]> granicus.if.org Git - postgresql/commitdiff
Cause the archiver process to adopt new postgresql.conf settings (particularly
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 May 2010 16:42:28 +0000 (16:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 May 2010 16:42:28 +0000 (16:42 +0000)
archive_command) as soon as possible, namely just before issuing a new call
of archive_command, even when there is a backlog of files to be archived.
The original coding would only absorb new settings after clearing the backlog
and returning to the outer loop.  Per discussion.

Back-patch to 8.3.  The logic in prior versions is a bit different and it
doesn't seem worth taking any risks of breaking it.

src/backend/postmaster/pgarch.c

index 23dad7f7de6b03e304c67d63a517dc9bd01a4fdd..bdbf04d5a2e0cd8aa3d66475c0bbf4c10674c8e6 100644 (file)
@@ -19,7 +19,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.41 2010/01/02 16:57:50 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.42 2010/05/11 16:42:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -410,14 +410,6 @@ pgarch_ArchiverCopyLoop(void)
 {
        char            xlog[MAX_XFN_CHARS + 1];
 
-       if (!XLogArchiveCommandSet())
-       {
-               ereport(WARNING,
-                  (errmsg("archive_mode enabled, yet archive_command is not set")));
-               /* can't do anything if no command ... */
-               return;
-       }
-
        /*
         * loop through all xlogs with archive_status of .ready and archive
         * them...mostly we expect this to be a single file, though it is possible
@@ -440,6 +432,25 @@ pgarch_ArchiverCopyLoop(void)
                        if (got_SIGTERM || !PostmasterIsAlive(true))
                                return;
 
+                       /*
+                        * Check for config update.  This is so that we'll adopt a new
+                        * setting for archive_command as soon as possible, even if there
+                        * is a backlog of files to be archived.
+                        */
+                       if (got_SIGHUP)
+                       {
+                               got_SIGHUP = false;
+                               ProcessConfigFile(PGC_SIGHUP);
+                       }
+
+                       /* can't do anything if no command ... */
+                       if (!XLogArchiveCommandSet())
+                       {
+                               ereport(WARNING,
+                                               (errmsg("archive_mode enabled, yet archive_command is not set")));
+                               return;
+                       }
+
                        if (pgarch_archiveXlog(xlog))
                        {
                                /* successful */