Mercurial > hg
view tests/test-transaction-wc-rollback-race.t @ 51946:d7e61891ab5a
tests: stabilize `test-transaction-wc-rollback-race.t` on Windows
MSYS has a tendency to munge C:\Dir\SubDir\File into C:DirSubDirFile unless it
is quoted, and that's what was happening here- there were a lot of these
failures:
file not created after 5 seconds: $TESTTMP/transaction-waiting
I suspect quoting is only needed in the hook script that is generated (the
catting of the log file pointed me in the right direction here), but I missed a
spot and trial and error got me here. The quoting elsewhere doesn't harm
anything and it was taking 7+ minutes to run this test when things were timing
out, so I don't feel like reducing the quoting to the minimum required.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 02 Oct 2024 18:19:59 -0400 |
parents | 596a6b9b0570 |
children |
line wrap: on
line source
======================================================================= Check potential race condition around transaction and working copy data ======================================================================= #testcases bookmarks-in-store bookmarks-wc-level The transaction is garanteed to run with the lock, but may runs without the wlock. So if the transaction backup/restore some content related to the working-copy and protected by the wlock, we might run into trouble if another process grab the wlock and modify them. This test file is testing various cases where such parallel changes happens to validate the transaction behavior. Other is used to get a simple pull source. As pull is a simple way to create transaction without the wlock. Setup ===== Avoid long deadlock $ cat << EOF >> $HGRCPATH > [ui] > timeout=10 > EOF #if bookmarks-in-store $ cat << EOF >> $HGRCPATH > [format] > bookmarks-in-store = yes > EOF #endif $ hg init repo $ cd repo $ for filename in a b c d e f g h i j k l m; do > echo $filename > default_$filename > hg add default_$filename > hg commit --quiet --message default_$filename > done $ hg bookmark --rev . foo $ hg branch babar marked working directory as branch babar (branches are permanent and global, did you want a bookmark?) $ for filename in a b c d e f g h i j k l m; do > echo $filename > babar_$filename > hg add babar_$filename > hg commit --quiet --message babar_$filename > done $ hg bookmark --rev . bar $ hg up 'desc("default_m")' 0 files updated, 0 files merged, 13 files removed, 0 files unresolved $ hg log -G -T '[{branch}] ({bookmarks}) {desc}\n' o [babar] (bar) babar_m | o [babar] () babar_l | o [babar] () babar_k | o [babar] () babar_j | o [babar] () babar_i | o [babar] () babar_h | o [babar] () babar_g | o [babar] () babar_f | o [babar] () babar_e | o [babar] () babar_d | o [babar] () babar_c | o [babar] () babar_b | o [babar] () babar_a | @ [default] (foo) default_m | o [default] () default_l | o [default] () default_k | o [default] () default_j | o [default] () default_i | o [default] () default_h | o [default] () default_g | o [default] () default_f | o [default] () default_e | o [default] () default_d | o [default] () default_c | o [default] () default_b | o [default] () default_a $ cat << EOF >> ../txn-close.sh > rm -f "$TESTTMP/transaction-continue" > "$RUNTESTDIR/testlib/wait-on-file" 5 "$TESTTMP/transaction-continue" "$TESTTMP/transaction-waiting" > rm -f "$TESTTMP/transaction-waiting" > exit 1 > EOF $ cat << EOF >> .hg/hgrc > [hooks] > pretxnclose.test = sh "$TESTTMP/txn-close.sh" > EOF Check the overall logic is working, the transaction is holding the `lock` , but not the `wlock`, then get aborted on a signal-file. $ hg phase --rev 0 0: draft $ hg phase --public --rev 0 2> ../log.err & $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/transaction-waiting $ echo y | hg --config ui.interactive=yes debuglock --set-wlock ready to release the lock (y)? y $ echo y | hg --config ui.interactive=yes debuglock --set-lock abort: lock is already held [255] $ touch "$TESTTMP/transaction-continue" $ wait $ hg phase --rev 0 0: draft $ cat ../log.err abort: pretxnclose.test hook exited with status 1 Actual testing ============== Changing tracked file --------------------- $ hg status $ hg phase --public --rev 0 2> ../log.err & $ "$RUNTESTDIR/testlib/wait-on-file" 5 "$TESTTMP/transaction-waiting" $ hg forget default_a $ hg status R default_a $ touch "$TESTTMP/transaction-continue" $ wait $ hg status R default_a $ hg revert --all --quiet Changing branch from default ---------------------------- $ hg branch default $ hg phase --public --rev 0 2> ../log.err & $ "$RUNTESTDIR/testlib/wait-on-file" 5 "$TESTTMP/transaction-waiting" $ hg branch celeste marked working directory as branch celeste $ hg branch celeste $ touch "$TESTTMP/transaction-continue" $ wait $ hg branch celeste Changing branch from another one -------------------------------- $ hg up babar --quiet $ hg branch babar $ hg phase --public --rev 0 2> ../log.err & $ "$RUNTESTDIR/testlib/wait-on-file" 5 "$TESTTMP/transaction-waiting" $ hg branch celeste marked working directory as branch celeste $ hg branch celeste $ touch "$TESTTMP/transaction-continue" $ wait $ hg branch celeste updating working copy --------------------- $ hg st $ hg log --rev . -T '{desc}\n' babar_m $ hg phase --public --rev 0 2> ../log.err & $ $RUNTESTDIR/testlib/wait-on-file 5 "$TESTTMP/transaction-waiting" $ hg update "parents(.)" --quiet $ hg log --rev . -T '{desc}\n' babar_l $ hg st $ touch "$TESTTMP/transaction-continue" $ wait $ hg log --rev . -T '{desc}\n' babar_l $ hg st $ hg purge --no-confirm $ hg up --quiet babar Activating a bookmark --------------------- (without going through the bookmark command) Show the activation/desactivation pattern that exist without taking the store lock. $ hg log -r . -T '= {activebookmark} =\n' = = $ hg up bar 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (activating bookmark bar) $ hg log -r . -T '= {activebookmark} =\n' = bar = $ hg up . 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (leaving bookmark bar) $ hg log -r . -T '= {activebookmark} =\n' = = Activating the bookmark during a transaction $ hg up . --quiet $ hg log -r . -T '= {activebookmark} =\n' = = $ hg phase --public --rev 0 2> ../log.err & $ $RUNTESTDIR/testlib/wait-on-file 5 "$TESTTMP/transaction-waiting" $ hg up bar 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (activating bookmark bar) $ hg log -r . -T '= {activebookmark} =\n' = bar = $ touch "$TESTTMP/transaction-continue" $ wait $ hg log -r . -T '= {activebookmark} =\n' = bar = Deactivating the bookmark $ hg up bar --quiet $ hg log -r . -T '= {activebookmark} =\n' = bar = $ hg phase --public --rev 0 2> ../log.err & $ $RUNTESTDIR/testlib/wait-on-file 5 "$TESTTMP/transaction-waiting" $ hg up . 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (leaving bookmark bar) $ hg log -r . -T '= {activebookmark} =\n' = = $ touch "$TESTTMP/transaction-continue" $ wait $ hg log -r . -T '= {activebookmark} =\n' = =