aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2012-11-23 18:51:51 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2012-11-23 19:14:54 +0200
commit3f7b04d6f694b447c17999ef0aed406e658de82f (patch)
tree2fbab17c6a3dc9a1269cdc30cadea6be19afa4d0
parent430b47f382609c567bd87ff28a81ea5055d173d5 (diff)
downloadpostgresql-3f7b04d6f694b447c17999ef0aed406e658de82f.tar.gz
postgresql-3f7b04d6f694b447c17999ef0aed406e658de82f.zip
pg_stat_replication.sync_state was displayed incorrectly at page boundary.
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.
-rw-r--r--src/backend/replication/syncrep.c5
-rw-r--r--src/backend/replication/walsender.c4
2 files changed, 5 insertions, 4 deletions
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index 088f7b67f91..d3bec802656 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -45,6 +45,7 @@
#include <unistd.h>
+#include "access/transam.h"
#include "access/xact.h"
#include "miscadmin.h"
#include "replication/syncrep.h"
@@ -382,7 +383,7 @@ SyncRepReleaseWaiters(void)
*/
if (MyWalSnd->sync_standby_priority == 0 ||
MyWalSnd->state < WALSNDSTATE_STREAMING ||
- XLogRecPtrIsInvalid(MyWalSnd->flush))
+ XLByteEQ(MyWalSnd->flush, InvalidXLogRecPtr))
return;
/*
@@ -403,7 +404,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;
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 064ddd54953..6c274497072 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1559,14 +1559,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;