diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-07-04 04:51:52 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-07-04 04:51:52 +0000 |
| commit | eb5949d190e80360386113fde0f05854f0c9824d (patch) | |
| tree | f5683b4ff77c0b311ae975817b88c5ccc65ce5a9 /src/bin/pg_resetxlog/pg_resetxlog.c | |
| parent | 7504f0bae853b0b9fec03c8e361c8b1a4b1c3209 (diff) | |
| download | postgresql-eb5949d190e80360386113fde0f05854f0c9824d.tar.gz | |
Arrange for the postmaster (and standalone backends, initdb, etc) to
chdir into PGDATA and subsequently use relative paths instead of absolute
paths to access all files under PGDATA. This seems to give a small
performance improvement, and it should make the system more robust
against naive DBAs doing things like moving a database directory that
has a live postmaster in it. Per recent discussion.
Diffstat (limited to 'src/bin/pg_resetxlog/pg_resetxlog.c')
| -rw-r--r-- | src/bin/pg_resetxlog/pg_resetxlog.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index 15c291b1ee..13a65c7784 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -23,7 +23,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.34 2005/06/08 15:50:27 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.35 2005/07/04 04:51:51 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -50,9 +50,6 @@ extern int optind; extern char *optarg; -char XLogDir[MAXPGPATH]; /* not static, see xlog_internal.h */ -static char ControlFilePath[MAXPGPATH]; - static ControlFileData ControlFile; /* pg_control values */ static uint32 newXlogId, newXlogSeg; /* ID/Segment of new XLOG segment */ @@ -236,8 +233,13 @@ main(int argc, char *argv[]) #endif DataDir = argv[optind]; - snprintf(XLogDir, MAXPGPATH, "%s/pg_xlog", DataDir); - snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir); + + if (chdir(DataDir) < 0) + { + fprintf(stderr, _("%s: could not change directory to \"%s\": %s\n"), + progname, DataDir, strerror(errno)); + exit(1); + } /* * Check for a postmaster lock file --- if there is one, refuse to @@ -348,7 +350,7 @@ ReadControlFile(void) char *buffer; pg_crc32 crc; - if ((fd = open(ControlFilePath, O_RDONLY)) < 0) + if ((fd = open(XLOG_CONTROL_FILE, O_RDONLY)) < 0) { /* * If pg_control is not there at all, or we can't read it, the @@ -356,12 +358,12 @@ ReadControlFile(void) * can do "touch pg_control" to force us to proceed. */ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), - progname, ControlFilePath, strerror(errno)); + progname, XLOG_CONTROL_FILE, strerror(errno)); if (errno == ENOENT) fprintf(stderr, _("If you are sure the data directory path is correct, execute\n" " touch %s\n" "and try again.\n"), - ControlFilePath); + XLOG_CONTROL_FILE); exit(1); } @@ -372,7 +374,7 @@ ReadControlFile(void) if (len < 0) { fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), - progname, ControlFilePath, strerror(errno)); + progname, XLOG_CONTROL_FILE, strerror(errno)); exit(1); } close(fd); @@ -598,9 +600,11 @@ RewriteControlFile(void) memset(buffer, 0, BLCKSZ); memcpy(buffer, &ControlFile, sizeof(ControlFileData)); - unlink(ControlFilePath); + unlink(XLOG_CONTROL_FILE); - fd = open(ControlFilePath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, S_IRUSR | S_IWUSR); + fd = open(XLOG_CONTROL_FILE, + O_RDWR | O_CREAT | O_EXCL | PG_BINARY, + S_IRUSR | S_IWUSR); if (fd < 0) { fprintf(stderr, _("%s: could not create pg_control file: %s\n"), @@ -639,11 +643,11 @@ KillExistingXLOG(void) struct dirent *xlde; char path[MAXPGPATH]; - xldir = opendir(XLogDir); + xldir = opendir(XLOGDIR); if (xldir == NULL) { fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), - progname, XLogDir, strerror(errno)); + progname, XLOGDIR, strerror(errno)); exit(1); } @@ -653,7 +657,7 @@ KillExistingXLOG(void) if (strlen(xlde->d_name) == 24 && strspn(xlde->d_name, "0123456789ABCDEF") == 24) { - snprintf(path, MAXPGPATH, "%s/%s", XLogDir, xlde->d_name); + snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name); if (unlink(path) < 0) { fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"), @@ -676,7 +680,7 @@ KillExistingXLOG(void) if (errno) { fprintf(stderr, _("%s: could not read from directory \"%s\": %s\n"), - progname, XLogDir, strerror(errno)); + progname, XLOGDIR, strerror(errno)); exit(1); } closedir(xldir); |
