mirror of
https://github.com/postgres/postgres.git
synced 2025-04-20 00:42:27 +03:00
pg_logicalinspect: Stabilize isolation tests.
The previous isolation tests did not account for the possibility that the background writer or the checkpointer could write a RUNNING_XACTS record, which could cause logical decoding to produce more logical snapshots than expected. This commit modifies the isolation tests to verify that at least one logical snapshot contains the expected number of committed or ongoing catalog-change transactions. Per buildfarm member skink. Reported-by: Andres Freund <andres@anarazel.de> Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Discussion: https://postgr.es/m/5qbxud4pvnvmtuoi7weiizm5hmumxaeohx4vztfhrwlfhyz6rj@buh4435mllwo
This commit is contained in:
parent
8b1b342544
commit
a49927f04c
@ -1,6 +1,6 @@
|
|||||||
Parsed test spec with 2 sessions
|
Parsed test spec with 2 sessions
|
||||||
|
|
||||||
starting permutation: s0_init s0_begin s0_savepoint s0_truncate s1_checkpoint s1_get_changes s0_commit s0_begin s0_insert s1_checkpoint s1_get_changes s0_commit s1_get_changes s1_get_logical_snapshot_info s1_get_logical_snapshot_meta
|
starting permutation: s0_init s0_begin s0_savepoint s0_truncate s1_create_table s1_checkpoint s1_get_changes s1_check_snapshot_info s1_check_snapshot_meta s0_commit
|
||||||
step s0_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
step s0_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||||
?column?
|
?column?
|
||||||
--------
|
--------
|
||||||
@ -10,43 +10,23 @@ init
|
|||||||
step s0_begin: BEGIN;
|
step s0_begin: BEGIN;
|
||||||
step s0_savepoint: SAVEPOINT sp1;
|
step s0_savepoint: SAVEPOINT sp1;
|
||||||
step s0_truncate: TRUNCATE tbl1;
|
step s0_truncate: TRUNCATE tbl1;
|
||||||
|
step s1_create_table: CREATE TABLE tbl2 (val1 integer, val2 integer);
|
||||||
step s1_checkpoint: CHECKPOINT;
|
step s1_checkpoint: CHECKPOINT;
|
||||||
step s1_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
|
step s1_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
|
||||||
data
|
data
|
||||||
----
|
----
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
step s0_commit: COMMIT;
|
step s1_check_snapshot_info: SELECT count(*) > 0 as has_info FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info where info.catchange_count >= 2 and array_length(info.catchange_xip,1) >= 2 and info.committed_count >= 1 and array_length(info.committed_xip,1) >= 1;
|
||||||
step s0_begin: BEGIN;
|
has_info
|
||||||
step s0_insert: INSERT INTO tbl1 VALUES (1);
|
--------
|
||||||
step s1_checkpoint: CHECKPOINT;
|
t
|
||||||
step s1_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
|
|
||||||
data
|
|
||||||
---------------------------------------
|
|
||||||
BEGIN
|
|
||||||
table public.tbl1: TRUNCATE: (no-flags)
|
|
||||||
COMMIT
|
|
||||||
(3 rows)
|
|
||||||
|
|
||||||
step s0_commit: COMMIT;
|
|
||||||
step s1_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
|
|
||||||
data
|
|
||||||
-------------------------------------------------------------
|
|
||||||
BEGIN
|
|
||||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:null
|
|
||||||
COMMIT
|
|
||||||
(3 rows)
|
|
||||||
|
|
||||||
step s1_get_logical_snapshot_info: SELECT info.state, info.catchange_count, array_length(info.catchange_xip,1) AS catchange_array_length, info.committed_count, array_length(info.committed_xip,1) AS committed_array_length FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info ORDER BY 2;
|
|
||||||
state |catchange_count|catchange_array_length|committed_count|committed_array_length
|
|
||||||
----------+---------------+----------------------+---------------+----------------------
|
|
||||||
consistent| 0| | 2| 2
|
|
||||||
consistent| 2| 2| 0|
|
|
||||||
(2 rows)
|
|
||||||
|
|
||||||
step s1_get_logical_snapshot_meta: SELECT COUNT(meta.*) from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta;
|
|
||||||
count
|
|
||||||
-----
|
|
||||||
2
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
step s1_check_snapshot_meta: SELECT count(meta.*) > 0 AS has_meta from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta;
|
||||||
|
has_meta
|
||||||
|
--------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
step s0_commit: COMMIT;
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
# Test the pg_logicalinspect functions: that needs some permutation to
|
# Test the pg_logicalinspect functions: that needs some permutation to
|
||||||
# ensure that we are creating multiple logical snapshots and that one of them
|
# ensure that we are creating at least one snapshot that contains ongoing and
|
||||||
# contains ongoing catalogs changes.
|
# committed catalogs changes.
|
||||||
setup
|
setup
|
||||||
{
|
{
|
||||||
DROP TABLE IF EXISTS tbl1;
|
DROP TABLE IF EXISTS tbl1;
|
||||||
|
DROP TABLE IF EXISTS tbl2;
|
||||||
CREATE TABLE tbl1 (val1 integer, val2 integer);
|
CREATE TABLE tbl1 (val1 integer, val2 integer);
|
||||||
CREATE EXTENSION pg_logicalinspect;
|
CREATE EXTENSION pg_logicalinspect;
|
||||||
}
|
}
|
||||||
@ -11,6 +12,7 @@ setup
|
|||||||
teardown
|
teardown
|
||||||
{
|
{
|
||||||
DROP TABLE tbl1;
|
DROP TABLE tbl1;
|
||||||
|
DROP TABLE tbl2;
|
||||||
SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot');
|
SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot');
|
||||||
DROP EXTENSION pg_logicalinspect;
|
DROP EXTENSION pg_logicalinspect;
|
||||||
}
|
}
|
||||||
@ -21,14 +23,24 @@ step "s0_init" { SELECT 'init' FROM pg_create_logical_replication_slot('isolatio
|
|||||||
step "s0_begin" { BEGIN; }
|
step "s0_begin" { BEGIN; }
|
||||||
step "s0_savepoint" { SAVEPOINT sp1; }
|
step "s0_savepoint" { SAVEPOINT sp1; }
|
||||||
step "s0_truncate" { TRUNCATE tbl1; }
|
step "s0_truncate" { TRUNCATE tbl1; }
|
||||||
step "s0_insert" { INSERT INTO tbl1 VALUES (1); }
|
|
||||||
step "s0_commit" { COMMIT; }
|
step "s0_commit" { COMMIT; }
|
||||||
|
|
||||||
session "s1"
|
session "s1"
|
||||||
setup { SET synchronous_commit=on; }
|
setup { SET synchronous_commit=on; }
|
||||||
step "s1_checkpoint" { CHECKPOINT; }
|
step "s1_checkpoint" { CHECKPOINT; }
|
||||||
|
step "s1_create_table" { CREATE TABLE tbl2 (val1 integer, val2 integer); }
|
||||||
step "s1_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); }
|
step "s1_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); }
|
||||||
step "s1_get_logical_snapshot_meta" { SELECT COUNT(meta.*) from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta;}
|
step "s1_check_snapshot_meta" { SELECT count(meta.*) > 0 AS has_meta from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta; }
|
||||||
step "s1_get_logical_snapshot_info" { SELECT info.state, info.catchange_count, array_length(info.catchange_xip,1) AS catchange_array_length, info.committed_count, array_length(info.committed_xip,1) AS committed_array_length FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info ORDER BY 2; }
|
step "s1_check_snapshot_info" { SELECT count(*) > 0 as has_info FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info where info.catchange_count >= 2 and array_length(info.catchange_xip,1) >= 2 and info.committed_count >= 1 and array_length(info.committed_xip,1) >= 1; }
|
||||||
|
|
||||||
permutation "s0_init" "s0_begin" "s0_savepoint" "s0_truncate" "s1_checkpoint" "s1_get_changes" "s0_commit" "s0_begin" "s0_insert" "s1_checkpoint" "s1_get_changes" "s0_commit" "s1_get_changes" "s1_get_logical_snapshot_info" "s1_get_logical_snapshot_meta"
|
|
||||||
|
# Both s0 and s1 execute catalog-change transactions. When "s1_get_changes" is
|
||||||
|
# executed, s0's transaction is still in progress, while s1's transaction has
|
||||||
|
# already completed. Consequently, the logical decoding produces a snapshot at
|
||||||
|
# the point where a RUNNING_XACTS record is generated by "s1_checkpoint".
|
||||||
|
# This snapshot contains both two ongoing catalog-change transactions (from s0's
|
||||||
|
# top-level and sub transactions) and one completed transaction (from s1).
|
||||||
|
# "s1_check_snapshot_info" verifies whether the logical snapshot contains at
|
||||||
|
# least the expected number of transactions, accounting for potential
|
||||||
|
# additional catalog changes that may occur due to concurrent autoanalyze.
|
||||||
|
permutation "s0_init" "s0_begin" "s0_savepoint" "s0_truncate" "s1_create_table" "s1_checkpoint" "s1_get_changes" "s1_check_snapshot_info" "s1_check_snapshot_meta" "s0_commit"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user