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

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



To: martinvonz, #hg-reviewers
Cc: mercurial-devel
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to