pull: remove inadequate use of operations records to update stepdone
authorBoris Feld <boris.feld@octobus.net>
Tue, 26 Sep 2017 15:55:01 +0200
changeset 34323 6c7aaf59b21e
parent 34322 10e162bb9bf5
child 34324 e473f482b9b3
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.
mercurial/bundle2.py
mercurial/exchange.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):
--- 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':