diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index ce1f8cdef1c..71778b37d33 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -2114,6 +2114,7 @@ RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode) proc->waitLock = NULL; proc->waitProcLock = NULL; proc->waitStatus = PROC_WAIT_STATUS_ERROR; + pg_atomic_write_u64(&proc->waitStart, 0); /* * Delete the proclock immediately if it represents no already-held locks. diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index cfa60154278..7840a620912 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -867,6 +867,9 @@ LockErrorCleanup(void) GrantAwaitedLock(); } + /* An error can bypass ProcSleep()'s reset, so clear waitStart here */ + pg_atomic_write_u64(&MyProc->waitStart, 0); + ResetAwaitedLock(); LWLockRelease(partitionLock); @@ -1720,6 +1723,12 @@ ProcSleep(LOCALLOCK *locallock) } } while (myWaitStatus == PROC_WAIT_STATUS_WAITING); + /* + * Clear waitStart after the wait, as we may have set it after + * ProcWakeup() cleared it. + */ + pg_atomic_write_u64(&MyProc->waitStart, 0); + /* * Disable the timers, if they are still running. As in LockErrorCleanup, * we must preserve the LOCK_TIMEOUT indicator flag: if a lock timeout has