Fix the display of UNKNOWN message type in apply worker.
authorAmit Kapila
Tue, 25 Jul 2023 03:20:37 +0000 (08:50 +0530)
committerAmit Kapila
Tue, 25 Jul 2023 03:20:37 +0000 (08:50 +0530)
We include the message type while displaying an error context in the
apply worker. Now, while retrieving the message type string if the
message type is unknown we throw an error that will hide the original
error. So, instead, we need to simply return the string indicating an
unknown message type.

Reported-by: Ashutosh Bapat
Author: Euler Taveira, Amit Kapila
Reviewed-by: Ashutosh Bapat
Backpatch-through: 15
Discussion: https://postgr.es/m/CAExHW5suAEDW-mBZt_qu4RVxWZ1vL54-L+ci2zreYWebpzxYsA@mail.gmail.com

src/backend/replication/logical/proto.c
src/backend/replication/logical/worker.c
src/include/replication/logicalproto.h

index f5f2bc24d8fb9469ab27306d61bfcaf536dc4c7d..a041937ce90e11a2c4d229deda4cb24543e6b2a6 100644 (file)
@@ -1194,9 +1194,11 @@ logicalrep_read_stream_abort(StringInfo in, TransactionId *xid,
 /*
  * Get string representing LogicalRepMsgType.
  */
-char *
+const char *
 logicalrep_message_type(LogicalRepMsgType action)
 {
+   static char err_unknown[20];
+
    switch (action)
    {
        case LOGICAL_REP_MSG_BEGIN:
@@ -1239,7 +1241,12 @@ logicalrep_message_type(LogicalRepMsgType action)
            return "STREAM PREPARE";
    }
 
-   elog(ERROR, "invalid logical replication message type \"%c\"", action);
+   /*
+    * This message provides context in the error raised when applying a
+    * logical message. So we can't throw an error here. Return an unknown
+    * indicator value so that the original error is still reported.
+    */
+   snprintf(err_unknown, sizeof(err_unknown), "??? (%d)", action);
 
-   return NULL;                /* keep compiler quiet */
+   return err_unknown;
 }
index cc6b079fcd677b7e38574ef6cf87e8666d327db7..dcc3fdf6c7685b0559440a4947e07051d0e80d22 100644 (file)
@@ -2579,7 +2579,7 @@ apply_dispatch(StringInfo s)
        default:
            ereport(ERROR,
                    (errcode(ERRCODE_PROTOCOL_VIOLATION),
-                    errmsg("invalid logical replication message type \"%c\"", action)));
+                    errmsg("invalid logical replication message type \"??? (%d)\"", action)));
    }
 
    /* Reset the current command */
index 04e1cd89cf7e6a3cf852a521631762cca0447191..8cdc04a65f55c1c1270e673f08d7037d31844b90 100644 (file)
@@ -249,6 +249,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid,
                                          TransactionId subxid);
 extern void logicalrep_read_stream_abort(StringInfo in, TransactionId *xid,
                                         TransactionId *subxid);
-extern char *logicalrep_message_type(LogicalRepMsgType action);
+extern const char *logicalrep_message_type(LogicalRepMsgType action);
 
 #endif                         /* LOGICAL_PROTO_H */