Patchwork D2643: setdiscovery: back out changeset 5cfdf6137af8 (issue5809)

login
register
mail settings
Submitter phabricator
Date March 4, 2018, 4:58 p.m.
Message ID <differential-rev-PHID-DREV-uyfldg3wzso5djpmn4xq-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/28931/
State Superseded
Headers show

Comments

phabricator - March 4, 2018, 4:58 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  As explained in the bug report, this commit caused a performance
  regression. The problem occurs when the local repo has very many
  heads. Before https://phab.mercurial-scm.org/rHG5cfdf6137af87e52063a5a11a697bab805e4b03d, we used to get the remote's list of heads
  and if these heads mostly overlapped with the local repo's heads, we
  would mark these common heads as common, which would greatly reduce
  the size of the set of undecided nodes.
  
  Note that a similar problem existed before https://phab.mercurial-scm.org/rHG5cfdf6137af87e52063a5a11a697bab805e4b03d: If the local
  repo had very many heads and the server just had a few (or many heads
  from a disjoint set), we would do the same kind of slow discovery as
  we would with https://phab.mercurial-scm.org/rHG5cfdf6137af87e52063a5a11a697bab805e4b03d in the case where local and remote repos
  share a large set of common nodes.
  
  For now, we just back out https://phab.mercurial-scm.org/rHG5cfdf6137af87e52063a5a11a697bab805e4b03d. We should improve the
  discovery in the "local has many heads, remote has few heads" case,
  but let's do that after backing this out.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/discovery.py
  mercurial/setdiscovery.py

CHANGE DETAILS




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

Patch

diff --git a/mercurial/setdiscovery.py b/mercurial/setdiscovery.py
--- a/mercurial/setdiscovery.py
+++ b/mercurial/setdiscovery.py
@@ -130,7 +130,7 @@ 
         sample = set(random.sample(sample, desiredlen))
     return sample
 
-def findcommonheads(ui, local, remote, heads=None,
+def findcommonheads(ui, local, remote,
                     initialsamplesize=100,
                     fullsamplesize=200,
                     abortwhenunrelated=True,
@@ -155,15 +155,11 @@ 
     sample = _limitsample(ownheads, initialsamplesize)
     # indices between sample and externalized version must match
     sample = list(sample)
-    if heads:
-        srvheadhashes = heads
-        yesno = remote.known(dag.externalizeall(sample))
-    else:
-        batch = remote.iterbatch()
-        batch.heads()
-        batch.known(dag.externalizeall(sample))
-        batch.submit()
-        srvheadhashes, yesno = batch.results()
+    batch = remote.iterbatch()
+    batch.heads()
+    batch.known(dag.externalizeall(sample))
+    batch.submit()
+    srvheadhashes, yesno = batch.results()
 
     if cl.tip() == nullid:
         if srvheadhashes != [nullid]:
diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -57,7 +57,7 @@ 
         if all(knownnode(h) for h in heads):
             return (heads, False, heads)
 
-    res = setdiscovery.findcommonheads(repo.ui, repo, remote, heads,
+    res = setdiscovery.findcommonheads(repo.ui, repo, remote,
                                        abortwhenunrelated=not force,
                                        ancestorsof=ancestorsof)
     common, anyinc, srvheads = res