Hi, Alex and Sami noticed in [1] that RemoveFromWaitQueue() does not clear PGPROC->waitStart. After lock_timeout, cancel or deadlock the old value stays until the next lock wait.
It leaks into pg_locks for a short time. The next wait joins the queue before ProcSleep() stores the new waitStart, and in that window pg_locks shows the old start time instead of NULL. Backend stopped at ProcSleep() entry, a few seconds after a lock_timeout: pid | relation | mode | granted | waitstart -------+----------+---------------------+---------+------------------------------- 42442 | t | AccessExclusiveLock | f | 2026-09-23 21:01:39.274763-04 With the patch it reads NULL. The patch clears it the same way ProcWakeup() does, like 70f470314cb did for the grant path. It applies to 14 and up. [1] https://postgr.es/m/CAPrb+Q+XN=snusxiuewmmo2h7qgq3y4upeksslkhcncyf7g...@mail.gmail.com Thanks, Shihao
v1-0001-Reset-waitStart-when-a-lock-wait-fails.patch
Description: Binary data
