Assorted corrections to the patch to add WAL receiver replies.
authorRobert Haas
Tue, 15 Feb 2011 17:02:53 +0000 (12:02 -0500)
committerRobert Haas
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;
        
       
 
-      
-       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.
+      
+      
+     
+
      
     
    
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 (;;)
    {