From 538c662aa562a5cc7630ac845e1b8a6b4abfffa1 Mon Sep 17 00:00:00 2001 From: Laurenz Albe Date: Tue, 9 Jul 2024 21:48:41 +0200 Subject: [PATCH v6] Improve pg_ctl message for shutdown after recovery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the postmaster exits after a successful point-in-time-recovery, pg_ctl used to report a message that indicated a problem. Author: Zhao Junwang, Crisp Lee Reviewed by: Nazir Bilal Yavuz, Nathan Bossart, Álvaro Herrera, Laurenz Albe Discussion: https://postgr.es/m/CAGHPtV7GttPZ-HvxZuYRy70jLGQMEm5%3DLQc4fKGa%3DJ74m2VZbg%40mail.gmail.com --- src/bin/pg_ctl/pg_ctl.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 405e223c19..324a6da096 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -45,6 +45,7 @@ typedef enum { POSTMASTER_READY, POSTMASTER_STILL_STARTING, + POSTMASTER_SHUTDOWN_IN_RECOVERY, POSTMASTER_FAILED, } WaitPMResult; @@ -657,17 +658,23 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) * On Windows, we may be checking the postmaster's parent shell, but * that's fine for this purpose. */ -#ifndef WIN32 { + bool pm_died; +#ifndef WIN32 int exitstatus; - if (waitpid(pm_pid, &exitstatus, WNOHANG) == pm_pid) - return POSTMASTER_FAILED; - } + pm_died = (waitpid(pm_pid, &exitstatus, WNOHANG) == pm_pid); #else - if (WaitForSingleObject(postmasterProcess, 0) == WAIT_OBJECT_0) - return POSTMASTER_FAILED; + pm_died = (WaitForSingleObject(postmasterProcess, 0) == WAIT_OBJECT_0); #endif + if (pm_died) + { + if (get_control_dbstate() == DB_SHUTDOWNED_IN_RECOVERY) + return POSTMASTER_SHUTDOWN_IN_RECOVERY; + else + return POSTMASTER_FAILED; + } + } /* Startup still in process; wait, printing a dot once per second */ if (i % WAITS_PER_SEC == 0) @@ -991,6 +998,10 @@ do_start(void) progname); exit(1); break; + case POSTMASTER_SHUTDOWN_IN_RECOVERY: + print_msg(_(" done\n")); + print_msg(_("server shut down because of recovery target settings\n")); + break; case POSTMASTER_FAILED: print_msg(_(" stopped waiting\n")); write_stderr(_("%s: could not start server\n" -- 2.45.2