Move canAcceptConnections check from ProcessStartupPacket to caller.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 11 Oct 2023 11:06:38 +0000 (14:06 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 11 Oct 2023 11:06:38 +0000 (14:06 +0300)
The check is not about processing the startup packet, so the calling
function seems like a more natural place. I'm also working on a patch
that moves 'canAcceptConnections' out of the Port struct, and this
makes that refactoring more convenient.

Reviewed-by: Tristan Partin
Discussion: https://www.postgresql.org/message-id/7a59b073-5b5b-151e-7ed3-8b01ff7ce9ef@iki.fi

src/backend/postmaster/postmaster.c

index 3d7fec995aee00f6b7dc49a29be2f63f8fa9de16..282e64869484dfdb169300038b9e763e1b897021 100644 (file)
@@ -2281,49 +2281,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;
 }
 
@@ -4360,6 +4317,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.
         */