Thanks for the reviews.
v3 attached.
* Emit "recovery still waiting" inside the function.
It now fires at deadlock_timeout instead of max_standby_streaming_delay (Ilmar).
* Pass waitStart and &logged_recovery_conflict from the caller;
the in-function branch reuses the same gate.
* An early-return alternative reopens a race in the
SetStartupBufferPinWaitBufId(-1) gap; the lock path has
no equivalent because its caller is structured differently.
* Covered by src/test/recovery/t/
054_bufferpin_conflict_log_timing.pl (FAIL on v2, PASS on v3).
--
JH Shin