0001-Fix-cleanup-of-local-cache-pgstats-entries-for-entry.patch
text/x-diff
Filename: 0001-Fix-cleanup-of-local-cache-pgstats-entries-for-entry.patch
Type: text/x-diff
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Fix cleanup of local cache pgstats entries for entry reinit
| File | + | − |
|---|---|---|
| src/backend/utils/activity/pgstat_shmem.c | 9 | 2 |
From 77bcf14b6c8576de416b7d01320d42755e10c665 Mon Sep 17 00:00:00 2001 From: Michael Paquier <michael@paquier.xyz> Date: Thu, 5 Dec 2024 13:23:48 +0900 Subject: [PATCH 1/2] Fix cleanup of local cache pgstats entries for entry reinit 818119afccd3 has introduced the generation concept when a pgstats entry is reinitialized, but did not count on the fact that backends still holding local references to such entries need to be refreshed if the cache age is outdated. The mattered for replication slot stats, where a concurrent drop/create could cause incorrect stats to be locally referenced. Backpatch-through: 15 --- src/backend/utils/activity/pgstat_shmem.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 041c262b9f..ccb5e5f6de 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -729,7 +729,8 @@ pgstat_gc_entry_refs(void) Assert(curage != 0); /* - * Some entries have been dropped. Invalidate cache pointer to them. + * Some entries have been dropped or reinitialized. Invalidate cache + * pointer to them. */ pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i); while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) != NULL) @@ -739,7 +740,13 @@ pgstat_gc_entry_refs(void) Assert(!entry_ref->shared_stats || entry_ref->shared_stats->magic == 0xdeadbeef); - if (!entry_ref->shared_entry->dropped) + /* + * "generation" checks for the case of entries being reinitialized, and + * "dropped" for the case where these are.. dropped. + */ + if (!entry_ref->shared_entry->dropped && + pg_atomic_read_u32(&entry_ref->shared_entry->generation) == + entry_ref->generation) continue; /* cannot gc shared ref that has pending data */ -- 2.45.2