Add postmaster/postgres undocumented -b option for binary upgrades.
authorBruce Momjian <bruce@momjian.us>
Mon, 25 Apr 2011 16:00:21 +0000 (12:00 -0400)
committerBruce Momjian <bruce@momjian.us>
Mon, 25 Apr 2011 16:00:21 +0000 (12:00 -0400)
This option turns off autovacuum, prevents non-super-user connections,
and enables oid setting hooks in the backend.  The code continues to use
the old autoavacuum disable settings for servers with earlier catalog
versions.

This includes a catalog version bump to identify servers that support
the -b option.

16 files changed:
contrib/pg_upgrade/check.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/server.c
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/catalog/pg_enum.c
src/backend/catalog/pg_type.c
src/backend/catalog/toasting.c
src/backend/commands/typecmds.c
src/backend/commands/user.c
src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c
src/backend/utils/init/globals.c
src/backend/utils/init/postinit.c
src/include/catalog/catversion.h
src/include/miscadmin.h

index d1dc5dbeaacc0f61812814536cc6c78299fcdc5a..415f95b616d19099bb4a6a301a5aad9d5e82cd79 100644 (file)
@@ -264,7 +264,7 @@ check_cluster_compatibility(bool live_check)
 
    /* Is it 9.0 but without tablespace directories? */
    if (GET_MAJOR_VERSION(new_cluster.major_version) == 900 &&
-       new_cluster.controldata.cat_ver < TABLE_SPACE_SUBDIRS)
+       new_cluster.controldata.cat_ver < TABLE_SPACE_SUBDIRS_CAT_VER)
        pg_log(PG_FATAL, "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
               "because of backend API changes made during development.\n");
 }
index 5ca570eb157c7e7287464025d7d526a59c568b89..5865315d9e4f44afa36d52502f9ab93fda082931 100644 (file)
@@ -58,7 +58,9 @@
 #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
 /* OID system catalog preservation added during PG 9.0 development */
-#define TABLE_SPACE_SUBDIRS 201001111
+#define TABLE_SPACE_SUBDIRS_CAT_VER 201001111
+/* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
+#define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
 
 /*
  * Each relation is represented by a relinfo structure.
index 2a0f50eb2a22b4907e8d462db169530e1f251ea0..ab8d8c73342c634ecc2f30c0780bc696aefc2fa8 100644 (file)
@@ -173,6 +173,11 @@ start_postmaster(ClusterInfo *cluster, bool quiet)
    const char *datadir;
    unsigned short port;
    bool        exit_hook_registered = false;
+#ifndef WIN32
+   char        *output_filename = log_opts.filename;
+#else
+   char        *output_filename = DEVNULL;
+#endif
 
    bindir = cluster->bindir;
    datadir = cluster->pgdata;
@@ -193,7 +198,6 @@ start_postmaster(ClusterInfo *cluster, bool quiet)
     * same file because we get the error: "The process cannot access the file
     * because it is being used by another process." so we have to send all
     * other output to 'nul'.
-    *
     * Using autovacuum=off disables cleanup vacuum and analyze, but freeze
     * vacuums can still happen, so we set autovacuum_freeze_max_age to its
     * maximum.  We assume all datfrozenxid and relfrozen values are less than
@@ -202,15 +206,13 @@ start_postmaster(ClusterInfo *cluster, bool quiet)
     */
    snprintf(cmd, sizeof(cmd),
             SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
-            "-o \"-p %d -c autovacuum=off "
-            "-c autovacuum_freeze_max_age=2000000000\" "
-            "start >> \"%s\" 2>&1" SYSTEMQUOTE,
-            bindir,
-#ifndef WIN32
-            log_opts.filename, datadir, port, log_opts.filename);
-#else
-            DEVNULL, datadir, port, DEVNULL);
-#endif
+            "-o \"-p %d %s\" start >> \"%s\" 2>&1" SYSTEMQUOTE,
+            bindir, output_filename, datadir, port,
+            (cluster->controldata.cat_ver >=
+               BINARY_UPGRADE_SERVER_FLAG_CAT_VER) ? "-b" :
+               "-c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
+            log_opts.filename);
+
    exec_prog(true, "%s", cmd);
 
    /* wait for the server to start properly */
