From 99370364437b98912e47120ff493c50e7e6cbc19 Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Tue, 26 Feb 2019 12:22:26 +1100
Subject: [PATCH] Move the current_logfiles file into log_directory

---
 src/backend/postmaster/postmaster.c  |  8 ++---
 src/backend/postmaster/syslogger.c   | 46 +++++++++++++++++++++++-----
 src/backend/replication/basebackup.c |  3 --
 src/backend/utils/adt/misc.c         | 14 ++++++---
 src/include/postmaster/syslogger.h   |  1 +
 5 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index ccea231e98..22d1980075 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -1021,12 +1021,8 @@ PostmasterMain(int argc, char *argv[])
 	/* Do the same for logrotate signal file */
 	RemoveLogrotateSignalFiles();
 
-	/* Remove any outdated file holding the current log filenames. */
-	if (unlink(LOG_METAINFO_DATAFILE) < 0 && errno != ENOENT)
-		ereport(LOG,
-				(errcode_for_file_access(),
-				 errmsg("could not remove file \"%s\": %m",
-						LOG_METAINFO_DATAFILE)));
+	/* Remove the outdated current_logfiles */
+	RemoveCurrentLogFile();
 
 	/*
 	 * If enabled, start up syslogger collection subprocess
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index d1ea46deb8..a82a55027e 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -1453,24 +1453,34 @@ static void
 update_metainfo_datafile(void)
 {
 	FILE	   *fh;
+	char		filename[MAXPGPATH];
+	char		tmp_filename[MAXPGPATH];
+	int			len;
+
+	snprintf(filename, MAXPGPATH, "%s/", Log_directory);
+	snprintf(tmp_filename, MAXPGPATH, "%s/", Log_directory);
+
+	len = strlen(filename);
+	strlcpy(filename + len, LOG_METAINFO_DATAFILE, MAXPGPATH - len);
+	strlcpy(tmp_filename + len, LOG_METAINFO_DATAFILE_TMP, MAXPGPATH - len);
 
 	if (!(Log_destination & LOG_DESTINATION_STDERR) &&
 		!(Log_destination & LOG_DESTINATION_CSVLOG))
 	{
-		if (unlink(LOG_METAINFO_DATAFILE) < 0 && errno != ENOENT)
+		if (unlink(filename) < 0 && errno != ENOENT)
 			ereport(LOG,
 					(errcode_for_file_access(),
 					 errmsg("could not remove file \"%s\": %m",
-							LOG_METAINFO_DATAFILE)));
+							 filename)));
 		return;
 	}
 
-	if ((fh = logfile_open(LOG_METAINFO_DATAFILE_TMP, "w", true)) == NULL)
+	if ((fh = logfile_open(tmp_filename, "w", true)) == NULL)
 	{
 		ereport(LOG,
 				(errcode_for_file_access(),
 				 errmsg("could not open file \"%s\": %m",
-						LOG_METAINFO_DATAFILE_TMP)));
+						 tmp_filename)));
 		return;
 	}
 
@@ -1481,7 +1491,7 @@ update_metainfo_datafile(void)
 			ereport(LOG,
 					(errcode_for_file_access(),
 					 errmsg("could not write file \"%s\": %m",
-							LOG_METAINFO_DATAFILE_TMP)));
+							 tmp_filename)));
 			fclose(fh);
 			return;
 		}
@@ -1494,18 +1504,38 @@ update_metainfo_datafile(void)
 			ereport(LOG,
 					(errcode_for_file_access(),
 					 errmsg("could not write file \"%s\": %m",
-							LOG_METAINFO_DATAFILE_TMP)));
+							 tmp_filename)));
 			fclose(fh);
 			return;
 		}
 	}
 	fclose(fh);
 
-	if (rename(LOG_METAINFO_DATAFILE_TMP, LOG_METAINFO_DATAFILE) != 0)
+	if (rename(tmp_filename, filename) != 0)
 		ereport(LOG,
 				(errcode_for_file_access(),
 				 errmsg("could not rename file \"%s\" to \"%s\": %m",
-						LOG_METAINFO_DATAFILE_TMP, LOG_METAINFO_DATAFILE)));
+						 tmp_filename, filename)));
+}
+
+/*
+ * Remove any out dated file holding the current log filenames.
+ */
+void
+RemoveCurrentLogFile(void)
+{
+	char		filename[MAXPGPATH];
+	int			len;
+
+	snprintf(filename, MAXPGPATH, "%s/", Log_directory);
+	len = strlen(filename);
+	strlcpy(filename + len, LOG_METAINFO_DATAFILE, MAXPGPATH - len);
+
+	if (unlink(filename) < 0 && errno != ENOENT)
+		ereport(LOG,
+				(errcode_for_file_access(),
+				errmsg("could not remove file \"%s\": %m",
+						filename)));
 }
 
 /* --------------------------------
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index def6c03dd0..0f35604435 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -165,9 +165,6 @@ static const char *excludeFiles[] =
 	/* Skip auto conf temporary file. */
 	PG_AUTOCONF_FILENAME ".tmp",
 
