Commit df938449 authored by Fujii Masao's avatar Fujii Masao

Improve connection denied error message during recovery.

Previously when an archive recovery or a standby was starting and
reached the consistent recovery state but hot_standby was configured
to off, the error message when a client connectted was "the database
system is starting up", which was needless confusing and not really
all that accurate either.

This commit improves the connection denied error message during
recovery, as follows, so that the users immediately know that their
servers are configured to deny those connections.

- If hot_standby is disabled, the error message "the database system
  is not accepting connections" and the detail message "Hot standby
  mode is disabled." are output when clients connect while an archive
  recovery or a standby is running.

- If hot_standby is enabled, the error message "the database system
  is not yet accepting connections" and the detail message
  "Consistent recovery state has not been yet reached." are output
  when clients connect until the consistent recovery state is reached
  and postmaster starts accepting read only connections.

This commit doesn't change the connection denied error message of
"the database system is starting up" during normal server startup and
crash recovery. Because it's still suitable for those situations.

Author: James Coleman
Reviewed-by: Alvaro Herrera, Andres Freund, David Zhang, Tom Lane, Fujii Masao
Discussion: https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com
parent b34ca595
...@@ -2294,6 +2294,18 @@ retry1: ...@@ -2294,6 +2294,18 @@ retry1:
(errcode(ERRCODE_CANNOT_CONNECT_NOW), (errcode(ERRCODE_CANNOT_CONNECT_NOW),
errmsg("the database system is starting up"))); errmsg("the database system is starting up")));
break; break;
case CAC_NOTCONSISTENT:
if (EnableHotStandby)
ereport(FATAL,
(errcode(ERRCODE_CANNOT_CONNECT_NOW),
errmsg("the database system is not yet accepting connections"),
errdetail("Consistent recovery state has not been yet reached.")));
else
ereport(FATAL,
(errcode(ERRCODE_CANNOT_CONNECT_NOW),
errmsg("the database system is not accepting connections"),
errdetail("Hot standby mode is disabled.")));
break;
case CAC_SHUTDOWN: case CAC_SHUTDOWN:
ereport(FATAL, ereport(FATAL,
(errcode(ERRCODE_CANNOT_CONNECT_NOW), (errcode(ERRCODE_CANNOT_CONNECT_NOW),
...@@ -2435,10 +2447,11 @@ canAcceptConnections(int backend_type) ...@@ -2435,10 +2447,11 @@ canAcceptConnections(int backend_type)
{ {
if (Shutdown > NoShutdown) if (Shutdown > NoShutdown)
return CAC_SHUTDOWN; /* shutdown is pending */ return CAC_SHUTDOWN; /* shutdown is pending */
else if (!FatalError && else if (!FatalError && pmState == PM_STARTUP)
(pmState == PM_STARTUP ||
pmState == PM_RECOVERY))
return CAC_STARTUP; /* normal startup */ return CAC_STARTUP; /* normal startup */
else if (!FatalError && pmState == PM_RECOVERY)
return CAC_NOTCONSISTENT; /* not yet at consistent recovery
* state */
else else
return CAC_RECOVERY; /* else must be crash recovery */ return CAC_RECOVERY; /* else must be crash recovery */
} }
......
...@@ -70,7 +70,12 @@ typedef struct ...@@ -70,7 +70,12 @@ typedef struct
typedef enum CAC_state typedef enum CAC_state
{ {
CAC_OK, CAC_STARTUP, CAC_SHUTDOWN, CAC_RECOVERY, CAC_TOOMANY, CAC_OK,
CAC_STARTUP,
CAC_SHUTDOWN,
CAC_RECOVERY,
CAC_NOTCONSISTENT,
CAC_TOOMANY,
CAC_SUPERUSER CAC_SUPERUSER
} CAC_state; } CAC_state;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment