From 2f518be9e96cfed1a1a49b4af8f7cb4a837aa784 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 12 Jun 2023 18:07:54 +0300 Subject: [PATCH 5/9] Move "too many clients already" et al. checks from ProcessStartupPacket. The check is not about processing the startup packet, so the calling function seems like a more natural place. --- src/backend/postmaster/postmaster.c | 86 ++++++++++++++--------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 228744ebee5..fa6f2c8e29c 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2321,49 +2321,6 @@ retry1: */ MemoryContextSwitchTo(oldcontext); - /* - * If we're going to reject the connection due to database state, say so - * now instead of wasting cycles on an authentication exchange. (This also - * allows a pg_ping utility to be written.) - */ - switch (port->canAcceptConnections) - { - case CAC_STARTUP: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is starting up"))); - 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: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is shutting down"))); - break; - case CAC_RECOVERY: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is in recovery mode"))); - break; - case CAC_TOOMANY: - ereport(FATAL, - (errcode(ERRCODE_TOO_MANY_CONNECTIONS), - errmsg("sorry, too many clients already"))); - break; - case CAC_OK: - break; - } - return STATUS_OK; } @@ -4391,6 +4348,49 @@ BackendInitialize(Port *port) */ status = ProcessStartupPacket(port, false, false); + /* + * If we're going to reject the connection due to database state, say so + * now instead of wasting cycles on an authentication exchange. (This also + * allows a pg_ping utility to be written.) + */ + switch (port->canAcceptConnections) + { + case CAC_STARTUP: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is starting up"))); + 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: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is shutting down"))); + break; + case CAC_RECOVERY: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is in recovery mode"))); + break; + case CAC_TOOMANY: + ereport(FATAL, + (errcode(ERRCODE_TOO_MANY_CONNECTIONS), + errmsg("sorry, too many clients already"))); + break; + case CAC_OK: + break; + } + /* * Disable the timeout, and prevent SIGTERM again. */ -- 2.30.2