]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Re-introduce pgstat_drop_entry(), keeping ABI compatibility
authorMichael Paquier <michael@paquier.xyz>
Mon, 22 Jun 2026 22:58:04 +0000 (07:58 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 22 Jun 2026 22:58:04 +0000 (07:58 +0900)
This routine acts as a wrapper of a new pgstat_drop_entry_ext(), used in
the core code with a missing_ok argument.

This includes an update of .abi-compliance-history, removing the latest
entry that has documented the change of pgstat_drop_entry().  This
change is applied across v15~v18.  HEAD keeps pgstat_drop_entry() as
single entry point, with the new missing_ok.

Per discussion with Álvaro Herrera and Lukas Fittl.  This is a follow-up
of 850b9218c8e4.

Discussion: https://postgr.es/m/ajZz_sVJVX7pmPHo@alvherre.pgsql
Backpatch-through: 15-18

.abi-compliance-history
src/backend/utils/activity/pgstat.c
src/backend/utils/activity/pgstat_function.c
src/backend/utils/activity/pgstat_replslot.c
src/backend/utils/activity/pgstat_shmem.c
src/backend/utils/activity/pgstat_xact.c
src/include/utils/pgstat_internal.h
src/test/modules/injection_points/injection_stats.c

index 6ba3e7519b706bd2724c746c82f5bfd487218c9b..a4bf3336cacbc1ebc86d19198a413b3c7172ec28 100644 (file)
 # Be sure to replace "<ADD JUSTIFICATION HERE>" with details of your change and
 # why it is deemed acceptable.
 
-5cc59834b860ed48d710c1baa9c50c66540c64d0
-#
-# Fix PANIC with track_functions due to concurrent drop of pgstats entries
-# 2026-06-18 11:49:34 +0900
-#
-# This commit has added a "missing_ok" argument to pgstat_drop_entry().  All
-# the callers of this routine are in core for v15-v17.  One custom stats kinds
-# available in the public since v18 is impacted (maintainer informed).
-
 8d9a97e0bb6d820dac553848f0d5d8cc3f3e219d
 #
 # Avoid name collision with NOT NULL constraints
index d997be2e1d931b1ef8a152225ec9b7134efdb128..99e537bc886a67055d16510b8d8a2e61cf5a2c28 100644 (file)
@@ -620,7 +620,7 @@ pgstat_shutdown_hook(int code, Datum arg)
        dlist_init(&pgStatPending);
 
        /* drop the backend stats entry */
-       if (!pgstat_drop_entry(PGSTAT_KIND_BACKEND, InvalidOid, MyProcNumber, false))
+       if (!pgstat_drop_entry_ext(PGSTAT_KIND_BACKEND, InvalidOid, MyProcNumber, false))
                pgstat_request_entry_refs_gc();
 
        pgstat_detach_shmem();
index f763a0d6f5bab1ef631adc58db0755e0e986c1fc..eaeb0dcb1def1ed6bd83423d0cccd068c2122155 100644 (file)
@@ -112,8 +112,8 @@ pgstat_init_function_usage(FunctionCallInfo fcinfo,
                AcceptInvalidationMessages();
                if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(fcinfo->flinfo->fn_oid)))
                {
-                       pgstat_drop_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId,
-                                                         fcinfo->flinfo->fn_oid, true);
+                       pgstat_drop_entry_ext(PGSTAT_KIND_FUNCTION, MyDatabaseId,
+                                                                 fcinfo->flinfo->fn_oid, true);
                        ereport(ERROR, errcode(ERRCODE_UNDEFINED_FUNCTION),
                                        errmsg("function call to dropped function"));
                }
index 746b97a0b5af9e110de3738e695fa40982175963..675c535266c080a3e3f7d426ff2c620454dbe6d7 100644 (file)
@@ -157,8 +157,8 @@ pgstat_drop_replslot(ReplicationSlot *slot)
 {
        Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE));
 
-       if (!pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid,
-                                                  ReplicationSlotIndex(slot), false))
+       if (!pgstat_drop_entry_ext(PGSTAT_KIND_REPLSLOT, InvalidOid,
+                                                          ReplicationSlotIndex(slot), false))
                pgstat_request_entry_refs_gc();
 }
 
