From e61734f9d2efd326bc259e3f869207404fe80143 Mon Sep 17 00:00:00 2001
From: Atsushi Torikoshi <torikoshia@oss.nttdata.com>
Date: Mon, 19 Jun 2023 20:47:53 +0900
Subject: [PATCH v9 2/3] Refactored to reduce the nesting level

---
 src/bin/pg_archivecleanup/pg_archivecleanup.c | 114 +++++++++---------
 1 file changed, 56 insertions(+), 58 deletions(-)

diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index fc0dca9856..950e27e63b 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -93,75 +93,73 @@ CleanupPriorWALFiles(void)
 	struct dirent *xlde;
 	char		walfile[MAXPGPATH];
 
-	if ((xldir = opendir(archiveLocation)) != NULL)
+	if ((xldir = opendir(archiveLocation)) == NULL)
+		pg_fatal("could not open archive location \"%s\": %m",
+				 archiveLocation);
+
+	while (errno = 0, (xlde = readdir(xldir)) != 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)
 		{
-			/*
-			 * 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);
+			char		WALFilePath[MAXPGPATH * 2]; /* the file path
+													 * including archive */
 
 			/*
-			 * 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.
+			 * Use the original file name again now, including any
+			 * extension that might have been chopped off before testing
+			 * the sequence.
 			 */
-			if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
-				strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
-			{
-				char		WALFilePath[MAXPGPATH * 2]; /* the file path
-														 * including archive */
+			snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
+					 archiveLocation, xlde->d_name);
 
+			if (dryrun)
+			{
 				/*
-				 * Use the original file name again now, including any
-				 * extension that might have been chopped off before testing
-				 * the sequence.
+				 * 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.
 				 */
-				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);
+				printf("%s\n", WALFilePath);
+				pg_log_debug("file \"%s\" would be removed", WALFilePath);
+				continue;
 			}
-		}
 
-		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);
+			pg_log_debug("removing file \"%s\"", WALFilePath);
+
+			rc = unlink(WALFilePath);
+			if (rc != 0)
+				pg_fatal("could not remove file \"%s\": %m",
+						 WALFilePath);
+		}
 	}
-	else
-		pg_fatal("could not open archive location \"%s\": %m",
+
+	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

