Mercurial > hg
view tests/test-transaction-rollback-on-sigpipe.t @ 47890:3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
All the other caller goes through `reset_state`, so we can safely have an
explicit method on `DirstateItem` object.
This means that all the logic to preserve the previous state (from p2, merged,
etc) is now properly encapsulated within the DirstateItem. This pave the way to
using different storage for these information.
Differential Revision: https://phab.mercurial-scm.org/D11315
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 20 Aug 2021 11:27:01 +0200 |
parents | 27ff81547d35 |
children | 9c4204b7f3e4 |
line wrap: on
line source
Test that, when an hg push is interrupted and the remote side receives SIGPIPE, the remote hg is able to successfully roll back the transaction. $ hg init -q remote $ hg clone -e "\"$PYTHON\" \"$RUNTESTDIR/dummyssh\"" -q ssh://user@dummy/`pwd`/remote local $ 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 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. $ remotecmd="$RUNTESTDIR/testlib/sigpipe-remote.py" 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] > pretxnchangegroup.00-break-things=sh "$RUNTESTDIR/testlib/wait-on-file" 10 "$SYNCFILE2" "$SYNCFILE1" > pretxnchangegroup.01-output-things=echo "some remote output to be forward to the closed pipe" > pretxnchangegroup.02-output-things=echo "some more remote output" > EOF $ hg --cwd ./remote tip -T '{node|short}\n' 000000000000 $ cd local $ echo foo > foo ; hg commit -qAm "commit" (use quiet to avoid flacky output from the server) $ hg push --quiet -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" --remotecmd "$remotecmd" abort: stream ended unexpectedly (got 0 bytes, expected 4) [255] $ cat $SIGPIPE_REMOTE_DEBUG_FILE SIGPIPE-HELPER: Starting SIGPIPE-HELPER: Redirection in place SIGPIPE-HELPER: pipes closed in main SIGPIPE-HELPER: SYNCFILE1 detected SIGPIPE-HELPER: worker killed SIGPIPE-HELPER: creating SYNCFILE2 SIGPIPE-HELPER: Shutting down SIGPIPE-HELPER: Server process terminated with status 255 (no-windows !) SIGPIPE-HELPER: Server process terminated with status 1 (windows !) SIGPIPE-HELPER: Shut down The remote should be left in a good state $ hg --cwd ../remote tip -T '{node|short}\n' 000000000000 #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 $ hg --cwd ../remote recover no interrupted transaction available [1] #endif