mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
ec5896aed3
Heikki noticed in 544E23C0.8090605@vmware.com that slot.c and snapbuild.c were missing the FIN_CRC32 call when computing/checking checksums of on disk files. That doesn't lower the the error detection capabilities of the checksum, but is inconsistent with other usages. In a followup mail Heikki also noticed that, contrary to a comment, the 'version' and 'length' struct fields of replication slot's on disk data where not covered by the checksum. That's not likely to lead to actually missed corruption as those fields are cross checked with the expected version and the actual file length. But it's wrong nonetheless. As fixing these issues makes existing on disk files unreadable, bump the expected versions of on disk files for both slots and logical decoding historic catalog snapshots. This means that loading old files will fail with ERROR: "replication slot file ... has unsupported version 1" and ERROR: "snapbuild state file ... has unsupported version 1 instead of 2" respectively. Given the low likelihood of anybody already using these new features in a production setup that seems acceptable. Fixing these issues made me notice that there's no regression test covering the loading of historic snapshot from disk - so add one. Backpatch to 9.4 where these features were introduced.
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
# Force usage of ondisk decoding snapshots to test that code path.
|
|
setup
|
|
{
|
|
DROP TABLE IF EXISTS do_write;
|
|
CREATE TABLE do_write(id serial primary key);
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE do_write;
|
|
SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot');
|
|
}
|
|
|
|
|
|
session "s1"
|
|
setup { SET synchronous_commit=on; }
|
|
|
|
step "s1init" {SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');}
|
|
step "s1start" {SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');}
|
|
step "s1insert" { INSERT INTO do_write DEFAULT VALUES; }
|
|
step "s1checkpoint" { CHECKPOINT; }
|
|
step "s1alter" { ALTER TABLE do_write ADD COLUMN addedbys1 int; }
|
|
|
|
session "s2"
|
|
setup { SET synchronous_commit=on; }
|
|
|
|
step "s2txid" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT txid_current() IS NULL; }
|
|
step "s2alter" { ALTER TABLE do_write ADD COLUMN addedbys2 int; }
|
|
step "s2c" { COMMIT; }
|
|
|
|
|
|
session "s3"
|
|
setup { SET synchronous_commit=on; }
|
|
|
|
step "s3txid" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT txid_current() IS NULL; }
|
|
step "s3c" { COMMIT; }
|
|
|
|
# Force usage of ondisk snapshot by starting and not finishing a
|
|
# transaction with a assigned xid after consistency has been
|
|
# reached. In combination with a checkpoint forcing a snapshot to be
|
|
# written and a new restart point computed that'll lead to the usage
|
|
# of the snapshot.
|
|
permutation "s2txid" "s1init" "s3txid" "s2alter" "s2c" "s1insert" "s1checkpoint" "s1start" "s1insert" "s1alter" "s1insert" "s1start"
|