diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index b6f8621278..9505caf47a 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -1984,29 +1984,6 @@ SET ENABLE_SEQSCAN TO OFF;
-
- wal_receiver_status_interval (integer)
-
- wal_receiver_status_interval> configuration parameter
-
-
-
- Specifies the minimum frequency, in seconds, for the WAL receiver
- process on the standby to send information about replication progress
- to the primary, where they can be seen using the
- pg_stat_replication view. The standby will report
- the last transaction log position it has written, the last position it
- has flushed to disk, and the last position it has applied. Updates are
- sent each time the write or flush positions changed, or at least as
- often as specified by this parameter. Thus, the apply position may
- lag slightly behind the true position. Setting this parameter to zero
- disables status updates completely. This parameter can only be set in
- the postgresql.conf> file or on the server command line.
- The default value is 10 seconds.
-
-
-
-
vacuum_defer_cleanup_age (integer)
@@ -2121,6 +2098,29 @@ SET ENABLE_SEQSCAN TO OFF;
+
+ wal_receiver_status_interval (integer)
+
+ wal_receiver_status_interval> configuration parameter
+
+
+
+ Specifies the minimum frequency, in seconds, for the WAL receiver
+ process on the standby to send information about replication progress
+ to the primary, where they can be seen using the
+ pg_stat_replication view. The standby will report
+ the last transaction log position it has written, the last position it
+ has flushed to disk, and the last position it has applied. Updates are
+ sent each time the write or flush positions changed, or at least as
+ often as specified by this parameter. Thus, the apply position may
+ lag slightly behind the true position. Setting this parameter to zero
+ disables status updates completely. This parameter can only be set in
+ the postgresql.conf> file or on the server command line.
+ The default value is 10 seconds.
+
+
+
+
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 3ad95b495e..fe9961638c 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -89,6 +89,11 @@ static uint32 sendOff = 0;
*/
static XLogRecPtr sentPtr = {0, 0};
+/*
+ * Buffer for processing reply messages.
+ */
+static StringInfoData reply_message;
+
/* Flags set by signal handlers for later service in main loop */
static volatile sig_atomic_t got_SIGHUP = false;
volatile sig_atomic_t walsender_shutdown_requested = false;
@@ -469,7 +474,7 @@ ProcessRepliesIfAny(void)
switch (firstchar)
{
/*
- * 'd' means a standby reply wrapped in a COPY BOTH packet.
+ * 'd' means a standby reply wrapped in a CopyData packet.
*/
case 'd':
ProcessStandbyReplyMessage();
@@ -495,16 +500,15 @@ ProcessRepliesIfAny(void)
static void
ProcessStandbyReplyMessage(void)
{
- static StringInfoData input_message;
StandbyReplyMessage reply;
char msgtype;
- initStringInfo(&input_message);
+ resetStringInfo(&reply_message);
/*
* Read the message contents.
*/
- if (pq_getmessage(&input_message, 0))
+ if (pq_getmessage(&reply_message, 0))
{
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
@@ -516,13 +520,16 @@ ProcessStandbyReplyMessage(void)
* Check message type from the first byte. At the moment, there is only
* one type.
*/
- msgtype = pq_getmsgbyte(&input_message);
+ msgtype = pq_getmsgbyte(&reply_message);
if (msgtype != 'r')
+ {
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("unexpected message type %c", msgtype)));
+ proc_exit(0);
+ }
- pq_copymsgbytes(&input_message, (char *) &reply, sizeof(StandbyReplyMessage));
+ pq_copymsgbytes(&reply_message, (char *) &reply, sizeof(StandbyReplyMessage));
elog(DEBUG2, "write %X/%X flush %X/%X apply %X/%X ",
reply.write.xlogid, reply.write.xrecoff,
@@ -559,6 +566,12 @@ WalSndLoop(void)
*/
output_message = palloc(1 + sizeof(WalDataMessageHeader) + MAX_SEND_SIZE);
+ /*
+ * Allocate buffer that will be used for processing reply messages. As
+ * above, do this just once to reduce palloc overhead.
+ */
+ initStringInfo(&reply_message);
+
/* Loop forever, unless we get an error */
for (;;)
{