diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2024-07-18 13:48:58 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2024-07-18 13:48:58 -0400 |
commit | cd85ae1114fedcce8602bca77b4557fe75165637 (patch) | |
tree | 90da65ad1f85ccd89df19ef3a9a377113798e7d0 /src | |
parent | 56c6be57af6bd1c7eb7dff50e5f169ced4ed3045 (diff) | |
download | postgresql-cd85ae1114fedcce8602bca77b4557fe75165637.tar.gz postgresql-cd85ae1114fedcce8602bca77b4557fe75165637.zip |
Improve pg_ctl's message for shutdown after recovery.
If pg_ctl tries to start the postmaster, but the postmaster shuts down
because it completed a point-in-time recovery, pg_ctl used to report
a message that indicated a failure. It's not really a failure, so
instead say "server shut down because of recovery target settings".
Zhao Junwang, Crisp Lee, Laurenz Albe
Discussion: https://postgr.es/m/CAGHPtV7GttPZ-HvxZuYRy70jLGQMEm5=LQc4fKGa=J74m2VZbg@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_ctl/pg_ctl.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 57ed8c8e294..e7e878c22f0 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,24 @@ 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) + { + /* See if postmaster terminated intentionally */ + 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 +999,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" |