]> granicus.if.org Git - postgresql/commitdiff
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;