mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-20 17:13:23 +02:00
Previously, we relied on HEAP2_NEW_CID records and XACT_INVALIDATION records to know if the transaction has modified the catalog, and that information is not serialized to snapshot. Therefore, after the restart, if the logical decoding decodes only the commit record of the transaction that has actually modified a catalog, we will miss adding its XID to the snapshot. Thus, we will end up looking at catalogs with the wrong snapshot. To fix this problem, this changes the snapshot builder so that it remembers the last-running-xacts list of the decoded RUNNING_XACTS record after restoring the previously serialized snapshot. Then, we mark the transaction as containing catalog changes if it's in the list of initial running transactions and its commit record has XACT_XINFO_HAS_INVALS. To avoid ABI breakage, we store the array of the initial running transactions in the static variables InitialRunningXacts and NInitialRunningXacts, instead of storing those in SnapBuild or ReorderBuffer. This approach has a false positive; we could end up adding the transaction that didn't change catalog to the snapshot since we cannot distinguish whether the transaction has catalog changes only by checking the COMMIT record. It doesn't have the information on which (sub) transaction has catalog changes, and XACT_XINFO_HAS_INVALS doesn't necessarily indicate that the transaction has catalog change. But that won't be a problem since we use snapshot built during decoding only to read system catalogs. On the master branch, we took a more future-proof approach by writing catalog modifying transactions to the serialized snapshot which avoids the above false positive. But we cannot backpatch it because of a change in the SnapBuild. Reported-by: Mike Oh Author: Masahiko Sawada Reviewed-by: Amit Kapila, Shi yu, Takamichi Osumi, Kyotaro Horiguchi, Bertrand Drouvot, Ahsan Hadi Backpatch-through: 10 Discussion: https://postgr.es/m/81D0D8B0-E7C4-4999-B616-1E5004DBDCD2%40amazon.com
38 lines
1.3 KiB
Makefile
38 lines
1.3 KiB
Makefile
# contrib/test_decoding/Makefile
|
|
|
|
MODULES = test_decoding
|
|
PGFILEDESC = "test_decoding - example of a logical decoding output plugin"
|
|
|
|
REGRESS = ddl xact rewrite toast permissions decoding_in_xact \
|
|
decoding_into_rel binary prepared replorigin time messages \
|
|
spill slot truncate stream stats twophase twophase_stream
|
|
ISOLATION = mxact delayed_startup ondisk_startup concurrent_ddl_dml \
|
|
oldest_xmin snapshot_transfer subxact_without_top concurrent_stream \
|
|
twophase_snapshot slot_creation_error catalog_change_snapshot
|
|
|
|
REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf
|
|
ISOLATION_OPTS = --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf
|
|
|
|
# Disabled because these tests require "wal_level=logical", which
|
|
# typical installcheck users do not have (e.g. buildfarm clients).
|
|
NO_INSTALLCHECK = 1
|
|
|
|
TAP_TESTS = 1
|
|
|
|
ifdef USE_PGXS
|
|
PG_CONFIG = pg_config
|
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
|
include $(PGXS)
|
|
else
|
|
subdir = contrib/test_decoding
|
|
top_builddir = ../..
|
|
include $(top_builddir)/src/Makefile.global
|
|
include $(top_srcdir)/contrib/contrib-global.mk
|
|
endif
|
|
|
|
# But it can nonetheless be very helpful to run tests on preexisting
|
|
# installation, allow to do so, but only if requested explicitly.
|
|
installcheck-force:
|
|
$(pg_regress_installcheck) $(REGRESS)
|
|
$(pg_isolation_regress_installcheck) $(ISOLATION)
|