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 (;;) {