Skip to content

Commit f87bd25

Browse files
committed
In pg_upgrade, report /bin directory checks independent of /data checks.
1 parent bae8283 commit f87bd25

File tree

1 file changed

+80
-86
lines changed

1 file changed

+80
-86
lines changed

contrib/pg_upgrade/exec.c

Lines changed: 80 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* execution functions
55
*
66
* Copyright (c) 2010, PostgreSQL Global Development Group
7-
* $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.8 2010/07/06 19:18:55 momjian Exp $
7+
* $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.9 2010/07/13 18:09:55 momjian Exp $
88
*/
99

1010
#include "pg_upgrade.h"
@@ -13,10 +13,10 @@
1313
#include <grp.h>
1414

1515

16-
static void checkBinDir(migratorContext *ctx, ClusterInfo *cluster);
16+
static void check_data_dir(migratorContext *ctx, const char *pg_data);
17+
static void check_bin_dir(migratorContext *ctx, ClusterInfo *cluster);
1718
static int check_exec(migratorContext *ctx, const char *dir, const char *cmdName);
1819
static const char *validate_exec(const char *path);
19-
static int check_data_dir(migratorContext *ctx, const char *pg_data);
2020

2121

2222
/*
@@ -55,6 +55,34 @@ exec_prog(migratorContext *ctx, bool throw_error, const char *fmt,...)
5555
}
5656

5757

58+
/*
59+
* is_server_running()
60+
*
61+
* checks whether postmaster on the given data directory is running or not.
62+
* The check is performed by looking for the existence of postmaster.pid file.
63+
*/
64+
bool
65+
is_server_running(migratorContext *ctx, const char *datadir)
66+
{
67+
char path[MAXPGPATH];
68+
int fd;
69+
70+
snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
71+
72+
if ((fd = open(path, O_RDONLY, 0)) < 0)
73+
{
74+
if (errno != ENOENT)
75+
pg_log(ctx, PG_FATAL, "\ncould not open file \"%s\" for reading\n",
76+
path);
77+
78+
return false;
79+
}
80+
81+
close(fd);
82+
return true;
83+
}
84+
85+
5886
/*
5987
* verify_directories()
6088
*
@@ -67,29 +95,70 @@ void
6795
verify_directories(migratorContext *ctx)
6896
{
6997
prep_status(ctx, "Checking old data directory (%s)", ctx->old.pgdata);
70-
if (check_data_dir(ctx, ctx->old.pgdata) != 0)
71-
pg_log(ctx, PG_FATAL, "Failed\n");
72-
checkBinDir(ctx, &ctx->old);
98+
check_data_dir(ctx, ctx->old.pgdata);
99+
check_ok(ctx);
100+
101+
prep_status(ctx, "Checking old bin directory (%s)", ctx->old.bindir);
102+
check_bin_dir(ctx, &ctx->old);
73103
check_ok(ctx);
74104

75105
prep_status(ctx, "Checking new data directory (%s)", ctx->new.pgdata);
76-
if (check_data_dir(ctx, ctx->new.pgdata) != 0)
77-
pg_log(ctx, PG_FATAL, "Failed\n");
78-
checkBinDir(ctx, &ctx->new);
106+
check_data_dir(ctx, ctx->new.pgdata);
107+
check_ok(ctx);
108+
109+
prep_status(ctx, "Checking new bin directory (%s)", ctx->new.bindir);
110+
check_bin_dir(ctx, &ctx->new);
79111
check_ok(ctx);
80112
}
81113

82114

83115
/*
84-
* checkBinDir()
116+
* check_data_dir()
117+
*
118+
* This function validates the given cluster directory - we search for a
119+
* small set of subdirectories that we expect to find in a valid $PGDATA
120+
* directory. If any of the subdirectories are missing (or secured against
121+
* us) we display an error message and exit()
122+
*
123+
*/
124+
static void
125+
check_data_dir(migratorContext *ctx, const char *pg_data)
126+
{
127+
char subDirName[MAXPGPATH];
128+
int subdirnum;
129+
const char *requiredSubdirs[] = {"base", "global", "pg_clog",
130+
"pg_multixact", "pg_subtrans", "pg_tblspc", "pg_twophase",
131+
"pg_xlog"};
132+
133+
for (subdirnum = 0;
134+
subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]);
135+
++subdirnum)
136+
{
137+
struct stat statBuf;
138+
139+
snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data,
140+
requiredSubdirs[subdirnum]);
141+
142+
if (stat(subDirName, &statBuf) != 0)
143+
report_status(ctx, PG_FATAL, "check for %s failed: %s",
144+
requiredSubdirs[subdirnum], getErrorText(errno));
145+
else if (!S_ISDIR(statBuf.st_mode))
146+
report_status(ctx, PG_FATAL, "%s is not a directory",
147+
requiredSubdirs[subdirnum]);
148+
}
149+
}
150+
151+
152+
/*
153+
* check_bin_dir()
85154
*
86155
* This function searches for the executables that we expect to find
87156
* in the binaries directory. If we find that a required executable
88157
* is missing (or secured against us), we display an error message and
89158
* exit().
90159
*/
91160
static void
92-
checkBinDir(migratorContext *ctx, ClusterInfo *cluster)
161+
check_bin_dir(migratorContext *ctx, ClusterInfo *cluster)
93162
{
94163
check_exec(ctx, cluster->bindir, "postgres");
95164
check_exec(ctx, cluster->bindir, "psql");
@@ -98,34 +167,6 @@ checkBinDir(migratorContext *ctx, ClusterInfo *cluster)
98167
}
99168

