[PATCH 3 of 3] pull: only prefetch bookmark when using bundle1
Augie Fackler
raf at durin42.com
Mon Jun 1 03:39:31 UTC 2015
On May 29, 2015, at 6:25 PM, Pierre-Yves David <pierre-yves.david at ens-lyon.org> wrote:
> # 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
These were part of my bulk review of marmouteâs series and are now queued. Thanks!
>
> 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
> there.
>
> (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()
> try:
> pullop.trmanager = transactionmanager(repo, 'pull', remote.url())
> _pulldiscovery(pullop)
> if _canusebundle2(pullop):
> @@ -941,10 +940,20 @@ def _pulldiscovery(pullop):
> """Run all discovery steps"""
> for stepname in pulldiscoveryorder:
> step = pulldiscoverymapping[stepname]
> step(pullop)
>
> + 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')
> +
> +
> @pulldiscovery('changegroup')
> def _pulldiscoverychangegroup(pullop):
> """discovery phase for the pull
>
> Current handle changeset discovery only, will change handle all discovery
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150531/64a02310/attachment.pgp>
More information about the Mercurial-devel
mailing list