]> granicus.if.org Git - postgresql/commitdiff
Fix integer overflow in debug message of walreceiver
authorTatsuo Ishii <ishii@postgresql.org>
Fri, 13 Mar 2015 23:16:50 +0000 (08:16 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Fri, 13 Mar 2015 23:22:18 +0000 (08:22 +0900)
The message tries to tell the replication apply delay which fails if
the first WAL record is not applied yet. Fix is, instead of telling
overflowed minus numeric, showing "N/A" which indicates that the delay
data is not yet available. Problem reported by me and patch by
Fabrízio de Royes Mello.

Back patched to 9.4, 9.3 and 9.2 stable branches (9.1 and 9.0 do not
have the debug message).

src/backend/replication/walreceiver.c
src/backend/replication/walreceiverfuncs.c

index 753316e8c3777ed99a8f54d9d88ada86b2d08ccb..ed3ef55ebe79c378d5f13c597d8a9ba9c0de88b2 100644 (file)
@@ -793,15 +793,26 @@ ProcessWalSndrMessage(XLogRecPtr walEnd, TimestampTz sendTime)
        {
                char       *sendtime;
                char       *receipttime;
+               int                     applyDelay;
 
                /* Copy because timestamptz_to_str returns a static buffer */
                sendtime = pstrdup(timestamptz_to_str(sendTime));
                receipttime = pstrdup(timestamptz_to_str(lastMsgReceiptTime));
-               elog(DEBUG2, "sendtime %s receipttime %s replication apply delay %d ms transfer latency %d ms",
-                        sendtime,
-                        receipttime,
-                        GetReplicationApplyDelay(),
-                        GetReplicationTransferLatency());
+               applyDelay = GetReplicationApplyDelay();
+
+               /* apply delay is not available */
+               if (applyDelay == -1)
+                       elog(DEBUG2, "sendtime %s receipttime %s replication apply delay (N/A) transfer latency %d ms",
+                                sendtime,
+                                receipttime,
+                                GetReplicationTransferLatency());
+               else
+                       elog(DEBUG2, "sendtime %s receipttime %s replication apply delay %d ms transfer latency %d ms",
+                                sendtime,
+                                receipttime,
+                                applyDelay,
+                                GetReplicationTransferLatency());
+
                pfree(sendtime);
                pfree(receipttime);
        }
index e105f093d35c254c4608e59ab4f92b1c56c4502a..98706e3b9ba913a3f3883da154913dc4af8effae 100644 (file)
@@ -241,7 +241,8 @@ GetWalRcvWriteRecPtr(XLogRecPtr *latestChunkStart)
 }
 
 /*
- * Returns the replication apply delay in ms
+ * Returns the replication apply delay in ms or -1
+ * if the apply delay info is not available
  */
 int
 GetReplicationApplyDelay(void)
@@ -255,6 +256,8 @@ GetReplicationApplyDelay(void)
        long            secs;
        int                     usecs;
 
+       TimestampTz     chunckReplayStartTime;
+
        SpinLockAcquire(&walrcv->mutex);
        receivePtr = walrcv->receivedUpto;
        SpinLockRelease(&walrcv->mutex);
@@ -264,7 +267,12 @@ GetReplicationApplyDelay(void)
        if (XLByteEQ(receivePtr, replayPtr))
                return 0;
 
-       TimestampDifference(GetCurrentChunkReplayStartTime(),
+       chunckReplayStartTime = GetCurrentChunkReplayStartTime();
+
+       if (chunckReplayStartTime == 0)
+               return -1;
+
+       TimestampDifference(chunckReplayStartTime,
                                                GetCurrentTimestamp(),
                                                &secs, &usecs);