Hi all,

Except if I am missing something, is there any reason why the sequence used
in XLogArchiveCheckDone and XLogArchiveIsBusy to check if a XLOG segment
has been already archived is duplicated? I guess that doing a little bit of
refactoring here would make sense for simplicity, patch is attached.
Regards,
-- 
Michael
From 9b96e5825f6f6d2cbbc5ddf9c45c6609e6c01fb7 Mon Sep 17 00:00:00 2001
From: Michael Paquier <mpaqu...@vmware.com>
Date: Mon, 20 Oct 2014 16:33:26 +0900
Subject: [PATCH] Refactor archive status analysis into a single function

The same code block was used for XLogArchiveIsBusy and XLogArchiveCheckDone
to check the archive status of a given segment...
---
 src/backend/access/transam/xlogarchive.c | 50 +++++++++++++++++---------------
 src/include/access/xlog_internal.h       |  1 +
 2 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/src/backend/access/transam/xlogarchive.c b/src/backend/access/transam/xlogarchive.c
index 047efa2..047e8f8 100644
--- a/src/backend/access/transam/xlogarchive.c
+++ b/src/backend/access/transam/xlogarchive.c
@@ -607,12 +607,7 @@ XLogArchiveForceDone(const char *xlog)
 }
 
 /*
- * XLogArchiveCheckDone
- *
- * This is called when we are ready to delete or recycle an old XLOG segment
- * file or backup history file.  If it is okay to delete it then return true.
- * If it is not time to delete it, make sure a .ready file exists, and return
- * false.
+ * XLogArchiveIsDone
  *
  * If <XLOG>.done exists, then return true; else if <XLOG>.ready exists,
  * then return false; else create <XLOG>.ready and return false.
@@ -621,15 +616,11 @@ XLogArchiveForceDone(const char *xlog)
  * create <XLOG>.ready fails, we'll retry during subsequent checkpoints.
  */
 bool
-XLogArchiveCheckDone(const char *xlog)
+XLogArchiveIsDone(const char *xlog)
 {
 	char		archiveStatusPath[MAXPGPATH];
 	struct stat stat_buf;
 
-	/* Always deletable if archiving is off */
-	if (!XLogArchivingActive())
-		return true;
-
 	/* First check for .done --- this means archiver is done with it */
 	StatusFilePath(archiveStatusPath, xlog, ".done");
 	if (stat(archiveStatusPath, &stat_buf) == 0)
@@ -645,6 +636,28 @@ XLogArchiveCheckDone(const char *xlog)
 	if (stat(archiveStatusPath, &stat_buf) == 0)
 		return true;
 
+	return false;
+}
+
+/*
+ * XLogArchiveCheckDone
+ *
+ * This is called when we are ready to delete or recycle an old XLOG segment
+ * file or backup history file.  If it is okay to delete it then return true.
+ * If it is not time to delete it, make sure a .ready file exists, and return
+ * false.
+ */
+bool
+XLogArchiveCheckDone(const char *xlog)
+{
+	/* Always deletable if archiving is off */
+	if (!XLogArchivingActive())
+		return true;
+
+	/* Check if segment is marked as .done */
+	if (XLogArchiveIsDone(xlog))
+		return true;
+
 	/* Retry creation of the .ready file */
 	XLogArchiveNotify(xlog);
 	return false;
@@ -666,19 +679,8 @@ XLogArchiveIsBusy(const char *xlog)
 	char		archiveStatusPath[MAXPGPATH];
 	struct stat stat_buf;
 
-	/* First check for .done --- this means archiver is done with it */
-	StatusFilePath(archiveStatusPath, xlog, ".done");
-	if (stat(archiveStatusPath, &stat_buf) == 0)
-		return false;
-
-	/* check for .ready --- this means archiver is still busy with it */
-	StatusFilePath(archiveStatusPath, xlog, ".ready");
-	if (stat(archiveStatusPath, &stat_buf) == 0)
-		return true;
-
-	/* Race condition --- maybe archiver just finished, so recheck */
-	StatusFilePath(archiveStatusPath, xlog, ".done");
-	if (stat(archiveStatusPath, &stat_buf) == 0)
+	/* Check that segment is not yet marked as .done */
+	if (XLogArchiveIsDone(xlog))
 		return false;
 
 	/*
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index 27b9899..6d1a66c 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -287,6 +287,7 @@ extern void KeepFileRestoredFromArchive(char *path, char *xlogfname);
 extern void XLogArchiveNotify(const char *xlog);
 extern void XLogArchiveNotifySeg(XLogSegNo segno);
 extern void XLogArchiveForceDone(const char *xlog);
+extern bool XLogArchiveIsDone(const char *xlog);
 extern bool XLogArchiveCheckDone(const char *xlog);
 extern bool XLogArchiveIsBusy(const char *xlog);
 extern void XLogArchiveCleanup(const char *xlog);
-- 
2.1.2

-- 
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