diff options
-rw-r--r-- | doc/src/sgml/config.sgml | 46 | ||||
-rw-r--r-- | src/backend/replication/walsender.c | 25 |
2 files changed, 42 insertions, 29 deletions
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index b6f8621278c..9505caf47a2 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1984,29 +1984,6 @@ SET ENABLE_SEQSCAN TO OFF; </listitem> </varlistentry> - <varlistentry id="guc-wal-receiver-status-interval" xreflabel="wal_receiver_status_interval"> - <term><varname>wal_receiver_status_interval</varname> (<type>integer</type>)</term> - <indexterm> - <primary><varname>wal_receiver_status_interval</> configuration parameter</primary> - </indexterm> - <listitem> - <para> - 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 - <literal>pg_stat_replication</literal> 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 <filename>postgresql.conf</> file or on the server command line. - The default value is 10 seconds. - </para> - </listitem> - </varlistentry> - <varlistentry id="guc-vacuum-defer-cleanup-age" xreflabel="vacuum_defer_cleanup_age"> <term><varname>vacuum_defer_cleanup_age</varname> (<type>integer</type>)</term> <indexterm> @@ -2121,6 +2098,29 @@ SET ENABLE_SEQSCAN TO OFF; </listitem> </varlistentry> + <varlistentry id="guc-wal-receiver-status-interval" xreflabel="wal_receiver_status_interval"> + <term><varname>wal_receiver_status_interval</varname> (<type>integer</type>)</term> + <indexterm> + <primary><varname>wal_receiver_status_interval</> configuration parameter</primary> + </indexterm> + <listitem> + <para> + 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 + <literal>pg_stat_replication</literal> 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 <filename>postgresql.conf</> file or on the server command line. + The default value is 10 seconds. + </para> + </listitem> + </varlistentry> + </variablelist> </sect2> </sect1> diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 3ad95b495ec..fe9961638c6 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 (;;) { |