diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2011-11-02 14:25:01 +0000 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2011-11-02 14:25:01 +0000 |
commit | 9aceb6ab3c202a5bf00d5f00436bb6ad285fc0bf (patch) | |
tree | a4ec05fb44b3356827a4cb6fd7649126fb1614f7 /src/backend/access/transam/xlog.c | |
parent | 86e33648992cfc104836ab1fbb6e654308beb4a5 (diff) | |
download | postgresql-9aceb6ab3c202a5bf00d5f00436bb6ad285fc0bf.tar.gz postgresql-9aceb6ab3c202a5bf00d5f00436bb6ad285fc0bf.zip |
Refactor xlog.c to create src/backend/postmaster/startup.c
Startup process now has its own dedicated file, just like all other
special/background processes. Reduces role and size of xlog.c
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 200 |
1 files changed, 6 insertions, 194 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 0944aa4162d..7ac17779c88 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -41,6 +41,7 @@ #include "miscadmin.h" #include "pgstat.h" #include "postmaster/bgwriter.h" +#include "postmaster/startup.h" #include "replication/walreceiver.h" #include "replication/walsender.h" #include "storage/bufmgr.h" @@ -584,19 +585,6 @@ typedef struct xl_restore_point char rp_name[MAXFNAMELEN]; } xl_restore_point; -/* - * Flags set by interrupt handlers for later service in the redo loop. - */ -static volatile sig_atomic_t got_SIGHUP = false; -static volatile sig_atomic_t shutdown_requested = false; -static volatile sig_atomic_t promote_triggered = false; - -/* - * Flag set when executing a restore command, to tell SIGTERM signal handler - * that it's safe to just proc_exit. - */ -static volatile sig_atomic_t in_restore_command = false; - static void XLogArchiveNotify(const char *xlog); static void XLogArchiveNotifySeg(uint32 log, uint32 seg); @@ -3068,21 +3056,16 @@ RestoreArchivedFile(char *path, const char *xlogfname, xlogRestoreCmd))); /* - * Set in_restore_command to tell the signal handler that we should exit - * right away on SIGTERM. We know that we're at a safe point to do that. - * Check if we had already received the signal, so that we don't miss a - * shutdown request received just before this. + * Check signals before restore command and reset afterwards. */ - in_restore_command = true; - if (shutdown_requested) - proc_exit(1); + PreRestoreCommand(); /* * Copy xlog from archival storage to XLOGDIR */ rc = system(xlogRestoreCmd); - in_restore_command = false; + PostRestoreCommand(); if (rc == 0) { @@ -9946,177 +9929,6 @@ CancelBackup(void) } } -/* ------------------------------------------------------ - * Startup Process main entry point and signal handlers - * ------------------------------------------------------ - */ - -/* - * startupproc_quickdie() occurs when signalled SIGQUIT by the postmaster. - * - * Some backend has bought the farm, - * so we need to stop what we're doing and exit. - */ -static void -startupproc_quickdie(SIGNAL_ARGS) -{ - PG_SETMASK(&BlockSig); - - /* - * We DO NOT want to run proc_exit() callbacks -- we're here because - * shared memory may be corrupted, so we don't want to try to clean up our - * transaction. Just nail the windows shut and get out of town. Now that - * there's an atexit callback to prevent third-party code from breaking - * things by calling exit() directly, we have to reset the callbacks - * explicitly to make this work as intended. - */ - on_exit_reset(); - - /* - * Note we do exit(2) not exit(0). This is to force the postmaster into a - * system reset cycle if some idiot DBA sends a manual SIGQUIT to a random - * backend. This is necessary precisely because we don't clean up our - * shared memory state. (The "dead man switch" mechanism in pmsignal.c - * should ensure the postmaster sees this as a crash, too, but no harm in - * being doubly sure.) - */ - exit(2); -} - - -/* SIGUSR1: let latch facility handle the signal */ -static void -StartupProcSigUsr1Handler(SIGNAL_ARGS) -{ - int save_errno = errno; - - latch_sigusr1_handler(); - - errno = save_errno; -} - -/* SIGUSR2: set flag to finish recovery */ -static void -StartupProcTriggerHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - promote_triggered = true; - WakeupRecovery(); - - errno = save_errno; -} - -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -StartupProcSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - WakeupRecovery(); - - errno = save_errno; -} - -/* SIGTERM: set flag to abort redo and exit */ -static void -StartupProcShutdownHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - if (in_restore_command) - proc_exit(1); - else - shutdown_requested = true; - WakeupRecovery(); - - errno = save_errno; -} - -/* Handle SIGHUP and SIGTERM signals of startup process */ -void -HandleStartupProcInterrupts(void) -{ - /* - * Check if we were requested to re-read config file. - */ - if (got_SIGHUP) - { - got_SIGHUP = false; - ProcessConfigFile(PGC_SIGHUP); - } - - /* - * Check if we were requested to exit without finishing recovery. - */ - if (shutdown_requested) - proc_exit(1); - - /* - * Emergency bailout if postmaster has died. This is to avoid the - * necessity for manual cleanup of all postmaster children. - */ - if (IsUnderPostmaster && !PostmasterIsAlive()) - exit(1); -} - -/* Main entry point for startup process */ -void -StartupProcessMain(void) -{ - /* - * If possible, make this process a group leader, so that the postmaster - * can signal any child processes too. - */ -#ifdef HAVE_SETSID - if (setsid() < 0) - elog(FATAL, "setsid() failed: %m"); -#endif - - /* - * Properly accept or ignore signals the postmaster might send us. - * - * Note: ideally we'd not enable handle_standby_sig_alarm unless actually - * doing hot standby, but we don't know that yet. Rely on it to not do - * anything if it shouldn't. - */ - pqsignal(SIGHUP, StartupProcSigHupHandler); /* reload config file */ - pqsignal(SIGINT, SIG_IGN); /* ignore query cancel */ - pqsignal(SIGTERM, StartupProcShutdownHandler); /* request shutdown */ - pqsignal(SIGQUIT, startupproc_quickdie); /* hard crash time */ - if (EnableHotStandby) - pqsignal(SIGALRM, handle_standby_sig_alarm); /* ignored unless - * InHotStandby */ - else - pqsignal(SIGALRM, SIG_IGN); - pqsignal(SIGPIPE, SIG_IGN); - pqsignal(SIGUSR1, StartupProcSigUsr1Handler); - pqsignal(SIGUSR2, StartupProcTriggerHandler); - - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, SIG_DFL); - pqsignal(SIGTTIN, SIG_DFL); - pqsignal(SIGTTOU, SIG_DFL); - pqsignal(SIGCONT, SIG_DFL); - pqsignal(SIGWINCH, SIG_DFL); - - /* - * Unblock signals (they were blocked when the postmaster forked us) - */ - PG_SETMASK(&UnBlockSig); - - StartupXLOG(); - - /* - * Exit normally. Exit code 0 tells postmaster that we completed recovery - * successfully. - */ - proc_exit(0); -} - /* * Read the XLOG page containing RecPtr into readBuf (if not read already). * Returns true if the page is read successfully. @@ -10564,12 +10376,12 @@ CheckForStandbyTrigger(void) if (triggered) return true; - if (promote_triggered) + if (IsPromoteTriggered()) { ereport(LOG, (errmsg("received promote request"))); ShutdownWalRcv(); - promote_triggered = false; + ResetPromoteTriggered(); triggered = true; return true; } |