aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2016-07-01 13:53:46 -0400
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2016-07-01 13:53:46 -0400
commit1bdae16fca884a9190dc330790e7a63c04989fa3 (patch)
treeefd2fe00b1e7f4065ee443d69b7afa276baf8423
parent9e703987a8a1961af8edd751169a8ae1055890eb (diff)
downloadpostgresql-1bdae16fca884a9190dc330790e7a63c04989fa3.tar.gz
postgresql-1bdae16fca884a9190dc330790e7a63c04989fa3.zip
walreceiver: tweak pg_stat_wal_receiver behavior
There are two problems in the original coding: one is that if one walreceiver process exits, the ready_to_display flag remains set in shared memory, exposing the conninfo of the next walreceiver before obfuscating. Fix by having WalRcvDie reset the flag. Second, the sleep-and-retry behavior that waited until walreceiver had set ready_to_display wasn't liked; the preference is to have it return no data instead, so let's do that. Bugs in 9ed551e0a reported by Fujii Masao and Michël Paquier. Author: Michaël Paquier
-rw-r--r--src/backend/replication/walreceiver.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index d552f04901c..413ee3a5c18 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -246,6 +246,7 @@ WalReceiverMain(void)
walrcv->walRcvState = WALRCV_STREAMING;
/* Fetch information required to start streaming */
+ walrcv->ready_to_display = false;
strlcpy(conninfo, (char *) walrcv->conninfo, MAXCONNINFO);
strlcpy(slotname, (char *) walrcv->slotname, NAMEDATALEN);
startpoint = walrcv->receiveStart;
@@ -770,6 +771,7 @@ WalRcvDie(int code, Datum arg)
Assert(walrcv->pid == MyProcPid);
walrcv->walRcvState = WALRCV_STOPPED;
walrcv->pid = 0;
+ walrcv->ready_to_display = false;
SpinLockRelease(&walrcv->mutex);
/* Terminate the connection gracefully. */
@@ -1343,24 +1345,12 @@ pg_stat_get_wal_receiver(PG_FUNCTION_ARGS)
char *slotname;
char *conninfo;
- /* No WAL receiver, just return a tuple with NULL values */
- if (walrcv->pid == 0)
- PG_RETURN_NULL();
-
/*
- * Users attempting to read this data mustn't be shown security sensitive
- * data, so sleep until everything has been properly obfuscated.
+ * No WAL receiver (or not ready yet), just return a tuple with NULL
+ * values
*/
-retry:
- SpinLockAcquire(&walrcv->mutex);
- if (!walrcv->ready_to_display)
- {
- SpinLockRelease(&walrcv->mutex);
- CHECK_FOR_INTERRUPTS();
- pg_usleep(1000);
- goto retry;
- }
- SpinLockRelease(&walrcv->mutex);
+ if (walrcv->pid == 0 || !walrcv->ready_to_display)
+ PG_RETURN_NULL();
/* determine result type */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)