Re: Potential G2-item cycles under serializable isolation
Peter Geoghegan <pg@bowt.ie>
From: Peter Geoghegan <pg@bowt.ie>
To: Kyle Kingsbury <aphyr@jepsen.io>
Cc: PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2020-06-08T02:54:21Z
Lists: pgsql-bugs
Attachments
- 0001-Fix-HeapCheckForSerializableConflictOut-bug.patch (application/octet-stream) patch 0001
On Sat, Jun 6, 2020 at 3:24 PM Peter Geoghegan <pg@bowt.ie> wrote: > Here is a restatement of the same anomaly with RR event number > annotations, to make it easy for other people to match up each > observation/modification to a query from the log file I made available > yesterday: Attached is a tentative bug fix. With this applied, I cannot get Jepsen/Elle to complain about a G2-Item anymore, nor any other anomaly, even after a dozen or so attempts. The regression tests pass, too. The issue seems to be that heapam's mechanism for adding a "conflict out" can get some details subtly wrong. This can happen in the event of a concurrently updated tuple where the updating xact aborts. So for each pair of transactions that committed in each G2-Item, there seemed to be a third updating transaction that aborted, messing things up. I think that the "conflict out" stuff ought to behave as if an updated tuple was never updated when it's not visible to our xact anyway. We should use the XID that created the original tuple for "conflict out" purposes -- not the (possibly aborted) updater's XID (i.e. not the HeapTupleHeaderGetUpdateXid() XID). In the example RR log that I posted the other day, the update + abort transaction was here (jepsen process 39/xid 1680826): [rr 316505 584863] 1591388175.991-316505-7/407-1680826-SELECT-5edaa7f9.4d459-jepsen process 39 LOG: execute <unnamed>: select (val) from txn0 where id = $1 1591388175.991-316505-7/407-1680826-SELECT-5edaa7f9.4d459-jepsen process 39 DETAIL: parameters: $1 = '1470' [rr 316505 584881] 1591388175.992-316505-7/0-1680826-ROLLBACK-5edaa7f9.4d459-jepsen process 39 LOG: execute <unnamed>: ROLLBACK Kyle: Shouldn't be too hard to build Postgres from source if you want to test it yourself. Either way, thanks for the report! -- Peter Geoghegan
Commits
-
Doc: Add references for SI and SSI.
- 4c897197d793 9.5.23 landed
- 7295ac9c6c71 9.6.19 landed
- e2aca0d02d97 10.14 landed
- 648e56d3984d 11.9 landed
- eb1286413c0a 12.4 landed
- 4701efa9f741 13.0 landed
- 1575fbf1ac3c 14.0 landed
-
Improve comments for [Heap]CheckForSerializableConflictOut().
- 44eff2841059 13.0 landed
- 7aa4fb592530 14.0 landed
-
Avoid update conflict out serialization anomalies.
- 5940ffb22131 14.0 landed
- 6df7105e5d50 13.0 landed
- e620a38c23b9 12.4 landed
- dd616f2ec1c5 11.9 landed
- 19a6e1bc3083 10.14 landed
- e81dc2b7e2c4 9.6.19 landed
- c05f6b354ffe 9.5.23 landed
-
Implement genuine serializable isolation level.
- dafaa3efb75c 9.1.0 cited