Patchwork [2,of,2,V2] discovery: properly filter changeset in 'peer.known' (issue4982)

login
register
mail settings
Submitter Pierre-Yves David
Date Dec. 6, 2015, 10:10 p.m.
Message ID <e14ed641db8e1aabaf2c.1449439811@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/11873/
State Accepted
Delegated to: Pierre-Yves David
Headers show

Comments

Pierre-Yves David - Dec. 6, 2015, 10:10 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1449101535 28800
#      Wed Dec 02 16:12:15 2015 -0800
# Node ID e14ed641db8e1aabaf2c47c7c6f94a84a9636845
# Parent  179e1f468d683a1b9e7e8df76af0690b454c4025
# EXP-Topic fixknown
# Available At http://hg.netv6.net/marmoute-wip/mercurial/
#              hg pull http://hg.netv6.net/marmoute-wip/mercurial/ -r e14ed641db8e
discovery: properly filter changeset in 'peer.known' (issue4982)

The 'peer.known' call (handled at the repository level) was applying its own
manual filtering (looking at phases) instead of relying on the repoview
mechanism. This led to the discovery finding more "common" node that
'getbundle' was willing to recognised. From there, bad things happen, issue4982
is a symptom of it. While situations like described in issue4982 can still
happen because of race conditions, fixing 'peer.known' is important for
consistency in all cases.

We update the code to use 'repoview' filtering. This lead to small changes in
the tests for exchanging obsolescence marker because the discovery yields
different results.

Patch

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -806,16 +806,17 @@  class localrepository(object):
 
         repo = (remote and remote.local()) and remote or self
         return repo[key].branch()
 
     def known(self, nodes):
-        nm = self.changelog.nodemap
-        pc = self._phasecache
+        cl = self.changelog
+        nm = cl.nodemap
+        filtered = cl.filteredrevs
         result = []
         for n in nodes:
             r = nm.get(n)
-            resp = not (r is None or pc.phase(self, r) >= phases.secret)
+            resp = not (r is None or r in filtered)
             result.append(resp)
         return result
 
     def local(self):
         return self
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -743,12 +743,11 @@  This test issue 3805
   searching for changes
   3:323a9c3ddd91 (draft) [tip ] A
   $ hg outgoing
   comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
   searching for changes
-  no changes found
-  [1]
+  1:29f0c6921ddd (draft) [tip ] A
 
 #if serve
 
   $ hg serve -R ../repo-issue3805 -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
   $ cat hg.pid >> $DAEMON_PIDS
@@ -758,12 +757,11 @@  This test issue 3805
   searching for changes
   2:323a9c3ddd91 (draft) [tip ] A
   $ hg outgoing http://localhost:$HGPORT
   comparing with http://localhost:$HGPORT/
   searching for changes
-  no changes found
-  [1]
+  1:29f0c6921ddd (draft) [tip ] A
 
   $ killdaemons.py
 
 #endif