On Thu, Sep 19, 2024 at 12:00:00PM +0300, Alexander Lakhin wrote:
> I've discovered that Jonathan's initial script:
> CREATE TABLE def (id int);
> SELECT array_agg(n) b FROM generate_series(1,10_000) n \gset
> CREATE OR REPLACE FUNCTION vec_quantizer (a int, b int[]) RETURNS bool
> AS $$ SELECT true $$ LANGUAGE SQL IMMUTABLE;
> CREATE INDEX ON def (vec_quantizer(id, :'b'));
> 
> completed with:
> DROP INDEX CONCURRENTLY def_vec_quantizer_idx;
> 
> triggers an assertion failure:
> TRAP: failed Assert("HaveRegisteredOrActiveSnapshot()"), File: 
> "toast_internals.c", Line: 668, PID: 3723372

Ha, that was fast.  The attached patch seems to fix the assertion failures.
It's probably worth checking if any of the adjacent code paths are
affected, too.

-- 
nathan
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b2b3ecb524..2e378ef4ef 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2255,6 +2255,7 @@ index_drop(Oid indexId, bool concurrent, bool 
concurrent_lock_mode)
                PopActiveSnapshot();
                CommitTransactionCommand();
                StartTransactionCommand();
+               PushActiveSnapshot(GetTransactionSnapshot());
 
                /*
                 * Now we must wait until no running transaction could be using 
the
@@ -2283,8 +2284,10 @@ index_drop(Oid indexId, bool concurrent, bool 
concurrent_lock_mode)
                 * Again, commit the transaction to make the pg_index update 
visible
                 * to other sessions.
                 */
+               PopActiveSnapshot();
                CommitTransactionCommand();
                StartTransactionCommand();
+               PushActiveSnapshot(GetTransactionSnapshot());
 
                /*
                 * Wait till every transaction that saw the old index state has
@@ -2387,6 +2390,8 @@ index_drop(Oid indexId, bool concurrent, bool 
concurrent_lock_mode)
        {
                UnlockRelationIdForSession(&heaprelid, 
ShareUpdateExclusiveLock);
                UnlockRelationIdForSession(&indexrelid, 
ShareUpdateExclusiveLock);
+
+               PopActiveSnapshot();
        }
 }
 

Reply via email to