memtx: fix story delete statement list
Current implementation of tracking statements that delete a story has a flaw, consider the following example: tx1('box.space.s:replace{0, 0}') -- statement 1 tx2('box.space.s:replace{0, 1}') -- statement 2 tx2('box.space.s:delete{0}') -- statement 3 tx2('box.space.s:replace{0, 2}') -- statement 4 When statement 1 is prepared, both statements 2 and 4 will be linked to the delete statement list of {0, 0}'s story, though, apparently, statement 4 does not delete {0, 0}. Let us notice the following: statement 4 is "pure" in the sense that, in the transaction's scope, it is guaranteed not to replace any tuple — we can retrieve this information when we check where the insert statement violates replacement rules, use it to determine "pure" insert statements, and skip them later on when, during preparation of insert statements, we handle other insert statements which assume they do not replace anything (i.e., have no visible old tuple). On the contrary, statements 1 and 2 are "dirty": they assume that they replaced nothing (i.e., there was no visible tuple in the index) — when one of them gets prepared — the other one needs to be either aborted or relinked to replace the prepared tuple. We also need to fix relinking of delete statements from the older story (in terms of the history chain) to the new one during preparation of insert statements: a statement needs to be relinked iff it comes from a different transaction (to be precise, there must, actually, be no more than one delete statement from the same transaction). Additionally, add assertions to verify the invariant that the story's add (delete) psn is equal to the psn of the add (delete) statement's transaction psn. Closes #7214 Closes #7217 NO_DOC=bugfix
Showing
- changelogs/unreleased/gh-7214-repeatable-replace-assertion.md 4 additions, 0 deletions...gelogs/unreleased/gh-7214-repeatable-replace-assertion.md
- changelogs/unreleased/gh-7217-repeatable-{in, up}sert-memtx-tx-conflict.md 4 additions, 0 deletions...ased/gh-7217-repeatable-{in, up}sert-memtx-tx-conflict.md
- src/box/memtx_tx.c 59 additions, 19 deletionssrc/box/memtx_tx.c
- src/box/txn.c 1 addition, 0 deletionssrc/box/txn.c
- src/box/txn.h 8 additions, 0 deletionssrc/box/txn.h
- test/box-luatest/gh_7214_repeatable_replace_assertion_test.lua 73 additions, 0 deletions...box-luatest/gh_7214_repeatable_replace_assertion_test.lua
- test/box-luatest/gh_7217_repeatable_{in, up}sert_memtx_tx_conflict_test.lua 124 additions, 0 deletions...h_7217_repeatable_{in, up}sert_memtx_tx_conflict_test.lua
Loading
Please register or sign in to comment