##// END OF EJS Templates
tests: dd status=noxfer is not portable (issue6523)...
Thomas Klausner -
r49147:141e38ef stable
parent child Browse files
Show More
@@ -1,1255 +1,1256 b''
1 1 ===================================
2 2 Test the persistent on-disk nodemap
3 3 ===================================
4 4
5 5
6 6 $ cat << EOF >> $HGRCPATH
7 7 > [format]
8 8 > use-share-safe=yes
9 9 > [extensions]
10 10 > share=
11 11 > EOF
12 12
13 13 #if no-rust
14 14
15 15 $ cat << EOF >> $HGRCPATH
16 16 > [format]
17 17 > use-persistent-nodemap=yes
18 18 > [devel]
19 19 > persistent-nodemap=yes
20 20 > EOF
21 21
22 22 #endif
23 23
24 24 $ hg init test-repo --config storage.revlog.persistent-nodemap.slow-path=allow
25 25 $ cd test-repo
26 26
27 27 Check handling of the default slow-path value
28 28
29 29 #if no-pure no-rust
30 30
31 31 $ hg id
32 32 abort: accessing `persistent-nodemap` repository without associated fast implementation.
33 33 (check `hg help config.format.use-persistent-nodemap` for details)
34 34 [255]
35 35
36 36 Unlock further check (we are here to test the feature)
37 37
38 38 $ cat << EOF >> $HGRCPATH
39 39 > [storage]
40 40 > # to avoid spamming the test
41 41 > revlog.persistent-nodemap.slow-path=allow
42 42 > EOF
43 43
44 44 #endif
45 45
46 46 #if rust
47 47
48 48 Regression test for a previous bug in Rust/C FFI for the `Revlog_CAPI` capsule:
49 49 in places where `mercurial/cext/revlog.c` function signatures use `Py_ssize_t`
50 50 (64 bits on Linux x86_64), corresponding declarations in `rust/hg-cpython/src/cindex.rs`
51 51 incorrectly used `libc::c_int` (32 bits).
52 52 As a result, -1 passed from Rust for the null revision became 4294967295 in C.
53 53
54 54 $ hg log -r 00000000
55 55 changeset: -1:000000000000
56 56 tag: tip
57 57 user:
58 58 date: Thu Jan 01 00:00:00 1970 +0000
59 59
60 60
61 61 #endif
62 62
63 63
64 64 $ hg debugformat
65 65 format-variant repo
66 66 fncache: yes
67 67 dirstate-v2: no
68 68 dotencode: yes
69 69 generaldelta: yes
70 70 share-safe: yes
71 71 sparserevlog: yes
72 72 persistent-nodemap: yes
73 73 copies-sdc: no
74 74 revlog-v2: no
75 75 changelog-v2: no
76 76 plain-cl-delta: yes
77 77 compression: zlib (no-zstd !)
78 78 compression: zstd (zstd !)
79 79 compression-level: default
80 80 $ hg debugbuilddag .+5000 --new-file
81 81
82 82 $ hg debugnodemap --metadata
83 83 uid: ???????? (glob)
84 84 tip-rev: 5000
85 85 tip-node: 6b02b8c7b96654c25e86ba69eda198d7e6ad8b3c
86 86 data-length: 121088
87 87 data-unused: 0
88 88 data-unused: 0.000%
89 89 $ f --size .hg/store/00changelog.n
90 90 .hg/store/00changelog.n: size=62
91 91
92 92 Simple lookup works
93 93
94 94 $ ANYNODE=`hg log --template '{node|short}\n' --rev tip`
95 95 $ hg log -r "$ANYNODE" --template '{rev}\n'
96 96 5000
97 97
98 98
99 99 #if rust
100 100
101 101 $ f --sha256 .hg/store/00changelog-*.nd
102 102 .hg/store/00changelog-????????.nd: sha256=2e029d3200bd1a986b32784fc2ef1a3bd60dc331f025718bcf5ff44d93f026fd (glob)
103 103
104 104 $ f --sha256 .hg/store/00manifest-*.nd
105 105 .hg/store/00manifest-????????.nd: sha256=97117b1c064ea2f86664a124589e47db0e254e8d34739b5c5cc5bf31c9da2b51 (glob)
106 106 $ hg debugnodemap --dump-new | f --sha256 --size
107 107 size=121088, sha256=2e029d3200bd1a986b32784fc2ef1a3bd60dc331f025718bcf5ff44d93f026fd
108 108 $ hg debugnodemap --dump-disk | f --sha256 --bytes=256 --hexdump --size
109 109 size=121088, sha256=2e029d3200bd1a986b32784fc2ef1a3bd60dc331f025718bcf5ff44d93f026fd
110 110 0000: 00 00 00 91 00 00 00 20 00 00 00 bb 00 00 00 e7 |....... ........|
111 111 0010: 00 00 00 66 00 00 00 a1 00 00 01 13 00 00 01 22 |...f..........."|
112 112 0020: 00 00 00 23 00 00 00 fc 00 00 00 ba 00 00 00 5e |...#...........^|
113 113 0030: 00 00 00 df 00 00 01 4e 00 00 01 65 00 00 00 ab |.......N...e....|
114 114 0040: 00 00 00 a9 00 00 00 95 00 00 00 73 00 00 00 38 |...........s...8|
115 115 0050: 00 00 00 cc 00 00 00 92 00 00 00 90 00 00 00 69 |...............i|
116 116 0060: 00 00 00 ec 00 00 00 8d 00 00 01 4f 00 00 00 12 |...........O....|
117 117 0070: 00 00 02 0c 00 00 00 77 00 00 00 9c 00 00 00 8f |.......w........|
118 118 0080: 00 00 00 d5 00 00 00 6b 00 00 00 48 00 00 00 b3 |.......k...H....|
119 119 0090: 00 00 00 e5 00 00 00 b5 00 00 00 8e 00 00 00 ad |................|
120 120 00a0: 00 00 00 7b 00 00 00 7c 00 00 00 0b 00 00 00 2b |...{...|.......+|
121 121 00b0: 00 00 00 c6 00 00 00 1e 00 00 01 08 00 00 00 11 |................|
122 122 00c0: 00 00 01 30 00 00 00 26 00 00 01 9c 00 00 00 35 |...0...&.......5|
123 123 00d0: 00 00 00 b8 00 00 01 31 00 00 00 2c 00 00 00 55 |.......1...,...U|
124 124 00e0: 00 00 00 8a 00 00 00 9a 00 00 00 0c 00 00 01 1e |................|
125 125 00f0: 00 00 00 a4 00 00 00 83 00 00 00 c9 00 00 00 8c |................|
126 126
127 127
128 128 #else
129 129
130 130 $ f --sha256 .hg/store/00changelog-*.nd
131 131 .hg/store/00changelog-????????.nd: sha256=f544f5462ff46097432caf6d764091f6d8c46d6121be315ead8576d548c9dd79 (glob)
132 132 $ hg debugnodemap --dump-new | f --sha256 --size
133 133 size=121088, sha256=f544f5462ff46097432caf6d764091f6d8c46d6121be315ead8576d548c9dd79
134 134 $ hg debugnodemap --dump-disk | f --sha256 --bytes=256 --hexdump --size
135 135 size=121088, sha256=f544f5462ff46097432caf6d764091f6d8c46d6121be315ead8576d548c9dd79
136 136 0000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
137 137 0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
138 138 0020: ff ff ff ff ff ff f5 06 ff ff ff ff ff ff f3 e7 |................|
139 139 0030: ff ff ef ca ff ff ff ff ff ff ff ff ff ff ff ff |................|
140 140 0040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
141 141 0050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ed 08 |................|
142 142 0060: ff ff ed 66 ff ff ff ff ff ff ff ff ff ff ff ff |...f............|
143 143 0070: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
144 144 0080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
145 145 0090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff f6 ed |................|
146 146 00a0: ff ff ff ff ff ff fe 61 ff ff ff ff ff ff ff ff |.......a........|
147 147 00b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
148 148 00c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
149 149 00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
150 150 00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff f1 02 |................|
151 151 00f0: ff ff ff ff ff ff ed 1b ff ff ff ff ff ff ff ff |................|
152 152
153 153 #endif
154 154
155 155 $ hg debugnodemap --check
156 156 revision in index: 5001
157 157 revision in nodemap: 5001
158 158
159 159 add a new commit
160 160
161 161 $ hg up
162 162 5001 files updated, 0 files merged, 0 files removed, 0 files unresolved
163 163 $ echo foo > foo
164 164 $ hg add foo
165 165
166 166
167 167 Check slow-path config value handling
168 168 -------------------------------------
169 169
170 170 #if no-pure no-rust
171 171
172 172 $ hg id --config "storage.revlog.persistent-nodemap.slow-path=invalid-value"
173 173 unknown value for config "storage.revlog.persistent-nodemap.slow-path": "invalid-value"
174 174 falling back to default value: abort
175 175 abort: accessing `persistent-nodemap` repository without associated fast implementation.
176 176 (check `hg help config.format.use-persistent-nodemap` for details)
177 177 [255]
178 178
179 179 $ hg log -r . --config "storage.revlog.persistent-nodemap.slow-path=warn"
180 180 warning: accessing `persistent-nodemap` repository without associated fast implementation.
181 181 (check `hg help config.format.use-persistent-nodemap` for details)
182 182 changeset: 5000:6b02b8c7b966
183 183 tag: tip
184 184 user: debugbuilddag
185 185 date: Thu Jan 01 01:23:20 1970 +0000
186 186 summary: r5000
187 187
188 188 $ hg ci -m 'foo' --config "storage.revlog.persistent-nodemap.slow-path=abort"
189 189 abort: accessing `persistent-nodemap` repository without associated fast implementation.
190 190 (check `hg help config.format.use-persistent-nodemap` for details)
191 191 [255]
192 192
193 193 #else
194 194
195 195 $ hg id --config "storage.revlog.persistent-nodemap.slow-path=invalid-value"
196 196 unknown value for config "storage.revlog.persistent-nodemap.slow-path": "invalid-value"
197 197 falling back to default value: abort
198 198 6b02b8c7b966+ tip
199 199
200 200 #endif
201 201
202 202 $ hg ci -m 'foo'
203 203
204 204 #if no-pure no-rust
205 205 $ hg debugnodemap --metadata
206 206 uid: ???????? (glob)
207 207 tip-rev: 5001
208 208 tip-node: 16395c3cf7e231394735e6b1717823ada303fb0c
209 209 data-length: 121088
210 210 data-unused: 0
211 211 data-unused: 0.000%
212 212 #else
213 213 $ hg debugnodemap --metadata
214 214 uid: ???????? (glob)
215 215 tip-rev: 5001
216 216 tip-node: 16395c3cf7e231394735e6b1717823ada303fb0c
217 217 data-length: 121344
218 218 data-unused: 256
219 219 data-unused: 0.211%
220 220 #endif
221 221
222 222 $ f --size .hg/store/00changelog.n
223 223 .hg/store/00changelog.n: size=62
224 224
225 225 (The pure code use the debug code that perform incremental update, the C code reencode from scratch)
226 226
227 227 #if pure
228 228 $ f --sha256 .hg/store/00changelog-*.nd --size
229 229 .hg/store/00changelog-????????.nd: size=121344, sha256=cce54c5da5bde3ad72a4938673ed4064c86231b9c64376b082b163fdb20f8f66 (glob)
230 230 #endif
231 231
232 232 #if rust
233 233 $ f --sha256 .hg/store/00changelog-*.nd --size
234 234 .hg/store/00changelog-????????.nd: size=121344, sha256=952b042fcf614ceb37b542b1b723e04f18f83efe99bee4e0f5ccd232ef470e58 (glob)
235 235 #endif
236 236
237 237 #if no-pure no-rust
238 238 $ f --sha256 .hg/store/00changelog-*.nd --size
239 239 .hg/store/00changelog-????????.nd: size=121088, sha256=df7c06a035b96cb28c7287d349d603baef43240be7736fe34eea419a49702e17 (glob)
240 240 #endif
241 241
242 242 $ hg debugnodemap --check
243 243 revision in index: 5002
244 244 revision in nodemap: 5002
245 245
246 246 Test code path without mmap
247 247 ---------------------------
248 248
249 249 $ echo bar > bar
250 250 $ hg add bar
251 251 $ hg ci -m 'bar' --config storage.revlog.persistent-nodemap.mmap=no
252 252
253 253 $ hg debugnodemap --check --config storage.revlog.persistent-nodemap.mmap=yes
254 254 revision in index: 5003
255 255 revision in nodemap: 5003
256 256 $ hg debugnodemap --check --config storage.revlog.persistent-nodemap.mmap=no
257 257 revision in index: 5003
258 258 revision in nodemap: 5003
259 259
260 260
261 261 #if pure
262 262 $ hg debugnodemap --metadata
263 263 uid: ???????? (glob)
264 264 tip-rev: 5002
265 265 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
266 266 data-length: 121600
267 267 data-unused: 512
268 268 data-unused: 0.421%
269 269 $ f --sha256 .hg/store/00changelog-*.nd --size
270 270 .hg/store/00changelog-????????.nd: size=121600, sha256=def52503d049ccb823974af313a98a935319ba61f40f3aa06a8be4d35c215054 (glob)
271 271 #endif
272 272 #if rust
273 273 $ hg debugnodemap --metadata
274 274 uid: ???????? (glob)
275 275 tip-rev: 5002
276 276 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
277 277 data-length: 121600
278 278 data-unused: 512
279 279 data-unused: 0.421%
280 280 $ f --sha256 .hg/store/00changelog-*.nd --size
281 281 .hg/store/00changelog-????????.nd: size=121600, sha256=dacf5b5f1d4585fee7527d0e67cad5b1ba0930e6a0928f650f779aefb04ce3fb (glob)
282 282 #endif
283 283 #if no-pure no-rust
284 284 $ hg debugnodemap --metadata
285 285 uid: ???????? (glob)
286 286 tip-rev: 5002
287 287 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
288 288 data-length: 121088
289 289 data-unused: 0
290 290 data-unused: 0.000%
291 291 $ f --sha256 .hg/store/00changelog-*.nd --size
292 292 .hg/store/00changelog-????????.nd: size=121088, sha256=59fcede3e3cc587755916ceed29e3c33748cd1aa7d2f91828ac83e7979d935e8 (glob)
293 293 #endif
294 294
295 295 Test force warming the cache
296 296
297 297 $ rm .hg/store/00changelog.n
298 298 $ hg debugnodemap --metadata
299 299 $ hg debugupdatecache
300 300 #if pure
301 301 $ hg debugnodemap --metadata
302 302 uid: ???????? (glob)
303 303 tip-rev: 5002
304 304 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
305 305 data-length: 121088
306 306 data-unused: 0
307 307 data-unused: 0.000%
308 308 #else
309 309 $ hg debugnodemap --metadata
310 310 uid: ???????? (glob)
311 311 tip-rev: 5002
312 312 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
313 313 data-length: 121088
314 314 data-unused: 0
315 315 data-unused: 0.000%
316 316 #endif
317 317
318 318 Check out of sync nodemap
319 319 =========================
320 320
321 321 First copy old data on the side.
322 322
323 323 $ mkdir ../tmp-copies
324 324 $ cp .hg/store/00changelog-????????.nd .hg/store/00changelog.n ../tmp-copies
325 325
326 326 Nodemap lagging behind
327 327 ----------------------
328 328
329 329 make a new commit
330 330
331 331 $ echo bar2 > bar
332 332 $ hg ci -m 'bar2'
333 333 $ NODE=`hg log -r tip -T '{node}\n'`
334 334 $ hg log -r "$NODE" -T '{rev}\n'
335 335 5003
336 336
337 337 If the nodemap is lagging behind, it can catch up fine
338 338
339 339 $ hg debugnodemap --metadata
340 340 uid: ???????? (glob)
341 341 tip-rev: 5003
342 342 tip-node: c9329770f979ade2d16912267c38ba5f82fd37b3
343 343 data-length: 121344 (pure !)
344 344 data-length: 121344 (rust !)
345 345 data-length: 121152 (no-rust no-pure !)
346 346 data-unused: 192 (pure !)
347 347 data-unused: 192 (rust !)
348 348 data-unused: 0 (no-rust no-pure !)
349 349 data-unused: 0.158% (pure !)
350 350 data-unused: 0.158% (rust !)
351 351 data-unused: 0.000% (no-rust no-pure !)
352 352 $ cp -f ../tmp-copies/* .hg/store/
353 353 $ hg debugnodemap --metadata
354 354 uid: ???????? (glob)
355 355 tip-rev: 5002
356 356 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
357 357 data-length: 121088
358 358 data-unused: 0
359 359 data-unused: 0.000%
360 360 $ hg log -r "$NODE" -T '{rev}\n'
361 361 5003
362 362
363 363 changelog altered
364 364 -----------------
365 365
366 366 If the nodemap is not gated behind a requirements, an unaware client can alter
367 367 the repository so the revlog used to generate the nodemap is not longer
368 368 compatible with the persistent nodemap. We need to detect that.
369 369
370 370 $ hg up "$NODE~5"
371 371 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
372 372 $ echo bar > babar
373 373 $ hg add babar
374 374 $ hg ci -m 'babar'
375 375 created new head
376 376 $ OTHERNODE=`hg log -r tip -T '{node}\n'`
377 377 $ hg log -r "$OTHERNODE" -T '{rev}\n'
378 378 5004
379 379
380 380 $ hg --config extensions.strip= strip --rev "$NODE~1" --no-backup
381 381
382 382 the nodemap should detect the changelog have been tampered with and recover.
383 383
384 384 $ hg debugnodemap --metadata
385 385 uid: ???????? (glob)
386 386 tip-rev: 5002
387 387 tip-node: b355ef8adce0949b8bdf6afc72ca853740d65944
388 388 data-length: 121536 (pure !)
389 389 data-length: 121088 (rust !)
390 390 data-length: 121088 (no-pure no-rust !)
391 391 data-unused: 448 (pure !)
392 392 data-unused: 0 (rust !)
393 393 data-unused: 0 (no-pure no-rust !)
394 394 data-unused: 0.000% (rust !)
395 395 data-unused: 0.369% (pure !)
396 396 data-unused: 0.000% (no-pure no-rust !)
397 397
398 398 $ cp -f ../tmp-copies/* .hg/store/
399 399 $ hg debugnodemap --metadata
400 400 uid: ???????? (glob)
401 401 tip-rev: 5002
402 402 tip-node: 880b18d239dfa9f632413a2071bfdbcc4806a4fd
403 403 data-length: 121088
404 404 data-unused: 0
405 405 data-unused: 0.000%
406 406 $ hg log -r "$OTHERNODE" -T '{rev}\n'
407 407 5002
408 408
409 409 missing data file
410 410 -----------------
411 411
412 412 $ UUID=`hg debugnodemap --metadata| grep 'uid:' | \
413 413 > sed 's/uid: //'`
414 414 $ FILE=.hg/store/00changelog-"${UUID}".nd
415 415 $ mv $FILE ../tmp-data-file
416 416 $ cp .hg/store/00changelog.n ../tmp-docket
417 417
418 418 mercurial don't crash
419 419
420 420 $ hg log -r .
421 421 changeset: 5002:b355ef8adce0
422 422 tag: tip
423 423 parent: 4998:d918ad6d18d3
424 424 user: test
425 425 date: Thu Jan 01 00:00:00 1970 +0000
426 426 summary: babar
427 427
428 428 $ hg debugnodemap --metadata
429 429
430 430 $ hg debugupdatecache
431 431 $ hg debugnodemap --metadata
432 432 uid: * (glob)
433 433 tip-rev: 5002
434 434 tip-node: b355ef8adce0949b8bdf6afc72ca853740d65944
435 435 data-length: 121088
436 436 data-unused: 0
437 437 data-unused: 0.000%
438 438 $ mv ../tmp-data-file $FILE
439 439 $ mv ../tmp-docket .hg/store/00changelog.n
440 440
441 441 Check transaction related property
442 442 ==================================
443 443
444 444 An up to date nodemap should be available to shell hooks,
445 445
446 446 $ echo dsljfl > a
447 447 $ hg add a
448 448 $ hg ci -m a
449 449 $ hg debugnodemap --metadata
450 450 uid: ???????? (glob)
451 451 tip-rev: 5003
452 452 tip-node: a52c5079765b5865d97b993b303a18740113bbb2
453 453 data-length: 121088
454 454 data-unused: 0
455 455 data-unused: 0.000%
456 456 $ echo babar2 > babar
457 457 $ hg ci -m 'babar2' --config "hooks.pretxnclose.nodemap-test=hg debugnodemap --metadata"
458 458 uid: ???????? (glob)
459 459 tip-rev: 5004
460 460 tip-node: 2f5fb1c06a16834c5679d672e90da7c5f3b1a984
461 461 data-length: 121280 (pure !)
462 462 data-length: 121280 (rust !)
463 463 data-length: 121088 (no-pure no-rust !)
464 464 data-unused: 192 (pure !)
465 465 data-unused: 192 (rust !)
466 466 data-unused: 0 (no-pure no-rust !)
467 467 data-unused: 0.158% (pure !)
468 468 data-unused: 0.158% (rust !)
469 469 data-unused: 0.000% (no-pure no-rust !)
470 470 $ hg debugnodemap --metadata
471 471 uid: ???????? (glob)
472 472 tip-rev: 5004
473 473 tip-node: 2f5fb1c06a16834c5679d672e90da7c5f3b1a984
474 474 data-length: 121280 (pure !)
475 475 data-length: 121280 (rust !)
476 476 data-length: 121088 (no-pure no-rust !)
477 477 data-unused: 192 (pure !)
478 478 data-unused: 192 (rust !)
479 479 data-unused: 0 (no-pure no-rust !)
480 480 data-unused: 0.158% (pure !)
481 481 data-unused: 0.158% (rust !)
482 482 data-unused: 0.000% (no-pure no-rust !)
483 483
484 484 Another process does not see the pending nodemap content during run.
485 485
486 486 $ echo qpoasp > a
487 487 $ hg ci -m a2 \
488 488 > --config "hooks.pretxnclose=sh \"$RUNTESTDIR/testlib/wait-on-file\" 20 sync-repo-read sync-txn-pending" \
489 489 > --config "hooks.txnclose=touch sync-txn-close" > output.txt 2>&1 &
490 490
491 491 (read the repository while the commit transaction is pending)
492 492
493 493 $ sh "$RUNTESTDIR/testlib/wait-on-file" 20 sync-txn-pending && \
494 494 > hg debugnodemap --metadata && \
495 495 > sh "$RUNTESTDIR/testlib/wait-on-file" 20 sync-txn-close sync-repo-read
496 496 uid: ???????? (glob)
497 497 tip-rev: 5004
498 498 tip-node: 2f5fb1c06a16834c5679d672e90da7c5f3b1a984
499 499 data-length: 121280 (pure !)
500 500 data-length: 121280 (rust !)
501 501 data-length: 121088 (no-pure no-rust !)
502 502 data-unused: 192 (pure !)
503 503 data-unused: 192 (rust !)
504 504 data-unused: 0 (no-pure no-rust !)
505 505 data-unused: 0.158% (pure !)
506 506 data-unused: 0.158% (rust !)
507 507 data-unused: 0.000% (no-pure no-rust !)
508 508 $ hg debugnodemap --metadata
509 509 uid: ???????? (glob)
510 510 tip-rev: 5005
511 511 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
512 512 data-length: 121536 (pure !)
513 513 data-length: 121536 (rust !)
514 514 data-length: 121088 (no-pure no-rust !)
515 515 data-unused: 448 (pure !)
516 516 data-unused: 448 (rust !)
517 517 data-unused: 0 (no-pure no-rust !)
518 518 data-unused: 0.369% (pure !)
519 519 data-unused: 0.369% (rust !)
520 520 data-unused: 0.000% (no-pure no-rust !)
521 521
522 522 $ cat output.txt
523 523
524 524 Check that a failing transaction will properly revert the data
525 525
526 526 $ echo plakfe > a
527 527 $ f --size --sha256 .hg/store/00changelog-*.nd
528 528 .hg/store/00changelog-????????.nd: size=121536, sha256=bb414468d225cf52d69132e1237afba34d4346ee2eb81b505027e6197b107f03 (glob) (pure !)
529 529 .hg/store/00changelog-????????.nd: size=121536, sha256=909ac727bc4d1c0fda5f7bff3c620c98bd4a2967c143405a1503439e33b377da (glob) (rust !)
530 530 .hg/store/00changelog-????????.nd: size=121088, sha256=342d36d30d86dde67d3cb6c002606c4a75bcad665595d941493845066d9c8ee0 (glob) (no-pure no-rust !)
531 531 $ hg ci -m a3 --config "extensions.abort=$RUNTESTDIR/testlib/crash_transaction_late.py"
532 532 transaction abort!
533 533 rollback completed
534 534 abort: This is a late abort
535 535 [255]
536 536 $ hg debugnodemap --metadata
537 537 uid: ???????? (glob)
538 538 tip-rev: 5005
539 539 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
540 540 data-length: 121536 (pure !)
541 541 data-length: 121536 (rust !)
542 542 data-length: 121088 (no-pure no-rust !)
543 543 data-unused: 448 (pure !)
544 544 data-unused: 448 (rust !)
545 545 data-unused: 0 (no-pure no-rust !)
546 546 data-unused: 0.369% (pure !)
547 547 data-unused: 0.369% (rust !)
548 548 data-unused: 0.000% (no-pure no-rust !)
549 549 $ f --size --sha256 .hg/store/00changelog-*.nd
550 550 .hg/store/00changelog-????????.nd: size=121536, sha256=bb414468d225cf52d69132e1237afba34d4346ee2eb81b505027e6197b107f03 (glob) (pure !)
551 551 .hg/store/00changelog-????????.nd: size=121536, sha256=909ac727bc4d1c0fda5f7bff3c620c98bd4a2967c143405a1503439e33b377da (glob) (rust !)
552 552 .hg/store/00changelog-????????.nd: size=121088, sha256=342d36d30d86dde67d3cb6c002606c4a75bcad665595d941493845066d9c8ee0 (glob) (no-pure no-rust !)
553 553
554 554 Check that removing content does not confuse the nodemap
555 555 --------------------------------------------------------
556 556
557 557 removing data with rollback
558 558
559 559 $ echo aso > a
560 560 $ hg ci -m a4
561 561 $ hg rollback
562 562 repository tip rolled back to revision 5005 (undo commit)
563 563 working directory now based on revision 5005
564 564 $ hg id -r .
565 565 90d5d3ba2fc4 tip
566 566
567 567 removing data with strip
568 568
569 569 $ echo aso > a
570 570 $ hg ci -m a4
571 571 $ hg --config extensions.strip= strip -r . --no-backup
572 572 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
573 573 $ hg id -r . --traceback
574 574 90d5d3ba2fc4 tip
575 575
576 576 (be a good citizen and regenerate the nodemap)
577 577 $ hg debugupdatecaches
578 578 $ hg debugnodemap --metadata
579 579 uid: * (glob)
580 580 tip-rev: 5005
581 581 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
582 582 data-length: 121088
583 583 data-unused: 0
584 584 data-unused: 0.000%
585 585
586 586 Check race condition when multiple process write new data to the repository
587 587 ---------------------------------------------------------------------------
588 588
589 589 In this test, we check that two writers touching the repositories will not
590 590 overwrite each other data. This test is prompted by the existent of issue6554.
591 591 Where a writer ended up using and outdated docket to update the repository. See
592 592 the dedicated extension for details on the race windows and read/write schedule
593 593 necessary to end up in this situation: testlib/persistent-nodemap-race-ext.py
594 594
595 595 The issue was initially observed on a server with a high push trafic, but it
596 596 can be reproduced using a share and two commiting process which seems simpler.
597 597
598 598 The test is Rust only as the other implementation does not use the same
599 599 read/write patterns.
600 600
601 601 $ cd ..
602 602
603 603 #if rust
604 604
605 605 $ cp -R test-repo race-repo
606 606 $ hg share race-repo ./other-wc --config format.use-share-safe=yes
607 607 updating working directory
608 608 5001 files updated, 0 files merged, 0 files removed, 0 files unresolved
609 609 $ hg debugformat -R ./race-repo | egrep 'share-safe|persistent-nodemap'
610 610 share-safe: yes
611 611 persistent-nodemap: yes
612 612 $ hg debugformat -R ./other-wc/ | egrep 'share-safe|persistent-nodemap'
613 613 share-safe: yes
614 614 persistent-nodemap: yes
615 615 $ hg -R ./other-wc update 'min(head())'
616 616 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
617 617 $ hg -R ./race-repo debugnodemap --metadata
618 618 uid: 43c37dde
619 619 tip-rev: 5005
620 620 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
621 621 data-length: 121088
622 622 data-unused: 0
623 623 data-unused: 0.000%
624 624 $ hg -R ./race-repo log -G -r 'head()'
625 625 @ changeset: 5005:90d5d3ba2fc4
626 626 | tag: tip
627 627 ~ user: test
628 628 date: Thu Jan 01 00:00:00 1970 +0000
629 629 summary: a2
630 630
631 631 o changeset: 5001:16395c3cf7e2
632 632 | user: test
633 633 ~ date: Thu Jan 01 00:00:00 1970 +0000
634 634 summary: foo
635 635
636 636 $ hg -R ./other-wc log -G -r 'head()'
637 637 o changeset: 5005:90d5d3ba2fc4
638 638 | tag: tip
639 639 ~ user: test
640 640 date: Thu Jan 01 00:00:00 1970 +0000
641 641 summary: a2
642 642
643 643 @ changeset: 5001:16395c3cf7e2
644 644 | user: test
645 645 ~ date: Thu Jan 01 00:00:00 1970 +0000
646 646 summary: foo
647 647
648 648 $ echo left-side-race > race-repo/left-side-race
649 649 $ hg -R ./race-repo/ add race-repo/left-side-race
650 650
651 651 $ echo right-side-race > ./other-wc/right-side-race
652 652 $ hg -R ./other-wc/ add ./other-wc/right-side-race
653 653
654 654 $ mkdir sync-files
655 655 $ mkdir outputs
656 656 $ (
657 657 > hg -R ./race-repo/ commit -m left-side-commit \
658 658 > --config "extensions.race=${RUNTESTDIR}/testlib/persistent-nodemap-race-ext.py" \
659 659 > --config 'devel.nodemap-race.role=left';
660 660 > touch sync-files/left-done
661 661 > ) > outputs/left.txt 2>&1 &
662 662 $ (
663 663 > hg -R ./other-wc/ commit -m right-side-commit \
664 664 > --config "extensions.race=${RUNTESTDIR}/testlib/persistent-nodemap-race-ext.py" \
665 665 > --config 'devel.nodemap-race.role=right';
666 666 > touch sync-files/right-done
667 667 > ) > outputs/right.txt 2>&1 &
668 668 $ (
669 669 > hg -R ./race-repo/ check-nodemap-race \
670 670 > --config "extensions.race=${RUNTESTDIR}/testlib/persistent-nodemap-race-ext.py" \
671 671 > --config 'devel.nodemap-race.role=reader';
672 672 > touch sync-files/reader-done
673 673 > ) > outputs/reader.txt 2>&1 &
674 674 $ sh "$RUNTESTDIR"/testlib/wait-on-file 10 sync-files/left-done
675 675 $ cat outputs/left.txt
676 676 docket-details:
677 677 uid: 43c37dde
678 678 actual-tip: 5005
679 679 tip-rev: 5005
680 680 data-length: 121088
681 681 nodemap-race: left side locked and ready to commit
682 682 docket-details:
683 683 uid: 43c37dde
684 684 actual-tip: 5005
685 685 tip-rev: 5005
686 686 data-length: 121088
687 687 finalized changelog write
688 688 persisting changelog nodemap
689 689 new data start at 121088
690 690 persisted changelog nodemap
691 691 docket-details:
692 692 uid: 43c37dde
693 693 actual-tip: 5006
694 694 tip-rev: 5006
695 695 data-length: 121280
696 696 $ sh "$RUNTESTDIR"/testlib/wait-on-file 10 sync-files/right-done
697 697 $ cat outputs/right.txt
698 698 nodemap-race: right side start of the locking sequence
699 699 nodemap-race: right side reading changelog
700 700 nodemap-race: right side reading of changelog is done
701 701 docket-details:
702 702 uid: 43c37dde
703 703 actual-tip: 5006
704 704 tip-rev: 5005
705 705 data-length: 121088
706 706 nodemap-race: right side ready to wait for the lock
707 707 nodemap-race: right side locked and ready to commit
708 708 docket-details:
709 709 uid: 43c37dde
710 710 actual-tip: 5006
711 711 tip-rev: 5006
712 712 data-length: 121280
713 713 right ready to write, waiting for reader
714 714 right proceeding with writing its changelog index and nodemap
715 715 finalized changelog write
716 716 persisting changelog nodemap
717 717 new data start at 121280
718 718 persisted changelog nodemap
719 719 docket-details:
720 720 uid: 43c37dde
721 721 actual-tip: 5007
722 722 tip-rev: 5007
723 723 data-length: 121536
724 724 $ sh "$RUNTESTDIR"/testlib/wait-on-file 10 sync-files/reader-done
725 725 $ cat outputs/reader.txt
726 726 reader: reading changelog
727 727 reader ready to read the changelog, waiting for right
728 728 reader: nodemap docket read
729 729 record-data-length: 121280
730 730 actual-data-length: 121280
731 731 file-actual-length: 121536
732 732 reader: changelog read
733 733 docket-details:
734 734 uid: 43c37dde
735 735 actual-tip: 5006
736 736 tip-rev: 5006
737 737 data-length: 121280
738 738 tip-rev: 5006
739 739 tip-node: 492901161367
740 740 node-rev: 5006
741 741
742 742 $ hg -R ./race-repo log -G -r 'head()'
743 743 o changeset: 5007:ac4a2abde241
744 744 | tag: tip
745 745 ~ parent: 5001:16395c3cf7e2
746 746 user: test
747 747 date: Thu Jan 01 00:00:00 1970 +0000
748 748 summary: right-side-commit
749 749
750 750 @ changeset: 5006:492901161367
751 751 | user: test
752 752 ~ date: Thu Jan 01 00:00:00 1970 +0000
753 753 summary: left-side-commit
754 754
755 755 $ hg -R ./other-wc log -G -r 'head()'
756 756 @ changeset: 5007:ac4a2abde241
757 757 | tag: tip
758 758 ~ parent: 5001:16395c3cf7e2
759 759 user: test
760 760 date: Thu Jan 01 00:00:00 1970 +0000
761 761 summary: right-side-commit
762 762
763 763 o changeset: 5006:492901161367
764 764 | user: test
765 765 ~ date: Thu Jan 01 00:00:00 1970 +0000
766 766 summary: left-side-commit
767 767
768 768 #endif
769 769
770 770 Test upgrade / downgrade
771 771 ========================
772 772
773 773 $ cd ./test-repo/
774 774
775 775 downgrading
776 776
777 777 $ cat << EOF >> .hg/hgrc
778 778 > [format]
779 779 > use-persistent-nodemap=no
780 780 > EOF
781 781 $ hg debugformat -v
782 782 format-variant repo config default
783 783 fncache: yes yes yes
784 784 dirstate-v2: no no no
785 785 dotencode: yes yes yes
786 786 generaldelta: yes yes yes
787 787 share-safe: yes yes no
788 788 sparserevlog: yes yes yes
789 789 persistent-nodemap: yes no no
790 790 copies-sdc: no no no
791 791 revlog-v2: no no no
792 792 changelog-v2: no no no
793 793 plain-cl-delta: yes yes yes
794 794 compression: zlib zlib zlib (no-zstd !)
795 795 compression: zstd zstd zstd (zstd !)
796 796 compression-level: default default default
797 797 $ hg debugupgraderepo --run --no-backup --quiet
798 798 upgrade will perform the following actions:
799 799
800 800 requirements
801 801 preserved: dotencode, fncache, generaldelta, revlogv1, share-safe, sparserevlog, store (no-zstd no-dirstate-v2 !)
802 802 preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd no-dirstate-v2 !)
803 803 preserved: dotencode, exp-rc-dirstate-v2, fncache, generaldelta, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd dirstate-v2 !)
804 804 removed: persistent-nodemap
805 805
806 806 processed revlogs:
807 807 - all-filelogs
808 808 - changelog
809 809 - manifest
810 810
811 811 $ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
812 812 00changelog-*.nd (glob)
813 813 00manifest-*.nd (glob)
814 814 undo.backup.00changelog.n
815 815 undo.backup.00manifest.n
816 816 $ hg debugnodemap --metadata
817 817
818 818
819 819 upgrading
820 820
821 821 $ cat << EOF >> .hg/hgrc
822 822 > [format]
823 823 > use-persistent-nodemap=yes
824 824 > EOF
825 825 $ hg debugformat -v
826 826 format-variant repo config default
827 827 fncache: yes yes yes
828 828 dirstate-v2: no no no
829 829 dotencode: yes yes yes
830 830 generaldelta: yes yes yes
831 831 share-safe: yes yes no
832 832 sparserevlog: yes yes yes
833 833 persistent-nodemap: no yes no
834 834 copies-sdc: no no no
835 835 revlog-v2: no no no
836 836 changelog-v2: no no no
837 837 plain-cl-delta: yes yes yes
838 838 compression: zlib zlib zlib (no-zstd !)
839 839 compression: zstd zstd zstd (zstd !)
840 840 compression-level: default default default
841 841 $ hg debugupgraderepo --run --no-backup --quiet
842 842 upgrade will perform the following actions:
843 843
844 844 requirements
845 845 preserved: dotencode, fncache, generaldelta, revlogv1, share-safe, sparserevlog, store (no-zstd no-dirstate-v2 !)
846 846 preserved: dotencode, fncache, generaldelta, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd no-dirstate-v2 !)
847 847 preserved: dotencode, exp-rc-dirstate-v2, fncache, generaldelta, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd dirstate-v2 !)
848 848 added: persistent-nodemap
849 849
850 850 processed revlogs:
851 851 - all-filelogs
852 852 - changelog
853 853 - manifest
854 854
855 855 $ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
856 856 00changelog-*.nd (glob)
857 857 00changelog.n
858 858 00manifest-*.nd (glob)
859 859 00manifest.n
860 860 undo.backup.00changelog.n
861 861 undo.backup.00manifest.n
862 862
863 863 $ hg debugnodemap --metadata
864 864 uid: * (glob)
865 865 tip-rev: 5005
866 866 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
867 867 data-length: 121088
868 868 data-unused: 0
869 869 data-unused: 0.000%
870 870
871 871 Running unrelated upgrade
872 872
873 873 $ hg debugupgraderepo --run --no-backup --quiet --optimize re-delta-all
874 874 upgrade will perform the following actions:
875 875
876 876 requirements
877 877 preserved: dotencode, fncache, generaldelta, persistent-nodemap, revlogv1, share-safe, sparserevlog, store (no-zstd no-dirstate-v2 !)
878 878 preserved: dotencode, fncache, generaldelta, persistent-nodemap, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd no-dirstate-v2 !)
879 879 preserved: dotencode, exp-rc-dirstate-v2, fncache, generaldelta, persistent-nodemap, revlog-compression-zstd, revlogv1, share-safe, sparserevlog, store (zstd dirstate-v2 !)
880 880
881 881 optimisations: re-delta-all
882 882
883 883 processed revlogs:
884 884 - all-filelogs
885 885 - changelog
886 886 - manifest
887 887
888 888 $ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
889 889 00changelog-*.nd (glob)
890 890 00changelog.n
891 891 00manifest-*.nd (glob)
892 892 00manifest.n
893 893
894 894 $ hg debugnodemap --metadata
895 895 uid: * (glob)
896 896 tip-rev: 5005
897 897 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
898 898 data-length: 121088
899 899 data-unused: 0
900 900 data-unused: 0.000%
901 901
902 902 Persistent nodemap and local/streaming clone
903 903 ============================================
904 904
905 905 $ cd ..
906 906
907 907 standard clone
908 908 --------------
909 909
910 910 The persistent nodemap should exist after a streaming clone
911 911
912 912 $ hg clone --pull --quiet -U test-repo standard-clone
913 913 $ ls -1 standard-clone/.hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
914 914 00changelog-*.nd (glob)
915 915 00changelog.n
916 916 00manifest-*.nd (glob)
917 917 00manifest.n
918 918 $ hg -R standard-clone debugnodemap --metadata
919 919 uid: * (glob)
920 920 tip-rev: 5005
921 921 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
922 922 data-length: 121088
923 923 data-unused: 0
924 924 data-unused: 0.000%
925 925
926 926
927 927 local clone
928 928 ------------
929 929
930 930 The persistent nodemap should exist after a streaming clone
931 931
932 932 $ hg clone -U test-repo local-clone
933 933 $ ls -1 local-clone/.hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
934 934 00changelog-*.nd (glob)
935 935 00changelog.n
936 936 00manifest-*.nd (glob)
937 937 00manifest.n
938 938 $ hg -R local-clone debugnodemap --metadata
939 939 uid: * (glob)
940 940 tip-rev: 5005
941 941 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
942 942 data-length: 121088
943 943 data-unused: 0
944 944 data-unused: 0.000%
945 945
946 946 Test various corruption case
947 947 ============================
948 948
949 949 Missing datafile
950 950 ----------------
951 951
952 952 Test behavior with a missing datafile
953 953
954 954 $ hg clone --quiet --pull test-repo corruption-test-repo
955 955 $ ls -1 corruption-test-repo/.hg/store/00changelog*
956 956 corruption-test-repo/.hg/store/00changelog-*.nd (glob)
957 957 corruption-test-repo/.hg/store/00changelog.d
958 958 corruption-test-repo/.hg/store/00changelog.i
959 959 corruption-test-repo/.hg/store/00changelog.n
960 960 $ rm corruption-test-repo/.hg/store/00changelog*.nd
961 961 $ hg log -R corruption-test-repo -r .
962 962 changeset: 5005:90d5d3ba2fc4
963 963 tag: tip
964 964 user: test
965 965 date: Thu Jan 01 00:00:00 1970 +0000
966 966 summary: a2
967 967
968 968 $ ls -1 corruption-test-repo/.hg/store/00changelog*
969 969 corruption-test-repo/.hg/store/00changelog.d
970 970 corruption-test-repo/.hg/store/00changelog.i
971 971 corruption-test-repo/.hg/store/00changelog.n
972 972
973 973 Truncated data file
974 974 -------------------
975 975
976 976 Test behavior with a too short datafile
977 977
978 978 rebuild the missing data
979 979 $ hg -R corruption-test-repo debugupdatecache
980 980 $ ls -1 corruption-test-repo/.hg/store/00changelog*
981 981 corruption-test-repo/.hg/store/00changelog-*.nd (glob)
982 982 corruption-test-repo/.hg/store/00changelog.d
983 983 corruption-test-repo/.hg/store/00changelog.i
984 984 corruption-test-repo/.hg/store/00changelog.n
985 985
986 986 truncate the file
987 987
988 988 $ datafilepath=`ls corruption-test-repo/.hg/store/00changelog*.nd`
989 989 $ f -s $datafilepath
990 990 corruption-test-repo/.hg/store/00changelog-*.nd: size=121088 (glob)
991 $ dd if=$datafilepath bs=1000 count=10 of=$datafilepath-tmp status=noxfer
991 $ dd if=$datafilepath bs=1000 count=10 of=$datafilepath-tmp
992 992 10+0 records in
993 993 10+0 records out
994 * bytes * (glob)
994 995 $ mv $datafilepath-tmp $datafilepath
995 996 $ f -s $datafilepath
996 997 corruption-test-repo/.hg/store/00changelog-*.nd: size=10000 (glob)
997 998
998 999 Check that Mercurial reaction to this event
999 1000
1000 1001 $ hg -R corruption-test-repo log -r . --traceback
1001 1002 changeset: 5005:90d5d3ba2fc4
1002 1003 tag: tip
1003 1004 user: test
1004 1005 date: Thu Jan 01 00:00:00 1970 +0000
1005 1006 summary: a2
1006 1007
1007 1008
1008 1009
1009 1010 stream clone
1010 1011 ============
1011 1012
1012 1013 The persistent nodemap should exist after a streaming clone
1013 1014
1014 1015 Simple case
1015 1016 -----------
1016 1017
1017 1018 No race condition
1018 1019
1019 1020 $ hg clone -U --stream ssh://user@dummy/test-repo stream-clone --debug | egrep '00(changelog|manifest)'
1020 1021 adding [s] 00manifest.n (62 bytes)
1021 1022 adding [s] 00manifest-*.nd (118 KB) (glob)
1022 1023 adding [s] 00changelog.n (62 bytes)
1023 1024 adding [s] 00changelog-*.nd (118 KB) (glob)
1024 1025 adding [s] 00manifest.d (452 KB) (no-zstd !)
1025 1026 adding [s] 00manifest.d (491 KB) (zstd !)
1026 1027 adding [s] 00changelog.d (360 KB) (no-zstd !)
1027 1028 adding [s] 00changelog.d (368 KB) (zstd !)
1028 1029 adding [s] 00manifest.i (313 KB)
1029 1030 adding [s] 00changelog.i (313 KB)
1030 1031 $ ls -1 stream-clone/.hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)'
1031 1032 00changelog-*.nd (glob)
1032 1033 00changelog.n
1033 1034 00manifest-*.nd (glob)
1034 1035 00manifest.n
1035 1036 $ hg -R stream-clone debugnodemap --metadata
1036 1037 uid: * (glob)
1037 1038 tip-rev: 5005
1038 1039 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
1039 1040 data-length: 121088
1040 1041 data-unused: 0
1041 1042 data-unused: 0.000%
1042 1043
1043 1044 new data appened
1044 1045 -----------------
1045 1046
1046 1047 Other commit happening on the server during the stream clone
1047 1048
1048 1049 setup the step-by-step stream cloning
1049 1050
1050 1051 $ HG_TEST_STREAM_WALKED_FILE_1="$TESTTMP/sync_file_walked_1"
1051 1052 $ export HG_TEST_STREAM_WALKED_FILE_1
1052 1053 $ HG_TEST_STREAM_WALKED_FILE_2="$TESTTMP/sync_file_walked_2"
1053 1054 $ export HG_TEST_STREAM_WALKED_FILE_2
1054 1055 $ HG_TEST_STREAM_WALKED_FILE_3="$TESTTMP/sync_file_walked_3"
1055 1056 $ export HG_TEST_STREAM_WALKED_FILE_3
1056 1057 $ cat << EOF >> test-repo/.hg/hgrc
1057 1058 > [extensions]
1058 1059 > steps=$RUNTESTDIR/testlib/ext-stream-clone-steps.py
1059 1060 > EOF
1060 1061
1061 1062 Check and record file state beforehand
1062 1063
1063 1064 $ f --size test-repo/.hg/store/00changelog*
1064 1065 test-repo/.hg/store/00changelog-*.nd: size=121088 (glob)
1065 1066 test-repo/.hg/store/00changelog.d: size=376891 (zstd !)
1066 1067 test-repo/.hg/store/00changelog.d: size=368890 (no-zstd !)
1067 1068 test-repo/.hg/store/00changelog.i: size=320384
1068 1069 test-repo/.hg/store/00changelog.n: size=62
1069 1070 $ hg -R test-repo debugnodemap --metadata | tee server-metadata.txt
1070 1071 uid: * (glob)
1071 1072 tip-rev: 5005
1072 1073 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
1073 1074 data-length: 121088
1074 1075 data-unused: 0
1075 1076 data-unused: 0.000%
1076 1077
1077 1078 Prepare a commit
1078 1079
1079 1080 $ echo foo >> test-repo/foo
1080 1081 $ hg -R test-repo/ add test-repo/foo
1081 1082
1082 1083 Do a mix of clone and commit at the same time so that the file listed on disk differ at actual transfer time.
1083 1084
1084 1085 $ (hg clone -U --stream ssh://user@dummy/test-repo stream-clone-race-1 --debug 2>> clone-output | egrep '00(changelog|manifest)' >> clone-output; touch $HG_TEST_STREAM_WALKED_FILE_3) &
1085 1086 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1
1086 1087 $ hg -R test-repo/ commit -m foo
1087 1088 $ touch $HG_TEST_STREAM_WALKED_FILE_2
1088 1089 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3
1089 1090 $ cat clone-output
1090 1091 adding [s] 00manifest.n (62 bytes)
1091 1092 adding [s] 00manifest-*.nd (118 KB) (glob)
1092 1093 adding [s] 00changelog.n (62 bytes)
1093 1094 adding [s] 00changelog-*.nd (118 KB) (glob)
1094 1095 adding [s] 00manifest.d (452 KB) (no-zstd !)
1095 1096 adding [s] 00manifest.d (491 KB) (zstd !)
1096 1097 adding [s] 00changelog.d (360 KB) (no-zstd !)
1097 1098 adding [s] 00changelog.d (368 KB) (zstd !)
1098 1099 adding [s] 00manifest.i (313 KB)
1099 1100 adding [s] 00changelog.i (313 KB)
1100 1101
1101 1102 Check the result state
1102 1103
1103 1104 $ f --size stream-clone-race-1/.hg/store/00changelog*
1104 1105 stream-clone-race-1/.hg/store/00changelog-*.nd: size=121088 (glob)
1105 1106 stream-clone-race-1/.hg/store/00changelog.d: size=368890 (no-zstd !)
1106 1107 stream-clone-race-1/.hg/store/00changelog.d: size=376891 (zstd !)
1107 1108 stream-clone-race-1/.hg/store/00changelog.i: size=320384
1108 1109 stream-clone-race-1/.hg/store/00changelog.n: size=62
1109 1110
1110 1111 $ hg -R stream-clone-race-1 debugnodemap --metadata | tee client-metadata.txt
1111 1112 uid: * (glob)
1112 1113 tip-rev: 5005
1113 1114 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
1114 1115 data-length: 121088
1115 1116 data-unused: 0
1116 1117 data-unused: 0.000%
1117 1118
1118 1119 We get a usable nodemap, so no rewrite would be needed and the metadata should be identical
1119 1120 (ie: the following diff should be empty)
1120 1121
1121 1122 This isn't the case for the `no-rust` `no-pure` implementation as it use a very minimal nodemap implementation that unconditionnaly rewrite the nodemap "all the time".
1122 1123
1123 1124 #if no-rust no-pure
1124 1125 $ diff -u server-metadata.txt client-metadata.txt
1125 1126 --- server-metadata.txt * (glob)
1126 1127 +++ client-metadata.txt * (glob)
1127 1128 @@ -1,4 +1,4 @@
1128 1129 -uid: * (glob)
1129 1130 +uid: * (glob)
1130 1131 tip-rev: 5005
1131 1132 tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe
1132 1133 data-length: 121088
1133 1134 [1]
1134 1135 #else
1135 1136 $ diff -u server-metadata.txt client-metadata.txt
1136 1137 #endif
1137 1138
1138 1139
1139 1140 Clean up after the test.
1140 1141
1141 1142 $ rm -f "$HG_TEST_STREAM_WALKED_FILE_1"
1142 1143 $ rm -f "$HG_TEST_STREAM_WALKED_FILE_2"
1143 1144 $ rm -f "$HG_TEST_STREAM_WALKED_FILE_3"
1144 1145
1145 1146 full regeneration
1146 1147 -----------------
1147 1148
1148 1149 A full nodemap is generated
1149 1150
1150 1151 (ideally this test would append enough data to make sure the nodemap data file
1151 1152 get changed, however to make thing simpler we will force the regeneration for
1152 1153 this test.
1153 1154
1154 1155 Check the initial state
1155 1156
1156 1157 $ f --size test-repo/.hg/store/00changelog*
1157 1158 test-repo/.hg/store/00changelog-*.nd: size=121344 (glob) (rust !)
1158 1159 test-repo/.hg/store/00changelog-*.nd: size=121344 (glob) (pure !)
1159 1160 test-repo/.hg/store/00changelog-*.nd: size=121152 (glob) (no-rust no-pure !)
1160 1161 test-repo/.hg/store/00changelog.d: size=376950 (zstd !)
1161 1162 test-repo/.hg/store/00changelog.d: size=368949 (no-zstd !)
1162 1163 test-repo/.hg/store/00changelog.i: size=320448
1163 1164 test-repo/.hg/store/00changelog.n: size=62
1164 1165 $ hg -R test-repo debugnodemap --metadata | tee server-metadata-2.txt
1165 1166 uid: * (glob)
1166 1167 tip-rev: 5006
1167 1168 tip-node: ed2ec1eef9aa2a0ec5057c51483bc148d03e810b
1168 1169 data-length: 121344 (rust !)
1169 1170 data-length: 121344 (pure !)
1170 1171 data-length: 121152 (no-rust no-pure !)
1171 1172 data-unused: 192 (rust !)
1172 1173 data-unused: 192 (pure !)
1173 1174 data-unused: 0 (no-rust no-pure !)
1174 1175 data-unused: 0.158% (rust !)
1175 1176 data-unused: 0.158% (pure !)
1176 1177 data-unused: 0.000% (no-rust no-pure !)
1177 1178
1178 1179 Performe the mix of clone and full refresh of the nodemap, so that the files
1179 1180 (and filenames) are different between listing time and actual transfer time.
1180 1181
1181 1182 $ (hg clone -U --stream ssh://user@dummy/test-repo stream-clone-race-2 --debug 2>> clone-output-2 | egrep '00(changelog|manifest)' >> clone-output-2; touch $HG_TEST_STREAM_WALKED_FILE_3) &
1182 1183 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1
1183 1184 $ rm test-repo/.hg/store/00changelog.n
1184 1185 $ rm test-repo/.hg/store/00changelog-*.nd
1185 1186 $ hg -R test-repo/ debugupdatecache
1186 1187 $ touch $HG_TEST_STREAM_WALKED_FILE_2
1187 1188 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3
1188 1189
1189 1190 (note: the stream clone code wronly pick the `undo.` files)
1190 1191
1191 1192 $ cat clone-output-2
1192 1193 adding [s] undo.backup.00manifest.n (62 bytes) (known-bad-output !)
1193 1194 adding [s] undo.backup.00changelog.n (62 bytes) (known-bad-output !)
1194 1195 adding [s] 00manifest.n (62 bytes)
1195 1196 adding [s] 00manifest-*.nd (118 KB) (glob)
1196 1197 adding [s] 00changelog.n (62 bytes)
1197 1198 adding [s] 00changelog-*.nd (118 KB) (glob)
1198 1199 adding [s] 00manifest.d (492 KB) (zstd !)
1199 1200 adding [s] 00manifest.d (452 KB) (no-zstd !)
1200 1201 adding [s] 00changelog.d (360 KB) (no-zstd !)
1201 1202 adding [s] 00changelog.d (368 KB) (zstd !)
1202 1203 adding [s] 00manifest.i (313 KB)
1203 1204 adding [s] 00changelog.i (313 KB)
1204 1205
1205 1206 Check the result.
1206 1207
1207 1208 $ f --size stream-clone-race-2/.hg/store/00changelog*
1208 1209 stream-clone-race-2/.hg/store/00changelog-*.nd: size=121344 (glob) (rust !)
1209 1210 stream-clone-race-2/.hg/store/00changelog-*.nd: size=121344 (glob) (pure !)
1210 1211 stream-clone-race-2/.hg/store/00changelog-*.nd: size=121152 (glob) (no-rust no-pure !)
1211 1212 stream-clone-race-2/.hg/store/00changelog.d: size=376950 (zstd !)
1212 1213 stream-clone-race-2/.hg/store/00changelog.d: size=368949 (no-zstd !)
1213 1214 stream-clone-race-2/.hg/store/00changelog.i: size=320448
1214 1215 stream-clone-race-2/.hg/store/00changelog.n: size=62
1215 1216
1216 1217 $ hg -R stream-clone-race-2 debugnodemap --metadata | tee client-metadata-2.txt
1217 1218 uid: * (glob)
1218 1219 tip-rev: 5006
1219 1220 tip-node: ed2ec1eef9aa2a0ec5057c51483bc148d03e810b
1220 1221 data-length: 121344 (rust !)
1221 1222 data-unused: 192 (rust !)
1222 1223 data-unused: 0.158% (rust !)
1223 1224 data-length: 121152 (no-rust no-pure !)
1224 1225 data-unused: 0 (no-rust no-pure !)
1225 1226 data-unused: 0.000% (no-rust no-pure !)
1226 1227 data-length: 121344 (pure !)
1227 1228 data-unused: 192 (pure !)
1228 1229 data-unused: 0.158% (pure !)
1229 1230
1230 1231 We get a usable nodemap, so no rewrite would be needed and the metadata should be identical
1231 1232 (ie: the following diff should be empty)
1232 1233
1233 1234 This isn't the case for the `no-rust` `no-pure` implementation as it use a very minimal nodemap implementation that unconditionnaly rewrite the nodemap "all the time".
1234 1235
1235 1236 #if no-rust no-pure
1236 1237 $ diff -u server-metadata-2.txt client-metadata-2.txt
1237 1238 --- server-metadata-2.txt * (glob)
1238 1239 +++ client-metadata-2.txt * (glob)
1239 1240 @@ -1,4 +1,4 @@
1240 1241 -uid: * (glob)
1241 1242 +uid: * (glob)
1242 1243 tip-rev: 5006
1243 1244 tip-node: ed2ec1eef9aa2a0ec5057c51483bc148d03e810b
1244 1245 data-length: 121152
1245 1246 [1]
1246 1247 #else
1247 1248 $ diff -u server-metadata-2.txt client-metadata-2.txt
1248 1249 #endif
1249 1250
1250 1251 Clean up after the test
1251 1252
1252 1253 $ rm -f $HG_TEST_STREAM_WALKED_FILE_1
1253 1254 $ rm -f $HG_TEST_STREAM_WALKED_FILE_2
1254 1255 $ rm -f $HG_TEST_STREAM_WALKED_FILE_3
1255 1256
General Comments 0
You need to be logged in to leave comments. Login now