From c5061503e34fe4676388b17297a4c2f02354bcd5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 8 Sep 2020 20:51:09 -0700 Subject: [PATCH v1 3/3] WIP: Test for VACUUM (INTERRUPTIBLE) cancellation working. Needs ANALYZE support. Perhaps also a better approach for switching sessions once the VACUUM has started (see previous commit). Author: Reviewed-By: Discussion: https://postgr.es/m/ Backpatch: --- src/test/isolation/expected/vacuum-cancel.out | 45 +++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + src/test/isolation/specs/vacuum-cancel.spec | 37 +++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/test/isolation/expected/vacuum-cancel.out create mode 100644 src/test/isolation/specs/vacuum-cancel.spec diff --git a/src/test/isolation/expected/vacuum-cancel.out b/src/test/isolation/expected/vacuum-cancel.out new file mode 100644 index 00000000000..2532fb4c7c7 --- /dev/null +++ b/src/test/isolation/expected/vacuum-cancel.out @@ -0,0 +1,45 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_begin s1_pin s2_delete s2_vacuum_interruptible s1_commit +step s1_begin: BEGIN; +step s1_pin: + DECLARE pin_page CURSOR WITHOUT HOLD FOR SELECT * FROM test_vacuum_cancel; + FETCH NEXT FROM pin_page; + +data + +somedata +step s2_delete: DELETE FROM test_vacuum_cancel; +step s2_vacuum_interruptible: VACUUM (FREEZE, INTERRUPTIBLE) test_vacuum_cancel; +step s1_commit: COMMIT; +step s2_vacuum_interruptible: <... completed> + +starting permutation: s1_begin s1_pin s2_delete s2_analyze_interruptible s1_commit +step s1_begin: BEGIN; +step s1_pin: + DECLARE pin_page CURSOR WITHOUT HOLD FOR SELECT * FROM test_vacuum_cancel; + FETCH NEXT FROM pin_page; + +data + +somedata +step s2_delete: DELETE FROM test_vacuum_cancel; +step s2_analyze_interruptible: ANALYZE (INTERRUPTIBLE) test_vacuum_cancel; +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_pin s2_delete s2_vacuum_interruptible s1_lock s1_commit +step s1_begin: BEGIN; +step s1_pin: + DECLARE pin_page CURSOR WITHOUT HOLD FOR SELECT * FROM test_vacuum_cancel; + FETCH NEXT FROM pin_page; + +data + +somedata +step s2_delete: DELETE FROM test_vacuum_cancel; +step s2_vacuum_interruptible: VACUUM (FREEZE, INTERRUPTIBLE) test_vacuum_cancel; +step s1_lock: LOCK test_vacuum_cancel; +step s1_lock: <... completed> +step s2_vacuum_interruptible: <... completed> +error in steps s1_lock s2_vacuum_interruptible: ERROR: canceling statement due to user request +step s1_commit: COMMIT; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 6acbb695ece..c02be96fb8c 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -78,6 +78,7 @@ test: timeouts test: vacuum-concurrent-drop test: vacuum-conflict test: vacuum-skip-locked +test: vacuum-cancel test: predicate-hash test: predicate-gist test: predicate-gin diff --git a/src/test/isolation/specs/vacuum-cancel.spec b/src/test/isolation/specs/vacuum-cancel.spec new file mode 100644 index 00000000000..e41877dce42 --- /dev/null +++ b/src/test/isolation/specs/vacuum-cancel.spec @@ -0,0 +1,37 @@ +setup +{ + CREATE TABLE test_vacuum_cancel(data text); + /* don't want autovacuum clean up to-be-cleaned data concurrently */ + ALTER TABLE test_vacuum_cancel SET (AUTOVACUUM_ENABLED = false); + /* insert some data */ + INSERT INTO test_vacuum_cancel VALUES('somedata'); + INSERT INTO test_vacuum_cancel VALUES('otherdata'); +} + +teardown +{ + DROP TABLE test_vacuum_cancel; +} + +session "s1" +step "s1_begin" { BEGIN; } +step "s1_pin" { + DECLARE pin_page CURSOR WITHOUT HOLD FOR SELECT * FROM test_vacuum_cancel; + FETCH NEXT FROM pin_page; +} +step "s1_lock" { LOCK test_vacuum_cancel; } +step "s1_commit" { COMMIT; } + +session "s2" +step "s2_delete" { DELETE FROM test_vacuum_cancel; } +step "s2_vacuum_interruptible" { VACUUM (FREEZE, INTERRUPTIBLE) test_vacuum_cancel; } +step "s2_analyze_interruptible" { ANALYZE (INTERRUPTIBLE) test_vacuum_cancel; } + +# First test pin release resolves issues +permutation "s1_begin" "s1_pin" "s2_delete" "s2_vacuum_interruptible" "s1_commit" +# XXX: This doesn't actually wait on the pin, need alternative wait trick +permutation "s1_begin" "s1_pin" "s2_delete" "s2_analyze_interruptible" "s1_commit" + +# Then track that concurrent TRUNCATE interrupts VACUUM / ANALYZE +permutation "s1_begin" "s1_pin" "s2_delete" "s2_vacuum_interruptible" "s1_lock" "s1_commit" +#permutation "s1_begin" "s1_pin" "s2_delete" "s2_analyze_interruptible" "s3_truncate" -- 2.25.0.114.g5b0ca878e0