evolve: add a push pass using bundle2
authorPierre-Yves David <pierre-yves.david@fb.com>
Tue, 20 May 2014 13:41:27 -0700
changeset 957 2cde59f3cb5d
parent 956 b107f3549ec2
child 958 6d18a1ab496c
evolve: add a push pass using bundle2 Instead of using a dedicated wireprotocol commands, we use bundle2 to transmit an obs marker parts. This aims at both testing bundle2 more and to limit the amount of special code we needs to put in simple for server to fit our needs. The massive test changes comes from the fact we can use this fast path for both remote and local push.
README
hgext/evolve.py
tests/test-corrupt.t
tests/test-exchange-A1.t
tests/test-exchange-A2.t
tests/test-exchange-A3.t
tests/test-exchange-A4.t
tests/test-exchange-A5.t
tests/test-exchange-A6.t
tests/test-exchange-B1.t
tests/test-exchange-B2.t
tests/test-exchange-B4.t
tests/test-exchange-B5.t
tests/test-exchange-B6.t
tests/test-exchange-C1.t
tests/test-exchange-C2.t
tests/test-exchange-C3.t
tests/test-exchange-C4.t
tests/test-exchange-D1.t
tests/test-exchange-D2.t
tests/test-exchange-D4.t
tests/test-obsolete.t
tests/test-tutorial.t
--- a/README	Mon Jun 02 14:44:13 2014 -0700
+++ b/README	Tue May 20 13:41:27 2014 -0700
@@ -64,6 +64,7 @@
     - added progress when pulling obsmarkers
     - only pull markers relevant to pulled subset
     - avoid exchanging common markers in some case
+    - use bundle2 as transport when available.
  - add a hook related to the new commands
 
 3.3.2 -- 2014-05-14
--- a/hgext/evolve.py	Mon Jun 02 14:44:13 2014 -0700
+++ b/hgext/evolve.py	Tue May 20 13:41:27 2014 -0700
@@ -66,6 +66,7 @@
 from mercurial import wireproto
 from mercurial import localrepo
 from mercurial.hgweb import hgweb_mod
+from mercurial import bundle2
 
 _pack = struct.pack
 
@@ -2275,6 +2276,26 @@
             markers = []
         if not markers:
             repo.ui.status("OBSEXC: no marker to push\n")
+        elif remote.capable('_evoext_b2x_obsmarkers_0_pushonly'):
+            obsdata = StringIO()
+            _encodemarkersstream(obsdata, markers)
+            obsdata.seek(0)
+            repo.ui.status("OBSEXC: pushing %i markers (%i bytes)\n"
+                           % (len(markers), len(obsdata.getvalue())))
+            bundler = bundle2.bundle20(pushop.ui, {})
+            capsblob = bundle2.encodecaps(pushop.repo.bundle2caps)
+            bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsblob))
+            cgpart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1', data=obsdata.getvalue())
+            bundler.addpart(cgpart)
+            stream = util.chunkbuffer(bundler.getchunks())
+            try:
+                reply = pushop.remote.unbundle(stream, ['force'], 'push')
+            except bundle2.UnknownPartError, exc:
+                raise util.Abort('missing support for %s' % exc)
+            try:
+                op = bundle2.processbundle(pushop.repo, reply)
+            except bundle2.UnknownPartError, exc:
+                raise util.Abort('missing support for %s' % exc)
         elif remote.capable('_evoext_pushobsmarkers_0'):
             obsdata = pushobsmarkerStringIO()
             _encodemarkersstream(obsdata, markers)
@@ -2348,6 +2369,12 @@
     repo.hook('evolve_pushobsmarkers')
     return wireproto.pushres(0)
 
