On Wed, Jul 1, 2015 at 8:18 PM, Fujii Masao wrote:
> On Wed, Jul 1, 2015 at 8:16 PM, Fujii Masao wrote:
>> I updated the patch as follows. Patch attached.
>>
>> +#define XLogFileNameExtended(fname, tli, log, seg)
>>
>> Move this macro to xlog_internal.h because it's used both in
>> pg_standby and pg_archivecleanup. There seems no need to
>> define it independently.

OK for me.

>> -#define MAXFNAMELEN        64
>> +#define MAXFNAMELEN                64
>>
>> Revert this unnecessary change.

Yes, thanks.

>>
>> +/* Length of XLog file name */
>> +#define XLOG_DATA_FNAME_LEN     24
>>
>> Shorten the name of this macro variable, to XLOG_FNAME_LEN,
>> for more code readability.

Thanks. You have more talent for naming than I do.

>> Comments?

Just reading it again, I think that XLogFileNameById should use
MAXFNAMELEN, and that XLogFileName should call directly
XLogFileNameById as both are doing the same operation like in the
attached. It seems also safer to use MAXFNAMELEN instead of MAXPGPATH
for exclusiveCleanupFileName in pg_standby.c and pg_archivecleanup.c.
-- 
Michael
diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index 2f9f2b4..861caea 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -32,6 +32,8 @@
 
 #include "pg_getopt.h"
 
+#include "access/xlog_internal.h"
+
 const char *progname;
 
 /* Options and defaults */
@@ -57,7 +59,7 @@ char	   *restartWALFileName; /* the file from which we can restart restore */
 char	   *priorWALFileName;	/* the file we need to get from archive */
 char		WALFilePath[MAXPGPATH];		/* the file path including archive */
 char		restoreCommand[MAXPGPATH];	/* run this to restore */
-char		exclusiveCleanupFileName[MAXPGPATH];		/* the file we need to
+char		exclusiveCleanupFileName[MAXFNAMELEN];		/* the file we need to
 														 * get from archive */
 
 /*
@@ -113,11 +115,6 @@ struct stat stat_buf;
  *	folded in to later versions of this program.
  */
 
-#define XLOG_DATA_FNAME_LEN		24
-/* Reworked from access/xlog_internal.h */
-#define XLogFileName(fname, tli, log, seg)	\
-	snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)
-
 /*
  *	Initialize allows customized commands into the warm standby program.
  *
@@ -182,10 +179,7 @@ CustomizableNextWALFileReady()
 		 * If it's a backup file, return immediately. If it's a regular file
 		 * return only if it's the right size already.
 		 */
-		if (strlen(nextWALFileName) > 24 &&
-			strspn(nextWALFileName, "0123456789ABCDEF") == 24 &&
-		strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".backup"),
-			   ".backup") == 0)
+		if (IsBackupHistoryFileName(nextWALFileName))
 		{
 			nextWALFileType = XLOG_BACKUP_LABEL;
 			return true;
@@ -261,8 +255,7 @@ CustomizableCleanupPriorWALFiles(void)
 				 * are not removed in the order they were originally written,
 				 * in case this worries you.
 				 */
-				if (strlen(xlde->d_name) == XLOG_DATA_FNAME_LEN &&
-					strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
+				if (IsXLogFileName(xlde->d_name) &&
 				  strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
 				{
 #ifdef WIN32
@@ -366,7 +359,7 @@ SetWALFileNameForCleanup(void)
 		}
 	}
 
-	XLogFileName(exclusiveCleanupFileName, tli, log, seg);
+	XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
 
 	return cleanup;
 }
@@ -740,10 +733,7 @@ main(int argc, char **argv)
 	 * Check for initial history file: always the first file to be requested
 	 * It's OK if the file isn't there - all other files need to wait
 	 */
-	if (strlen(nextWALFileName) > 8 &&
-		strspn(nextWALFileName, "0123456789ABCDEF") == 8 &&
-		strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".history"),
-			   ".history") == 0)
+	if (IsTLHistoryFileName(nextWALFileName))
 	{
 		nextWALFileType = XLOG_HISTORY;
 		if (RestoreWALFileForRecovery())
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index ba6e242..579a9bb 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -21,6 +21,8 @@
 
 #include "pg_getopt.h"
 
+#include "access/xlog_internal.h"
+
 const char *progname;
 
 /* Options and defaults */
@@ -31,7 +33,7 @@ char	   *additional_ext = NULL;		/* Extension to remove from filenames */
 char	   *archiveLocation;	/* where to find the archive? */
 char	   *restartWALFileName; /* the file from which we can restart restore */
 char		WALFilePath[MAXPGPATH];		/* the file path including archive */
-char		exclusiveCleanupFileName[MAXPGPATH];		/* the oldest file we
+char		exclusiveCleanupFileName[MAXFNAMELEN];		/* the oldest file we
 														 * want to remain in
 														 * archive */
 
@@ -51,12 +53,6 @@ char		exclusiveCleanupFileName[MAXPGPATH];		/* the oldest file we
  *	folded in to later versions of this program.
  */
 
-#define XLOG_DATA_FNAME_LEN		24
-/* Reworked from access/xlog_internal.h */
-#define XLogFileName(fname, tli, log, seg)	\
-	snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)
-#define XLOG_BACKUP_FNAME_LEN	40
-
 /*
  *	Initialize allows customized commands into the archive cleanup program.
  *
@@ -110,7 +106,7 @@ CleanupPriorWALFiles(void)
 		{
 			/*
 			 * Truncation is essentially harmless, because we skip names of
-			 * length other than XLOG_DATA_FNAME_LEN.  (In principle, one
+			 * length other than XLOG_FNAME_LEN.  (In principle, one
 			 * could use a 1000-character additional_ext and get trouble.)
 			 */
 			strlcpy(walfile, xlde->d_name, MAXPGPATH);
