test-transaction-safety.t
287 lines
| 6.3 KiB
| text/troff
|
Tads3Lexer
/ tests / test-transaction-safety.t
r48010 | Test transaction safety | |||
======================= | ||||
r48037 | #testcases revlogv1 revlogv2 changelogv2 | |||
r48011 | ||||
#if revlogv1 | ||||
$ cat << EOF >> $HGRCPATH | ||||
> [experimental] | ||||
> revlogv2=no | ||||
> EOF | ||||
#endif | ||||
#if revlogv2 | ||||
$ cat << EOF >> $HGRCPATH | ||||
> [experimental] | ||||
> revlogv2=enable-unstable-format-and-corrupt-my-data | ||||
> EOF | ||||
#endif | ||||
r48037 | #if changelogv2 | |||
$ cat << EOF >> $HGRCPATH | ||||
> [format] | ||||
> exp-use-changelog-v2=enable-unstable-format-and-corrupt-my-data | ||||
> EOF | ||||
#endif | ||||
r48010 | This test basic case to make sure external process do not see transaction | |||
content until it is committed. | ||||
# TODO: also add an external reader accessing revlog files while they are written | ||||
# (instead of during transaction finalisation) | ||||
# TODO: also add stream clone and hardlink clone happening during these transaction. | ||||
setup | ||||
----- | ||||
r48585 | synchronisation+output script using the following schedule: | |||
[A1] "external" is started | ||||
[A2] "external" waits on EXT_UNLOCK | ||||
[A2] "external" + creates EXT_WAITING → unlocks [C1] | ||||
[B1] "hg commit/pull" is started | ||||
[B2] "hg commit/pull" is ready to be committed | ||||
[B3] "hg commit/pull" spawn "internal" using a pretxnclose hook (need [C4]) | ||||
[C1] "internal" waits on EXT_WAITING (need [A2]) | ||||
r48586 | [C2] "internal" creates EXT_UNLOCK → unlocks [A2] | |||
[C3] "internal" show the tipmost revision (inside of the transaction) | ||||
[C4] "internal" waits on EXT_DONE (need [A4]) | ||||
r48585 | [A3] "external" show the tipmost revision (outside of the transaction) | |||
r48586 | [A4] "external" creates EXT_DONE → unlocks [C4] | |||
[C5] "internal" end of execution -> unlock [B3] | ||||
r48585 | [B4] "hg commit/pull" transaction is committed on disk | |||
r48010 | ||||
$ mkdir sync | ||||
$ mkdir output | ||||
$ mkdir script | ||||
$ HG_TEST_FILE_EXT_WAITING=$TESTTMP/sync/ext_waiting | ||||
$ export HG_TEST_FILE_EXT_WAITING | ||||
$ HG_TEST_FILE_EXT_UNLOCK=$TESTTMP/sync/ext_unlock | ||||
$ export HG_TEST_FILE_EXT_UNLOCK | ||||
$ HG_TEST_FILE_EXT_DONE=$TESTTMP/sync/ext_done | ||||
$ export HG_TEST_FILE_EXT_DONE | ||||
$ cat << EOF > script/external.sh | ||||
> #!/bin/sh | ||||
Matt Harbison
|
r48094 | > "$RUNTESTDIR/testlib/wait-on-file" 5 "$HG_TEST_FILE_EXT_UNLOCK" "$HG_TEST_FILE_EXT_WAITING" | ||
> hg log --rev 'tip' -T 'external: {rev} {desc}\n' > "$TESTTMP/output/external.out" | ||||
> touch "$HG_TEST_FILE_EXT_DONE" | ||||
r48010 | > EOF | |||
$ cat << EOF > script/internal.sh | ||||
> #!/bin/sh | ||||
r48585 | > "$RUNTESTDIR/testlib/wait-on-file" 5 "$HG_TEST_FILE_EXT_WAITING" | |||
r48586 | > touch "$HG_TEST_FILE_EXT_UNLOCK" | |||
Matt Harbison
|
r48094 | > hg log --rev 'tip' -T 'internal: {rev} {desc}\n' > "$TESTTMP/output/internal.out" | ||
r48586 | > "$RUNTESTDIR/testlib/wait-on-file" 5 "$HG_TEST_FILE_EXT_DONE" | |||
r48010 | > EOF | |||
Automated commands: | ||||
$ make_one_commit() { | ||||
> rm -f $TESTTMP/sync/* | ||||
> rm -f $TESTTMP/output/* | ||||
> hg log --rev 'tip' -T 'pre-commit: {rev} {desc}\n' | ||||
r52072 | > echo x >> of | |||
Matt Harbison
|
r48094 | > sh $TESTTMP/script/external.sh & hg commit -m "$1" | ||
r48010 | > cat $TESTTMP/output/external.out | |||
> cat $TESTTMP/output/internal.out | ||||
> hg log --rev 'tip' -T 'post-tr: {rev} {desc}\n' | ||||
> } | ||||
$ make_one_pull() { | ||||
> rm -f $TESTTMP/sync/* | ||||
> rm -f $TESTTMP/output/* | ||||
> hg log --rev 'tip' -T 'pre-commit: {rev} {desc}\n' | ||||
r52072 | > echo x >> of | |||
Matt Harbison
|
r48094 | > sh $TESTTMP/script/external.sh & hg pull ../other-repo/ --rev "$1" --force --quiet | ||
r48010 | > cat $TESTTMP/output/external.out | |||
> cat $TESTTMP/output/internal.out | ||||
> hg log --rev 'tip' -T 'post-tr: {rev} {desc}\n' | ||||
> } | ||||
prepare a large source to which to pull from: | ||||
The source is large to unsure we don't use inline more after the pull | ||||
$ hg init other-repo | ||||
r52072 | $ hg -R other-repo debugbuilddag .+500 --overwritten-file | |||
r48010 | ||||
prepare an empty repository where to make test: | ||||
$ hg init repo | ||||
$ cd repo | ||||
r52072 | $ touch of | |||
$ hg add of | ||||
r48010 | ||||
prepare a small extension to controll inline size | ||||
$ mkdir $TESTTMP/ext | ||||
$ cat << EOF > $TESTTMP/ext/small_inline.py | ||||
> from mercurial import revlog | ||||
r52072 | > revlog._maxinline = 3 * 100 | |||
r48010 | > EOF | |||
$ cat << EOF >> $HGRCPATH | ||||
> [extensions] | ||||
> small_inline=$TESTTMP/ext/small_inline.py | ||||
> [hooks] | ||||
Matt Harbison
|
r48094 | > pretxnclose = sh $TESTTMP/script/internal.sh | ||
r48010 | > EOF | |||
check this is true for the initial commit (inline → inline) | ||||
----------------------------------------------------------- | ||||
the repository should still be inline (for relevant format) | ||||
$ make_one_commit first | ||||
pre-commit: -1 | ||||
r48013 | external: -1 | |||
r48015 | internal: 0 first | |||
r48010 | post-tr: 0 first | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48010 | ||||
r48011 | #endif | |||
r48010 | check this is true for extra commit (inline → inline) | |||
----------------------------------------------------- | ||||
the repository should still be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48011 | ||||
#endif | ||||
r48010 | $ make_one_commit second | |||
pre-commit: 0 first | ||||
r48013 | external: 0 first | |||
r48015 | internal: 1 second | |||
r48010 | post-tr: 1 second | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48010 | ||||
r48011 | #endif | |||
r48010 | check this is true for a small pull (inline → inline) | |||
----------------------------------------------------- | ||||
the repository should still be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48011 | ||||
#endif | ||||
r48010 | $ make_one_pull 3 | |||
pre-commit: 1 second | ||||
warning: repository is unrelated | ||||
r48013 | external: 1 second | |||
r48015 | internal: 5 r3 | |||
r48010 | post-tr: 5 r3 | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48010 | ||||
r48011 | #endif | |||
r48010 | Make a large pull (inline → no-inline) | |||
--------------------------------------- | ||||
the repository should no longer be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r52072 | $ hg debugrevlog of | grep inline | |||
r52073 | flags : inline, * (glob) | |||
r48011 | ||||
#endif | ||||
r48010 | $ make_one_pull 400 | |||
pre-commit: 5 r3 | ||||
r48013 | external: 5 r3 | |||
r48015 | internal: 402 r400 | |||
r48010 | post-tr: 402 r400 | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r48010 | [1] | |||
r48011 | #endif | |||
r48010 | check this is true for extra commit (no-inline → no-inline) | |||
----------------------------------------------------------- | ||||
the repository should no longer be inline (for relevant format) | ||||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r48010 | [1] | |||
r48011 | ||||
#endif | ||||
r48010 | $ make_one_commit third | |||
pre-commit: 402 r400 | ||||
r48013 | external: 402 r400 | |||
r48015 | internal: 403 third | |||
r48010 | post-tr: 403 third | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r48010 | [1] | |||
r48011 | #endif | |||
r48010 | ||||
Make a pull (not-inline → no-inline) | ||||
------------------------------------- | ||||
the repository should no longer be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r52072 | $ hg debugrevlog of | grep inline | |||
r48010 | [1] | |||
r48011 | ||||
#endif | ||||
r48010 | $ make_one_pull tip | |||
pre-commit: 403 third | ||||
r48013 | external: 403 third | |||
r48015 | internal: 503 r500 | |||
r48010 | post-tr: 503 r500 | |||
r48011 | ||||
#if revlogv1 | ||||
r52072 | $ hg debugrevlog of | grep inline | |||
r48010 | [1] | |||
r48011 | ||||
#endif | ||||