Refactor InitPostgres() to use bitwise option flags
authorMichael Paquier <michael@paquier.xyz>
Wed, 11 Oct 2023 03:31:49 +0000 (12:31 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 11 Oct 2023 03:31:49 +0000 (12:31 +0900)
InitPostgres() has been using a set of boolean arguments to control its
behavior, and a patch under discussion was aiming at expanding it with a
third one.  In preparation for expanding this area, this commit switches
all the current boolean arguments of this routine to a single bits32
argument instead.  Two values are currently supported for the flags:
- INIT_PG_LOAD_SESSION_LIBS to load [session|local]_preload_libraries at
startup.
- INIT_PG_OVERRIDE_ALLOW_CONNS to allow connection to a database even if
it has !datallowconn.  This is used by bgworkers.

Reviewed-by: Bertrand Drouvot
Discussion: https://postgr.es/m/ZSTn66_BXRZCeaqS@paquier.xyz

src/backend/bootstrap/bootstrap.c
src/backend/postmaster/autovacuum.c
src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c
src/backend/utils/init/postinit.c
src/include/miscadmin.h

index 5810f8825e9e73b1666ebb8b52f374345c23eee8..e01dca9b7c1869d6863c2ad8a8829a324d771085 100644 (file)
@@ -345,7 +345,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only)
    if (pg_link_canary_is_frontend())
        elog(ERROR, "backend is incorrectly linked to frontend functions");
 
-   InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL);
+   InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL);
 
    /* Initialize stuff for bootstrap-file processing */
    for (i = 0; i < MAXATTR; i++)
index ae9be9b9113c7171ee162817baa46e293e8e4a32..327ea0d45adac31f2b54da4d6cc8b22c5364e504 100644 (file)
@@ -488,7 +488,7 @@ AutoVacLauncherMain(int argc, char *argv[])
    /* Early initialization */
    BaseInit();
 
-   InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL);
+   InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL);
 
    SetProcessingMode(NormalProcessing);
 
@@ -1706,8 +1706,7 @@ AutoVacWorkerMain(int argc, char *argv[])
         * Note: if we have selected a just-deleted database (due to using
         * stale stats info), we'll fail and exit here.
         */
-       InitPostgres(NULL, dbid, NULL, InvalidOid, false, false,
-                    dbname);
+       InitPostgres(NULL, dbid, NULL, InvalidOid, 0, dbname);
        SetProcessingMode(NormalProcessing);
        set_ps_display(dbname);
        ereport(DEBUG1,
index 0761b38bf880d845bc1921e0b966eb5600735a60..3d7fec995aee00f6b7dc49a29be2f63f8fa9de16 100644 (file)
@@ -5562,6 +5562,11 @@ void
 BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags)
 {
    BackgroundWorker *worker = MyBgworkerEntry;
+   bits32      init_flags = 0; /* never honor session_preload_libraries */
+
+   /* ignore datallowconn? */
+   if (flags & BGWORKER_BYPASS_ALLOWCONN)
+       init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS;
 
    /* XXX is this the right errcode? */
    if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION))
@@ -5571,8 +5576,7 @@ BackgroundWorkerInitializeConnection(const char *dbname, const char *username, u
 
    InitPostgres(dbname, InvalidOid,    /* database to connect to */
                 username, InvalidOid,  /* role to connect as */
-                false,         /* never honor session_preload_libraries */
-                (flags & BGWORKER_BYPASS_ALLOWCONN) != 0,  /* ignore datallowconn? */
+                init_flags,
                 NULL);         /* no out_dbname */
 
    /* it had better not gotten out of "init" mode yet */
@@ -5589,6 +5593,11 @@ void
 BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags)
 {
    BackgroundWorker *worker = MyBgworkerEntry;
+   bits32      init_flags = 0; /* never honor session_preload_libraries */
+
+   /* ignore datallowconn? */
+   if (flags & BGWORKER_BYPASS_ALLOWCONN)
+       init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS;
 
    /* XXX is this the right errcode? */
    if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION))
@@ -5598,8 +5607,7 @@ BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags)
 
    InitPostgres(NULL, dboid,   /* database to connect to */
                 NULL, useroid, /* role to connect as */
-                false,         /* never honor session_preload_libraries */
-                (flags & BGWORKER_BYPASS_ALLOWCONN) != 0,  /* ignore datallowconn? */
+                init_flags,
                 NULL);         /* no out_dbname */
 
    /* it had better not gotten out of "init" mode yet */
