# HG changeset patch # User Boris Feld # Date 1546614288 -3600 # Node ID f4277a35c42cd221c022bbd625c4f1fdd387bd4c # Parent c9e1104e627229735796cfaa9dcbfc0e30082e75 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) diff -r c9e1104e6272 -r f4277a35c42c 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"""