Commit d85c6883 authored by Tom Lane's avatar Tom Lane

Fix pg_resetxlog to remove archive status files along with WAL segment files.

Fujii Masao
parent c52963ac
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.72 2009/02/25 13:03:07 petere Exp $ * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.73 2009/05/03 23:13:37 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -71,6 +71,7 @@ static void PrintControlValues(bool guessed); ...@@ -71,6 +71,7 @@ static void PrintControlValues(bool guessed);
static void RewriteControlFile(void); static void RewriteControlFile(void);
static void FindEndOfXLOG(void); static void FindEndOfXLOG(void);
static void KillExistingXLOG(void); static void KillExistingXLOG(void);
static void KillExistingArchiveStatus(void);
static void WriteEmptyXLOG(void); static void WriteEmptyXLOG(void);
static void usage(void); static void usage(void);
...@@ -360,6 +361,7 @@ main(int argc, char *argv[]) ...@@ -360,6 +361,7 @@ main(int argc, char *argv[])
*/ */
RewriteControlFile(); RewriteControlFile();
KillExistingXLOG(); KillExistingXLOG();
KillExistingArchiveStatus();
WriteEmptyXLOG(); WriteEmptyXLOG();
printf(_("Transaction log reset\n")); printf(_("Transaction log reset\n"));
...@@ -811,6 +813,63 @@ KillExistingXLOG(void) ...@@ -811,6 +813,63 @@ KillExistingXLOG(void)
} }
/*
* Remove existing archive status files
*/
static void
KillExistingArchiveStatus(void)
{
DIR *xldir;
struct dirent *xlde;
char path[MAXPGPATH];
#define ARCHSTATDIR XLOGDIR "/archive_status"
xldir = opendir(ARCHSTATDIR);
if (xldir == NULL)
{
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),
progname, ARCHSTATDIR, strerror(errno));
exit(1);
}
errno = 0;
while ((xlde = readdir(xldir)) != NULL)
{
if (strspn(xlde->d_name, "0123456789ABCDEF") == 24 &&
(strcmp(xlde->d_name + 24, ".ready") == 0 ||
strcmp(xlde->d_name + 24, ".done") == 0))
{
snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
if (unlink(path) < 0)
{
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),
progname, path, strerror(errno));
exit(1);
}
}
errno = 0;
}
#ifdef WIN32
/*
* This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but not in
* released version
*/
if (GetLastError() == ERROR_NO_MORE_FILES)
errno = 0;
#endif
if (errno)
{
fprintf(stderr, _("%s: could not read from directory \"%s\": %s\n"),
progname, ARCHSTATDIR, strerror(errno));
exit(1);
}
closedir(xldir);
}
/* /*
* Write an empty XLOG file, containing only the checkpoint record * Write an empty XLOG file, containing only the checkpoint record
* already set up in ControlFile. * already set up in ControlFile.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment