Fix checkpoint signalling
authorAlvaro Herrera <[email protected]>
Wed, 29 Apr 2020 22:46:42 +0000 (18:46 -0400)
committerAlvaro Herrera <[email protected]>
Wed, 29 Apr 2020 22:46:42 +0000 (18:46 -0400)
commit1816a1c6ffe46782eee9a16a974b4aa3f4b8457b
tree0c8c2d8e41d7b7d7a3f038498fa59cc0fbd36e3a
parentfef819ac534d6efb9608fa0bbb93c6fe6c87440e
Fix checkpoint signalling

Checkpointer uses its MyLatch to wake up when a checkpoint request is
received.  But before commit c6550776394e the latch was not used for
anything else, so the code could just go to sleep after each loop
without rechecking the sleeping condition.  That commit added a separate
ResetLatch in its code path[1], which can cause a checkpoint to go
unnoticed for potentially a long time.

Fix by skipping sleep if any checkpoint flags are set.  Also add a test
to verify this; authored by Kyotaro Horiguchi.

[1] CreateCheckPoint -> InvalidateObsoleteReplicationSlots ->
ConditionVariableTimeSleep

Report and diagnosis by Kyotaro Horiguchi.
Co-authored-by: Kyotaro Horiguchi <[email protected]>
Co-authored-by: Álvaro Herrera <[email protected]>
Discussion: https://postgr.es/m/20200408.141956.891237856186513376[email protected]
src/backend/postmaster/checkpointer.c
src/test/recovery/t/019_replslot_limit.pl