From patchwork Thu Sep 28 05:08:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [7, of, 7, bundle2] pull: remove inadequate use of operations records to update stepdone From: Boris Feld X-Patchwork-Id: 24199 Message-Id: <6b46f4991b6af0b5796e.1506575322@FB> To: mercurial-devel@mercurial-scm.org Date: Thu, 28 Sep 2017 07:08:42 +0200 # HG changeset patch # User Boris Feld # 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. 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':