Hi, On 2023-08-07 12:57:40 +0200, Christoph Berg wrote: > Re: Thomas Munro > > Thanks for testing! Would you mind trying v8 from that thread? V7 > > had a silly bug (I accidentally deleted a 'case' label while cleaning > > some stuff up, resulting in the above error...) > > v8 worked better. It succeeded a few times (at least 12, my screen > scrollback didn't catch more) before erroring like this:
> [10:21:58.410](0.151s) ok 15 - startup deadlock: logfile contains terminated > connection due to recovery conflict > [10:21:58.463](0.053s) not ok 16 - startup deadlock: stats show conflict on > standby > [10:21:58.463](0.000s) > [10:21:58.463](0.000s) # Failed test 'startup deadlock: stats show conflict > on standby' > # at t/031_recovery_conflict.pl line 332. > [10:21:58.463](0.000s) # got: '0' > # expected: '1' Hm, that could just be a "harmless" race. Does it still happen if you apply the attached patch in addition? Greetings, Andres Freund
diff --git i/src/backend/utils/activity/pgstat_database.c w/src/backend/utils/activity/pgstat_database.c index 7149f22f729..bb36d73ec04 100644 --- i/src/backend/utils/activity/pgstat_database.c +++ w/src/backend/utils/activity/pgstat_database.c @@ -81,12 +81,22 @@ void pgstat_report_recovery_conflict(int reason) { PgStat_StatDBEntry *dbentry; + PgStat_EntryRef *entry_ref; + PgStatShared_Database *sharedent; Assert(IsUnderPostmaster); if (!pgstat_track_counts) return; - dbentry = pgstat_prep_database_pending(MyDatabaseId); + /* + * Update the shared stats directly - recovery conflicts should never be + * common enough for that to be a problem. + */ + entry_ref = + pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, MyDatabaseId, InvalidOid, false); + + sharedent = (PgStatShared_Database *) entry_ref->shared_stats; + dbentry = &sharedent->stats; switch (reason) { @@ -116,6 +126,8 @@ pgstat_report_recovery_conflict(int reason) dbentry->conflict_startup_deadlock++; break; } + + pgstat_unlock_entry(entry_ref); } /*