100169

101-
/*
102-
* is_server_running()
103-
*
104-
* checks whether postmaster on the given data directory is running or not.
105-
* The check is performed by looking for the existence of postmaster.pid file.
106-
*/
107-
bool
108-
is_server_running(migratorContext *ctx, const char *datadir)
109-
{
110-
char path[MAXPGPATH];
111-
int fd;
112-
113-
snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
114-
115-
if ((fd = open(path, O_RDONLY, 0)) < 0)
116-
{
117-
if (errno != ENOENT)
118-
pg_log(ctx, PG_FATAL, "\ncould not open file \"%s\" for reading\n",
119-
path);
120-
121-
return false;
122-
}
123-
124-
close(fd);
125-
return true;
126-
}
127-
128-
129170
/*
130171
* check_exec()
131172
*
@@ -264,50 +305,3 @@ validate_exec(const char *path)
264305
return NULL;
265306
#endif
266307
}
267-
268-
269-
/*
270-
* check_data_dir()
271-
*
272-
* This function validates the given cluster directory - we search for a
273-
* small set of subdirectories that we expect to find in a valid $PGDATA
274-
* directory. If any of the subdirectories are missing (or secured against
275-
* us) we display an error message and exit()
276-
*
277-
*/
278-
static int
279-
check_data_dir(migratorContext *ctx, const char *pg_data)
280-
{
281-
char subDirName[MAXPGPATH];
282-
const char *requiredSubdirs[] = {"base", "global", "pg_clog",
283-
"pg_multixact", "pg_subtrans",
284-
"pg_tblspc", "pg_twophase", "pg_xlog"};
285-
bool fail = false;
286-
int subdirnum;
287-
288-
for (subdirnum = 0; subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]); ++subdirnum)
289-
{
290-
struct stat statBuf;
291-
292-
snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data,
293-
requiredSubdirs[subdirnum]);
294-
295-
if ((stat(subDirName, &statBuf)) != 0)
296-
{
297-
report_status(ctx, PG_WARNING, "check for %s warning: %s",
298-
requiredSubdirs[subdirnum], getErrorText(errno));
299-
fail = true;
300-
}
301-
else
302-
{
303-
if (!S_ISDIR(statBuf.st_mode))
304-
{
305-
report_status(ctx, PG_WARNING, "%s is not a directory",
306-
requiredSubdirs[subdirnum]);
307-
fail = true;
308-
}
309-
}
310-
}
311-
312-
return (fail) ? -1 : 0;
313-
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy