aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-07-18 13:48:58 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2024-07-18 13:48:58 -0400
commitcd85ae1114fedcce8602bca77b4557fe75165637 (patch)
tree90da65ad1f85ccd89df19ef3a9a377113798e7d0 /src
parent56c6be57af6bd1c7eb7dff50e5f169ced4ed3045 (diff)
downloadpostgresql-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.c24
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"