index 21b9763183e66bbc788e0c0246d48f4503ec15fe..f3c9f1f9bab1cdd50616ed5829417f0be416719e 100644 (file)
@@ -4206,11 +4206,12 @@ PostgresMain(const char *dbname, const char *username)
     * NOTE: if you are tempted to add code in this vicinity, consider putting
     * it inside InitPostgres() instead.  In particular, anything that
     * involves database access should be there, not here.
+    *
+    * Honor session_preload_libraries if not dealing with a WAL sender.
     */
    InitPostgres(dbname, InvalidOid,    /* database to connect to */
                 username, InvalidOid,  /* role to connect as */
-                !am_walsender, /* honor session_preload_libraries? */
-                false,         /* don't ignore datallowconn */
+                (!am_walsender) ? INIT_PG_LOAD_SESSION_LIBS : 0,
                 NULL);         /* no out_dbname */
 
    /*
index df4d15a50fbbb47c8519076f4eb16db84d74b90d..449541e94224936cf3f141890b8977869f914826 100644 (file)
@@ -681,8 +681,9 @@ BaseInit(void)
  * Parameters:
  * in_dbname, dboid: specify database to connect to, as described below
  * username, useroid: specify role to connect as, as described below
- * load_session_libraries: TRUE to honor [session|local]_preload_libraries
- * override_allow_connections: TRUE to connect despite !datallowconn
+ * flags:
+ *   - INIT_PG_LOAD_SESSION_LIBS to honor [session|local]_preload_libraries.
+ *   - INIT_PG_OVERRIDE_ALLOW_CONNS to connect despite !datallowconn.
  * out_dbname: optional output parameter, see below; pass NULL if not used
  *
  * The database can be specified by name, using the in_dbname parameter, or by
@@ -701,8 +702,8 @@ BaseInit(void)
  * database but not a username; conversely, a physical walsender specifies
  * username but not database.
  *
- * By convention, load_session_libraries should be passed as true in
- * "interactive" sessions (including standalone backends), but false in
+ * By convention, INIT_PG_LOAD_SESSION_LIBS should be passed in "flags" in
+ * "interactive" sessions (including standalone backends), but not in
  * background processes such as autovacuum.  Note in particular that it
  * shouldn't be true in parallel worker processes; those have another
  * mechanism for replicating their leader's set of loaded libraries.
@@ -717,8 +718,7 @@ BaseInit(void)
 void
 InitPostgres(const char *in_dbname, Oid dboid,
             const char *username, Oid useroid,
-            bool load_session_libraries,
-            bool override_allow_connections,
+            bits32 flags,
             char *out_dbname)
 {
    bool        bootstrap = IsBootstrapProcessingMode();
@@ -1189,7 +1189,8 @@ InitPostgres(const char *in_dbname, Oid dboid,
     * user is a superuser, so the above stuff has to happen first.)
     */
    if (!bootstrap)
-       CheckMyDatabase(dbname, am_superuser, override_allow_connections);
+       CheckMyDatabase(dbname, am_superuser,
+                       (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0);
 
    /*
     * Now process any command-line switches and any additional GUC variable
@@ -1227,7 +1228,7 @@ InitPostgres(const char *in_dbname, Oid dboid,
     * during the initial transaction in case anything that requires database
     * access needs to be done.
     */
-   if (load_session_libraries)
+   if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0)
        process_session_preload_libraries();
 
    /* report this backend in the PgBackendStatus array */
index 14bd574fc24ef2e64ce75ed8432942d9108dce12..1cc3712c0ff08e8b432dff01216d5e7e091adc27 100644 (file)
@@ -463,12 +463,14 @@ extern PGDLLIMPORT AuxProcType MyAuxProcType;
  *****************************************************************************/
 
 /* in utils/init/postinit.c */
+/* flags for InitPostgres() */
+#define INIT_PG_LOAD_SESSION_LIBS      0x0001
+#define INIT_PG_OVERRIDE_ALLOW_CONNS   0x0002
 extern void pg_split_opts(char **argv, int *argcp, const char *optstr);
 extern void InitializeMaxBackends(void);
 extern void InitPostgres(const char *in_dbname, Oid dboid,
                         const char *username, Oid useroid,
-                        bool load_session_libraries,
-                        bool override_allow_connections,
+                        bits32 flags,
                         char *out_dbname);
 extern void BaseInit(void);