tests/test-clone-stream-revlog-split.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 29 May 2023 14:07:58 +0200
changeset 50640 9caa860dcbec
parent 50626 9b0fe2b075b5
child 50641 5460424092e2
permissions -rw-r--r--
stream-clone: implement decidated `get_streams` method for revlog For revlog, we can do better using the maximum linkrev expected. This approach open the way to dealing with a much larger set of non-trivial changes, like splitting of inline revlogs. We will actually tackle this issue in the next changesets (thanks to this one).

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: expected 0 bytes but 1067 provided for data/some-file.d (known-bad-output !)
  abort: pull failed on remote (known-bad-output !)
  $ tail -2 errors.log
  mercurial.error.Abort: expected 0 bytes but 1067 provided for data/some-file.d (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]