]> granicus.if.org Git - postgresql/commitdiff
pg_stat_replication.sync_state was displayed incorrectly at page boundary.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 23 Nov 2012 16:51:51 +0000 (18:51 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 23 Nov 2012 17:14:41 +0000 (19:14 +0200)
XLogRecPtrIsInvalid() only checks the xrecoff field, which is correct when
checking if a WAL record could legally begin at the given position, but WAL
sending can legally be paused at a page boundary, in which case xrecoff is
0. Use XLByteEQ(..., InvalidXLogRecPtr) instead, which checks that both
xlogid and xrecoff are 0.

9.3 doesn't have this problem because XLogRecPtr is now a single 64-bit
integer, so XLogRecPtrIsInvalid() does the right thing. Apply to 9.2, and
9.1 where pg_stat_replication view was introduced.

Kyotaro HORIGUCHI, reviewed by Fujii Masao.

src/backend/replication/syncrep.c
src/backend/replication/walsender.c

index 10af4e85c1302c5e3d2ad472c9f876bd7db104fa..7fe9b09adfadf898fa6ced66c72e4a86a9af3cb3 100644 (file)
@@ -375,6 +375,7 @@ SyncRepReleaseWaiters(void)
        int                     numprocs = 0;
        int                     priority = 0;
        int                     i;
+       XLogRecPtr      InvalidXLogRecPtr = {0, 0};
 
        /*
         * If this WALSender is serving a standby that is not on the list of
@@ -384,7 +385,7 @@ SyncRepReleaseWaiters(void)
         */
        if (MyWalSnd->sync_standby_priority == 0 ||
                MyWalSnd->state < WALSNDSTATE_STREAMING ||
-               XLogRecPtrIsInvalid(MyWalSnd->flush))
+               XLByteEQ(MyWalSnd->flush, InvalidXLogRecPtr))
                return;
 
        /*
@@ -405,7 +406,7 @@ SyncRepReleaseWaiters(void)
                        walsnd->sync_standby_priority > 0 &&
                        (priority == 0 ||
                         priority > walsnd->sync_standby_priority) &&
-                       !XLogRecPtrIsInvalid(walsnd->flush))
+                       !XLByteEQ(walsnd->flush, InvalidXLogRecPtr))
                {
                        priority = walsnd->sync_standby_priority;
                        syncWalSnd = walsnd;
index c5391676c4ae24853b950fd361bf9b20d5345770..7ccab20b13e6592cb6bb05af4c0228181fa2bb81 100644 (file)
@@ -1403,6 +1403,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
        int                     priority = 0;
        int                     sync_standby = -1;
        int                     i;
+       XLogRecPtr      InvalidXLogRecPtr = {0, 0};
 
        /* check to see if caller supports us returning a tuplestore */
        if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo))
@@ -1448,14 +1449,14 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
                         * which always returns an invalid flush location, as an
                         * asynchronous standby.
                         */
-                       sync_priority[i] = XLogRecPtrIsInvalid(walsnd->flush) ?
+                       sync_priority[i] = XLByteEQ(walsnd->flush, InvalidXLogRecPtr) ?
                                0 : walsnd->sync_standby_priority;
 
                        if (walsnd->state == WALSNDSTATE_STREAMING &&
                                walsnd->sync_standby_priority > 0 &&
                                (priority == 0 ||
                                 priority > walsnd->sync_standby_priority) &&
-                               !XLogRecPtrIsInvalid(walsnd->flush))
+                               !XLByteEQ(walsnd->flush, InvalidXLogRecPtr))
                        {
                                priority = walsnd->sync_standby_priority;
                                sync_standby = i;