mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
PublishStartupProcessInformation() to avoid rare hang in recovery.
Bgwriter could cause hang in recovery during page concurrent cleaning. Bug report and testing by Bernd Helmle, fix by me
This commit is contained in:
@ -1287,12 +1287,53 @@ ProcWaitForSignal(void)
|
||||
void
|
||||
ProcSendSignal(int pid)
|
||||
{
|
||||
PGPROC *proc = BackendPidGetProc(pid);
|
||||
PGPROC *proc = NULL;
|
||||
|
||||
proc = BackendPidGetProc(pid);
|
||||
|
||||
if (proc == NULL)
|
||||
{
|
||||
/* use volatile pointer to prevent code rearrangement */
|
||||
volatile PROC_HDR *procglobal = ProcGlobal;
|
||||
|
||||
SpinLockAcquire(ProcStructLock);
|
||||
|
||||
/*
|
||||
* Check to see whether it is the Startup process we wish to signal.
|
||||
* This call is made by the buffer manager when it wishes to wake up a
|
||||
* process that has been waiting for a pin in so it can obtain a
|
||||
* cleanup lock using LockBufferForCleanup(). Startup is not a normal
|
||||
* backend, so BackendPidGetProc() will not return any pid at all. So
|
||||
* we remember the information for this special case.
|
||||
*/
|
||||
if (pid == procglobal->startupProcPid)
|
||||
proc = procglobal->startupProc;
|
||||
|
||||
SpinLockRelease(ProcStructLock);
|
||||
}
|
||||
|
||||
if (proc != NULL)
|
||||
PGSemaphoreUnlock(&proc->sem);
|
||||
}
|
||||
|
||||
/*
|
||||
* Record the PID and PGPROC structures for the Startup process, for use in
|
||||
* ProcSendSignal(). See comments there for further explanation.
|
||||
*/
|
||||
void
|
||||
PublishStartupProcessInformation(void)
|
||||
{
|
||||
/* use volatile pointer to prevent code rearrangement */
|
||||
volatile PROC_HDR *procglobal = ProcGlobal;
|
||||
|
||||
SpinLockAcquire(ProcStructLock);
|
||||
|
||||
procglobal->startupProc = MyProc;
|
||||
procglobal->startupProcPid = MyProcPid;
|
||||
|
||||
SpinLockRelease(ProcStructLock);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* SIGALRM interrupt support
|
||||
|
Reference in New Issue
Block a user