From d38ad8e31dee1a69f4f6d4b6bb4e007e3751a93c Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 25 Jul 2023 09:12:29 +0530 Subject: [PATCH] Fix the display of UNKNOWN message type in apply worker. 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 | 13 ++++++++++--- src/backend/replication/logical/worker.c | 2 +- src/include/replication/logicalproto.h | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index f308713275..504f94d4a7 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -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; } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index dd353fd1cb..cb6659fc61 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -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 */ diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 0ea2df5088..c5be981eae 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -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 */