test-transaction-rollback-on-sigpipe.t
80 lines
| 2.6 KiB
| text/troff
|
Tads3Lexer
/ tests / test-transaction-rollback-on-sigpipe.t
|
r48087 | Test that, when an hg push is interrupted and the remote side receives SIGPIPE, | ||
|
r46328 | the remote hg is able to successfully roll back the transaction. | ||
$ hg init -q remote | ||||
|
r48732 | $ hg clone -q ssh://user@dummy/`pwd`/remote local | ||
r48352 | $ SIGPIPE_REMOTE_DEBUG_FILE="$TESTTMP/DEBUGFILE" | |||
$ SYNCFILE1="$TESTTMP/SYNCFILE1" | ||||
$ SYNCFILE2="$TESTTMP/SYNCFILE2" | ||||
$ export SIGPIPE_REMOTE_DEBUG_FILE | ||||
$ export SYNCFILE1 | ||||
$ export SYNCFILE2 | ||||
$ PYTHONUNBUFFERED=1 | ||||
$ export PYTHONUNBUFFERED | ||||
|
r46328 | |||
On the remote end, run hg, piping stdout and stderr through processes that we | ||||
know the PIDs of. We will later kill these to simulate an ssh client | ||||
disconnecting. | ||||
r48352 | $ remotecmd="$RUNTESTDIR/testlib/sigpipe-remote.py" | |||
|
r46328 | |||
In the pretxnchangegroup hook, kill the PIDs recorded above to simulate ssh | ||||
disconnecting. Then exit nonzero, to force a transaction rollback. | ||||
$ cat >remote/.hg/hgrc <<EOF | ||||
> [hooks] | ||||
r48415 | > pretxnchangegroup.00-break-things=sh "$RUNTESTDIR/testlib/wait-on-file" 10 "$SYNCFILE2" "$SYNCFILE1" | |||
r48351 | > pretxnchangegroup.01-output-things=echo "some remote output to be forward to the closed pipe" | |||
r48418 | > pretxnchangegroup.02-output-things=echo "some more remote output" | |||
|
r46328 | > EOF | ||
r48350 | $ hg --cwd ./remote tip -T '{node|short}\n' | |||
000000000000 | ||||
|
r46328 | $ cd local | ||
$ echo foo > foo ; hg commit -qAm "commit" | ||||
r48418 | ||||
(use quiet to avoid flacky output from the server) | ||||
|
r48732 | $ hg push --quiet --remotecmd "$remotecmd" | ||
|
r46328 | abort: stream ended unexpectedly (got 0 bytes, expected 4) | ||
r48352 | [255] | |||
$ cat $SIGPIPE_REMOTE_DEBUG_FILE | ||||
SIGPIPE-HELPER: Starting | ||||
SIGPIPE-HELPER: Redirection in place | ||||
r48418 | SIGPIPE-HELPER: pipes closed in main | |||
r48352 | SIGPIPE-HELPER: SYNCFILE1 detected | |||
r48418 | SIGPIPE-HELPER: worker killed | |||
r48352 | SIGPIPE-HELPER: creating SYNCFILE2 | |||
SIGPIPE-HELPER: Shutting down | ||||
r48418 | SIGPIPE-HELPER: Server process terminated with status 255 (no-windows !) | |||
SIGPIPE-HELPER: Server process terminated with status 1 (windows !) | ||||
r48352 | SIGPIPE-HELPER: Shut down | |||
|
r46328 | |||
|
r48087 | The remote should be left in a good state | ||
r48350 | $ hg --cwd ../remote tip -T '{node|short}\n' | |||
000000000000 | ||||
r48418 | ||||
#if windows | ||||
XXX-Windows Broken behavior to be fixed | ||||
Behavior on Windows is broken and should be fixed. However this is a fairly | ||||
corner case situation and no data are being corrupted. This would affect | ||||
central repository being hosted on a Windows machine and accessed using ssh. | ||||
This was catch as we setup new CI for Windows. Making the test pass on Windows | ||||
was enough of a pain that fixing the behavior set aside for now. Dear and | ||||
honorable reader, feel free to fix it. | ||||
$ hg --cwd ../remote recover | ||||
rolling back interrupted transaction | ||||
(verify step skipped, run `hg verify` to check your repository content) | ||||
#else | ||||
|
r48087 | $ hg --cwd ../remote recover | ||
no interrupted transaction available | ||||
|
r46329 | [1] | ||
r48418 | ||||
#endif | ||||