tests/test-bookmarks-corner-case.t
author Raphaël Gomès <rgomes@octobus.net>
Tue, 05 Apr 2022 10:55:28 +0200
branchstable
changeset 49000 dd6b67d5c256
parent 47922 e5efbb11e185
permissions -rw-r--r--
rust: fix unsound `OwningDirstateMap` As per the previous patch, `OwningDirstateMap` is unsound. Self-referential structs are difficult to implement correctly in Rust since the compiler is free to move structs around as much as it wants to. They are also very rarely needed in practice, so the state-of-the-art on how they should be done within the Rust rules is still a bit new. The crate `ouroboros` is an attempt at providing a safe way (in the Rust sense) of declaring self-referential structs. It is getting a lot attention and was improved very quickly when soundness issues were found in the past: rather than relying on our own (limited) review circle, we might as well use the de-facto common crate to fix this problem. This will give us a much better chance of finding issues should any new ones be discovered as well as the benefit of fewer `unsafe` APIs of our own. I was starting to think about how I would present a safe API to the old struct but soon realized that the callback-based approach was already done in `ouroboros`, along with a lot more care towards refusing incorrect structs. In short: we don't return a mutable reference to the `DirstateMap` anymore, we expect users of its API to pass a `FnOnce` that takes the map as an argument. This allows our `OwningDirstateMap` to control the input and output lifetimes of the code that modifies it to prevent such issues. Changing to `ouroboros` meant changing every API with it, but it is relatively low churn in the end. It correctly identified the example buggy modification of `copy_map_insert` outlined in the previous patch as violating the borrow rules. Differential Revision: https://phab.mercurial-scm.org/D12429
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
================================
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
Test corner case around bookmark
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
================================
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
This test file is meant to gather test around bookmark that are specific
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
 enough to not find a place elsewhere.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
Test bookmark/changelog race condition
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
======================================
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
The data from the bookmark file are filtered to only contains bookmark with
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
node known to the changelog. If the cache invalidation between these two bits
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
goes wrong, bookmark can be dropped.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
Setup
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
-----
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
initial repository setup
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
  $ hg init bookrace-server
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
  $ cd bookrace-server
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
  $ echo a > a
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
  $ hg add a
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
  $ hg commit -m root
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
  $ echo a >> a
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
  $ hg bookmark book-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
  $ hg commit -m A0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
  $ hg up 'desc(root)'
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
  (leaving bookmark book-A)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
  $ echo b > b
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
  $ hg add b
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
  $ hg bookmark book-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
  $ hg commit -m B0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
  created new head
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
  $ hg up null
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
  (leaving bookmark book-B)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
  $ hg phase --public --rev 'all()'
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
  $ hg log -G
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
  o  changeset:   2:c79985706978
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
  |  bookmark:    book-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
  |  tag:         tip
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
  |  parent:      0:6569b5a81c7e
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
  |  user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    46
  |  date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
  |  summary:     B0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    48
  |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    49
  | o  changeset:   1:39c28d785860
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
  |/   bookmark:    book-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
  |    user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
  |    date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
  |    summary:     A0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
  |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
  o  changeset:   0:6569b5a81c7e
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
     user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
     date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
     summary:     root
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
  
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
  $ hg book
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
     book-A                    1:39c28d785860
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
     book-B                    2:c79985706978
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
  $ cd ..
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
Add new changeset on each bookmark in distinct clones
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
  $ hg clone ssh://user@dummy/bookrace-server client-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
  requesting all changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
  adding changesets
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
  adding manifests
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
  adding file changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
  added 3 changesets with 3 changes to 2 files (+1 heads)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
  new changesets 6569b5a81c7e:c79985706978
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    74
  updating to branch default
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
  $ hg -R client-A update book-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
  (activating bookmark book-A)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
  $ echo a >> client-A/a
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
  $ hg -R client-A commit -m A1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
  $ hg clone ssh://user@dummy/bookrace-server client-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
  requesting all changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
  adding changesets
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
  adding manifests
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
  adding file changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
  added 3 changesets with 3 changes to 2 files (+1 heads)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
  new changesets 6569b5a81c7e:c79985706978
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
  updating to branch default
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
  $ hg -R client-B update book-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
  (activating bookmark book-B)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
  $ echo b >> client-B/b
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
  $ hg -R client-B commit -m B1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    96
extension to reproduce the race
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
-------------------------------
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    99
If two process are pushing we want to make sure the following happens:
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   100
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
* process A read changelog
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   102
* process B to its full push
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   103
* process A read bookmarks
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   104
* process A proceed with rest of the push
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   106
We build a server side extension for this purpose
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   108
  $ cat > bookrace.py << EOF
42389
055687fe4c47 tests: sort some imports that were previously missed
Augie Fackler <augie@google.com>
parents: 42324
diff changeset
   109
  > import atexit
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
  > import os
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
  > import time
42666
cfb774aae660 tests: sort imports in test-bookmarks-corner-case.t
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42624
diff changeset
   112
  > from mercurial import bookmarks, error, extensions
42507
febf5c8215c1 test: factor out the "wait" logic in bookrace
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42506
diff changeset
   113
  > 
42508
c4d1807b165f test: add some assert in the bookrace extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42507
diff changeset
   114
  > def wait(repo):
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
  >     if not os.path.exists('push-A-started'):
