reinit_recheck.txt

text/plain

Filename: reinit_recheck.txt
Type: text/plain
Part: 0
Message: Re: BUG #17947: Combination of replslots pgstat issues causes error/assertion failure
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
index 0cdb552631..28d2b20b56 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -1383,7 +1383,6 @@ pgstat_write_statsfile(void)
 		CHECK_FOR_INTERRUPTS();
 
 		/* we may have some "dropped" entries not yet removed, skip them */
-		Assert(!ps->dropped);
 		if (ps->dropped)
 			continue;
 
diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c
index d1149adf70..0476ec2f85 100644
--- a/src/backend/utils/activity/pgstat_shmem.c
+++ b/src/backend/utils/activity/pgstat_shmem.c
@@ -378,8 +378,19 @@ pgstat_get_entry_ref_cached(PgStat_HashKey key, PgStat_EntryRef **entry_ref_p)
 		Assert(entry_ref->shared_stats != NULL);
 
 		Assert(entry_ref->shared_stats->magic == 0xdeadbeef);
-		/* should have at least our reference */
-		Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) > 0);
+		if (entry_ref->shared_entry->key.kind == PGSTAT_KIND_REPLSLOT &&
+			pg_atomic_read_u32(&entry_ref->shared_entry->refcount) > 1)
+		{
+			entry_ref->shared_stats = NULL;
+			entry_ref->shared_entry = NULL;
+			entry_ref->pending = NULL;
+			found = false;
+		}
+		else
+		{
+			/* should have at least our reference */
+			Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) > 0);
+		}
 	}
 
 	*entry_ref_p = cache_entry->entry_ref;