-	/* Skip current log file temporary file */
-	LOG_METAINFO_DATAFILE_TMP,
-
 	/* Skip relation cache because it is rebuilt on startup */
 	RELCACHE_INIT_FILENAME,
 
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
index d330a88e3c..e86a84d727 100644
--- a/src/backend/utils/adt/misc.c
+++ b/src/backend/utils/adt/misc.c
@@ -729,6 +729,8 @@ pg_current_logfile(PG_FUNCTION_ARGS)
 	char	   *log_filepath;
 	char	   *log_format = lbuffer;
 	char	   *nlpos;
+	char		filename[MAXPGPATH];
+	int			len;
 
 	/* The log format parameter is optional */
 	if (PG_NARGS() == 0 || PG_ARGISNULL(0))
@@ -744,14 +746,18 @@ pg_current_logfile(PG_FUNCTION_ARGS)
 					 errhint("The supported log formats are \"stderr\" and \"csvlog\".")));
 	}
 
-	fd = AllocateFile(LOG_METAINFO_DATAFILE, "r");
+	snprintf(filename, MAXPGPATH, "%s/", Log_directory);
+	len = strlen(filename);
+	strlcpy(filename + len, LOG_METAINFO_DATAFILE, MAXPGPATH - len);
+
+	fd = AllocateFile(filename, "r");
 	if (fd == NULL)
 	{
 		if (errno != ENOENT)
 			ereport(ERROR,
 					(errcode_for_file_access(),
 					 errmsg("could not read file \"%s\": %m",
-							LOG_METAINFO_DATAFILE)));
+							 filename)));
 		PG_RETURN_NULL();
 	}
 
@@ -770,7 +776,7 @@ pg_current_logfile(PG_FUNCTION_ARGS)
 		{
 			/* Uh oh.  No space found, so file content is corrupted. */
 			elog(ERROR,
-				 "missing space character in \"%s\"", LOG_METAINFO_DATAFILE);
+				 "missing space character in \"%s\"", filename);
 			break;
 		}
 
@@ -781,7 +787,7 @@ pg_current_logfile(PG_FUNCTION_ARGS)
 		{
 			/* Uh oh.  No newline found, so file content is corrupted. */
 			elog(ERROR,
-				 "missing newline character in \"%s\"", LOG_METAINFO_DATAFILE);
+				 "missing newline character in \"%s\"", filename);
 			break;
 		}
 		*nlpos = '\0';
diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h
index 3a61104573..f12e592e83 100644
--- a/src/include/postmaster/syslogger.h
+++ b/src/include/postmaster/syslogger.h
@@ -89,6 +89,7 @@ extern void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn();
 
 extern bool CheckLogrotateSignal(void);
 extern void RemoveLogrotateSignalFiles(void);
+extern void RemoveCurrentLogFile(void);
 
 /*
  * Name of files saving meta-data information about the log
-- 
2.20.1.windows.1