index 414b66be2dc46f111b5ae877448b5c11e9ffcc10..056c24c6ee1bc71132201c0cddceb2d40fbe91de 100644 (file)
@@ -880,7 +880,7 @@ pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat)
 
 /*
  * Helper for both pgstat_drop_database_and_contents() and
- * pgstat_drop_entry(). If hstat is non-null delete the shared entry using
+ * pgstat_drop_entry_ext(). If hstat is non-null delete the shared entry using
  * dshash_delete_current(), otherwise use dshash_delete_entry(). In either
  * case the entry needs to be already locked.
  */
@@ -968,6 +968,17 @@ pgstat_drop_database_and_contents(Oid dboid)
                pgstat_request_entry_refs_gc();
 }
 
+/*
+ * ABI-preserving wrapper around pgstat_drop_entry_ext().
+ *
+ * The original routine introduced in v15 did not include "missing_ok".
+ */
+bool
+pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid)
+{
+       return pgstat_drop_entry_ext(kind, dboid, objid, false);
+}
+
 /*
  * Drop a single stats entry.
  *
@@ -982,8 +993,8 @@ pgstat_drop_database_and_contents(Oid dboid)
  * pgstat_gc_entry_refs().
  */
 bool
-pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid,
-                                 bool missing_ok)
+pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, uint64 objid,
+                                         bool missing_ok)
 {
        PgStat_HashKey key;
        PgStatShared_HashEntry *shent;
index b058c978dcf39fb2aaa778c8590ccebe9d4d4015..fbbf2844a58fce146b87672b7229bad7bf65c3a5 100644 (file)
@@ -85,7 +85,7 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit)
                         * Transaction that dropped an object committed. Drop the stats
                         * too.
                         */
-                       if (!pgstat_drop_entry(it->kind, it->dboid, objid, true))
+                       if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true))
                                not_freed_count++;
                }
                else if (!isCommit && pending->is_create)
@@ -94,7 +94,7 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit)
                         * Transaction that created an object aborted. Drop the stats
                         * associated with the object.
                         */
-                       if (!pgstat_drop_entry(it->kind, it->dboid, objid, true))
+                       if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true))
                                not_freed_count++;
                }
 
@@ -160,7 +160,7 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state,
                         * Subtransaction creating a new stats object aborted. Drop the
                         * stats object.
                         */
-                       if (!pgstat_drop_entry(it->kind, it->dboid, objid, true))
+                       if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true))
                                not_freed_count++;
                        pfree(pending);
                }
@@ -323,7 +323,7 @@ pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items,
                xl_xact_stats_item *it = &items[i];
                uint64          objid = ((uint64) it->objid_hi) << 32 | it->objid_lo;
 
-               if (!pgstat_drop_entry(it->kind, it->dboid, objid, true))
+               if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true))
                        not_freed_count++;
        }
 
index 4f840c38f0721d9725c9e383e653aa79255d12e2..c09eda3a84d9f8759e2f1dd9bf7a73f190907d69 100644 (file)
@@ -708,8 +708,9 @@ extern PgStat_EntryRef *pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, uint64
 extern bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait);
 extern bool pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait);
 extern void pgstat_unlock_entry(PgStat_EntryRef *entry_ref);
-extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid,
-                                                         bool missing_ok);
+extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid);
+extern bool pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, uint64 objid,
+                                                                 bool missing_ok);
 extern void pgstat_drop_all_entries(void);
 extern void pgstat_drop_matching_entries(bool (*do_drop) (PgStatShared_HashEntry *, Datum),
                                                                                 Datum match_data);
index 435a0484a4ba5a025e0c12e19a8d2a4c5f896a5e..c659b2660d4fc08a708c1b990195895272e886ee 100644 (file)
@@ -149,8 +149,8 @@ pgstat_drop_inj(const char *name)
        if (!inj_stats_loaded || !inj_stats_enabled)
                return;
 
-       if (!pgstat_drop_entry(PGSTAT_KIND_INJECTION, InvalidOid,
-                                                  PGSTAT_INJ_IDX(name), false))
+       if (!pgstat_drop_entry_ext(PGSTAT_KIND_INJECTION, InvalidOid,
+                                                          PGSTAT_INJ_IDX(name), false))
                pgstat_request_entry_refs_gc();
 }