diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 127bc5888f..152d4ede37 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -11587,6 +11587,16 @@ CheckForStandbyTrigger(void) return false; } +/* + * Remove the files signaling a standby promotion request. + */ +void +RemovePromoteSignalFiles(void) +{ + unlink(PROMOTE_SIGNAL_FILE); + unlink(FALLBACK_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 1818f7ce46..baa43b203f 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1175,6 +1175,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 */ diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 6dacee2fbb..790ca66f8a 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -261,6 +261,7 @@ extern XLogRecPtr GetRedoRecPtr(void); extern XLogRecPtr GetInsertRecPtr(void); extern XLogRecPtr GetFlushRecPtr(void); extern void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch); +extern void RemovePromoteSignalFiles(void); extern bool CheckPromoteSignal(void); extern void WakeupRecovery(void);