diff options
-rw-r--r-- | src/backend/access/transam/xlog.c | 9 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 21 | ||||
-rw-r--r-- | src/include/access/xlog.h | 1 |
3 files changed, 31 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 967e0c59efd..3e619c81e25 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -10807,6 +10807,15 @@ CheckForStandbyTrigger(void) } /* + * Remove the files signaling a standby promotion request. + */ +void +RemovePromoteSignalFiles(void) +{ + unlink(PROMOTE_SIGNAL_FILE); +} + +/* * Check to see if a promote request has arrived. Should be * called by postmaster after receiving SIGUSR1. */ diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 80e3b6f2599..94ba381b0f0 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1088,6 +1088,27 @@ PostmasterMain(int argc, char *argv[]) RemovePgTempFiles(); /* + * Forcibly remove the files signaling a standby promotion + * request. Otherwise, the existence of those files triggers + * a promotion too early, whether a user wants that or not. + * + * This removal of files is usually unnecessary because they + * can exist only during a few moments during a standby + * promotion. However there is a race condition: if pg_ctl promote + * is executed and creates the files during a promotion, + * the files can stay around even after the server is brought up + * to new master. Then, if new standby starts by using the backup + * taken from that master, the files can exist at the server + * startup and should be removed in order to avoid an unexpected + * promotion. + * + * Note that promotion signal files need to be removed before + * the startup process is invoked. Because, after that, they can + * be used by postmaster's SIGUSR1 signal handler. + */ + RemovePromoteSignalFiles(); + + /* * If enabled, start up syslogger collection subprocess */ SysLoggerPID = SysLogger_Start(); diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 8250254fa30..49bb5c4aac7 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -319,6 +319,7 @@ extern XLogRecPtr GetInsertRecPtr(void); extern XLogRecPtr GetFlushRecPtr(void); extern void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch); extern TimeLineID GetRecoveryTargetTLI(void); +extern void RemovePromoteSignalFiles(void); extern void HandleStartupProcInterrupts(void); extern void StartupProcessMain(void); |