OSDN Git Service

Make sure walsender state is only read while holding the spinlock
authorMagnus Hagander <magnus@hagander.net>
Thu, 13 Jan 2011 17:51:13 +0000 (18:51 +0100)
committerMagnus Hagander <magnus@hagander.net>
Thu, 13 Jan 2011 17:51:13 +0000 (18:51 +0100)
Noted by Robert Haas.

src/backend/replication/walsender.c

index a0f20ab..cacd577 100644 (file)
@@ -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);