On 2020/12/17 11:04, Fujii Masao wrote:
Hi, When the startup process needs to wait for recovery conflict on lock, STANDBY_LOCK_TIMEOUT is enabled to interrupt ProcWaitForSignal() if necessary. If this timeout happens, StandbyLockTimeoutHandler() is called and this function does nothing as follows. /* * StandbyLockTimeoutHandler() will be called if STANDBY_LOCK_TIMEOUT is exceeded. * This doesn't need to do anything, simply waking up is enough. */ void StandbyLockTimeoutHandler(void) { } But if STANDBY_LOCK_TIMEOUT happens just before entering ProcWaitForSignal(), the timeout fails to interrupt that wait. Also a signal sent by this timeout doesn't interrupt poll() used in ProcWaitForSignal(), on all platforms. So I think that StandbyLockTimeoutHandler() should do SetLatch(MyLatch) so that the timeout can interrupt ProcWaitForSignal() even in those cases. Thought?
Patch attached. Regards, -- Fujii Masao Advanced Computing Technology Center Research and Development Headquarters NTT DATA CORPORATION
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 92d9027776..b690c86637 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -620,11 +620,15 @@ StandbyTimeoutHandler(void) /* * StandbyLockTimeoutHandler() will be called if STANDBY_LOCK_TIMEOUT is exceeded. - * This doesn't need to do anything, simply waking up is enough. + * This doesn't set flag, simply waking up is enough. */ void StandbyLockTimeoutHandler(void) { + int save_errno = errno; + + SetLatch(MyLatch); + errno = save_errno; } /*