Mercurial > hg-stable
changeset 50313:b0cdd0bea103 stable
revlog: test possible read race condition with splitting
This is currently working fine, but could break with another approach (for
example, with the one we are about to use in the next changesets…)
So we make sure the case is covered.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 17 Mar 2023 02:46:51 +0100 |
parents | c185545a4c69 |
children | 6487737e0f00 |
files | tests/test-transaction-rollback-on-revlog-split.t |
diffstat | 1 files changed, 59 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/test-transaction-rollback-on-revlog-split.t Thu Mar 16 21:04:52 2023 +0100 +++ b/tests/test-transaction-rollback-on-revlog-split.t Fri Mar 17 02:46:51 2023 +0100 @@ -40,6 +40,24 @@ > os.kill(os.getpid(), signal.SIGKILL) > EOF + $ cat > $TESTTMP/reader_wait_split.py << EOF + > import os + > import signal + > from mercurial import extensions, revlog, testing + > def _wait_post_load(orig, self, *args, **kwargs): + > wait = b'data/file' in self.radix + > if wait: + > testing.wait_file(b"$TESTTMP/writer-revlog-split") + > r = orig(self, *args, **kwargs) + > if wait: + > testing.write_file(b"$TESTTMP/reader-index-read") + > testing.wait_file(b"$TESTTMP/writer-revlog-unsplit") + > return r + > + > def extsetup(ui): + > extensions.wrapfunction(revlog.revlog, '_loadindex', _wait_post_load) + > EOF + setup a repository for tests ---------------------------- @@ -333,3 +351,44 @@ hint: run "hg debugrebuildfncache" to recover from corrupt fncache $ cd .. +Read race +========= + +We check that a client that started reading a revlog (its index) after the +split and end reading (the data) after the rollback should be fine + + $ hg clone --quiet --rev 1 troffset-computation troffset-computation-race + $ cd troffset-computation-race + $ cat > .hg/hgrc <<EOF + > [hooks] + > pretxnchangegroup=$RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/reader-index-read $TESTTMP/writer-revlog-split + > pretxnclose = false + > EOF + +start a reader + + $ hg cat --rev 0 file \ + > --config "extensions.wait_read=$TESTTMP/reader_wait_split.py" \ + > 2> $TESTTMP/reader.stderr \ + > > $TESTTMP/reader.stdout & + +Do a failed pull in // + + $ hg pull ../troffset-computation + pulling from ../troffset-computation + searching for changes + adding changesets + adding manifests + adding file changes + transaction abort! + rollback completed + abort: pretxnclose hook exited with status 1 + [40] + $ touch $TESTTMP/writer-revlog-unsplit + $ wait + +The reader should be fine + $ cat $TESTTMP/reader.stderr + $ cat $TESTTMP/reader.stdout + 1 (no-eol) + $ cd ..