From caf1889d4fc955f454b98d0b64d17c89e6732490 Mon Sep 17 00:00:00 2001
From: Atsushi Torikoshi <torikoshia@oss.nttdata.com>
Date: Fri, 23 Jun 2023 15:11:25 +0900
Subject: [PATCH v12 2/3] Preliminary refactoring for a subsequent patch

This is a preparatory patch that doesn't introduce any functional
change. Instead, this carries out preliminary refactoring with the
goal of reducing the overall nesting level. This helps to prevent the
forthcoming patch from further deepening the nesting level.

Reviewed-by: Michael Paquier, Kyotaro Horiguchi, Fujii Masao
---
 src/bin/pg_archivecleanup/pg_archivecleanup.c | 135 +++++++++---------
 1 file changed, 67 insertions(+), 68 deletions(-)

diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index fc0dca9856..8d185665ab 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -93,76 +93,75 @@ CleanupPriorWALFiles(void)
 	struct dirent *xlde;
 	char		walfile[MAXPGPATH];
 
-	if ((xldir = opendir(archiveLocation)) != NULL)
-	{
-		while (errno = 0, (xlde = readdir(xldir)) != NULL)
-		{
-			/*
-			 * Truncation is essentially harmless, because we skip names of
-			 * 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);
-			TrimExtension(walfile, additional_ext);
-
-			/*
-			 * We ignore the timeline part of the XLOG segment identifiers in
-			 * deciding whether a segment is still needed.  This ensures that
-			 * we won't prematurely remove a segment from a parent timeline.
-			 * We could probably be a little more proactive about removing
-			 * segments of non-parent timelines, but that would be a whole lot
-			 * more complicated.
-			 *
-			 * We use the alphanumeric sorting property of the filenames to
-			 * decide which ones are earlier than the exclusiveCleanupFileName
-			 * file. Note that this means files are not removed in the order
-			 * they were originally written, in case this worries you.
-			 */
-			if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
-				strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
-			{
-				char		WALFilePath[MAXPGPATH * 2]; /* the file path
-														 * including archive */
-
-				/*
-				 * Use the original file name again now, including any
-				 * extension that might have been chopped off before testing
-				 * the sequence.
-				 */
-				snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
-						 archiveLocation, xlde->d_name);
-
-				if (dryrun)
-				{
-					/*
-					 * Prints the name of the file to be removed and skips the
-					 * actual removal.  The regular printout is so that the
-					 * user can pipe the output into some other program.
-					 */
-					printf("%s\n", WALFilePath);
-					pg_log_debug("file \"%s\" would be removed", WALFilePath);
-					continue;
-				}
-
-				pg_log_debug("removing file \"%s\"", WALFilePath);
-
-				rc = unlink(WALFilePath);
-				if (rc != 0)
-					pg_fatal("could not remove file \"%s\": %m",
-							 WALFilePath);
-			}
-		}
-
-		if (errno)
-			pg_fatal("could not read archive location \"%s\": %m",
-					 archiveLocation);
-		if (closedir(xldir))
-			pg_fatal("could not close archive location \"%s\": %m",
-					 archiveLocation);
-	}
-	else
+	if ((xldir = opendir(archiveLocation)) == NULL)
 		pg_fatal("could not open archive location \"%s\": %m",
 				 archiveLocation);
+
+	while (errno = 0, (xlde = readdir(xldir)) != NULL)
+	{
+		char		WALFilePath[MAXPGPATH * 2]; /* the file path
+												 * including archive */
+		/*
+		 * Truncation is essentially harmless, because we skip names of
+		 * 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);
+		TrimExtension(walfile, additional_ext);
+
+		if (!IsXLogFileName(walfile) && !IsPartialXLogFileName(walfile))
+			continue;
+
+		/*
+		 * We ignore the timeline part of the XLOG segment identifiers in
+		 * deciding whether a segment is still needed.  This ensures that
+		 * we won't prematurely remove a segment from a parent timeline.
+		 * We could probably be a little more proactive about removing
+		 * segments of non-parent timelines, but that would be a whole lot
+		 * more complicated.
+		 *
+		 * We use the alphanumeric sorting property of the filenames to
+		 * decide which ones are earlier than the exclusiveCleanupFileName
+		 * file. Note that this means files are not removed in the order
+		 * they were originally written, in case this worries you.
+		 */
+		if (strcmp(walfile + 8, exclusiveCleanupFileName + 8) >= 0)
+			continue;
+
+		/*
+		 * Use the original file name again now, including any
+		 * extension that might have been chopped off before testing
+		 * the sequence.
+		 */
+		snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
+				 archiveLocation, xlde->d_name);
+
+		if (dryrun)
+		{
+			/*
+			 * Prints the name of the file to be removed and skips the
+			 * actual removal.  The regular printout is so that the
+			 * user can pipe the output into some other program.
+			 */
+			printf("%s\n", WALFilePath);
+			pg_log_debug("file \"%s\" would be removed", WALFilePath);
+			continue;
+		}
+
+		pg_log_debug("removing file \"%s\"", WALFilePath);
+
+		rc = unlink(WALFilePath);
+		if (rc != 0)
+			pg_fatal("could not remove file \"%s\": %m",
+					 WALFilePath);
+	}
+
+	if (errno)
+		pg_fatal("could not read archive location \"%s\": %m",
+				 archiveLocation);
+	if (closedir(xldir))
+		pg_fatal("could not close archive location \"%s\": %m",
+				 archiveLocation);
 }
 
 /*
-- 
2.39.2

