Adjust pg_upgrade to output a separate log file for pg_ctl output on
authorBruce Momjian <bruce@momjian.us>
Thu, 24 May 2012 00:19:21 +0000 (20:19 -0400)
committerBruce Momjian <bruce@momjian.us>
Thu, 24 May 2012 00:19:34 +0000 (20:19 -0400)
Windows, to avoid opening a file by multiple processes.

contrib/pg_upgrade/option.c
contrib/pg_upgrade/pg_upgrade.c
contrib/pg_upgrade/pg_upgrade.h

index 06af6d4278108330d74ebe74051760f445c56509..66a70cac8ac983243a9d8fd6eb391e6af90326eb 100644 (file)
@@ -57,7 +57,7 @@ parseCommandLine(int argc, char *argv[])
    int         optindex = 0;   /* used by getopt_long */
    int         os_user_effective_id;
    FILE        *fp;
-   int         i;
+   char        **filename;
    time_t      run_time = time(NULL);
    
    user_opts.transfer_mode = TRANSFER_MODE_COPY;
@@ -188,11 +188,12 @@ parseCommandLine(int argc, char *argv[])
    }
 
    /* label start of upgrade in logfiles */
-   for (i = 0; i < NUM_LOG_FILES; i++)
+   for (filename = output_files; *filename != NULL; filename++)
    {
-       if ((fp = fopen_priv(output_files[i], "a")) == NULL)
-           pg_log(PG_FATAL, "cannot write to log file %s\n",
-                  output_files[i]);
+       if ((fp = fopen_priv(*filename, "a")) == NULL)
+           pg_log(PG_FATAL, "cannot write to log file %s\n", *filename);
+
+       /* Start with newline because we might be appending to a file. */
        fprintf(fp, "\n"
        "-----------------------------------------------------------------\n"
        "  pg_upgrade run on %s"
index cc74f118086abe6b7d6ef4670fe20311afdd9acc..7297efd124035f56e15f5dfdc9b779b7a9470f6b 100644 (file)
@@ -55,11 +55,16 @@ ClusterInfo old_cluster,
            new_cluster;
 OSInfo     os_info;
 
-char *output_files[NUM_LOG_FILES] = {
+char *output_files[] = {
    SERVER_LOG_FILE,
+#ifdef WIN32
+   /* file is unique on Win32 */
+   SERVER_LOG_FILE2,
+#endif
    RESTORE_LOG_FILE,
    UTILITY_LOG_FILE,
-   INTERNAL_LOG_FILE
+   INTERNAL_LOG_FILE,
+   NULL
 };
 
 
@@ -454,21 +459,14 @@ cleanup(void)
    /* Remove dump and log files? */
    if (!log_opts.retain)
    {
-       char        filename[MAXPGPATH];
-       int i;
+       char        **filename;
 
-       for (i = 0; i < NUM_LOG_FILES; i++)
-       {
-           snprintf(filename, sizeof(filename), "%s", output_files[i]);
-           unlink(filename);
-       }
+       for (filename = output_files; *filename != NULL; filename++)
+           unlink(*filename);
 
        /* remove SQL files */
-       snprintf(filename, sizeof(filename), "%s", ALL_DUMP_FILE);
-       unlink(filename);
-       snprintf(filename, sizeof(filename), "%s", GLOBALS_DUMP_FILE);
-       unlink(filename);
-       snprintf(filename, sizeof(filename), "%s", DB_DUMP_FILE);
-       unlink(filename);
+       unlink(ALL_DUMP_FILE);
+       unlink(GLOBALS_DUMP_FILE);
+       unlink(DB_DUMP_FILE);
    }
 }
index 6dcb1a5b50f7aded85f956599d4423280820e7e9..0d6269a850a04896a1a54cde56e94b766ef9f245 100644 (file)
@@ -40,7 +40,6 @@
 #define UTILITY_LOG_FILE   "pg_upgrade_utility.log"
 #define INTERNAL_LOG_FILE  "pg_upgrade_internal.log"
 
-#define NUM_LOG_FILES      4
 extern char *output_files[];
 
 /*
@@ -49,8 +48,10 @@ extern char *output_files[];
  * On Win32, we can't send both pg_upgrade output and command output to the
  * same file because we get the error: "The process cannot access the file
  * because it is being used by another process." so send the pg_ctl
- * command-line output to the utility log file on Windows, rather than
- * into the server log file.
+ * command-line output to a new file, rather than into the server log file.
+ * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
+ * keep the pg_ctl output file open even after pg_ctl exits, perhaps by the
+ * running postmaster.
  *
  * We could use the Windows pgwin32_open() flags to allow shared file
  * writes but is unclear how all other tools would use those flags, so
@@ -60,7 +61,7 @@ extern char *output_files[];
 #ifndef WIN32
 #define SERVER_LOG_FILE2   SERVER_LOG_FILE
 #else
-#define SERVER_LOG_FILE2   UTILITY_LOG_FILE
+#define SERVER_LOG_FILE2   "pg_upgrade_server2.log"
 #endif