fix_smart_shutdown_in_recovery_v2_fujii.patch
application/octet-stream
Filename: fix_smart_shutdown_in_recovery_v2_fujii.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/postmaster/postmaster.c | 13 | 0 |
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
***************
*** 224,229 **** static int Shutdown = NoShutdown;
--- 224,231 ----
static bool FatalError = false; /* T if recovering from backend crash */
static bool RecoveryError = false; /* T if WAL recovery failed */
+ static bool NeedBackupLabel = false; /* T if backup_label is still required */
+
/*
* We use a simple state machine to control startup, shutdown, and
* crash recovery (which is rather like shutdown followed by startup).
***************
*** 267,272 **** static bool RecoveryError = false; /* T if WAL recovery failed */
--- 269,278 ----
* because we don't clear it until we've successfully started WAL redo.
* Similarly, RecoveryError means that we have crashed during recovery, and
* should not try to restart.
+ *
+ * If shutdown is requested in PM_STARTUP state, the postmaster sets the
+ * NeedBackupLabel to true and skips renaming the backup_label file since
+ * it's still required for subsequent recovery.
*/
typedef enum
{
***************
*** 2167,2174 **** pmdie(SIGNAL_ARGS)
ereport(LOG,
(errmsg("received smart shutdown request")));
if (pmState == PM_RUN || pmState == PM_RECOVERY ||
! pmState == PM_HOT_STANDBY)
{
/* autovacuum workers are told to shut down immediately */
SignalAutovacWorkers(SIGTERM);
--- 2173,2182 ----
ereport(LOG,
(errmsg("received smart shutdown request")));
+ if (pmState == PM_STARTUP)
+ NeedBackupLabel = true;
if (pmState == PM_RUN || pmState == PM_RECOVERY ||
! pmState == PM_HOT_STANDBY || pmState == PM_STARTUP)
{
/* autovacuum workers are told to shut down immediately */
SignalAutovacWorkers(SIGTERM);
***************
*** 2217,2222 **** pmdie(SIGNAL_ARGS)
--- 2225,2232 ----
signal_child(StartupPID, SIGTERM);
if (WalReceiverPID != 0)
signal_child(WalReceiverPID, SIGTERM);
+ if (pmState == PM_STARTUP)
+ NeedBackupLabel = true;
if (pmState == PM_RECOVERY)
{
/* only bgwriter is active in this state */
***************
*** 3030,3036 **** PostmasterStateMachine(void)
* Terminate backup mode to avoid recovery after a clean fast
* shutdown.
*/
! CancelBackup();
/* Normal exit from the postmaster is here */
ExitPostmaster(0);
--- 3040,3047 ----
* Terminate backup mode to avoid recovery after a clean fast
* shutdown.
*/
! if (!NeedBackupLabel)
! CancelBackup();
/* Normal exit from the postmaster is here */
ExitPostmaster(0);