diff options
Diffstat (limited to 'src/test/modules/snapshot_too_old')
9 files changed, 322 insertions, 0 deletions
diff --git a/src/test/modules/snapshot_too_old/.gitignore b/src/test/modules/snapshot_too_old/.gitignore new file mode 100644 index 0000000..5cf29ed --- /dev/null +++ b/src/test/modules/snapshot_too_old/.gitignore @@ -0,0 +1 @@ +/output_iso/ diff --git a/src/test/modules/snapshot_too_old/Makefile b/src/test/modules/snapshot_too_old/Makefile new file mode 100644 index 0000000..dfb4537 --- /dev/null +++ b/src/test/modules/snapshot_too_old/Makefile @@ -0,0 +1,28 @@ +# src/test/modules/snapshot_too_old/Makefile + +# Note: because we don't tell the Makefile there are any regression tests, +# we have to clean those result files explicitly +EXTRA_CLEAN = $(pg_regress_clean_files) + +ISOLATION = sto_using_cursor sto_using_select sto_using_hash_index +ISOLATION_OPTS = --temp-config $(top_srcdir)/src/test/modules/snapshot_too_old/sto.conf + +# Disabled because these tests require "old_snapshot_threshold" >= 0, which +# typical installcheck users do not have (e.g. buildfarm clients). +NO_INSTALLCHECK = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/snapshot_too_old +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_isolation_regress_installcheck) $(ISOLATION) diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out b/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out new file mode 100644 index 0000000..4359bf2 --- /dev/null +++ b/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out @@ -0,0 +1,95 @@ +Parsed test spec with 2 sessions + +starting permutation: s1decl s1f1 s1sleep s1f2 s2u +step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; +step s1f1: FETCH FIRST FROM cursor1; +c +- +1 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: FETCH FIRST FROM cursor1; +c +- +1 +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; + +starting permutation: s1decl s1f1 s1sleep s2u s1f2 +step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; +step s1f1: FETCH FIRST FROM cursor1; +c +- +1 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1f2: FETCH FIRST FROM cursor1; +ERROR: snapshot too old + +starting permutation: s1decl s1f1 s2u s1sleep s1f2 +step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; +step s1f1: FETCH FIRST FROM cursor1; +c +- +1 +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: FETCH FIRST FROM cursor1; +ERROR: snapshot too old + +starting permutation: s1decl s2u s1f1 s1sleep s1f2 +step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1f1: FETCH FIRST FROM cursor1; +c +- +1 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: FETCH FIRST FROM cursor1; +ERROR: snapshot too old + +starting permutation: s2u s1decl s1f1 s1sleep s1f2 +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; +step s1f1: FETCH FIRST FROM cursor1; +c +- +2 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: FETCH FIRST FROM cursor1; +ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out b/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out new file mode 100644 index 0000000..11f827f --- /dev/null +++ b/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out @@ -0,0 +1,19 @@ +Parsed test spec with 2 sessions + +starting permutation: noseq s1f1 s2sleep s2u s1f2 +step noseq: SET enable_seqscan = false; +step s1f1: SELECT c FROM sto1 where c = 1000; + c +---- +1000 +(1 row) + +step s2sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1000; +step s1f2: SELECT c FROM sto1 where c = 1001; +ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_select.out b/src/test/modules/snapshot_too_old/expected/sto_using_select.out new file mode 100644 index 0000000..3067e05 --- /dev/null +++ b/src/test/modules/snapshot_too_old/expected/sto_using_select.out @@ -0,0 +1,73 @@ +Parsed test spec with 2 sessions + +starting permutation: s1f1 s1sleep s1f2 s2u +step s1f1: SELECT c FROM sto1 ORDER BY c LIMIT 1; +c +- +1 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: SELECT c FROM sto1 ORDER BY c LIMIT 1; +c +- +1 +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; + +starting permutation: s1f1 s1sleep s2u s1f2 +step s1f1: SELECT c FROM sto1 ORDER BY c LIMIT 1; +c +- +1 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1f2: SELECT c FROM sto1 ORDER BY c LIMIT 1; +ERROR: snapshot too old + +starting permutation: s1f1 s2u s1sleep s1f2 +step s1f1: SELECT c FROM sto1 ORDER BY c LIMIT 1; +c +- +1 +(1 row) + +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: SELECT c FROM sto1 ORDER BY c LIMIT 1; +ERROR: snapshot too old + +starting permutation: s2u s1f1 s1sleep s1f2 +step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; +step s1f1: SELECT c FROM sto1 ORDER BY c LIMIT 1; +c +- +2 +(1 row) + +step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; +setting|pg_sleep +-------+-------- + 0| +(1 row) + +step s1f2: SELECT c FROM sto1 ORDER BY c LIMIT 1; +ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec b/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec new file mode 100644 index 0000000..eac18ca --- /dev/null +++ b/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec @@ -0,0 +1,37 @@ +# This test provokes a "snapshot too old" error using a cursor. +# +# The sleep is needed because with a threshold of zero a statement could error +# on changes it made. With more normal settings no external delay is needed, +# but we don't want these tests to run long enough to see that, since +# granularity is in minutes. +# +# Since results depend on the value of old_snapshot_threshold, sneak that into +# the line generated by the sleep, so that a surprising values isn't so hard +# to identify. + +setup +{ + CREATE TABLE sto1 (c int NOT NULL); + INSERT INTO sto1 SELECT generate_series(1, 1000); + CREATE TABLE sto2 (c int NOT NULL); +} +setup +{ + VACUUM ANALYZE sto1; +} + +teardown +{ + DROP TABLE sto1, sto2; +} + +session "s1" +setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step "s1decl" { DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; } +step "s1f1" { FETCH FIRST FROM cursor1; } +step "s1sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } +step "s1f2" { FETCH FIRST FROM cursor1; } +teardown { COMMIT; } + +session "s2" +step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1; } diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec b/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec new file mode 100644 index 0000000..33d91ff --- /dev/null +++ b/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec @@ -0,0 +1,31 @@ +# This test is like sto_using_select, except that we test access via a +# hash index. + +setup +{ + CREATE TABLE sto1 (c int NOT NULL); + INSERT INTO sto1 SELECT generate_series(1, 1000); + CREATE INDEX idx_sto1 ON sto1 USING HASH (c); +} +setup +{ + VACUUM ANALYZE sto1; +} + +teardown +{ + DROP TABLE sto1; +} + +session "s1" +setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step "noseq" { SET enable_seqscan = false; } +step "s1f1" { SELECT c FROM sto1 where c = 1000; } +step "s1f2" { SELECT c FROM sto1 where c = 1001; } +teardown { ROLLBACK; } + +session "s2" +step "s2sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } +step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1000; } + +permutation "noseq" "s1f1" "s2sleep" "s2u" "s1f2" diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_select.spec b/src/test/modules/snapshot_too_old/specs/sto_using_select.spec new file mode 100644 index 0000000..d7c34f3 --- /dev/null +++ b/src/test/modules/snapshot_too_old/specs/sto_using_select.spec @@ -0,0 +1,36 @@ +# This test provokes a "snapshot too old" error using SELECT statements. +# +# The sleep is needed because with a threshold of zero a statement could error +# on changes it made. With more normal settings no external delay is needed, +# but we don't want these tests to run long enough to see that, since +# granularity is in minutes. +# +# Since results depend on the value of old_snapshot_threshold, sneak that into +# the line generated by the sleep, so that a surprising values isn't so hard +# to identify. + +setup +{ + CREATE TABLE sto1 (c int NOT NULL); + INSERT INTO sto1 SELECT generate_series(1, 1000); + CREATE TABLE sto2 (c int NOT NULL); +} +setup +{ + VACUUM ANALYZE sto1; +} + +teardown +{ + DROP TABLE sto1, sto2; +} + +session "s1" +setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step "s1f1" { SELECT c FROM sto1 ORDER BY c LIMIT 1; } +step "s1sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } +step "s1f2" { SELECT c FROM sto1 ORDER BY c LIMIT 1; } +teardown { COMMIT; } + +session "s2" +step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1; } diff --git a/src/test/modules/snapshot_too_old/sto.conf b/src/test/modules/snapshot_too_old/sto.conf new file mode 100644 index 0000000..7eeaeeb --- /dev/null +++ b/src/test/modules/snapshot_too_old/sto.conf @@ -0,0 +1,2 @@ +autovacuum = off +old_snapshot_threshold = 0 |