mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-05 22:59:20 +02:00
Make use of xlog_internal.h's macros in WAL-related utilities.
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
This commit is contained in:
parent
cd7030ff08
commit
163e29dc38
@ -32,6 +32,8 @@
|
|||||||
|
|
||||||
#include "pg_getopt.h"
|
#include "pg_getopt.h"
|
||||||
|
|
||||||
|
#include "access/xlog_internal.h"
|
||||||
|
|
||||||
const char *progname;
|
const char *progname;
|
||||||
|
|
||||||
/* Options and defaults */
|
/* 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 *priorWALFileName; /* the file we need to get from archive */
|
||||||
char WALFilePath[MAXPGPATH]; /* the file path including archive */
|
char WALFilePath[MAXPGPATH]; /* the file path including archive */
|
||||||
char restoreCommand[MAXPGPATH]; /* run this to restore */
|
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 */
|
* get from archive */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -113,11 +115,6 @@ struct stat stat_buf;
|
|||||||
* folded in to later versions of this program.
|
* 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.
|
* 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
|
* If it's a backup file, return immediately. If it's a regular file
|
||||||
* return only if it's the right size already.
|
* return only if it's the right size already.
|
||||||
*/
|
*/
|
||||||
if (strlen(nextWALFileName) > 24 &&
|
if (IsBackupHistoryFileName(nextWALFileName))
|
||||||
strspn(nextWALFileName, "0123456789ABCDEF") == 24 &&
|
|
||||||
strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".backup"),
|
|
||||||
".backup") == 0)
|
|
||||||
{
|
{
|
||||||
nextWALFileType = XLOG_BACKUP_LABEL;
|
nextWALFileType = XLOG_BACKUP_LABEL;
|
||||||
return true;
|
return true;
|
||||||
@ -261,8 +255,7 @@ CustomizableCleanupPriorWALFiles(void)
|
|||||||
* are not removed in the order they were originally written,
|
* are not removed in the order they were originally written,
|
||||||
* in case this worries you.
|
* in case this worries you.
|
||||||
*/
|
*/
|
||||||
if (strlen(xlde->d_name) == XLOG_DATA_FNAME_LEN &&
|
if (IsXLogFileName(xlde->d_name) &&
|
||||||
strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
|
|
||||||
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
|
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -366,7 +359,7 @@ SetWALFileNameForCleanup(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XLogFileName(exclusiveCleanupFileName, tli, log, seg);
|
XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
|
||||||
|
|
||||||
return cleanup;
|
return cleanup;
|
||||||
}
|
}
|
||||||
@ -740,10 +733,7 @@ main(int argc, char **argv)
|
|||||||
* Check for initial history file: always the first file to be requested
|
* 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
|
* It's OK if the file isn't there - all other files need to wait
|
||||||
*/
|
*/
|
||||||
if (strlen(nextWALFileName) > 8 &&
|
if (IsTLHistoryFileName(nextWALFileName))
|
||||||
strspn(nextWALFileName, "0123456789ABCDEF") == 8 &&
|
|
||||||
strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".history"),
|
|
||||||
".history") == 0)
|
|
||||||
{
|
{
|
||||||
nextWALFileType = XLOG_HISTORY;
|
nextWALFileType = XLOG_HISTORY;
|
||||||
if (RestoreWALFileForRecovery())
|
if (RestoreWALFileForRecovery())
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include "pg_getopt.h"
|
#include "pg_getopt.h"
|
||||||
|
|
||||||
|
#include "access/xlog_internal.h"
|
||||||
|
|
||||||
const char *progname;
|
const char *progname;
|
||||||
|
|
||||||
/* Options and defaults */
|
/* Options and defaults */
|
||||||
@ -31,7 +33,7 @@ char *additional_ext = NULL; /* Extension to remove from filenames */
|
|||||||
char *archiveLocation; /* where to find the archive? */
|
char *archiveLocation; /* where to find the archive? */
|
||||||
char *restartWALFileName; /* the file from which we can restart restore */
|
char *restartWALFileName; /* the file from which we can restart restore */
|
||||||
char WALFilePath[MAXPGPATH]; /* the file path including archive */
|
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
|
* want to remain in
|
||||||
* archive */
|
* archive */
|
||||||
|
|
||||||
@ -51,12 +53,6 @@ char exclusiveCleanupFileName[MAXPGPATH]; /* the oldest file we
|
|||||||
* folded in to later versions of this program.
|
* 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.
|
* Initialize allows customized commands into the archive cleanup program.
|
||||||
*
|
*
|
||||||
@ -110,7 +106,7 @@ CleanupPriorWALFiles(void)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Truncation is essentially harmless, because we skip names of
|
* 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.)
|
* could use a 1000-character additional_ext and get trouble.)
|
||||||
*/
|
*/
|
||||||
strlcpy(walfile, xlde->d_name, MAXPGPATH);
|
strlcpy(walfile, xlde->d_name, MAXPGPATH);
|
||||||
@ -129,8 +125,7 @@ CleanupPriorWALFiles(void)
|
|||||||
* file. Note that this means files are not removed in the order
|
* file. Note that this means files are not removed in the order
|
||||||
* they were originally written, in case this worries you.
|
* they were originally written, in case this worries you.
|
||||||
*/
|
*/
|
||||||
if (strlen(walfile) == XLOG_DATA_FNAME_LEN &&
|
if (IsXLogFileName(walfile) &&
|
||||||
strspn(walfile, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
|
|
||||||
strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
|
strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -202,13 +197,12 @@ SetWALFileNameForCleanup(void)
|
|||||||
* 000000010000000000000010.00000020.backup is after
|
* 000000010000000000000010.00000020.backup is after
|
||||||
* 000000010000000000000010.
|
* 000000010000000000000010.
|
||||||
*/
|
*/
|
||||||
if (strlen(restartWALFileName) == XLOG_DATA_FNAME_LEN &&
|
if (IsXLogFileName(restartWALFileName))
|
||||||
strspn(restartWALFileName, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN)
|
|
||||||
{
|
{
|
||||||
strcpy(exclusiveCleanupFileName, restartWALFileName);
|
strcpy(exclusiveCleanupFileName, restartWALFileName);
|
||||||
fnameOK = true;
|
fnameOK = true;
|
||||||
}
|
}
|
||||||
else if (strlen(restartWALFileName) == XLOG_BACKUP_FNAME_LEN)
|
else if (IsBackupHistoryFileName(restartWALFileName))
|
||||||
{
|
{
|
||||||
int args;
|
int args;
|
||||||
uint32 tli = 1,
|
uint32 tli = 1,
|
||||||
@ -225,7 +219,7 @@ SetWALFileNameForCleanup(void)
|
|||||||
* Use just the prefix of the filename, ignore everything after
|
* Use just the prefix of the filename, ignore everything after
|
||||||
* first period
|
* first period
|
||||||
*/
|
*/
|
||||||
XLogFileName(exclusiveCleanupFileName, tli, log, seg);
|
XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'l':
|
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, _("%s: invalid argument for option %s\n"), progname, "-l");
|
||||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
|
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
|
||||||
@ -976,8 +976,7 @@ KillExistingXLOG(void)
|
|||||||
|
|
||||||
while (errno = 0, (xlde = readdir(xldir)) != NULL)
|
while (errno = 0, (xlde = readdir(xldir)) != NULL)
|
||||||
{
|
{
|
||||||
if (strlen(xlde->d_name) == 24 &&
|
if (IsXLogFileName(xlde->d_name))
|
||||||
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)
|
if (unlink(path) < 0)
|
||||||
@ -1027,9 +1026,9 @@ KillExistingArchiveStatus(void)
|
|||||||
|
|
||||||
while (errno = 0, (xlde = readdir(xldir)) != NULL)
|
while (errno = 0, (xlde = readdir(xldir)) != NULL)
|
||||||
{
|
{
|
||||||
if (strspn(xlde->d_name, "0123456789ABCDEF") == 24 &&
|
if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN &&
|
||||||
(strcmp(xlde->d_name + 24, ".ready") == 0 ||
|
(strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 ||
|
||||||
strcmp(xlde->d_name + 24, ".done") == 0))
|
strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0))
|
||||||
{
|
{
|
||||||
snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
|
snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
|
||||||
if (unlink(path) < 0)
|
if (unlink(path) < 0)
|
||||||
|
@ -137,13 +137,20 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
|
|||||||
*/
|
*/
|
||||||
#define MAXFNAMELEN 64
|
#define MAXFNAMELEN 64
|
||||||
|
|
||||||
|
/* Length of XLog file name */
|
||||||
|
#define XLOG_FNAME_LEN 24
|
||||||
|
|
||||||
#define XLogFileName(fname, tli, logSegNo) \
|
#define XLogFileName(fname, tli, logSegNo) \
|
||||||
snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, \
|
snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, \
|
||||||
(uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
|
(uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
|
||||||
(uint32) ((logSegNo) % XLogSegmentsPerXLogId))
|
(uint32) ((logSegNo) % XLogSegmentsPerXLogId))
|
||||||
|
|
||||||
|
#define XLogFileNameById(fname, tli, log, seg) \
|
||||||
|
snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg)
|
||||||
|
|
||||||
#define IsXLogFileName(fname) \
|
#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
|
* XLOG segment with .partial suffix. Used by pg_receivexlog and at end of
|
||||||
@ -151,9 +158,9 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
|
|||||||
* be complete yet.
|
* be complete yet.
|
||||||
*/
|
*/
|
||||||
#define IsPartialXLogFileName(fname) \
|
#define IsPartialXLogFileName(fname) \
|
||||||
(strlen(fname) == 24 + strlen(".partial") && \
|
(strlen(fname) == XLOG_FNAME_LEN + strlen(".partial") && \
|
||||||
strspn(fname, "0123456789ABCDEF") == 24 && \
|
strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \
|
||||||
strcmp((fname) + 24, ".partial") == 0)
|
strcmp((fname) + XLOG_FNAME_LEN, ".partial") == 0)
|
||||||
|
|
||||||
#define XLogFromFileName(fname, tli, logSegNo) \
|
#define XLogFromFileName(fname, tli, logSegNo) \
|
||||||
do { \
|
do { \
|
||||||
@ -188,8 +195,8 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
|
|||||||
(uint32) ((logSegNo) % XLogSegmentsPerXLogId), offset)
|
(uint32) ((logSegNo) % XLogSegmentsPerXLogId), offset)
|
||||||
|
|
||||||
#define IsBackupHistoryFileName(fname) \
|
#define IsBackupHistoryFileName(fname) \
|
||||||
(strlen(fname) > 24 && \
|
(strlen(fname) > XLOG_FNAME_LEN && \
|
||||||
strspn(fname, "0123456789ABCDEF") == 24 && \
|
strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \
|
||||||
strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0)
|
strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0)
|
||||||
|
|
||||||
#define BackupHistoryFilePath(path, tli, logSegNo, offset) \
|
#define BackupHistoryFilePath(path, tli, logSegNo, offset) \
|
||||||
|
Loading…
Reference in New Issue
Block a user