Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Assorted corrections to the patch to add WAL receiver replies.
authorRobert Haas <rhaas@postgresql.org>
Tue, 15 Feb 2011 17:02:53 +0000 (12:02 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 15 Feb 2011 17:05:00 +0000 (12:05 -0500)
Per reports from Fujii Masao.

doc/src/sgml/config.sgml
src/backend/replication/walsender.c

index b6f8621278c96399949f9399ddeca895c7a75e62..9505caf47a269d7fa66b910c6205f83b09394e0c 100644 (file)
@@ -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>
index 3ad95b495ec8dbe86d218959d8336b8576847d24..fe9961638c6fe4bcb2cc0f9b67b6e77633319dcc 100644 (file)
@@ -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 (;;)
    {