Avoid streaming the transaction which are skipped (in corner cases)
Dilip Kumar <dilipbalaut@gmail.com>
From: Dilip Kumar <dilipbalaut@gmail.com>
To: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-11-25T08:05:24Z
Lists: pgsql-hackers
Attachments
- v1-0001-Fix-thinko-in-when-to-stream-a-transaction.patch (text/x-patch) patch v1-0001
During DecodeCommit() for skipping a transaction we use ReadRecPtr to check whether to skip this transaction or not. Whereas in ReorderBufferCanStartStreaming() we use EndRecPtr to check whether to stream or not. Generally it will not create a problem but if the commit record itself is adding some changes to the transaction(e.g. snapshot) and if the "start_decoding_at" is in between ReadRecPtr and EndRecPtr then streaming will decide to stream the transaction where as DecodeCommit will decide to skip it. And for handling this case in ReorderBufferForget() we call stream_abort(). So ideally if we are planning to skip the transaction we should never stream it hence there is no need to stream abort such transaction in case of skip. In this patch I have fixed the skip condition in the streaming case and also added an assert inside ReorderBufferForget() to ensure that the transaction should have never been streamed. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com
Commits
-
Avoid unnecessary streaming of transactions during logical replication.
- bf07ab492c46 16.0 landed
-
Fix assertion failures while processing NEW_CID record in logical decoding.
- 16b1fe0037dc 16.0 cited