diff --git a/contrib/pg_upgrade/TESTING b/contrib/pg_upgrade/TESTING index 9646697f103..dc233afacb2 100644 --- a/contrib/pg_upgrade/TESTING +++ b/contrib/pg_upgrade/TESTING @@ -1,4 +1,4 @@ -$PostgreSQL: pgsql/contrib/pg_upgrade/TESTING,v 1.2.2.1 2010/07/09 16:51:29 momjian Exp $ +$PostgreSQL: pgsql/contrib/pg_upgrade/TESTING,v 1.2.2.2 2010/07/13 20:15:51 momjian Exp $ The most effective way to test pg_upgrade, aside from testing on user data, is by upgrading the PostgreSQL regression database. diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index 0e96705b2d1..be746e2c467 100644 --- a/contrib/pg_upgrade/check.c +++ b/contrib/pg_upgrade/check.c @@ -4,7 +4,7 @@ * server checks and output routines * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.11 2010/07/06 19:18:55 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.11.2.1 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" @@ -152,9 +152,9 @@ issue_warnings(migratorContext *ctx, char *sequence_script_file_name) { prep_status(ctx, "Adjusting sequences"); exec_prog(ctx, true, - SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d " - "--username \"%s\" -f \"%s\" --dbname template1 >> \"%s\"" - SYSTEMQUOTE, + SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on " + "--no-psqlrc --port %d --username \"%s\" " + "-f \"%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE, ctx->new.bindir, ctx->new.port, ctx->user, sequence_script_file_name, ctx->logfile); unlink(sequence_script_file_name); diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c index 88a2129e89e..c347484b81d 100644 --- a/contrib/pg_upgrade/exec.c +++ b/contrib/pg_upgrade/exec.c @@ -4,7 +4,7 @@ * execution functions * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.8 2010/07/06 19:18:55 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.8.2.1 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" @@ -13,10 +13,10 @@ #include -static void checkBinDir(migratorContext *ctx, ClusterInfo *cluster); +static void check_data_dir(migratorContext *ctx, const char *pg_data); +static void check_bin_dir(migratorContext *ctx, ClusterInfo *cluster); static int check_exec(migratorContext *ctx, const char *dir, const char *cmdName); static const char *validate_exec(const char *path); -static int check_data_dir(migratorContext *ctx, const char *pg_data); /* @@ -55,49 +55,6 @@ exec_prog(migratorContext *ctx, bool throw_error, const char *fmt,...) } -/* - * verify_directories() - * - * does all the hectic work of verifying directories and executables - * of old and new server. - * - * NOTE: May update the values of all parameters - */ -void -verify_directories(migratorContext *ctx) -{ - prep_status(ctx, "Checking old data directory (%s)", ctx->old.pgdata); - if (check_data_dir(ctx, ctx->old.pgdata) != 0) - pg_log(ctx, PG_FATAL, "Failed\n"); - checkBinDir(ctx, &ctx->old); - check_ok(ctx); - - prep_status(ctx, "Checking new data directory (%s)", ctx->new.pgdata); - if (check_data_dir(ctx, ctx->new.pgdata) != 0) - pg_log(ctx, PG_FATAL, "Failed\n"); - checkBinDir(ctx, &ctx->new); - check_ok(ctx); -} - - -/* - * checkBinDir() - * - * This function searches for the executables that we expect to find - * in the binaries directory. If we find that a required executable - * is missing (or secured against us), we display an error message and - * exit(). - */ -static void -checkBinDir(migratorContext *ctx, ClusterInfo *cluster) -{ - check_exec(ctx, cluster->bindir, "postgres"); - check_exec(ctx, cluster->bindir, "psql"); - check_exec(ctx, cluster->bindir, "pg_ctl"); - check_exec(ctx, cluster->bindir, "pg_dumpall"); -} - - /* * is_server_running() * @@ -126,6 +83,90 @@ is_server_running(migratorContext *ctx, const char *datadir) } +/* + * verify_directories() + * + * does all the hectic work of verifying directories and executables + * of old and new server. + * + * NOTE: May update the values of all parameters + */ +void +verify_directories(migratorContext *ctx) +{ + prep_status(ctx, "Checking old data directory (%s)", ctx->old.pgdata); + check_data_dir(ctx, ctx->old.pgdata); + check_ok(ctx); + + prep_status(ctx, "Checking old bin directory (%s)", ctx->old.bindir); + check_bin_dir(ctx, &ctx->old); + check_ok(ctx); + + prep_status(ctx, "Checking new data directory (%s)", ctx->new.pgdata); + check_data_dir(ctx, ctx->new.pgdata); + check_ok(ctx); + + prep_status(ctx, "Checking new bin directory (%s)", ctx->new.bindir); + check_bin_dir(ctx, &ctx->new); + check_ok(ctx); +} + + +/* + * check_data_dir() + * + * This function validates the given cluster directory - we search for a + * small set of subdirectories that we expect to find in a valid $PGDATA + * directory. If any of the subdirectories are missing (or secured against + * us) we display an error message and exit() + * + */ +static void +check_data_dir(migratorContext *ctx, const char *pg_data) +{ + char subDirName[MAXPGPATH]; + int subdirnum; + const char *requiredSubdirs[] = {"base", "global", "pg_clog", + "pg_multixact", "pg_subtrans", "pg_tblspc", "pg_twophase", + "pg_xlog"}; + + for (subdirnum = 0; + subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]); + ++subdirnum) + { + struct stat statBuf; + + snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data, + requiredSubdirs[subdirnum]); + + if (stat(subDirName, &statBuf) != 0) + report_status(ctx, PG_FATAL, "check for %s failed: %s", + requiredSubdirs[subdirnum], getErrorText(errno)); + else if (!S_ISDIR(statBuf.st_mode)) + report_status(ctx, PG_FATAL, "%s is not a directory", + requiredSubdirs[subdirnum]); + } +} + + +/* + * check_bin_dir() + * + * This function searches for the executables that we expect to find + * in the binaries directory. If we find that a required executable + * is missing (or secured against us), we display an error message and + * exit(). + */ +static void +check_bin_dir(migratorContext *ctx, ClusterInfo *cluster) +{ + check_exec(ctx, cluster->bindir, "postgres"); + check_exec(ctx, cluster->bindir, "psql"); + check_exec(ctx, cluster->bindir, "pg_ctl"); + check_exec(ctx, cluster->bindir, "pg_dumpall"); +} + + /* * check_exec() * @@ -264,50 +305,3 @@ validate_exec(const char *path) return NULL; #endif } - - -/* - * check_data_dir() - * - * This function validates the given cluster directory - we search for a - * small set of subdirectories that we expect to find in a valid $PGDATA - * directory. If any of the subdirectories are missing (or secured against - * us) we display an error message and exit() - * - */ -static int -check_data_dir(migratorContext *ctx, const char *pg_data) -{ - char subDirName[MAXPGPATH]; - const char *requiredSubdirs[] = {"base", "global", "pg_clog", - "pg_multixact", "pg_subtrans", - "pg_tblspc", "pg_twophase", "pg_xlog"}; - bool fail = false; - int subdirnum; - - for (subdirnum = 0; subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]); ++subdirnum) - { - struct stat statBuf; - - snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data, - requiredSubdirs[subdirnum]); - - if ((stat(subDirName, &statBuf)) != 0) - { - report_status(ctx, PG_WARNING, "check for %s warning: %s", - requiredSubdirs[subdirnum], getErrorText(errno)); - fail = true; - } - else - { - if (!S_ISDIR(statBuf.st_mode)) - { - report_status(ctx, PG_WARNING, "%s is not a directory", - requiredSubdirs[subdirnum]); - fail = true; - } - } - } - - return (fail) ? -1 : 0; -} diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c index e55ca2c7fa5..358fcf51b5a 100644 --- a/contrib/pg_upgrade/file.c +++ b/contrib/pg_upgrade/file.c @@ -4,7 +4,7 @@ * file system operations * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/file.c,v 1.13.2.1 2010/07/09 16:51:29 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/file.c,v 1.13.2.2 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c index 1704069b34b..d03b978619e 100644 --- a/contrib/pg_upgrade/option.c +++ b/contrib/pg_upgrade/option.c @@ -4,7 +4,7 @@ * options functions * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/option.c,v 1.12 2010/07/06 19:18:55 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/option.c,v 1.12.2.1 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" @@ -259,10 +259,6 @@ or\n"), ctx->old.port, ctx->new.port, ctx->user); C:\\> set NEWBINDIR=newCluster/bin\n\ C:\\> pg_upgrade\n")); #endif - printf(_("\n\ -You may find it useful to save the preceding 5 commands in a shell script\n\ -\n\ -Report bugs to \n")); } diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c index 695596ba603..1a515e75e6f 100644 --- a/contrib/pg_upgrade/pg_upgrade.c +++ b/contrib/pg_upgrade/pg_upgrade.c @@ -4,7 +4,7 @@ * main source file * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.c,v 1.10 2010/07/06 19:18:55 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.c,v 1.10.2.1 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" @@ -202,9 +202,10 @@ prepare_new_databases(migratorContext *ctx) */ prep_status(ctx, "Creating databases in the new cluster"); exec_prog(ctx, true, - SYSTEMQUOTE "\"%s/psql\" --port %d --username \"%s\" " - "--set ON_ERROR_STOP=on -f \"%s/%s\" --dbname template1 >> \"%s\"" - SYSTEMQUOTE, + SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on " + /* --no-psqlrc prevents AUTOCOMMIT=off */ + "--no-psqlrc --port %d --username \"%s\" " + "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE, ctx->new.bindir, ctx->new.port, ctx->user, ctx->cwd, GLOBALS_DUMP_FILE, ctx->logfile); check_ok(ctx); @@ -225,9 +226,9 @@ create_new_objects(migratorContext *ctx) prep_status(ctx, "Restoring database schema to new cluster"); exec_prog(ctx, true, - SYSTEMQUOTE "\"%s/psql\" --port %d --username \"%s\" " - "--set ON_ERROR_STOP=on -f \"%s/%s\" --dbname template1 >> \"%s\"" - SYSTEMQUOTE, + SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on " + "--no-psqlrc --port %d --username \"%s\" " + "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE, ctx->new.bindir, ctx->new.port, ctx->user, ctx->cwd, DB_DUMP_FILE, ctx->logfile); check_ok(ctx); diff --git a/contrib/pg_upgrade/server.c b/contrib/pg_upgrade/server.c index a9243ab75ae..eaa178cd7c2 100644 --- a/contrib/pg_upgrade/server.c +++ b/contrib/pg_upgrade/server.c @@ -4,7 +4,7 @@ * database server functions * * Copyright (c) 2010, PostgreSQL Global Development Group - * $PostgreSQL: pgsql/contrib/pg_upgrade/server.c,v 1.8 2010/07/06 19:18:55 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pg_upgrade/server.c,v 1.8.2.1 2010/07/13 20:15:51 momjian Exp $ */ #include "pg_upgrade.h" @@ -181,9 +181,9 @@ start_postmaster(migratorContext *ctx, Cluster whichCluster, bool quiet) } /* - * On Win32, we can't send both server output and pg_ctl output to the + * On Win32, we can't send both pg_upgrade output and pg_ctl output to the * 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 pg_ctl + * because it is being used by another process." so we have to send all other * output to 'nul'. */ snprintf(cmd, sizeof(cmd), @@ -191,11 +191,11 @@ start_postmaster(migratorContext *ctx, Cluster whichCluster, bool quiet) "-o \"-p %d -c autovacuum=off " "-c autovacuum_freeze_max_age=2000000000\" " "start >> \"%s\" 2>&1" SYSTEMQUOTE, - bindir, ctx->logfile, datadir, port, + bindir, #ifndef WIN32 - ctx->logfile); + ctx->logfile, datadir, port, ctx->logfile); #else - DEVNULL); + DEVNULL, datadir, port, DEVNULL); #endif exec_prog(ctx, true, "%s", cmd); @@ -235,11 +235,11 @@ stop_postmaster(migratorContext *ctx, bool fast, bool quiet) snprintf(cmd, sizeof(cmd), SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" %s stop >> " "\"%s\" 2>&1" SYSTEMQUOTE, - bindir, ctx->logfile, datadir, fast ? "-m fast" : "", + bindir, #ifndef WIN32 - ctx->logfile); + ctx->logfile, datadir, fast ? "-m fast" : "", ctx->logfile); #else - DEVNULL); + DEVNULL, datadir, fast ? "-m fast" : "", DEVNULL); #endif exec_prog(ctx, fast ? false : true, "%s", cmd);