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.
     */