On Sat, Oct 26, 2024 at 12:43:44AM -0700, Masahiko Sawada wrote:
> I got the following assertion failure from an autovaucum worker:
>
> 2024-10-26 00:32:03.685 PDT [830672] LOG: autovacuum: dropping orphan
> temp table "postgres.pg_temp_0.hoge"
> TRAP: failed Assert("HaveRegisteredOrActiveSnapshot()"), File:
> "index.c", Line: 2345, PID: 830672
IMHO the best way to handle this is to just unconditionally push a snapshot
in this code path instead of making assumptions about what callers will do.
--
nathan
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 9162b9f81a..74d0f3097e 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -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