mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Skip logical decoding of already-aborted transactions.
Previously, transaction aborts were detected concurrently only during system catalog scans while replaying a transaction in streaming mode. This commit adds an additional CLOG lookup to check the transaction status, allowing the logical decoding to skip changes also when it doesn't touch system catalogs, if the transaction is already aborted. This optimization enhances logical decoding performance, especially for large transactions that have already been rolled back, as it avoids unnecessary disk or network I/O. To avoid potential slowdowns caused by frequent CLOG lookups for small transactions (most of which commit), the CLOG lookup is performed only for large transactions before eviction. The performance benchmark results showed there is not noticeable performance regression due to CLOG lookups. Reviewed-by: Amit Kapila, Peter Smith, Vignesh C, Ajin Cherian Reviewed-by: Dilip Kumar, Andres Freund Discussion: https://postgr.es/m/CAD21AoDht9Pz_DFv_R2LqBTBbO4eGrpa9Vojmt5z5sEx3XwD7A@mail.gmail.com
This commit is contained in:
@ -49,7 +49,12 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'incl
|
||||
* detect that the subtransaction was aborted, and reset the transaction while having
|
||||
* the TOAST changes in memory, resulting in deallocating both decoded changes and
|
||||
* TOAST reconstruction data. Memory usage counters must be updated correctly.
|
||||
*
|
||||
* Set debug_logical_replication_streaming to 'immediate' to disable the transaction
|
||||
* status check happening before streaming the second insertion, so we can detect a
|
||||
* concurrent abort while streaming.
|
||||
*/
|
||||
SET debug_logical_replication_streaming = immediate;
|
||||
BEGIN;
|
||||
INSERT INTO stream_test SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i);
|
||||
ALTER TABLE stream_test ADD COLUMN i INT;
|
||||
@ -58,6 +63,7 @@ INSERT INTO stream_test(data, i) SELECT repeat(string_agg(to_char(g.i, 'FM0000')
|
||||
ROLLBACK TO s1;
|
||||
COMMIT;
|
||||
SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1');
|
||||
RESET debug_logical_replication_streaming;
|
||||
|
||||
DROP TABLE stream_test;
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
|
Reference in New Issue
Block a user