]> granicus.if.org Git - postgresql/commitdiff
Make use of xlog_internal.h's macros in WAL-related utilities.
authorFujii Masao <fujii@postgresql.org>
Thu, 2 Jul 2015 01:35:38 +0000 (10:35 +0900)
committerFujii Masao <fujii@postgresql.org>
Thu, 2 Jul 2015 01:36:18 +0000 (10:36 +0900)
Commit 179cdd09 added macros to check if a filename is a WAL segment
or other such file. However there were still some instances of the
strlen + strspn combination to check for that in WAL-related utilities
like pg_archivecleanup. Those checks can be replaced with the macros.

This patch makes use of the macros in those utilities and
which would make the code a bit easier to read.

Back-patch to 9.5.

Michael Paquier

contrib/pg_standby/pg_standby.c
src/bin/pg_archivecleanup/pg_archivecleanup.c
src/bin/pg_resetxlog/pg_resetxlog.c
src/include/access/xlog_internal.h

index 2f9f2b4d2e920f0beded40abddd262fd9c803f68..861caea348106cfb1f4fb67d2325d27cd8d201fe 100644 (file)
@@ -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())
index ba6e242f15569f4644d1c5a6398ecd25d37fc59b..579a9bb84307e624900a2759a9dc147a058efac1 100644 (file)
@@ -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);
                }
        }
 
index 6ffe795348d1e48cbcb527d700b6fcc143c0d003..e19a72b4c1640114f07e8b8dcfd398dd779f756a 100644 (file)
@@ -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)
index fbf9324ba4306430cf5ccfa9819dd5f9107bf635..5ebaa5f69c6aa42fdd78e923f21be8eaef69d5d1 100644 (file)
@@ -137,13 +137,20 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
  */
 #define MAXFNAMELEN            64
 
+/* Length of XLog file name */
+#define XLOG_FNAME_LEN     24
+
 #define XLogFileName(fname, tli, logSegNo)     \
        snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli,               \
                         (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
                         (uint32) ((logSegNo) % XLogSegmentsPerXLogId))
 
+#define XLogFileNameById(fname, tli, log, seg) \
+       snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg)
+
 #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)     \