Skip to content

Commit

Permalink
kv: declare write access to AbortSpan on all aborting EndTxn reqs
Browse files Browse the repository at this point in the history
Fixes cockroachdb#43707.
Fixes cockroachdb#48046.
Fixes cockroachdb#48189.

Part of the change made by cockroachdb#42765 was to clear AbortSpan entries on
non-poisoning, aborting EndTxn requests. Specifically, this change was
made in 1328787. The change forgot to update the corresponding span
declaration logic to reflect the fact that we were now writing to the
AbortSpan in cases where we previously weren't.

This was triggering an assertion in race builds that tried to catch this
kind of undeclared span access. The assertion failure was very rare
because it required the following conditions to all be met:
1. running a test with the race detector enabled
2. a txn (A) must have been aborted by another txn (B)
3. txn B must have cleared an intent on txn A's transaction record range
4. txn A must have noticed and issued a non-poisoning EndTxn(ABORT)

We should backport this when we get a change (once v20.1.0 has
stabilized), but I don't expect that this could actually cause any
issues. The AbortSpan update was strictly a matter of performance and we
should never be racing with another request that is trying to read the
same AbortSpan entry.
  • Loading branch information
nvanbenschoten committed Apr 30, 2020
1 parent 2ec6144 commit 18f8836
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion pkg/kv/kvserver/batcheval/cmd_end_transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,12 @@ func declareKeysEndTxn(
header.Txn.AssertInitialized(context.TODO())
minTxnTS = header.Txn.MinTimestamp
abortSpanAccess := spanset.SpanReadOnly
if !et.Commit && et.Poison {
if !et.Commit {
// Rollback EndTxn requests may write to the abort span, either if
// their Poison flag is set, in which case they will add an abort
// span entry, or if their Poison flag is not set and an abort span
// entry already exists on this Range, in which case they will clear
// that entry.
abortSpanAccess = spanset.SpanReadWrite
}
latchSpans.AddNonMVCC(abortSpanAccess, roachpb.Span{
Expand Down

0 comments on commit 18f8836

Please sign in to comment.