@@ -129,8 +125,7 @@ CleanupPriorWALFiles(void)
 			 * file. Note that this means files are not removed in the order
 			 * they were originally written, in case this worries you.
 			 */
-			if (strlen(walfile) == XLOG_DATA_FNAME_LEN &&
-				strspn(walfile, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
+			if (IsXLogFileName(walfile) &&
 				strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
 			{
 				/*
@@ -202,13 +197,12 @@ SetWALFileNameForCleanup(void)
 	 * 000000010000000000000010.00000020.backup is after
 	 * 000000010000000000000010.
 	 */
-	if (strlen(restartWALFileName) == XLOG_DATA_FNAME_LEN &&
-		strspn(restartWALFileName, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN)
+	if (IsXLogFileName(restartWALFileName))
 	{
 		strcpy(exclusiveCleanupFileName, restartWALFileName);
 		fnameOK = true;
 	}
-	else if (strlen(restartWALFileName) == XLOG_BACKUP_FNAME_LEN)
+	else if (IsBackupHistoryFileName(restartWALFileName))
 	{
 		int			args;
 		uint32		tli = 1,
@@ -225,7 +219,7 @@ SetWALFileNameForCleanup(void)
 			 * Use just the prefix of the filename, ignore everything after
 			 * first period
 			 */
-			XLogFileName(exclusiveCleanupFileName, tli, log, seg);
+			XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
 		}
 	}
 
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 6ffe795..e19a72b 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -261,7 +261,7 @@ main(int argc, char *argv[])
 				break;
 
 			case 'l':
-				if (strspn(optarg, "01234567890ABCDEFabcdef") != 24)
+				if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN)
 				{
 					fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-l");
 					fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
@@ -976,8 +976,7 @@ KillExistingXLOG(void)
 
 	while (errno = 0, (xlde = readdir(xldir)) != NULL)
 	{
-		if (strlen(xlde->d_name) == 24 &&
-			strspn(xlde->d_name, "0123456789ABCDEF") == 24)
+		if (IsXLogFileName(xlde->d_name))
 		{
 			snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name);
 			if (unlink(path) < 0)
@@ -1027,9 +1026,9 @@ KillExistingArchiveStatus(void)
 
 	while (errno = 0, (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))
+		if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN &&
+			(strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 ||
+			 strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0))
 		{
 			snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
 			if (unlink(path) < 0)
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index fbf9324..c09650e 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -137,13 +137,20 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
  */
 #define MAXFNAMELEN		64
 
+/* Length of XLog file name */
+#define XLOG_FNAME_LEN     24
+
+#define XLogFileNameById(fname, tli, log, seg)	\
+	snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg)
+
 #define XLogFileName(fname, tli, logSegNo)	\
-	snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli,		\
-			 (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
-			 (uint32) ((logSegNo) % XLogSegmentsPerXLogId))
+	XLogFileNameById(fname, tli, \
+					 (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
+					 (uint32) ((logSegNo) % XLogSegmentsPerXLogId))
 
 #define IsXLogFileName(fname) \
-	(strlen(fname) == 24 && strspn(fname, "0123456789ABCDEF") == 24)
+	(strlen(fname) == XLOG_FNAME_LEN && \
+	 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN)
 
 /*
  * XLOG segment with .partial suffix.  Used by pg_receivexlog and at end of
@@ -151,9 +158,9 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
  * be complete yet.
  */
 #define IsPartialXLogFileName(fname)	\
-	(strlen(fname) == 24 + strlen(".partial") &&	\
-	 strspn(fname, "0123456789ABCDEF") == 24 &&		\
-	 strcmp((fname) + 24, ".partial") == 0)
+	(strlen(fname) == XLOG_FNAME_LEN + strlen(".partial") &&	\
+	 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN &&		\
+	 strcmp((fname) + XLOG_FNAME_LEN, ".partial") == 0)
 
 #define XLogFromFileName(fname, tli, logSegNo)	\
 	do {												\
@@ -188,8 +195,8 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
 			 (uint32) ((logSegNo) % XLogSegmentsPerXLogId), offset)
 
 #define IsBackupHistoryFileName(fname) \
-	(strlen(fname) > 24 && \
-	 strspn(fname, "0123456789ABCDEF") == 24 && \
+	(strlen(fname) > XLOG_FNAME_LEN && \
+	 strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \
 	 strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0)
 
 #define BackupHistoryFilePath(path, tli, logSegNo, offset)	\
-- 
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