[Updated] D12008: revlog: demonstrate a bug where transaction can be aborted partially

aalekseyev (Arseniy Alekseyev) phabricator at mercurial-scm.org
Thu Jan 20 15:09:31 UTC 2022


Closed by commit rHGf38ae2d7390e: revlog: demonstrate a bug where transaction can be aborted partially (authored by aalekseyev).
This revision was automatically updated to reflect the committed changes.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D12008?vs=31706&id=31708

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D12008/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D12008

AFFECTED FILES
  tests/test-transaction-rollback-on-revlog-split.t

CHANGE DETAILS

diff --git a/tests/test-transaction-rollback-on-revlog-split.t b/tests/test-transaction-rollback-on-revlog-split.t
--- a/tests/test-transaction-rollback-on-revlog-split.t
+++ b/tests/test-transaction-rollback-on-revlog-split.t
@@ -17,22 +17,28 @@
   >     extensions.wrapfunction(util.atomictempfile, 'close', close)
   > EOF
 
-Test offset computation to correctly factor in the index entries themselve.
+Test offset computation to correctly factor in the index entries themselves.
 Also test that the new data size has the correct size if the transaction is aborted
 after the index has been replaced.
 
-Test repo has one small, one moderate and one big change. The clone has
-the small and moderate change and will transition to non-inline storage when
-adding the big change.
+Test repo has commits a, b, c, D, where D is large (grows the revlog enough that it
+transitions to non-inline storage). The clone initially has changes a, b
+and will transition to non-inline storage when adding c, D.
+
+If the transaction adding c, D is rolled back, then we don't undo the revlog split,
+but truncate the index and the data to remove both c and D.
 
   $ hg init troffset-computation --config format.revlog-compression=none
   $ cd troffset-computation
   $ printf '%20d' '1' > file
-  $ hg commit -Aqm_
+  $ hg commit -Aqma
   $ printf '%1024d' '1' > file
-  $ hg commit -Aqm_
+  $ hg commit -Aqmb
+  $ printf '%20d' '1' > file
+  $ hg commit -Aqmc
   $ dd if=/dev/zero of=file bs=1k count=128 > /dev/null 2>&1
-  $ hg commit -Aqm_
+  $ hg commit -AqmD
+
   $ cd ..
 
   $ hg clone -r 1 troffset-computation troffset-computation-copy --config format.revlog-compression=none -q
@@ -57,9 +63,9 @@
   [80]
 #endif
   $ cat .hg/store/journal | tr -s '\000' ' ' | grep data/file | tail -1
-  data/file.i 128
+  data/file.i 192
 
-The first file.i entry should match the size above.
+The first file.i entry should match the "Reference size" above.
 The first file.d entry is the temporary record during the split,
 the second entry after the split happened. The sum of the second file.d
 and the second file.i entry should match the first file.i entry.
@@ -67,29 +73,40 @@
   $ cat .hg/store/journal | tr -s '\000' ' ' | grep data/file
   data/file.i 1174
   data/file.d 0
-  data/file.d 1046
-  data/file.i 128
+  data/file.d 1067
+  data/file.i 192
   $ hg recover
   rolling back interrupted transaction
   (verify step skipped, run `hg verify` to check your repository content)
   $ f -s .hg/store/data/file*
-  .hg/store/data/file.d: size=1046
-  .hg/store/data/file.i: size=128
+  .hg/store/data/file.d: size=1067
+  .hg/store/data/file.i: size=192
   $ hg tip
-  changeset:   1:3ce491143aec
+  changeset:   1:cfa8d6e60429
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     _
+  summary:     b
   
   $ hg verify -q
    warning: revlog 'data/file.d' not in fncache!
-  1 warnings encountered!
+   file@?: rev 2 points to nonexistent changeset 2
+   (expected )
+   file@?: fa1120531cc1 not in manifests
+  2 warnings encountered!
   hint: run "hg debugrebuildfncache" to recover from corrupt fncache
+  2 integrity errors encountered!
+  [1]
   $ hg debugrebuildfncache --only-data
   adding data/file.d
   1 items added, 0 removed from fncache
   $ hg verify -q
+   file@?: rev 2 points to nonexistent changeset 2
+   (expected )
+   file@?: fa1120531cc1 not in manifests
+  1 warnings encountered!
+  2 integrity errors encountered!
+  [1]
   $ cd ..
 
 
@@ -117,20 +134,20 @@
   $ cat .hg/store/journal | tr -s '\000' ' ' | grep data/file
   data/file.i 1174
   data/file.d 0
-  data/file.d 1046
+  data/file.d 1067
 
   $ hg recover
   rolling back interrupted transaction
   (verify step skipped, run `hg verify` to check your repository content)
   $ f -s .hg/store/data/file*
-  .hg/store/data/file.d: size=1046
+  .hg/store/data/file.d: size=1067
   .hg/store/data/file.i: size=1174
   $ hg tip
-  changeset:   1:3ce491143aec
+  changeset:   1:cfa8d6e60429
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     _
+  summary:     b
   
   $ hg verify -q
   $ cd ..
@@ -155,18 +172,23 @@
   abort: pretxnchangegroup hook exited with status 1
   [40]
   $ f -s .hg/store/data/file*
-  .hg/store/data/file.d: size=1046
-  .hg/store/data/file.i: size=128
+  .hg/store/data/file.d: size=1067
+  .hg/store/data/file.i: size=192
   $ hg tip
-  changeset:   1:3ce491143aec
+  changeset:   1:cfa8d6e60429
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     _
+  summary:     b
   
   $ hg verify -q
    warning: revlog 'data/file.d' not in fncache!
-  1 warnings encountered!
+   file@?: rev 2 points to nonexistent changeset 2
+   (expected )
+   file@?: fa1120531cc1 not in manifests
+  2 warnings encountered!
   hint: run "hg debugrebuildfncache" to recover from corrupt fncache
+  2 integrity errors encountered!
+  [1]
   $ cd ..
 



To: aalekseyev, #hg-reviewers, Alphare
Cc: mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20220120/29d7b326/attachment-0002.html>


More information about the Mercurial-patches mailing list