# HG changeset patch # User Pierre-Yves David # Date 1685319740 -7200 # Node ID 9b0fe2b075b563f91919b57d64470ec143edba5b # Parent 1a554956af84100e7d5d97a3cf65675a5bc7b5a2 stream-clone: add a test that highlight crash on revlog splitting This has been a long running problem, we should have a tests for it. diff -r 1a554956af84 -r 9b0fe2b075b5 tests/test-clone-stream-revlog-split.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-clone-stream-revlog-split.t Mon May 29 02:22:20 2023 +0200 @@ -0,0 +1,150 @@ +Test stream cloning while a revlog split happens +------------------------------------------------ + +#testcases stream-bundle2-v2 stream-bundle2-v3 + +#if stream-bundle2-v3 + $ cat << EOF >> $HGRCPATH + > [experimental] + > stream-v3 = yes + > EOF +#endif + +setup a repository for tests +---------------------------- + + $ cat >> $HGRCPATH << EOF + > [format] + > # skip compression to make it easy to trigger a split + > revlog-compression=none + > EOF + + $ hg init server + $ cd server + $ file="some-file" + $ printf '%20d' '1' > $file + $ hg commit -Aqma + $ printf '%1024d' '1' > $file + $ hg commit -Aqmb + $ printf '%20d' '1' > $file + $ hg commit -Aqmc + +check the revlog is inline + + $ f -s .hg/store/data/some-file* + .hg/store/data/some-file.i: size=1259 + $ hg debug-revlog-index some-file + rev linkrev nodeid p1-nodeid p2-nodeid + 0 0 ed70cecbc103 000000000000 000000000000 + 1 1 7241018db64c ed70cecbc103 000000000000 + 2 2 fa1120531cc1 7241018db64c 000000000000 + $ cd .. + +setup synchronisation file + + $ HG_TEST_STREAM_WALKED_FILE_1="$TESTTMP/sync_file_walked_1" + $ export HG_TEST_STREAM_WALKED_FILE_1 + $ HG_TEST_STREAM_WALKED_FILE_2="$TESTTMP/sync_file_walked_2" + $ export HG_TEST_STREAM_WALKED_FILE_2 + $ HG_TEST_STREAM_WALKED_FILE_3="$TESTTMP/sync_file_walked_3" + $ export HG_TEST_STREAM_WALKED_FILE_3 + + +Test stream-clone raced by a revlog-split +========================================= + +Test stream-clone where the file is split right after the lock section is done + +Start the server + + $ hg serve -R server \ + > -p $HGPORT1 -d --error errors.log --pid-file=hg.pid \ + > --config extensions.stream_steps="$RUNTESTDIR/testlib/ext-stream-clone-steps.py" + $ cat hg.pid >> $DAEMON_PIDS + +Start a client doing a streaming clone + + $ (hg clone -q --stream -U http://localhost:$HGPORT1 clone-while-split > client.log 2>&1; touch "$HG_TEST_STREAM_WALKED_FILE_3") & + +Wait for the server to be done collecting data + + $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1 + +trigger a split + + $ dd if=/dev/zero of=server/$file bs=1k count=128 > /dev/null 2>&1 + $ hg -R server ci -m "triggering a split" --config ui.timeout.warn=-1 + +unlock the stream generation + + $ touch $HG_TEST_STREAM_WALKED_FILE_2 + +wait for the client to be done cloning. + + $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3 + +Check everything is fine + + $ cat client.log + remote: abort: unexpected error: clone could only read 256 bytes from data/some-file.i, but expected 1259 bytes (known-bad-output !) + abort: pull failed on remote (known-bad-output !) + $ tail -2 errors.log + mercurial.error.Abort: clone could only read 256 bytes from data/some-file.i, but expected 1259 bytes (known-bad-output !) + (known-bad-output !) + $ hg -R clone-while-split verify + checking changesets (missing-correct-output !) + checking manifests (missing-correct-output !) + crosschecking files in changesets and manifests (missing-correct-output !) + checking files (missing-correct-output !) + checking dirstate (missing-correct-output !) + checked 3 changesets with 3 changes to 1 files (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255] + $ hg -R clone-while-split tip + changeset: 2:dbd9854c38a6 (missing-correct-output !) + tag: tip (missing-correct-output !) + user: test (missing-correct-output !) + date: Thu Jan 01 00:00:00 1970 +0000 (missing-correct-output !) + summary: c (missing-correct-output !) + (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255] + $ hg -R clone-while-split debug-revlog-index some-file + rev linkrev nodeid p1-nodeid p2-nodeid (missing-correct-output !) + 0 0 ed70cecbc103 000000000000 000000000000 (missing-correct-output !) + 1 1 7241018db64c ed70cecbc103 000000000000 (missing-correct-output !) + 2 2 fa1120531cc1 7241018db64c 000000000000 (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255] + +subsequent pull work + + $ hg -R clone-while-split pull + pulling from http://localhost:$HGPORT1/ (missing-correct-output !) + searching for changes (missing-correct-output !) + adding changesets (missing-correct-output !) + adding manifests (missing-correct-output !) + adding file changes (missing-correct-output !) + added 1 changesets with 1 changes to 1 files (missing-correct-output !) + new changesets df05c6cb1406 (missing-correct-output !) + (run 'hg update' to get a working copy) (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255] + + $ hg -R clone-while-split debug-revlog-index some-file + rev linkrev nodeid p1-nodeid p2-nodeid (missing-correct-output !) + 0 0 ed70cecbc103 000000000000 000000000000 (missing-correct-output !) + 1 1 7241018db64c ed70cecbc103 000000000000 (missing-correct-output !) + 2 2 fa1120531cc1 7241018db64c 000000000000 (missing-correct-output !) + 3 3 a631378adaa3 fa1120531cc1 000000000000 (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255] + $ hg -R clone-while-split verify + checking changesets (missing-correct-output !) + checking manifests (missing-correct-output !) + crosschecking files in changesets and manifests (missing-correct-output !) + checking files (missing-correct-output !) + checking dirstate (missing-correct-output !) + checked 4 changesets with 4 changes to 1 files (missing-correct-output !) + abort: repository clone-while-split not found (known-bad-output !) + [255]