Patchwork [7,of,7,bundle2] pull: remove inadequate use of operations records to update stepdone

login
register
mail settings
Submitter Boris Feld
Date Sept. 28, 2017, 5:08 a.m.
Message ID <6b46f4991b6af0b5796e.1506575322@FB>
Download mbox | patch
Permalink /patch/24199/
State Accepted
Headers show

Comments

Boris Feld - Sept. 28, 2017, 5:08 a.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1506434101 -7200
#      Tue Sep 26 15:55:01 2017 +0200
# Node ID 6b46f4991b6af0b5796ec3b084941b306ea635b9
# Parent  dca2166f424196e9b4b6ef9c6b0925f249c54682
# EXP-Topic b2.phases
pull: remove inadequate use of operations records to update stepdone

The 'stepdone' set is design to be a client side mechanism. If the client used
some advanced capabilities to request necessary information (changeset,
obsmarkers, phases, etc). It marks the steps as done to avoid having a less
advanced mechanism issue a duplicated request.

So, the "stepdone.add('phases')" should be the result of a client choice,
because only the client can know it has requested all it needed to request. In
4a08cf1a2cfe this principle was broken because any phase-heads part sent by
the server to the client would declare the phases retrieval complete.

Now that there is an official phases related capability and code associated to
it. We do not need the change in 4a08cf1a2cfe anymore and we can back it out.
This brings back 'stepdone' management for 'phases' in line with the rest of
the code (including other phases handing).

Here is an example of potential misbehavior that 4a08cf1a2cfe introduced:

Imagine a server that pre-computes bundles. The bundles contains a changegroup
part and an (advisory) 'phase-heads' part. When a pull occurs, precomputed
bundled are reused if available. As the phase part is advisory it can be sent
to all clients.  However they could be relevant changesets without phase
information.  Either because they are already common or because they had no
precomputed bundle for them yet.

If receiving any 'phase-heads' parts disable subsequent phases re-trivial
parts, the client will not request phase data for all relevant changesets. For
example common changesets will not turn public.
Augie Fackler - Sept. 29, 2017, 10:44 a.m.
On Thu, Sep 28, 2017 at 07:08:42AM +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld@octobus.net>
> # Date 1506434101 -7200
> #      Tue Sep 26 15:55:01 2017 +0200
> # Node ID 6b46f4991b6af0b5796ec3b084941b306ea635b9
> # Parent  dca2166f424196e9b4b6ef9c6b0925f249c54682
> # EXP-Topic b2.phases
> pull: remove inadequate use of operations records to update stepdone

queued, thanks

Patch

diff -r dca2166f4241 -r 6b46f4991b6a mercurial/bundle2.py
--- a/mercurial/bundle2.py	Sun Sep 24 21:27:18 2017 +0200
+++ b/mercurial/bundle2.py	Tue Sep 26 15:55:01 2017 +0200
@@ -1844,7 +1844,6 @@ 
     """apply phases from bundle part to repo"""
     headsbyphase = phases.binarydecode(inpart)
     phases.updatephases(op.repo.unfiltered(), op.gettransaction, headsbyphase)
-    op.records.add('phase-heads', {})
 
 @parthandler('reply:pushkey', ('return', 'in-reply-to'))
 def handlepushkeyreply(op, inpart):
diff -r dca2166f4241 -r 6b46f4991b6a mercurial/exchange.py
--- a/mercurial/exchange.py	Sun Sep 24 21:27:18 2017 +0200
+++ b/mercurial/exchange.py	Tue Sep 26 15:55:01 2017 +0200
@@ -1400,10 +1400,6 @@ 
     if pullop.fetch:
         pullop.cgresult = bundle2.combinechangegroupresults(op)
 
-    # If the bundle had a phase-heads part, then phase exchange is already done
-    if op.records['phase-heads']:
-        pullop.stepsdone.add('phases')
-
     # processing phases change
     for namespace, value in op.records['listkeys']:
         if namespace == 'phases':