Fix the display of UNKNOWN message type in apply worker.
authorAmit Kapila <akapila@postgresql.org>
Tue, 25 Jul 2023 03:42:29 +0000 (09:12 +0530)
committerAmit Kapila <akapila@postgresql.org>
Tue, 25 Jul 2023 03:42:29 +0000 (09:12 +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 f3087132758f48ae9f686bdaf95a1800e761b9d7..504f94d4a77feb399106d3d3184140d64e8132eb 100644 (file)
@@ -1213,9 +1213,11 @@ logicalrep_read_stream_abort(StringInfo in,
 /*
  * Get string representing LogicalRepMsgType.
  */
-char *
+const char *
 logicalrep_message_type(LogicalRepMsgType action)
 {
+       static char     err_unknown[20];
+
        switch (action)
        {
                case LOGICAL_REP_MSG_BEGIN:
@@ -1258,7 +1260,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 dd353fd1cb0a304ffbaed2a57366a9efb2824eef..cb6659fc619b688629efba6b2577759f771962f2 100644 (file)
@@ -3367,7 +3367,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 0ea2df50889280e9f97114d80cc88c0356417504..c5be981eae66e272747ef129e6e4dc1fcc38c2a0 100644 (file)
@@ -269,6 +269,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid,
 extern void logicalrep_read_stream_abort(StringInfo in,
                                                                                 LogicalRepStreamAbortData *abort_data,
                                                                                 bool read_abort_info);
-extern char *logicalrep_message_type(LogicalRepMsgType action);
+extern const char *logicalrep_message_type(LogicalRepMsgType action);
 
 #endif                                                 /* LOGICAL_PROTO_H */