diff --git a/src/common/backend/utils/error/elog.cpp b/src/common/backend/utils/error/elog.cpp index 3267f2d57..4630a58d0 100644 --- a/src/common/backend/utils/error/elog.cpp +++ b/src/common/backend/utils/error/elog.cpp @@ -3639,7 +3639,15 @@ static void send_message_to_frontend(ErrorData* edata) !t_thrd.log_cxt.flush_message_immediately) return; - pq_flush(); + /* + * If it is WalSender's timeout message, choose pq_flush_if_writable() + * to avoid blokcing in send() if the send buffer of the socket is full. + */ + if (AM_WAL_NORMAL_SENDER && t_thrd.walsender_cxt.isWalSndSendTimeoutMessage) { + pq_flush_if_writable(); + } else { + pq_flush(); + } if (edata->elevel == FATAL) t_thrd.log_cxt.flush_message_immediately = true; diff --git a/src/gausskernel/process/threadpool/knl_thread.cpp b/src/gausskernel/process/threadpool/knl_thread.cpp old mode 100755 new mode 100644 index d9b055bf3..b471d55e4 --- a/src/gausskernel/process/threadpool/knl_thread.cpp +++ b/src/gausskernel/process/threadpool/knl_thread.cpp @@ -1364,6 +1364,7 @@ static void knl_t_walsender_init(knl_t_walsender_context* walsender_cxt) walsender_cxt->remotePort = 0; walsender_cxt->walSndCaughtUp = false; walsender_cxt->last_check_timeout_timestamp = 0; + walsender_cxt->isWalSndSendTimeoutMessage = false; walsender_cxt->advancePrimaryConn = NULL; walsender_cxt->ep_fd = -1; diff --git a/src/gausskernel/storage/replication/walsender.cpp b/src/gausskernel/storage/replication/walsender.cpp index caca192eb..1cbe433ae 100755 --- a/src/gausskernel/storage/replication/walsender.cpp +++ b/src/gausskernel/storage/replication/walsender.cpp @@ -3588,6 +3588,8 @@ static void WalSndCheckTimeOut(TimestampTz now) * standby. */ if (log_min_messages <= ERROR || client_min_messages <= ERROR) { + t_thrd.walsender_cxt.isWalSndSendTimeoutMessage = true; + WalReplicationTimestampInfo timeStampInfo; WalReplicationTimestampToString(&timeStampInfo, now, timeout, *last_reply_time, heartbeat); ereport(ERROR, (errmsg("terminating Walsender process due to replication timeout."), diff --git a/src/include/knl/knl_thread.h b/src/include/knl/knl_thread.h old mode 100755 new mode 100644 index a7c20d196..1fae36e36 --- a/src/include/knl/knl_thread.h +++ b/src/include/knl/knl_thread.h @@ -2283,7 +2283,8 @@ typedef struct knl_t_walsender_context { struct pg_conn* advancePrimaryConn; /* Timestamp of the last check-timeout time in WalSndCheckTimeOut. */ TimestampTz last_check_timeout_timestamp; - + /* flag set in WalSndCheckTimeout */ + bool isWalSndSendTimeoutMessage; int datafd; int ep_fd;