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