This patch causes, if a promotion is triggered while recovery is paused, the paused state to end and a promotion to continue. OTOH, this patch makes pg_wal_replay_pause() and _resume() throw an error if it's executed while a promotion is ongoing.
Regarding recovery_target_action, if the recovery target is reached while a promotion is ongoing, "pause" setting will act the same as "promote", i.e., recovery will finish and the server will start to accept connections.
To implement the above, I added new shared varible indicating whether a promotion is triggered or not. Only startup process can update this shared variable. Other processes like read-only backends can check whether promotion is ongoing, via this variable.
I added new function PromoteIsTriggered() that returns true if a promotion is triggered. Since the name of this function and the existing function IsPromoteTriggered() are confusingly similar, I changed the name of IsPromoteTriggered() to IsPromoteSignaled, as more appropriate name.
I've confirmed the patch works as you described above.
And I also poked around it a little bit but found no problems.