tests/test-dirstate-version-fallback.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 09 Apr 2024 02:54:19 +0200
changeset 51586 1cef1412af3e
parent 50725 7e5be4a7cda7
permissions -rw-r--r--
phases: rework the logic of _pushdiscoveryphase to bound complexity This rework the various graph traversal in _pushdiscoveryphase to keep the complexity in check. This is done though a couple of things: - first, limiting the space we have to explore, for example, if we are not in publishing push, we don't need to consider remote draft roots that are also draft locally, as there is nothing to be moved there. - avoid unbounded descendant computation, and use the faster "rev between" computation. This provide a massive boost to performance when exchanging with repository with a massive amount of draft, like mozilla-try: ### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog # benchmark.name = hg.command.push # bin-env-vars.hg.flavor = default # bin-env-vars.hg.py-re2-module = default # benchmark.variants.explicit-rev = all-out-heads # benchmark.variants.issue6528 = disabled # benchmark.variants.protocol = ssh # benchmark.variants.reuse-external-delta-parent = default ## benchmark.variants.revs = any-1-extra-rev before: 20.346590 seconds after: 11.232059 seconds (-38.15%, -7.48 seconds) ## benchmark.variants.revs = any-100-extra-rev before: 24.752051 seconds after: 15.367412 seconds (-37.91%, -9.38 seconds) After this changes, the push operation is still quite too slow. Some of this can be attributed to general phases slowness (reading all the roots from disk for example) and other know slowness (not using persistent-nodemap, branchmap, tags, etc. We are also working on them, but with this series, phase discovery during push no longer showing up in profile and this is a pretty nice and bit low-hanging fruit out of the way. ### (same case as the above) # benchmark.variants.revs = any-1-extra-rev pre-%ln-change: 44.235070 this-changeset: 11.232059 seconds (-74.61%, -33.00 seconds) # benchmark.variants.revs = any-100-extra-rev pre-%ln-change: 49.234697 this-changeset: 15.367412 seconds (-68.79%, -33.87 seconds) Note that with this change, the `hg push` performance is now much closer to the `hg pull` performance, even it still lagging behind a bit. (and the overall performance are still too slow). ### data-env-vars.name = mozilla-try-2023-03-22-ds2-pnm # benchmark.variants.explicit-rev = all-out-heads # benchmark.variants.issue6528 = disabled # benchmark.variants.protocol = ssh # benchmark.variants.pulled-delta-reuse-policy = default # bin-env-vars.hg.flavor = rust ## benchmark.variants.revs = any-1-extra-rev hg.command.pull: 6.517450 hg.command.push: 11.219888 ## benchmark.variants.revs = any-100-extra-rev hg.command.pull: 10.160991 hg.command.push: 14.251107 ### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog # bin-env-vars.hg.py-re2-module = default # benchmark.variants.explicit-rev = all-out-heads # benchmark.variants.issue6528 = disabled # benchmark.variants.protocol = ssh # benchmark.variants.pulled-delta-reuse-policy = default ## bin-env-vars.hg.flavor = default ## benchmark.variants.revs = any-1-extra-rev hg.command.pull: 8.577772 hg.command.push: 11.232059 ## bin-env-vars.hg.flavor = default ## benchmark.variants.revs = any-100-extra-rev hg.command.pull: 13.152976 hg.command.push: 15.367412 ## bin-env-vars.hg.flavor = rust ## benchmark.variants.revs = any-1-extra-rev hg.command.pull: 8.731982 hg.command.push: 11.178751 ## bin-env-vars.hg.flavor = rust ## benchmark.variants.revs = any-100-extra-rev hg.command.pull: 13.184236 hg.command.push: 15.620843
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50659
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     1
  $ cat >> $HGRCPATH << EOF
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     2
  > [storage]
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     3
  > dirstate-v2.slow-path=allow
50667
e7a3611181aa test-dirstate-version-fallback: future-proof the test for a different default
Raphaël Gomès <rgomes@octobus.net>
parents: 50660
diff changeset
     4
  > [format]
e7a3611181aa test-dirstate-version-fallback: future-proof the test for a different default
Raphaël Gomès <rgomes@octobus.net>
parents: 50660
diff changeset
     5
  > use-dirstate-v2=no
50659
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     6
  > EOF
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     7
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     8
Set up a v1 repo
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     9
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    10
  $ hg init repo
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    11
  $ cd repo
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    12
  $ echo a > a
50723
bfbd84c57bda dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50686
diff changeset
    13
  $ touch file-with-somewhat-long-name-to-make-dirstate-v1-bigger-than-v2
bfbd84c57bda dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50686
diff changeset
    14
  $ hg commit -Aqm a
50659
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    15
  $ hg debugrequires | grep dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    16
  [1]
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    17
  $ ls -1 .hg/dirstate*
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    18
  .hg/dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    19
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    20
Copy v1 dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    21
  $ cp .hg/dirstate $TESTTMP/dirstate-v1-backup
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    22
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    23
Upgrade it to v2
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    24
50725
7e5be4a7cda7 tests: use grep -E instead of obsolescent egrep
Mads Kiilerich <mads@kiilerich.com>
parents: 50723
diff changeset
    25
  $ hg debugupgraderepo -q --config format.use-dirstate-v2=1 --run | grep -E 'added:|removed:'
50659
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    26
     added: dirstate-v2
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    27
  $ hg debugrequires | grep dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    28
  dirstate-v2
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    29
  $ ls -1 .hg/dirstate*
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    30
  .hg/dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    31
  .hg/dirstate.* (glob)
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    32
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    33
Manually reset to dirstate v1 to simulate an incomplete dirstate-v2 upgrade
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    34
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    35
  $ rm .hg/dirstate*
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    36
  $ cp $TESTTMP/dirstate-v1-backup .hg/dirstate
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    37
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    38
There should be no errors, but a v2 dirstate should be written back to disk
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    39
  $ hg st
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    40
  $ ls -1 .hg/dirstate*
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    41
  .hg/dirstate
50660
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    42
  .hg/dirstate.* (glob)
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    43
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    44
Corrupt the dirstate to see how the errors show up to the user
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    45
  $ echo "I ate your data" > .hg/dirstate
50659
9e08cfbe77b1 dirstate: add test showing dirstate version mismatch causes an error
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    46
50660
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    47
  $ hg st
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    48
  abort: working directory state appears damaged! (no-rhg !)
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    49
  (falling back to dirstate-v1 from v2 also failed) (no-rhg !)
50686
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50667
diff changeset
    50
  abort: Too little data for dirstate: 16 bytes. (rhg !)
50660
bf16ef96defe rust-dirstate: fall back to v1 if reading v2 failed
Raphaël Gomès <rgomes@octobus.net>
parents: 50659
diff changeset
    51
  [255]