Mercurial > hg
view tests/test-histedit-non-commute.t @ 39561:d06834e0f48e
wireprotov2peer: stream decoded responses
Previously, wire protocol version 2 would buffer all response data.
Only once all data was received did we CBOR decode it and resolve
the future associated with the command. This was obviously not
desirable. In future commits that introduce large response payloads,
this caused significant memory bloat and slowed down client
operations due to waiting on the server.
This commit refactors the response handling code so that response
data can be streamed.
Command response objects now contain a buffered CBOR decoder. As
new data arrives, it is fed into the decoder. Decoded objects are
made available to the generator as they are decoded.
Because there is a separate thread processing incoming frames and
feeding data into the response object, there is the potential for
race conditions when mutating response objects. So a lock has been
added to guard access to critical state variables.
Because the generator emitting decoded objects needs to wait on
those objects to become available, we've added an Event for the
generator to wait on so it doesn't busy loop. This does mean
there is the potential for deadlocks. And I'm pretty sure they can
occur in some scenarios. We already have a handful of TODOs around
this. But I've added some more. Fixing this will likely require
moving the background thread receiving frames into clienthandler.
We likely would have done this anyway when implementing the client
bits for the SSH transport.
Test output changes because the initial CBOR map holding the overall
response state is now always handled internally by the response
object.
Differential Revision: https://phab.mercurial-scm.org/D4474
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 29 Aug 2018 15:17:11 -0700 |
parents | e5ffc91a2276 |
children | 9bc7ec924234 |
line wrap: on
line source
$ . "$TESTDIR/histedit-helpers.sh" $ cat >> $HGRCPATH <<EOF > [extensions] > histedit= > EOF $ initrepo () > { > hg init $1 > cd $1 > for x in a b c d e f ; do > echo $x$x$x$x$x > $x > hg add $x > done > hg ci -m 'Initial commit' > for x in a b c d e f ; do > echo $x > $x > hg ci -m $x > done > echo 'I can haz no commute' > e > hg ci -m 'does not commute with e' > cd .. > } $ initrepo r1 $ cd r1 Initial generation of the command files $ EDITED="$TESTTMP/editedhistory" $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 7 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED $ cat $EDITED pick 65a9a84f33fd 3 c pick 00f1c5383965 4 d pick 39522b764e3d 7 does not commute with e pick 7b4e2f4b7bcd 5 e pick 500cac37a696 6 f log before edit $ hg log --graph @ changeset: 7:39522b764e3d | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 6:500cac37a696 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:7b4e2f4b7bcd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit edit the history $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts while merging e! (edit, then use 'hg resolve --mark') Fix up the change (pick 39522b764e3d) (hg histedit --continue to resume) abort the edit $ hg histedit --abort 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved second edit set $ hg log --graph @ changeset: 7:39522b764e3d | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 6:500cac37a696 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:7b4e2f4b7bcd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit edit the history $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts while merging e! (edit, then use 'hg resolve --mark') Fix up the change (pick 39522b764e3d) (hg histedit --continue to resume) fix up $ echo 'I can haz no commute' > e $ hg resolve --mark e (no more unresolved files) continue: hg histedit --continue $ hg histedit --continue 2>&1 | fixbundle merging e warning: conflicts while merging e! (edit, then use 'hg resolve --mark') Fix up the change (pick 7b4e2f4b7bcd) (hg histedit --continue to resume) $ hg histedit --continue 2>&1 | fixbundle abort: unresolved merge conflicts (see 'hg help resolve') This failure is caused by 7b4e2f4b7bcd "e" not rebasing the non commutative former children. just continue this time $ hg revert -r 'p1()' e make sure the to-be-empty commit doesn't screw up the state (issue5545) $ hg histedit --continue 2>&1 | fixbundle abort: unresolved merge conflicts (see 'hg help resolve') $ hg resolve --mark e (no more unresolved files) continue: hg histedit --continue $ hg histedit --continue 2>&1 | fixbundle 7b4e2f4b7bcd: skipping changeset (no changes) log after edit $ hg log --graph @ changeset: 6:7efe1373e4bc | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:e334d87a1e55 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit start over $ cd .. $ initrepo r2 $ cd r2 $ rm $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED $ hg log --template 'mess {node|short} {rev} {desc}\n' -r 7 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED $ cat $EDITED pick 65a9a84f33fd 3 c pick 00f1c5383965 4 d mess 39522b764e3d 7 does not commute with e pick 7b4e2f4b7bcd 5 e pick 500cac37a696 6 f edit the history, this time with a fold action $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts while merging e! (edit, then use 'hg resolve --mark') Fix up the change (mess 39522b764e3d) (hg histedit --continue to resume) $ echo 'I can haz no commute' > e $ hg resolve --mark e (no more unresolved files) continue: hg histedit --continue $ hg histedit --continue 2>&1 | fixbundle merging e warning: conflicts while merging e! (edit, then use 'hg resolve --mark') Fix up the change (pick 7b4e2f4b7bcd) (hg histedit --continue to resume) second edit also fails, but just continue $ hg revert -r 'p1()' e $ hg resolve --mark e (no more unresolved files) continue: hg histedit --continue $ hg histedit --continue 2>&1 | fixbundle 7b4e2f4b7bcd: skipping changeset (no changes) post message fix $ hg log --graph @ changeset: 6:7efe1373e4bc | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:e334d87a1e55 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit $ cd ..