comparison tests/test-wireproto-exchangev2.t @ 39638:d292328e0143

exchangev2: fetch manifest revisions Now that the server has support for retrieving manifest data, we can implement the client bits to call it. We teach the changeset fetching code to capture the manifest revisions that are encountered on incoming changesets. We then feed this into a new function which filters out known manifests and then batches up manifest data requests to the server. This is different from the previous wire protocol in a few notable ways. First, the client fetches manifest data separately and explicitly. Before, we'd ask the server for data pertaining to some changesets (via a "getbundle" command) and manifests (and files) would be sent automatically. Providing an API for looking up just manifest data separately gives clients much more flexibility for manifest management. For example, a client may choose to only fetch manifest data on demand instead of prefetching it (i.e. partial clone). Second, we send N commands to the server for manifest retrieval instead of 1. This property has a few nice side-effects. One is that the deterministic nature of the requests lends itself to server-side caching. For example, say the remote has 50,000 manifests. If the server is configured to cache responses, each time a new commit arrives, you will have a cache miss and need to regenerate all outgoing data. But if you makes N requests requesting 10,000 manifests each, a new commit will still yield cache hits on the initial, unchanged manifest batches/requests. A derived benefit from these properties is that resumable clone is conceptually simpler to implement. When making a monolithic request for all of the repository data, recovering from an interrupted clone is hard because the server was in the driver's seat and was maintaining state about all the data that needed transferred. With the client driving fetching, the client can persist the set of unfetched entities and retry/resume a fetch if something goes wrong. Or we can fetch all data N changesets at a time and slowly build up a repository. This approach is drastically easier to implement when we have server APIs exposing low-level repository primitives (such as manifests and files). We don't yet support tree manifests. But it should be possible to implement that with the existing wire protocol command. Differential Revision: https://phab.mercurial-scm.org/D4489
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 05 Sep 2018 09:09:57 -0700
parents 349482d726ee
children 039bf1eddc2e
comparison
equal deleted inserted replaced
39637:c7a7c7e844e5 39638:d292328e0143
74 add changeset 4432d83626e8 74 add changeset 4432d83626e8
75 add changeset cd2534766bec 75 add changeset cd2534766bec
76 add changeset e96ae20f4188 76 add changeset e96ae20f4188
77 add changeset caa2a465451d 77 add changeset caa2a465451d
78 checking for updated bookmarks 78 checking for updated bookmarks
79 sending 1 commands
80 sending command manifestdata: {
81 'fields': set([
82 'parents',
83 'revision'
84 ]),
85 'nodes': [
86 '\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&A',
87 '\xa9\x88\xfbCX>\x87\x1d\x1e\xd5u\x0e\xe0t\xc6\xd8@\xbb\xbf\xc8',
88 '\xec\x80NH\x8c \x88\xc25\t\x9a\x10 u\x13\xbe\xcd\xc3\xdd\xa5',
89 '\x04\\\x7f9\'\xda\x13\xe7Z\xf8\xf0\xe4\xf0HI\xe4a\xa9x\x0f',
90 '7\x9c\xb0\xc2\xe6d\\y\xdd\xc5\x9a\x1dG\'\xa9\xfb\x83\n\xeb&'
91 ],
92 'tree': ''
93 }
94 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
95 received frame(size=922; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
96 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
79 updating the branch cache 97 updating the branch cache
80 new changesets 3390ef850073:caa2a465451d (3 drafts) 98 new changesets 3390ef850073:caa2a465451d (3 drafts)
81 99
82 All changesets should have been transferred 100 All changesets should have been transferred
83 101
99 | o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public 117 | o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public
100 |/ 118 |/
101 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public 119 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public
102 120
103 121
122 All manifests should have been transferred
123
124 $ hg -R client-simple debugindex -m
125 rev linkrev nodeid p1 p2
126 0 0 992f4779029a 000000000000 000000000000
127 1 1 a988fb43583e 992f4779029a 000000000000
128 2 2 ec804e488c20 a988fb43583e 000000000000
129 3 3 045c7f3927da 992f4779029a 000000000000
130 4 4 379cb0c2e664 045c7f3927da 000000000000
131
104 Cloning only a specific revision works 132 Cloning only a specific revision works
105 133
106 $ hg --debug clone -U -r 4432d83626e8 http://localhost:$HGPORT client-singlehead 134 $ hg --debug clone -U -r 4432d83626e8 http://localhost:$HGPORT client-singlehead
107 using http://localhost:$HGPORT/ 135 using http://localhost:$HGPORT/
108 sending capabilities command 136 sending capabilities command
144 received frame(size=353; request=1; stream=2; streamflags=; type=command-response; flags=continuation) 172 received frame(size=353; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
145 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) 173 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
146 add changeset 3390ef850073 174 add changeset 3390ef850073
147 add changeset 4432d83626e8 175 add changeset 4432d83626e8
148 checking for updated bookmarks 176 checking for updated bookmarks
177 sending 1 commands
178 sending command manifestdata: {
179 'fields': set([
180 'parents',
181 'revision'
182 ]),
183 'nodes': [
184 '\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&A',
185 '\xa9\x88\xfbCX>\x87\x1d\x1e\xd5u\x0e\xe0t\xc6\xd8@\xbb\xbf\xc8'
186 ],
187 'tree': ''
188 }
189 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
190 received frame(size=376; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
191 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
149 updating the branch cache 192 updating the branch cache
150 new changesets 3390ef850073:4432d83626e8 193 new changesets 3390ef850073:4432d83626e8
151 194
152 $ cd client-singlehead 195 $ cd client-singlehead
153 196
154 $ hg log -G -T '{rev} {node} {phase}\n' 197 $ hg log -G -T '{rev} {node} {phase}\n'
155 o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public 198 o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public
156 | 199 |
157 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public 200 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public
158 201
202
203 $ hg debugindex -m
204 rev linkrev nodeid p1 p2
205 0 0 992f4779029a 000000000000 000000000000
206 1 1 a988fb43583e 992f4779029a 000000000000
159 207
160 Incremental pull works 208 Incremental pull works
161 209
162 $ hg --debug pull 210 $ hg --debug pull
163 pulling from http://localhost:$HGPORT/ 211 pulling from http://localhost:$HGPORT/
202 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) 250 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
203 add changeset cd2534766bec 251 add changeset cd2534766bec
204 add changeset e96ae20f4188 252 add changeset e96ae20f4188
205 add changeset caa2a465451d 253 add changeset caa2a465451d
206 checking for updated bookmarks 254 checking for updated bookmarks
255 sending 1 commands
256 sending command manifestdata: {
257 'fields': set([
258 'parents',
259 'revision'
260 ]),
261 'nodes': [
262 '\xec\x80NH\x8c \x88\xc25\t\x9a\x10 u\x13\xbe\xcd\xc3\xdd\xa5',
263 '\x04\\\x7f9\'\xda\x13\xe7Z\xf8\xf0\xe4\xf0HI\xe4a\xa9x\x0f',
264 '7\x9c\xb0\xc2\xe6d\\y\xdd\xc5\x9a\x1dG\'\xa9\xfb\x83\n\xeb&'
265 ],
266 'tree': ''
267 }
268 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
269 received frame(size=559; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
270 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
207 updating the branch cache 271 updating the branch cache
208 new changesets cd2534766bec:caa2a465451d (3 drafts) 272 new changesets cd2534766bec:caa2a465451d (3 drafts)
209 (run 'hg update' to get a working copy) 273 (run 'hg update' to get a working copy)
210 274
211 $ hg log -G -T '{rev} {node} {phase}\n' 275 $ hg log -G -T '{rev} {node} {phase}\n'
218 | o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public 282 | o 1 4432d83626e8a98655f062ec1f2a43b07f7fbbb0 public
219 |/ 283 |/
220 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public 284 o 0 3390ef850073fbc2f0dfff2244342c8e9229013a public
221 285
222 286
287 $ hg debugindex -m
288 rev linkrev nodeid p1 p2
289 0 0 992f4779029a 000000000000 000000000000
290 1 1 a988fb43583e 992f4779029a 000000000000
291 2 2 ec804e488c20 a988fb43583e 000000000000
292 3 3 045c7f3927da 992f4779029a 000000000000
293 4 4 379cb0c2e664 045c7f3927da 000000000000
294
223 Phase-only update works 295 Phase-only update works
224 296
225 $ hg -R ../server-simple phase --public -r caa2a465451dd 297 $ hg -R ../server-simple phase --public -r caa2a465451dd
226 $ hg --debug pull 298 $ hg --debug pull
227 pulling from http://localhost:$HGPORT/ 299 pulling from http://localhost:$HGPORT/
329 add changeset e96ae20f4188 401 add changeset e96ae20f4188
330 add changeset caa2a465451d 402 add changeset caa2a465451d
331 checking for updated bookmarks 403 checking for updated bookmarks
332 adding remote bookmark book-1 404 adding remote bookmark book-1
333 adding remote bookmark book-2 405 adding remote bookmark book-2
406 sending 1 commands
407 sending command manifestdata: {
408 'fields': set([
409 'parents',
410 'revision'
411 ]),
412 'nodes': [
413 '\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&A',
414 '\xa9\x88\xfbCX>\x87\x1d\x1e\xd5u\x0e\xe0t\xc6\xd8@\xbb\xbf\xc8',
415 '\xec\x80NH\x8c \x88\xc25\t\x9a\x10 u\x13\xbe\xcd\xc3\xdd\xa5',
416 '\x04\\\x7f9\'\xda\x13\xe7Z\xf8\xf0\xe4\xf0HI\xe4a\xa9x\x0f',
417 '7\x9c\xb0\xc2\xe6d\\y\xdd\xc5\x9a\x1dG\'\xa9\xfb\x83\n\xeb&'
418 ],
419 'tree': ''
420 }
421 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
422 received frame(size=922; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
423 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
334 updating the branch cache 424 updating the branch cache
335 new changesets 3390ef850073:caa2a465451d (1 drafts) 425 new changesets 3390ef850073:caa2a465451d (1 drafts)
336 426
337 $ hg -R client-bookmarks bookmarks 427 $ hg -R client-bookmarks bookmarks
338 book-1 0:3390ef850073 428 book-1 0:3390ef850073