[PATCH 3 of 3] pull: only prefetch bookmark when using bundle1

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri May 29 17:25:15 CDT 2015

# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1432727823 25200
#      Wed May 27 04:57:03 2015 -0700
# Node ID a9acfde2c3126309056a92d421913599ff3781fe
# Parent  f9a958f8bc37c17ff8b10eee45ee51379ab90124
pull: only prefetch bookmark when using bundle1

All bundle2 servers now support the 'listkeys' part(1), so we'll alway be able
to fetch bookmarks data at the same time than the changeset. This should be
enough to avoid the one race condition that this bookmark prefetching is trying
to work around. It even allow future server to make sure everything is generated
from the same "transaction" if they become capable of such. The current code was
already overwriting the prefetched value with the one in bundle2 anyway.  Note
that this is not preventing all races conditions in related to bookmark in 'hg
pull' it makes nothing better and nothing worse.

Reducing the number of listkeys calls will reduce the latency on pull.

The pre-fetch is also moved into a discovery step because it seems to belong

(1) Because all servers not speaking 'pushkey' parts are conmpatible with the
'HG2X' protocol only.

diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -893,11 +893,10 @@ def pull(repo, remote, heads=None, force
             msg = _("required features are not"
                     " supported in the destination:"
                     " %s") % (', '.join(sorted(missing)))
             raise util.Abort(msg)
-    pullop.remotebookmarks = remote.listkeys('bookmarks')
     lock = pullop.repo.lock()
         pullop.trmanager = transactionmanager(repo, 'pull', remote.url())
         if _canusebundle2(pullop):
@@ -941,10 +940,20 @@ def _pulldiscovery(pullop):
     """Run all discovery steps"""
     for stepname in pulldiscoveryorder:
         step = pulldiscoverymapping[stepname]
+ at pulldiscovery('b1:bookmarks')
+def _pullbookmarkbundle1(pullop):
+    """fetch bookmark data in bundle1 case
+    If not using bundle2, we have to fetch bookmark before doing changesets
+    discovery to reduce the change and impact of race condition."""
+    if not _canusebundle2(pullop): # all bundle2 server now support listkeys
+        pullop.remotebookmarks = pullop.remote.listkeys('bookmarks')
 def _pulldiscoverychangegroup(pullop):
     """discovery phase for the pull
     Current handle changeset discovery only, will change handle all discovery

More information about the Mercurial-devel mailing list