sapling/tests/test-fb-hgext-pushrebase-cannot-rebasepublic.t
Phil Cohen 5f9bd1a7da pushrebase: run hgsql sync after running prepushrebase hooks
Summary:
Our hypothesis is that if the prepushrebase hooks take a significant amount of time, the repo state will get out date, causing hgsql to degrade under load.

This uses the previous test to simulate new commits coming in to the database while a single server is busy running prepushrebase hooks. The new code causes a second sync to occur just after running the hooks.

Reviewed By: quark-zju

Differential Revision: D9999683

fbshipit-source-id: 43d2390b476d090a66353555247c9a623386e75a
2018-09-25 18:23:12 -07:00

120 lines
2.9 KiB
Perl

Demonstrates the "cannot rebase public commits" issue seen using hgsql and
pushrebase.
$ . "$TESTDIR/hgsql/library.sh"
$ setconfig hgsql.verbose=True
$ setconfig pushrebase.verbose=True
$ enable pushrebase
$ enable strip
$ setconfig ui.ssh='python "$RUNTESTDIR/dummyssh"'
$ commit() {
> hg commit -Aq -m "$@"
> }
$ log() {
> hg log -G -T "{desc} [{phase}:{node|short}] {bookmarks} {remotenames}" "$@"
> }
$ config() {
> setconfig experimental.bundle2lazylocking=True
> setconfig pushrebase.runhgsqlsync=True
> enable pushrebase
> }
$ config_server() {
> config
> configureserver . foo
> }
$ clone() { # Usage: "clone <client directory> <source directory>
> SRC=${2:-server1}
> hg clone ssh://user@dummy/$SRC $1 -q
> cd $1
> hg up -q master
> config
> }
Set up server repository.
$ newrepo server1
$ config_server
$ echo foo > base
$ commit "base"
[hgsql] got lock after * seconds (glob)
[hgsql] held lock for * seconds (glob)
$ cd ..
Add a new commit to server2 (as if we stripped in server1):
$ cp -R server1 server2
$ cd server2
$ echo foo > a
$ commit "first"
[hgsql] got lock after * seconds (glob)
[hgsql] held lock for * seconds (glob)
$ hg book -r . master
[hgsql] got lock after * seconds (glob)
[hgsql] held lock for * seconds (glob)
$ log
@ first [draft:8585ef078134] master
|
o base [draft:4ced94c0a443]
Stop syncs in server1 so it doesn't pick up the new commit:
$ cd ../server1
$ cd .hg/store
$ ln -s "foo:9" synclimiter
$ cd ../../../
Clone client1 from the server2 repo (with the extra commit).
$ clone client1 server2
$ cd ../client1
Create a _third_ draft commit, push to the (behind) server1:
$ echo "foo" > foo
$ commit "third commit"
$ rm ../server1/.hg/store/synclimiter_
rm: cannot remove '../server1/.hg/store/synclimiter_': $ENOENT$
[1]
$ hg push --to master ssh://user@dummy/server1
pushing to ssh://user@dummy/server1
remote: [hgsql] skipping database sync because another process is already syncing
remote: [hgsql] getting 1 commits from database
searching for changes
remote: checking conflicts with 8585ef078134
remote: pushing 1 changeset:
remote: 87df66bba286 third commit
remote: [hgsql] got lock after * seconds (glob)
remote: rebasing stack from 8585ef078134 onto 8585ef078134
remote: [hgsql] held lock for * seconds (glob)
updating bookmark master
$ log
@ third commit [draft:87df66bba286] master
|
o first [public:8585ef078134]
|
o base [public:4ced94c0a443]
$ cd ../server1
$ log
[hgsql] skipping database sync because another process is already syncing
o third commit [public:87df66bba286] master
|
o first [public:8585ef078134]
|
@ base [public:4ced94c0a443]
$ cd ../server2
$ log
[hgsql] getting 1 commits from database
o third commit [draft:87df66bba286] master
|
@ first [draft:8585ef078134]
|
o base [draft:4ced94c0a443]