Re: Intermittent buildfarm failures on wrasse - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: Intermittent buildfarm failures on wrasse |
Date | |
Msg-id | 1737834.1650046487@sss.pgh.pa.us Whole thread Raw |
In response to | Re: Intermittent buildfarm failures on wrasse (Andres Freund <andres@anarazel.de>) |
Responses |
Re: Intermittent buildfarm failures on wrasse
Re: Intermittent buildfarm failures on wrasse |
List | pgsql-hackers |
Andres Freund <andres@anarazel.de> writes: > On 2022-04-15 12:36:52 -0400, Tom Lane wrote: >> Yeah, I was also thinking about a flag in PGPROC being a more reliable >> way to do this. Is there anything besides walsenders that should set >> that flag? > Not that I can think of. It's only because of hs_feedback that we need > to. I guess it's possible that somebody build some extension that needs > something similar, but then they'd need to set that flag... Here's a WIP patch for that. The only exciting thing in it is that because of some undocumented cowboy programming in walsender.c, the Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); in ProcArrayInstallRestoredXmin fires unless we skip that. I could use some help filling in the XXX comments, because it's far from clear to me *why* walsenders need this to happen. regards, tom lane diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index be40261393..a04a4a8e5d 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -285,6 +285,15 @@ InitWalSender(void) MarkPostmasterChildWalSender(); SendPostmasterSignal(PMSIGNAL_ADVANCE_STATE_MACHINE); + /* + * Also, mark ourselves in PGPROC as affecting vacuum horizons in all + * databases. XXX explain why + */ + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyProc->statusFlags |= PROC_AFFECTS_ALL_HORIZONS; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + LWLockRelease(ProcArrayLock); + /* Initialize empty timestamp buffer for lag tracking. */ lag_tracker = MemoryContextAllocZero(TopMemoryContext, sizeof(LagTracker)); } diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index f6e98aae29..8b867bd56c 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1821,10 +1821,12 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h) * to prune still needed data away). If the current backend never * connects to a database that is harmless, because * data_oldest_nonremovable will never be utilized. + * + * XXX explain PROC_AFFECTS_ALL_HORIZONS, too */ if (in_recovery || MyDatabaseId == InvalidOid || proc->databaseId == MyDatabaseId || - proc->databaseId == 0) /* always include WalSender */ + (statusFlags & PROC_AFFECTS_ALL_HORIZONS)) { /* * We can ignore this backend if it's running CREATE INDEX @@ -2681,10 +2683,14 @@ ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc) /* Install xmin */ MyProc->xmin = TransactionXmin = xmin; - /* Flags being copied must be valid copy-able flags. */ - Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); - MyProc->statusFlags = proc->statusFlags; - ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + /* walsender cheats by passing proc == MyProc, don't check flags */ + if (proc != MyProc) + { + /* Flags being copied must be valid copy-able flags. */ + Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); + MyProc->statusFlags = proc->statusFlags; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + } result = true; } diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 809b74db5e..e132665938 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -60,6 +60,9 @@ struct XidCache #define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */ #define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical * decoding outside xact */ +#define PROC_AFFECTS_ALL_HORIZONS 0x20 /* proc's xmin must be + * included in vacuum horizons + * in all databases */ /* flags reset at EOXact */ #define PROC_VACUUM_STATE_MASK \
pgsql-hackers by date: