Make standby promotion reset the recovery pause state to 'not paused'.
authorFujii Masao
Wed, 19 May 2021 04:48:19 +0000 (13:48 +0900)
committerFujii Masao
Wed, 19 May 2021 04:48:19 +0000 (13:48 +0900)
If a promotion is triggered while recovery is paused, the paused state ends
and promotion continues. But previously in that case
pg_get_wal_replay_pause_state() returned 'paused' wrongly while a promotion
was ongoing.

This commit changes a standby promotion so that it marks the recovery
pause state as 'not paused' when it's triggered, to fix the issue.

Author: Fujii Masao
Reviewed-by: Dilip Kumar, Kyotaro Horiguchi
Discussion: https://postgr.es/m/f706876c-4894-0ba5-6f4d-79803eeea21b@oss.nttdata.com

src/backend/access/transam/xlog.c

index 8d163f190f378227dc70e4bf09bcf1860c30e052..441a9124cd59863ca90c2e5fdcb85eeb85229b80 100644 (file)
@@ -12825,6 +12825,14 @@ SetPromoteIsTriggered(void)
    XLogCtl->SharedPromoteIsTriggered = true;
    SpinLockRelease(&XLogCtl->info_lck);
 
+   /*
+    * Mark the recovery pause state as 'not paused' because the paused state
+    * ends and promotion continues if a promotion is triggered while recovery
+    * is paused. Otherwise pg_get_wal_replay_pause_state() can mistakenly
+    * return 'paused' while a promotion is ongoing.
+    */
+   SetRecoveryPause(false);
+
    LocalPromoteIsTriggered = true;
 }