discovery: compute newly discovered missing in a more efficient way
authorBoris Feld <boris.feld@octobus.net>
Fri, 04 Jan 2019 16:04:48 +0100
changeset 41280 f4277a35c42c
parent 41279 c9e1104e6272
child 41281 183df3df6031
discovery: compute newly discovered missing in a more efficient way Calling "descendants" is expensive, instead, we bound the walk inside the know set of undecided revision. This help with discovery performance: # without the revset '%ld' improvement $ hg perfdiscovery -R pypy-left pypy-right before: wall 0.675631 comb 0.680000 user 0.670000 sys 0.010000 (median of 15) after: wall 0.520145 comb 0.530000 user 0.510000 sys 0.020000 (median of 19) There is another series in flight that greatly improves performances of "%ld" substitution in `repo.revs` call. If this changeset is applied above it, we see a similar performance boost. # with the revset '%ld' improvement $ hg perfdiscovery -R pypy-left pypy-right before: wall 0.477848 comb 0.480000 user 0.480000 sys 0.000000 (median of 22) after: wall 0.404163 comb 0.400000 user 0.400000 sys 0.000000 (median of 24)
mercurial/setdiscovery.py
--- a/mercurial/setdiscovery.py	Thu Jan 17 00:16:00 2019 -0500
+++ b/mercurial/setdiscovery.py	Fri Jan 04 16:04:48 2019 +0100
@@ -187,14 +187,10 @@
 
     def addmissings(self, missings):
         """registrer some nodes as missing"""
-        if self.missing:
-            new = self._repo.revs('descendants(%ld) - descendants(%ld)',
-                                  missings, self.missing)
-            self.missing.update(new)
-        else:
-            self.missing.update(self._repo.revs('descendants(%ld)', missings))
-
-        self.undecided.difference_update(self.missing)
+        newmissing = self._repo.revs('%ld::%ld', missings, self.undecided)
+        if newmissing:
+            self.missing.update(newmissing)
+            self.undecided.difference_update(newmissing)
 
     def addinfo(self, sample):
         """consume an iterable of (rev, known) tuples"""