At 2012-09-25 01:46:18 +0200, and...@2ndquadrant.com wrote: > > The attached patch fixes this issue. Haven't looked at the other one > in detail yet.
Here are tests for both bugs. They currently fail with HEAD. Note that the first test now uses PREPARE instead of the SELECTs in the original example, which no longer works after commit #96cc18 because of the re-added AcceptInvalidationMessages calls (archaeology by Andres). -- Abhijit
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 75e33bc..d964aaf 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -14,3 +14,5 @@ test: fk-contention test: fk-deadlock test: fk-deadlock2 test: eval-plan-qual +test: drop-index-concurrently-1 +test: drop-index-concurrently-2 diff --git a/src/test/isolation/specs/drop-index-concurrently-1.spec b/src/test/isolation/specs/drop-index-concurrently-1.spec new file mode 100644 index 0000000..83c44ab --- /dev/null +++ b/src/test/isolation/specs/drop-index-concurrently-1.spec @@ -0,0 +1,33 @@ +setup +{ + CREATE TABLE test_dc(id serial primary key, data int); + INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); + CREATE INDEX test_dc_data ON test_dc(data); +} + +teardown +{ + DROP TABLE test_dc; +} + +session "s1" +step "noseq" { SET enable_seqscan = false; } +step "prepi" { PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34; } +step "preps" { PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text; } +step "begin" { BEGIN; } +step "explaini" { EXPLAIN (COSTS OFF) EXECUTE getrow_idx; } +step "explains" { EXPLAIN (COSTS OFF) EXECUTE getrow_seq; } +step "selecti" { EXECUTE getrow_idx; } +step "selects" { EXECUTE getrow_seq; } +step "end" { COMMIT; } + +session "s2" +setup { BEGIN; } +step "select2" { SELECT * FROM test_dc WHERE data=34; } +step "insert2" { INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); } +step "end2" { COMMIT; } + +session "s3" +step "drop" { DROP INDEX CONCURRENTLY test_dc_data; } + +permutation "noseq" "prepi" "preps" "begin" "explaini" "explains" "select2" "drop" "insert2" "end2" "selecti" "selects" "end" diff --git a/src/test/isolation/expected/drop-index-concurrently-1.out b/src/test/isolation/expected/drop-index-concurrently-1.out new file mode 100644 index 0000000..c42ac91 --- /dev/null +++ b/src/test/isolation/expected/drop-index-concurrently-1.out @@ -0,0 +1,36 @@ +Parsed test spec with 3 sessions + +starting permutation: noseq prepi preps begin explaini explains select2 drop insert2 end2 selecti selects end +step noseq: SET enable_seqscan = false; +step prepi: PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34; +step preps: PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text; +step begin: BEGIN; +step explaini: EXPLAIN (COSTS OFF) EXECUTE getrow_idx; +QUERY PLAN + +Index Scan using test_dc_data on test_dc + Index Cond: (data = 34) +step explains: EXPLAIN (COSTS OFF) EXECUTE getrow_seq; +QUERY PLAN + +Seq Scan on test_dc + Filter: ((data)::text = '34'::text) +step select2: SELECT * FROM test_dc WHERE data=34; +id data + +34 34 +step drop: DROP INDEX CONCURRENTLY test_dc_data; <waiting ...> +step insert2: INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); +step end2: COMMIT; +step selecti: EXECUTE getrow_idx; +id data + +34 34 +134 34 +step selects: EXECUTE getrow_seq; +id data + +34 34 +134 34 +step end: COMMIT; +step drop: <... completed> diff --git a/src/test/isolation/specs/drop-index-concurrently-2.spec b/src/test/isolation/specs/drop-index-concurrently-2.spec new file mode 100644 index 0000000..273f735 --- /dev/null +++ b/src/test/isolation/specs/drop-index-concurrently-2.spec @@ -0,0 +1,21 @@ +setup +{ + CREATE TABLE test_dc(id serial primary key, data int); + CREATE INDEX test_dc_data ON test_dc(data); +} + +session "s1" +setup { BEGIN; } +step "explain" { EXPLAIN (COSTS OFF) SELECT * FROM test_dc WHERE data=34343; } +step "rollback" { ROLLBACK; } +step "droptab" { DROP TABLE test_dc; } +step "selecti" { SELECT indexrelid::regclass, indisvalid, indisready FROM pg_index WHERE indexrelid = 'test_dc_data'::regclass; } +step "dropi" { DROP INDEX test_dc_data; } + +session "s2" +step "drop" { DROP INDEX CONCURRENTLY test_dc_data; } + +session "s3" +step "cancel" { SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'DROP INDEX CONCURRENTLY test_dc_data;'; } + +permutation "explain" "drop" "cancel" "rollback" "droptab" "selecti" "dropi" diff --git a/src/test/isolation/expected/drop-index-concurrently-2.out b/src/test/isolation/expected/drop-index-concurrently-2.out new file mode 100644 index 0000000..4802777 --- /dev/null +++ b/src/test/isolation/expected/drop-index-concurrently-2.out @@ -0,0 +1,24 @@ +Parsed test spec with 3 sessions + +starting permutation: explain drop cancel rollback droptab selecti dropi +step explain: EXPLAIN (COSTS OFF) SELECT * FROM test_dc WHERE data=34343; +QUERY PLAN + +Bitmap Heap Scan on test_dc + Recheck Cond: (data = 34343) + -> Bitmap Index Scan on test_dc_data + Index Cond: (data = 34343) +step drop: DROP INDEX CONCURRENTLY test_dc_data; <waiting ...> +step cancel: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'DROP INDEX CONCURRENTLY test_dc_data;'; +pg_cancel_backend + +t +step drop: <... completed> +error in steps cancel drop: ERROR: canceling statement due to user request +step rollback: ROLLBACK; +step droptab: DROP TABLE test_dc; +step selecti: SELECT indexrelid::regclass, indisvalid, indisready FROM pg_index WHERE indexrelid = 'test_dc_data'::regclass; +indexrelid indisvalid indisready + +test_dc_data f f +step dropi: DROP INDEX test_dc_data;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers