Mercurial > hg
view tests/test-transaction-wc-rollback-race.t @ 51977:42a116f1cdc1
branchmap-v3: introduce a "stop_rev" argument to `headsrevs`
The `headsrevs` method of the revlog already have a `revs` argument to compute
the headrevs of a limited set of heads. However, it disable the use of the
native compiled code to compute the heads, which slows down the branchmap v3
code a lot.
The branchmap v3 usage is actually quite constrained as we will always only
ignores a part at the top of the graph. So we could be significantly faster.
We start by making small change to the python side to improve the situation and
introduce the new API. More collaboration with the native code are coming later.
This massively speedup operation and close most of the remaining gaps between
branchmap-v3 and branchmap-v2. especially on repository with many revs like
mozilla-try. A small overhead remains mostly because the `headrevs` logic
currently has some inefficiently. We will look into them from there.
### benchmark.name = hg.command.unbundle
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = disabled
# benchmark.variants.resource-usage = default
# benchmark.variants.reuse-external-delta-parent = yes
# benchmark.variants.revs = any-1-extra-rev
# benchmark.variants.source = unbundle
# benchmark.variants.validate = default
# benchmark.variants.verbosity = quiet
## data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.233711 ~~~~~
branch-v3 before: 0.368769 (+57.79%, +0.14)
branch-v3 after: 0.239857 (+2.63%, +0.01)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.235230 ~~~~~
branch-v3 before: 0.372460 (+58.34%, +0.14)
branch-v3 after: 0.240972 (+2.44%, +0.01)
## data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.255586 ~~~~~
branch-v3 before: 0.318907 (+24.78%, +0.06)
branch-v3 after: 0.268560 (+5.08%, +0.01)
## data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.339010 ~~~~~
branch-v3 before: 0.349752 (+3.17%, +0.01)
branch-v3 after: 0.349389 (+3.06%, +0.01)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.346525 ~~~~~
branch-v3 before: 0.354300 (+2.24%, +0.01)
branch-v3 after: 0.355661 (+2.64%, +0.01)
## data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.380202 ~~~~~
branch-v3 before: 0.396293 (+4.23%, +0.02)
branch-v3 after: 0.408851 (+7.54%, +0.03)
## data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.412165 ~~~~~
branch-v3 before: 0.424769 (+3.06%, +0.01)
branch-v3 after: 0.427782 (+3.79%, +0.02)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.412397 ~~~~~
branch-v3 before: 0.421796 (+2.28%, +0.01)
branch-v3 after: 0.422354 (+2.41%, +0.01)
## data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.429501 ~~~~~
branch-v3 before: 0.443849 (+3.34%, +0.01)
branch-v3 after: 0.443197 (+3.19%, +0.01)
## data-env-vars.name = mozilla-try-2024-03-26-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 3.403171 ~~~~~
branch-v3 before: 6.234055 (+83.18%, +2.83)
branch-v3 after: 3.819477 (+12.23%, +0.42)
# bin-env-vars.hg.flavor = rust
branch-v2: 3.454876 ~~~~~
branch-v3 before: 6.307813 (+82.58%, +2.85)
branch-v3 after: 3.590284 (+3.92%, +0.14)
## data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 3.465435 ~~~~~
branch-v3 before: 5.176076 (+49.36%, +1.71)
branch-v3 after: 3.633278 (+4.84%, +0.17)
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 03 Sep 2024 11:11:17 +0200 |
parents | d7e61891ab5a |
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' = =