summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagnus Hagander2011-01-13 17:51:13 +0000
committerMagnus Hagander2011-01-13 17:51:13 +0000
commit9eacd427e811a97337de1fdd61a3cb90604981ad (patch)
treee00ca2d4cc86042982995850d211d7318a48f38b /src
parent712dd95370fc6c3a8d20f71b8e195a7af3c50f42 (diff)
Make sure walsender state is only read while holding the spinlock
Noted by Robert Haas.
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/walsender.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index a0f20ab41f0..cacd577acce 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1050,6 +1050,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
volatile WalSnd *walsnd = &WalSndCtl->walsnds[i];
char sent_location[MAXFNAMELEN];
XLogRecPtr sentPtr;
+ WalSndState state;
Datum values[PG_STAT_GET_WAL_SENDERS_COLS];
bool nulls[PG_STAT_GET_WAL_SENDERS_COLS];
@@ -1058,6 +1059,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
SpinLockAcquire(&walsnd->mutex);
sentPtr = walsnd->sentPtr;
+ state = walsnd->state;
SpinLockRelease(&walsnd->mutex);
snprintf(sent_location, sizeof(sent_location), "%X/%X",
@@ -1065,7 +1067,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
memset(nulls, 0, sizeof(nulls));
values[0] = Int32GetDatum(walsnd->pid);
- values[1] = CStringGetTextDatum(WalSndGetStateString(walsnd->state));
+ values[1] = CStringGetTextDatum(WalSndGetStateString(state));
values[2] = CStringGetTextDatum(sent_location);
tuplestore_putvalues(tupstore, tupdesc, values, nulls);