pgsql: Increment xactCompletionCount during subtransaction abort.
От | Andres Freund |
---|---|
Тема | pgsql: Increment xactCompletionCount during subtransaction abort. |
Дата | |
Msg-id | E1lToY5-00080O-0I@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Increment xactCompletionCount during subtransaction abort. Snapshot caching, introduced in 623a9ba79b, did not increment xactCompletionCount during subtransaction abort. That could lead to an older snapshot being reused. That is, at least as far as I can see, not a correctness issue (for MVCC snapshots there's no difference between "in progress" and "aborted"). The only difference between the old and new snapshots would be a newer ->xmax. While HeapTupleSatisfiesMVCC makes the same visibility determination, reusing the old snapshot leads HeapTupleSatisfiesMVCC to not set HEAP_XMIN_INVALID. Which subsequently causes the kill_prior_tuple optimization to not kick in (via HeapTupleIsSurelyDead() returning false). The performance effects of doing the same index-lookups over and over again is how the issue was discovered... Fix the issue by incrementing xactCompletionCount in XidCacheRemoveRunningXids. It already acquires ProcArrayLock exclusively, making that an easy proposition. Add a test to ensure that kill_prior_tuple prevents index growth when it involves aborted subtransaction of the current transaction. Author: Andres Freund Discussion: https://postgr.es/m/20210406043521.lopeo7bbigad3n6t@alap3.anarazel.de Discussion: https://postgr.es/m/20210317055718.v6qs3ltzrformqoa%40alap3.anarazel.de Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/90c885cdab8bc5a5f12a243774fa0db51002a2fd Modified Files -------------- src/backend/storage/ipc/procarray.c | 8 +++++++ src/test/regress/expected/mvcc.out | 42 +++++++++++++++++++++++++++++++++++ src/test/regress/parallel_schedule | 2 +- src/test/regress/serial_schedule | 1 + src/test/regress/sql/mvcc.sql | 44 +++++++++++++++++++++++++++++++++++++ 5 files changed, 96 insertions(+), 1 deletion(-)
В списке pgsql-committers по дате отправления: