D7890: nodemap: double check the source docket when doing incremental update

marmoute (Pierre-Yves David) phabricator at mercurial-scm.org
Fri Jan 31 10:32:07 EST 2020


marmoute updated this revision to Diff 19771.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7890?vs=19308&id=19771

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7890/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7890

AFFECTED FILES
  mercurial/pure/parsers.py
  mercurial/revlogutils/nodemap.py

CHANGE DETAILS

diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py
--- a/mercurial/revlogutils/nodemap.py
+++ b/mercurial/revlogutils/nodemap.py
@@ -77,18 +77,27 @@
     can_incremental = util.safehasattr(revlog.index, "nodemap_data_incremental")
     ondisk_docket = revlog._nodemap_docket
 
+    data = None
     # first attemp an incremental update of the data
     if can_incremental and ondisk_docket is not None:
         target_docket = revlog._nodemap_docket.copy()
-        data_changed_count, data = revlog.index.nodemap_data_incremental()
-        datafile = _rawdata_filepath(revlog, target_docket)
-        # EXP-TODO: if this is a cache, this should use a cache vfs, not a
-        # store vfs
-        with revlog.opener(datafile, 'a') as fd:
-            fd.write(data)
-        target_docket.data_length += len(data)
-        target_docket.data_unused += data_changed_count
-    else:
+        (
+            src_docket,
+            data_changed_count,
+            data,
+        ) = revlog.index.nodemap_data_incremental()
+        if src_docket != target_docket:
+            data = None
+        else:
+            datafile = _rawdata_filepath(revlog, target_docket)
+            # EXP-TODO: if this is a cache, this should use a cache vfs, not a
+            # store vfs
+            with revlog.opener(datafile, 'a') as fd:
+                fd.write(data)
+            target_docket.data_length += len(data)
+            target_docket.data_unused += data_changed_count
+
+    if data is None:
         # otherwise fallback to a full new export
         target_docket = NodeMapDocket()
         datafile = _rawdata_filepath(revlog, target_docket)
@@ -182,6 +191,17 @@
         new.data_unused = self.data_unused
         return new
 
+    def __cmp__(self, other):
+        if self.uid < other.uid:
+            return -1
+        if self.uid > other.uid:
+            return 1
+        elif self.data_length < other.data_length:
+            return -1
+        elif self.data_length > other.data_length:
+            return 1
+        return 0
+
     def serialize(self):
         """return serialized bytes for a docket using the passed uid"""
         data = []
diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
--- a/mercurial/pure/parsers.py
+++ b/mercurial/pure/parsers.py
@@ -164,11 +164,13 @@
         """
         if self._nm_root is None:
             return None
+        docket = self._nm_docket
         changed, data = nodemaputil.update_persistent_data(
-            self, self._nm_root, self._nm_max_idx, self._nm_rev
+            self, self._nm_root, self._nm_max_idx, self._nm_docket.tip_rev
         )
-        self._nm_root = self._nm_max_idx = self._nm_rev = None
-        return changed, data
+
+        self._nm_root = self._nm_max_idx = self._nm_docket = None
+        return docket, changed, data
 
     def update_nodemap_data(self, docket, nm_data):
         """provide full block of persisted binary data for a nodemap
@@ -178,9 +180,9 @@
         if nm_data is not None:
             self._nm_root, self._nm_max_idx = nodemaputil.parse_data(nm_data)
             if self._nm_root:
-                self._nm_rev = docket.tip_rev
+                self._nm_docket = docket
             else:
-                self._nm_root = self._nm_max_idx = self._nm_rev = None
+                self._nm_root = self._nm_max_idx = self._nm_docket = None
 
 
 class InlinedIndexObject(BaseIndexObject):



To: marmoute, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list