Hi,

Current pg_resetxlog doesn't remove any archive status files. This
may cause continuous failure of archive command since .ready file
remains even if a corresponding XLOG segment is removed. And,
.done file without XLOG segment cannot be removed by checkpoint,
and would remain forever. These are undesirable behaviors.

I think that pg_resetxlog should remove existing archive status files
of XLOG segments. Here is the patch to do so.

Thought?

Regards,

-- 
Fujii Masao
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center
Index: src/bin/pg_resetxlog/pg_resetxlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v
retrieving revision 1.72
diff -c -r1.72 pg_resetxlog.c
*** src/bin/pg_resetxlog/pg_resetxlog.c	25 Feb 2009 13:03:07 -0000	1.72
--- src/bin/pg_resetxlog/pg_resetxlog.c	30 Apr 2009 14:42:48 -0000
***************
*** 71,76 ****
--- 71,77 ----
  static void RewriteControlFile(void);
  static void FindEndOfXLOG(void);
  static void KillExistingXLOG(void);
+ static void KillExistingArchiveStatus(void);
  static void WriteEmptyXLOG(void);
  static void usage(void);
  
***************
*** 360,365 ****
--- 361,367 ----
  	 */
  	RewriteControlFile();
  	KillExistingXLOG();
+ 	KillExistingArchiveStatus();
  	WriteEmptyXLOG();
  
  	printf(_("Transaction log reset\n"));
***************
*** 812,817 ****
--- 814,875 ----
  
  
  /*
+  * Remove existing archive status files
+  */
+ static void
+ KillExistingArchiveStatus(void)
+ {
+ 	DIR		   *xldir;
+ 	struct dirent *xlde;
+ 	char		path[MAXPGPATH];
+ 
+ 	snprintf(path, MAXPGPATH, XLOGDIR "/archive_status");
+ 	xldir = opendir(path);
+ 	if (xldir == NULL)
+ 	{
+ 		fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),
+ 				progname, path, 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, XLOGDIR "/archive_status/%s", 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, path, strerror(errno));
+ 		exit(1);
+ 	}
+ 	closedir(xldir);
+ }
+ 
+ 
+ /*
   * Write an empty XLOG file, containing only the checkpoint record
   * already set up in ControlFile.
   */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to