Fix rare deadlock failure in create_am regression test.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 4 Sep 2020 16:40:28 +0000 (12:40 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 4 Sep 2020 16:40:28 +0000 (12:40 -0400)
The "DROP ACCESS METHOD gist2" test will require locking the index
to be dropped and then its table; while most ordinary operations
lock a table first then its index.  While no concurrent test scripts
should be touching fast_emp4000, autovacuum might chance to be
processing that table when the DROP runs, resulting in a deadlock
failure.  This is pretty rare but we see it in the buildfarm from
time to time.

To fix, acquire a lock on fast_emp4000 before issuing the DROP.

Since the point of the exercise is mostly to prevent buildfarm
failures, back-patch to 9.6 where this test was introduced.

Discussion: https://postgr.es/m/839004.1599185607@sss.pgh.pa.us

src/test/regress/expected/create_am.out
src/test/regress/sql/create_am.sql

index 47dd885c4e9b1ff8d1595197bc926c855b7d2fa5..0b8ba6dbfabdc6f2e6feae05fdf015303212c119 100644 (file)
@@ -97,5 +97,10 @@ ERROR:  cannot drop access method gist2 because other objects depend on it
 DETAIL:  index grect2ind2 depends on operator class box_ops for access method gist2
 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
 -- Drop access method cascade
+-- To prevent a (rare) deadlock against autovacuum,
+-- we must lock the table that owns the index that will be dropped
+BEGIN;
+LOCK TABLE fast_emp4000;
 DROP ACCESS METHOD gist2 CASCADE;
 NOTICE:  drop cascades to index grect2ind2
+COMMIT;
index 3e0ac104f3cca3d59f33f83c808b7d2954bc2fc6..1aa338d3e675b05cf0f2a1fb01eba8e64ba0278a 100644 (file)
@@ -65,4 +65,9 @@ ROLLBACK;
 DROP ACCESS METHOD gist2;
 
 -- Drop access method cascade
+-- To prevent a (rare) deadlock against autovacuum,
+-- we must lock the table that owns the index that will be dropped
+BEGIN;
+LOCK TABLE fast_emp4000;
 DROP ACCESS METHOD gist2 CASCADE;
+COMMIT;