index 28d5c549a32d3eff46dd39ca391a90e1437c93f5..4c089677030d391f5a0e8e8ede24566e558359de 100644 (file)
@@ -1053,7 +1053,8 @@ heap_create_with_catalog(const char *relname,
         * Use binary-upgrade override for pg_class.oid/relfilenode, if
         * supplied.
         */
-       if (OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
+       if (IsBinaryUpgrade &&
+           OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
            (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
             relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
             relkind == RELKIND_FOREIGN_TABLE))
@@ -1061,7 +1062,8 @@ heap_create_with_catalog(const char *relname,
            relid = binary_upgrade_next_heap_pg_class_oid;
            binary_upgrade_next_heap_pg_class_oid = InvalidOid;
        }
-       else if (OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
+       else if (IsBinaryUpgrade &&
+                OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
                 relkind == RELKIND_TOASTVALUE)
        {
            relid = binary_upgrade_next_toast_pg_class_oid;
index bc630a6f3ac9e9a3f3bc45e08e70563b9ae2960e..a0898e00488a84d963239fbf847d07a5d1b65145 100644 (file)
@@ -789,7 +789,8 @@ index_create(Relation heapRelation,
         * Use binary-upgrade override for pg_class.oid/relfilenode, if
         * supplied.
         */
-       if (OidIsValid(binary_upgrade_next_index_pg_class_oid))
+       if (IsBinaryUpgrade &&
+           OidIsValid(binary_upgrade_next_index_pg_class_oid))
        {
            indexRelationId = binary_upgrade_next_index_pg_class_oid;
            binary_upgrade_next_index_pg_class_oid = InvalidOid;
index 08d8aa13f332d6058572a51b4eff1d9871afed68..61a9322d901bda96fe55e799658c527d34057a18 100644 (file)
@@ -21,6 +21,7 @@
 #include "catalog/pg_enum.h"
 #include "catalog/pg_type.h"
 #include "storage/lmgr.h"
+#include "miscadmin.h"
 #include "utils/builtins.h"
 #include "utils/fmgroids.h"
 #include "utils/rel.h"
@@ -311,7 +312,7 @@ restart:
    }
 
    /* Get a new OID for the new label */
-   if (OidIsValid(binary_upgrade_next_pg_enum_oid))
+   if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
    {
        /*
         * Use binary-upgrade override for pg_enum.oid, if supplied. During
index b6912578786060b4da2bc94eb682b54b64db8215..de5c63defe5f292d08145fdb543e93ee4acced4b 100644 (file)
@@ -125,7 +125,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
    tup = heap_form_tuple(tupDesc, values, nulls);
 
    /* Use binary-upgrade override for pg_type.oid, if supplied. */
-   if (OidIsValid(binary_upgrade_next_pg_type_oid))
+   if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
    {
        HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
        binary_upgrade_next_pg_type_oid = InvalidOid;
@@ -430,7 +430,7 @@ TypeCreate(Oid newTypeOid,
        if (OidIsValid(newTypeOid))
            HeapTupleSetOid(tup, newTypeOid);
        /* Use binary-upgrade override for pg_type.oid, if supplied. */
-       else if (OidIsValid(binary_upgrade_next_pg_type_oid))
+       else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
        {
            HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
            binary_upgrade_next_pg_type_oid = InvalidOid;
index 85fe57fb2a5308d5079ce49bb602de1a12b23cf2..362d26d9d1fe73f5d2519c151963053a75c4e9fa 100644 (file)
@@ -157,7 +157,8 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, Datum reloptio
     * creation even if it seems not to need one.
     */
    if (!needs_toast_table(rel) &&
-       !OidIsValid(binary_upgrade_next_toast_pg_class_oid))
+       (!IsBinaryUpgrade ||
+        !OidIsValid(binary_upgrade_next_toast_pg_class_oid)))
        return false;
 
    /*
@@ -202,7 +203,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, Datum reloptio
        namespaceid = PG_TOAST_NAMESPACE;
 
    /* Use binary-upgrade override for pg_type.oid, if supplied. */
-   if (OidIsValid(binary_upgrade_next_toast_pg_type_oid))
+   if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
    {
        toast_typid = binary_upgrade_next_toast_pg_type_oid;
        binary_upgrade_next_toast_pg_type_oid = InvalidOid;
index 7388e5a3db9167a5b82cdb9c942dd170c30fa47d..f8eb5bc4a65cc83f0c6ff2e363444c3b38d3afca 100644 (file)
@@ -1550,7 +1550,7 @@ AssignTypeArrayOid(void)
    Oid         type_array_oid;
 
    /* Use binary-upgrade override for pg_type.typarray, if supplied. */
-   if (OidIsValid(binary_upgrade_next_array_pg_type_oid))
+   if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
    {
        type_array_oid = binary_upgrade_next_array_pg_type_oid;
        binary_upgrade_next_array_pg_type_oid = InvalidOid;
index 3f7d4992af8df3c706bca0e05497a673a31c0440..838d6eba2056509fdfa84670e4b360469c658fa3 100644 (file)
@@ -388,7 +388,7 @@ CreateRole(CreateRoleStmt *stmt)
     * pg_largeobject_metadata contains pg_authid.oid's, so we use the
     * binary-upgrade override, if specified.
     */
-   if (OidIsValid(binary_upgrade_next_pg_authid_oid))
+   if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
    {
        HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
        binary_upgrade_next_pg_authid_oid = InvalidOid;
index 6e7f66472fd62694001bc7443f3103fdde7f483b..c0cf0336a1e62408f1fd7b9102c9f26c17eaba98 100644 (file)
@@ -529,7 +529,7 @@ PostmasterMain(int argc, char *argv[])
     * tcop/postgres.c (the option sets should not conflict) and with the
     * common help() function in main/main.c.
     */
-   while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
+   while ((opt = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
    {
        switch (opt)
        {
@@ -541,6 +541,11 @@ PostmasterMain(int argc, char *argv[])
                SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
 
+           case 'b':
+               /* Undocumented flag used for binary upgrades */
+               IsBinaryUpgrade = true;
+               break;
+
            case 'D':
                userDoption = optarg;
                break;
@@ -1480,8 +1485,13 @@ ServerLoop(void)
        if (WalWriterPID == 0 && pmState == PM_RUN)
            WalWriterPID = StartWalWriter();
 
-       /* If we have lost the autovacuum launcher, try to start a new one */
-       if (AutoVacPID == 0 &&
+       /*
+        *  If we have lost the autovacuum launcher, try to start a new one.
+        *  We don't want autovacuum to run in binary upgrade mode because
+        *  autovacuum might update relfrozenxid for empty tables before
+        *  the physical files are put in place.
+        */
+       if (!IsBinaryUpgrade && AutoVacPID == 0 &&
            (AutoVacuumingActive() || start_autovac_launcher) &&
            pmState == PM_RUN)
        {
@@ -2413,7 +2423,7 @@ reaper(SIGNAL_ARGS)
             */
            if (WalWriterPID == 0)
                WalWriterPID = StartWalWriter();
-           if (AutoVacuumingActive() && AutoVacPID == 0)
+           if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0)
                AutoVacPID = StartAutoVacLauncher();
            if (XLogArchivingActive() && PgArchPID == 0)
                PgArchPID = pgarch_start();
index 59b7666c10998870dbbe6193063b157f4694d58c..a07661f02abdd08e1e4d0af7d45735e810d5cb7c 100644 (file)
@@ -3238,7 +3238,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
     * postmaster/postmaster.c (the option sets should not conflict) and with
     * the common help() function in main/main.c.
     */
-   while ((flag = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
+   while ((flag = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
    {
        switch (flag)
        {
@@ -3250,6 +3250,11 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
                SetConfigOption("shared_buffers", optarg, ctx, gucsource);
                break;
 
+           case 'b':
+               /* Undocumented flag used for binary upgrades */
+               IsBinaryUpgrade = true;
+               break;
+
            case 'D':
                if (secure)
                    userDoption = strdup(optarg);
index 984ffd0c73ee822247e35c4318f45871ed8439e1..c4c41544a2126a9a7be8aed5d1dc27515af6e978 100644 (file)
@@ -85,6 +85,7 @@ pid_t     PostmasterPid = 0;
  */
 bool       IsPostmasterEnvironment = false;
 bool       IsUnderPostmaster = false;
+bool       IsBinaryUpgrade = false;
 
 bool       ExitOnAnyError = false;
 
index a4c5d4c69ab630813f9720f7a13a98f4a5cf926c..1f6fba5f752778dfcb2d1a767d629fe102c02d3c 100644 (file)
@@ -625,6 +625,16 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
            errmsg("must be superuser to connect during database shutdown")));
    }
 
+   /*
+    * Binary upgrades only allowed super-user connections
+    */
+   if (IsBinaryUpgrade && !am_superuser)
+   {
+           ereport(FATAL,
+                   (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+           errmsg("must be superuser to connect in binary upgrade mode")));
+   }
+
    /*
     * The last few connections slots are reserved for superusers. Although
     * replication connections currently require superuser privileges, we
index 53c684aa4e3a809091326314e2902e2b2b42b3d3..2df489f32ea615088247500d56c03c83e6f56587 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 201104181
+#define CATALOG_VERSION_NO 201104251
 
 #endif
index aa8cce5ca816d19cd0b8149f3abf4d6d5f09229f..9d194171a564bf9be8786a4649f64bc3aa6810a4 100644 (file)
@@ -124,6 +124,7 @@ do { \
 extern pid_t PostmasterPid;
 extern bool IsPostmasterEnvironment;
 extern PGDLLIMPORT bool IsUnderPostmaster;
+extern bool IsBinaryUpgrade;
 
 extern bool ExitOnAnyError;