From 5317f527f4a502347782030e30ca05db83c57584 Mon Sep 17 00:00:00 2001 From: amit Date: Fri, 6 Nov 2015 17:10:13 +0900 Subject: [PATCH] Make repack_drop() processing robust against deadlocks. Concurrent activity on the target table can cause deadlocks when repack_drop() is doing its job, ie, dropping the temporary objects created. It is highly likely to occur when pg_repack is interrupted midway through its processing. --- lib/repack.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/repack.c b/lib/repack.c index 3224544..edac638 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -949,6 +949,17 @@ repack_drop(PG_FUNCTION_ARGS) /* connect to SPI manager */ repack_init(); + /* + * To prevent concurrent lockers of the repack target table from + * causing deadlocks, take an exclusive lock on it. + * + * Fixes deadlock mentioned in the Github issue #55. + */ + execute_with_format( + SPI_OK_UTILITY, + "LOCK TABLE %s IN ACCESS EXCLUSIVE MODE", + relname); + /* drop log table: must be done before dropping the pk type, * since the log table is dependent on the pk type. (That's * why we check numobj > 1 here.)