OSDN Git Service

Remove rare corner case for data loss when triggering standby server.
authorSimon Riggs <simon@2ndQuadrant.com>
Tue, 8 Feb 2011 14:38:02 +0000 (14:38 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Tue, 8 Feb 2011 14:38:02 +0000 (14:38 +0000)
If the standby was streaming when trigger file arrives, check also in the
archive for additional WAL files. This is a corner case since it is
unlikely that we would trigger a failover while the master is still
available and sending data to standby, while at the same time running in
archive mode and also while the streaming standby has fallen behind archive.
Someone would eventually be unlucky; we must plug all gaps however small.

Fujii Masao

src/backend/access/transam/xlog.c

index 25c7e06..1a3eed2 100644 (file)
@@ -9619,7 +9619,7 @@ retry:
                                         * five seconds like in the WAL file polling case below.
                                         */
                                        if (CheckForStandbyTrigger())
-                                               goto triggered;
+                                               goto retry;
 
                                        /*
                                         * Wait for more WAL to arrive, or timeout to be reached
@@ -9886,6 +9886,10 @@ static bool
 CheckForStandbyTrigger(void)
 {
        struct stat stat_buf;
+       static bool     triggered = false;
+
+       if (triggered)
+               return true;
 
        if (TriggerFile == NULL)
                return false;
@@ -9896,6 +9900,7 @@ CheckForStandbyTrigger(void)
                                (errmsg("trigger file found: %s", TriggerFile)));
                ShutdownWalRcv();
                unlink(TriggerFile);
+               triggered = true;
                return true;
        }
        return false;