+@bundle2.parthandler('evolve:b2x:obsmarkerv1')
+def handleobsmarkerv1(op, inpart):
+    """add a stream of obsmarker to the repo"""
+    tr = op.gettransaction()
+    op.repo.obsstore.mergemarkers(tr, inpart.read())
+
 def _buildpullobsmerkersboundaries(pullop):
     """small funtion returning the argument for pull markers call
     may to contains 'heads' and 'common'. skip the key for None.
@@ -2582,12 +2609,14 @@
         caps += ' _evoext_pushobsmarkers_0'
         caps += ' _evoext_pullobsmarkers_0'
         caps += ' _evoext_obshash_0'
+        caps += ' _evoext_b2x_obsmarkers_0_pushonly'
     return caps
 
 
 @eh.extsetup
 def _installwireprotocol(ui):
     localrepo.moderncaps.add('_evoext_pullobsmarkers_0')
+    localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0_pushonly')
     hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
     hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
     hgweb_mod.perms['evoext_obshash'] = 'pull'
--- a/tests/test-corrupt.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-corrupt.t	Tue May 20 13:41:27 2014 -0700
@@ -113,7 +113,7 @@
   added 1 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 4 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (184 bytes)
+  OBSEXC: pushing 2 markers (147 bytes)
   OBSEXC: DONE
   $ hg -R ../other verify
   checking changesets
--- a/tests/test-exchange-A1.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A1.t	Tue May 20 13:41:27 2014 -0700
@@ -74,7 +74,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -124,7 +124,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -233,7 +233,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -280,7 +280,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-A2.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A2.t	Tue May 20 13:41:27 2014 -0700
@@ -82,7 +82,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-A3.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A3.t	Tue May 20 13:41:27 2014 -0700
@@ -94,7 +94,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -198,7 +198,7 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-A4.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A4.t	Tue May 20 13:41:27 2014 -0700
@@ -87,7 +87,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-A5.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A5.t	Tue May 20 13:41:27 2014 -0700
@@ -95,7 +95,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-A6.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-A6.t	Tue May 20 13:41:27 2014 -0700
@@ -82,7 +82,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -121,7 +121,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (78 bytes)
+  OBSEXC: pushing 1 markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-B1.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-B1.t	Tue May 20 13:41:27 2014 -0700
@@ -73,7 +73,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -120,7 +120,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-B2.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-B2.t	Tue May 20 13:41:27 2014 -0700
@@ -65,7 +65,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -104,7 +104,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-B4.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-B4.t	Tue May 20 13:41:27 2014 -0700
@@ -91,7 +91,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -130,7 +130,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers in 1 pushkey payload (112 bytes)
+  OBSEXC: pushing 1 markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-B5.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-B5.t	Tue May 20 13:41:27 2014 -0700
@@ -93,7 +93,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -148,7 +148,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-B6.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-B6.t	Tue May 20 13:41:27 2014 -0700
@@ -77,7 +77,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-C1.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-C1.t	Tue May 20 13:41:27 2014 -0700
@@ -72,7 +72,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (222 bytes)
+  OBSEXC: pushing 2 markers (177 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -117,7 +117,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (222 bytes)
+  OBSEXC: pushing 2 markers (177 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-C2.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-C2.t	Tue May 20 13:41:27 2014 -0700
@@ -82,7 +82,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -135,7 +135,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-C3.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-C3.t	Tue May 20 13:41:27 2014 -0700
@@ -85,7 +85,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 markers in 1 pushkey payload (298 bytes)
+  OBSEXC: pushing 3 markers (238 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -136,7 +136,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 markers in 1 pushkey payload (298 bytes)
+  OBSEXC: pushing 3 markers (238 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-C4.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-C4.t	Tue May 20 13:41:27 2014 -0700
@@ -93,7 +93,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-D1.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-D1.t	Tue May 20 13:41:27 2014 -0700
@@ -76,7 +76,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-D2.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-D2.t	Tue May 20 13:41:27 2014 -0700
@@ -69,7 +69,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (188 bytes)
+  OBSEXC: pushing 2 markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-exchange-D4.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-exchange-D4.t	Tue May 20 13:41:27 2014 -0700
@@ -92,7 +92,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (154 bytes)
+  OBSEXC: pushing 2 markers (123 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
--- a/tests/test-obsolete.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-obsolete.t	Tue May 20 13:41:27 2014 -0700
@@ -183,7 +183,7 @@
   added 5 changesets with 5 changes to 5 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 2 markers in 1 pushkey payload (154 bytes)
+  OBSEXC: pushing 2 markers (123 bytes)
   OBSEXC: DONE
   $ hg -R ../other-new verify
   checking changesets
@@ -240,7 +240,7 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 3 markers in 1 pushkey payload (230 bytes)
+  OBSEXC: pushing 3 markers (184 bytes)
   OBSEXC: DONE
   $ qlog -R ../other-new
   5
@@ -265,7 +265,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 3 markers in 1 pushkey payload (230 bytes)
+  OBSEXC: pushing 3 markers (184 bytes)
   OBSEXC: DONE
   [1]
 
@@ -548,7 +548,7 @@
   added 2 changesets with 1 changes to [12] files (re)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 7 markers in 1 pushkey payload (565 bytes)
+  OBSEXC: pushing 7 markers (452 bytes)
   OBSEXC: DONE
   $ hg up -q 10
   $ mkcommit "obsol_d'''"
@@ -563,7 +563,7 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 8 markers in 1 pushkey payload (642 bytes)
+  OBSEXC: pushing 8 markers (513 bytes)
   OBSEXC: DONE
   $ cd ..
 
--- a/tests/test-tutorial.t	Mon Jun 02 14:44:13 2014 -0700
+++ b/tests/test-tutorial.t	Tue May 20 13:41:27 2014 -0700
@@ -407,7 +407,7 @@
   added 3 changesets with 3 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 6 markers in 1 pushkey payload (609 bytes)
+  OBSEXC: pushing 6 markers (487 bytes)
   OBSEXC: DONE
 
 for simplicity sake we get the bathroom change in line again
@@ -740,7 +740,7 @@
   added 2 changesets with 2 changes to 1 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 7 nodes
-  OBSEXC: pushing 10 markers in 1 pushkey payload (1004 bytes)
+  OBSEXC: pushing 10 markers (803 bytes)
   OBSEXC: DONE
 
 remote get a warning that current working directory is based on an obsolete changeset