42508
c4d1807b165f test: add some assert in the bookrace extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42507
diff changeset
   116
  >         assert repo._currentlock(repo._lockref) is None
c4d1807b165f test: add some assert in the bookrace extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42507
diff changeset
   117
  >         assert repo._currentlock(repo._wlockref) is None
42430
5b217451a2c2 py3: fix test-bookmarks-corner-case.t
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42389
diff changeset
   118
  >         repo.ui.status(b'setting raced push up\n')
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
  >         with open('push-A-started', 'w'):
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
  >             pass
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
  >     clock = 300
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
  >     while not os.path.exists('push-B-done'):
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   123
  >         clock -= 1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
  >         if clock <= 0:
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
  >             raise error.Abort("race scenario timed out")
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   126
  >         time.sleep(0.1)
42507
febf5c8215c1 test: factor out the "wait" logic in bookrace
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42506
diff changeset
   127
  > 
42509
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   128
  > def reposetup(ui, repo):
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   129
  >     class racedrepo(repo.__class__):
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   130
  >         @property
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   131
  >         def _bookmarks(self):
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   132
  >             wait(self)
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   133
  >             return super(racedrepo, self)._bookmarks
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   134
  >     repo.__class__ = racedrepo
95c2f951e502 bookmarks: actually trigger the race deleting bookmark in the test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42508
diff changeset
   135
  > 
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   136
  > def e():
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   137
  >     with open('push-A-done', 'w'):
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   138
  >         pass
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   139
  > atexit.register(e)
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   140
  > EOF
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   141
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   142
Actual test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   143
-----------
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   144
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   145
Start the raced push.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   146
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   147
  $ cat >> bookrace-server/.hg/hgrc << EOF
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   148
  > [extensions]
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   149
  > bookrace=$TESTTMP/bookrace.py
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   150
  > EOF
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   151
  $ hg push -R client-A -r book-A >push-output.txt 2>&1 &
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   152
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   153
Wait up to 30 seconds for that push to start.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   154
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   155
  $ clock=30
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   156
  $ while [ ! -f push-A-started ] && [ $clock -gt 0 ] ; do
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   157
  >    clock=`expr $clock - 1`
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   158
  >    sleep 1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   159
  > done
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   160
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   161
Do the other push.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   162
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   163
  $ cat >> bookrace-server/.hg/hgrc << EOF
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   164
  > [extensions]
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   165
  > bookrace=!
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   166
  > EOF
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   167
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   168
  $ hg push -R client-B -r book-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   169
  pushing to ssh://user@dummy/bookrace-server
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   170
  searching for changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   171
  remote: adding changesets
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   172
  remote: adding manifests
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   173
  remote: adding file changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   174
  remote: added 1 changesets with 1 changes to 1 files
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   175
  updating bookmark book-B
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   176
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   177
Signal the raced put that we are done (it waits up to 30 seconds).
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   178
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   179
  $ touch push-B-done
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   180
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   181
Wait for the raced push to finish (with the remaning of the initial 30 seconds).
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   182
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   183
  $ while [ ! -f push-A-done ] && [ $clock -gt 0 ] ; do
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   184
  >    clock=`expr $clock - 1`
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   185
  >    sleep 1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   186
  > done
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   187
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   188
Check raced push output.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   189
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   190
  $ cat push-output.txt
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   191
  pushing to ssh://user@dummy/bookrace-server
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   192
  searching for changes
42896
7e19b640c53e sshserver: flush stream after command dispatch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42685
diff changeset
   193
  remote: setting raced push up
42682
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42624
diff changeset
   194
  remote has heads on branch 'default' that are not known locally: f26c3b5167d1
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   195
  remote: adding changesets
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   196
  remote: adding manifests
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   197
  remote: adding file changes
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   198
  remote: added 1 changesets with 1 changes to 1 files
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   199
  updating bookmark book-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   200
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   201
Check result of the push.
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   202
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   203
  $ hg -R bookrace-server log -G
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   204
  o  changeset:   4:9ce3b28c16de
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   205
  |  bookmark:    book-A
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   206
  |  tag:         tip
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   207
  |  parent:      1:39c28d785860
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   208
  |  user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   209
  |  date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   210
  |  summary:     A1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   211
  |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   212
  | o  changeset:   3:f26c3b5167d1
42682
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42624
diff changeset
   213
  | |  bookmark:    book-B
42322
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   214
  | |  user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   215
  | |  date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   216
  | |  summary:     B1
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   217
  | |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   218
  | o  changeset:   2:c79985706978
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   219
  | |  parent:      0:6569b5a81c7e
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   220
  | |  user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   221
  | |  date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   222
  | |  summary:     B0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   223
  | |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   224
  o |  changeset:   1:39c28d785860
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   225
  |/   user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   226
  |    date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   227
  |    summary:     A0
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   228
  |
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   229
  o  changeset:   0:6569b5a81c7e
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   230
     user:        test
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   231
     date:        Thu Jan 01 00:00:00 1970 +0000
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   232
     summary:     root
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   233
  
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   234
  $ hg -R bookrace-server book
d2c871b78c36 bookmark: add a test for a race condition on push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   235
     book-A                    4:9ce3b28c16de
42682
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42624
diff changeset
   236
     book-B                    3:f26c3b5167d1