From f87bd25f009210a8c4eabcd066dd9b5f6b8ef857 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 13 Jul 2010 18:09:55 +0000 Subject: [PATCH] In pg_upgrade, report /bin directory checks independent of /data checks. --- contrib/pg_upgrade/exec.c | 166 ++++++++++++++++++-------------------- 1 file changed, 80 insertions(+), 86 deletions(-) diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c index 88a2129e89..1e024cb81e 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.9 2010/07/13 18:09:55 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,6 +55,34 @@ exec_prog(migratorContext *ctx, bool throw_error, const char *fmt,...) } +/* + * is_server_running() + * + * checks whether postmaster on the given data directory is running or not. + * The check is performed by looking for the existence of postmaster.pid file. + */ +bool +is_server_running(migratorContext *ctx, const char *datadir) +{ + char path[MAXPGPATH]; + int fd; + + snprintf(path, sizeof(path), "%s/postmaster.pid", datadir); + + if ((fd = open(path, O_RDONLY, 0)) < 0) + { + if (errno != ENOENT) + pg_log(ctx, PG_FATAL, "\ncould not open file \"%s\" for reading\n", + path); + + return false; + } + + close(fd); + return true; +} + + /* * verify_directories() * @@ -67,21 +95,62 @@ 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_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); - if (check_data_dir(ctx, ctx->new.pgdata) != 0) - pg_log(ctx, PG_FATAL, "Failed\n"); - checkBinDir(ctx, &ctx->new); + 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); } /* - * checkBinDir() + * 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 @@ -89,7 +158,7 @@ verify_directories(migratorContext *ctx) * exit(). */ static void -checkBinDir(migratorContext *ctx, ClusterInfo *cluster) +check_bin_dir(migratorContext *ctx, ClusterInfo *cluster) { check_exec(ctx, cluster->bindir, "postgres"); check_exec(ctx, cluster->bindir, "psql"); @@ -98,34 +167,6 @@ checkBinDir(migratorContext *ctx, ClusterInfo *cluster) } -/* - * is_server_running() - * - * checks whether postmaster on the given data directory is running or not. - * The check is performed by looking for the existence of postmaster.pid file. - */ -bool -is_server_running(migratorContext *ctx, const char *datadir) -{ - char path[MAXPGPATH]; - int fd; - - snprintf(path, sizeof(path), "%s/postmaster.pid", datadir); - - if ((fd = open(path, O_RDONLY, 0)) < 0) - { - if (errno != ENOENT) - pg_log(ctx, PG_FATAL, "\ncould not open file \"%s\" for reading\n", - path); - - return false; - } - - close(fd); - return true; -} - - /* * 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; -} -- 2.40.0