Ensure we have a snapshot when updating pg_index in index_drop().
authorNathan Bossart <[email protected]>
Mon, 28 Oct 2024 21:44:31 +0000 (16:44 -0500)
committerNathan Bossart <[email protected]>
Mon, 28 Oct 2024 21:44:31 +0000 (16:44 -0500)
I assumed that all index_drop() callers set an active snapshot
beforehand, but that is evidently not true.  One counterexample is
autovacuum, which doesn't set an active snapshot when cleaning up
orphan temp indexes.  To fix, unconditionally push an active
snapshot before updating pg_index in index_drop().

Oversight in commit b52adbad46.

Reported-by: Masahiko Sawada
Reviewed-by: Stepan Neretin, Masahiko Sawada
Discussion: https://postgr.es/m/CAD21AoBgF9etQrXbN9or_YHsmBRJHHNUEkhHp9rGK9CyQv5aTQ%40mail.gmail.com

src/backend/catalog/index.c

index 9162b9f81a2e230dedf112dbab7d25c64d88a540..74d0f3097eb8038d8aefcf740cd76267233ca275 100644 (file)
@@ -2336,13 +2336,9 @@ index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode)
 
    /*
     * Updating pg_index might involve TOAST table access, so ensure we have a
-    * valid snapshot.  We only expect to get here without a snapshot in the
-    * concurrent path.
+    * valid snapshot.
     */
-   if (concurrent)
-       PushActiveSnapshot(GetTransactionSnapshot());
-   else
-       Assert(HaveRegisteredOrActiveSnapshot());
+   PushActiveSnapshot(GetTransactionSnapshot());
 
    /*
     * fix INDEX relation, and check for expressional index
@@ -2361,8 +2357,7 @@ index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode)
    ReleaseSysCache(tuple);
    table_close(indexRelation, RowExclusiveLock);
 
-   if (concurrent)
-       PopActiveSnapshot();
+   PopActiveSnapshot();
 
    /*
     * if it has any expression columns, we might have stored statistics about