test-transaction-safety.t
269 lines
| 5.4 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 | ||||
----- | ||||
synchronisation+output script: | ||||
$ 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 | ||||
|
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 | ||||
|
r48094 | > hg log --rev 'tip' -T 'internal: {rev} {desc}\n' > "$TESTTMP/output/internal.out" | ||
> "$RUNTESTDIR/testlib/wait-on-file" 5 "$HG_TEST_FILE_EXT_DONE" "$HG_TEST_FILE_EXT_UNLOCK" | ||||
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' | ||||
> echo x >> a | ||||
|
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' | ||||
> echo x >> a | ||||
|
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 | ||||
$ hg -R other-repo debugbuilddag .+500 | ||||
prepare an empty repository where to make test: | ||||
$ hg init repo | ||||
$ cd repo | ||||
$ touch a | ||||
$ hg add a | ||||
prepare a small extension to controll inline size | ||||
$ mkdir $TESTTMP/ext | ||||
$ cat << EOF > $TESTTMP/ext/small_inline.py | ||||
> from mercurial import revlog | ||||
> revlog._maxinline = 64 * 100 | ||||
> EOF | ||||
$ cat << EOF >> $HGRCPATH | ||||
> [extensions] | ||||
> small_inline=$TESTTMP/ext/small_inline.py | ||||
> [hooks] | ||||
|
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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
r48011 | #endif | |||
r48010 | check this is true for extra commit (inline → inline) | |||
----------------------------------------------------- | ||||
the repository should still be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
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 | |||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
r48011 | #endif | |||
r48010 | Make a large pull (inline → no-inline) | |||
--------------------------------------- | ||||
the repository should no longer be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r48010 | $ hg debugrevlog -c | grep inline | |||
flags : inline | ||||
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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
[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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
[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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
[1] | ||||
r48011 | #endif | |||
r48010 | ||||
Make a pull (not-inline → no-inline) | ||||
------------------------------------- | ||||
the repository should no longer be inline (for relevant format) | ||||
r48011 | #if revlogv1 | |||
r48010 | $ hg debugrevlog -c | grep inline | |||
[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 | ||||
r48010 | $ hg debugrevlog -c | grep inline | |||
[1] | ||||
r48011 | ||||
#endif | ||||