From 4beef76427f47ce1c0dce05867366b2e09db2ca3 Mon Sep 17 00:00:00 2001 From: congzhou2603 Date: Fri, 23 May 2025 14:52:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E5=90=886.0.0[bugfix]=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AE=9E=E6=97=B6=E6=9E=84=E5=BB=BA=E6=B5=81=E6=8E=A7?= =?UTF-8?q?=E6=9C=89=E6=A6=82=E7=8E=87=E5=87=BA=E7=8E=B0=E4=B8=BB=E6=9C=BA?= =?UTF-8?q?=E6=94=B6=E5=88=B0=E6=8C=82=E6=8E=89=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddes/adapter/ss_transaction.cpp | 24 +++++++++++++++++-- src/include/ddes/dms/ss_dms_recovery.h | 8 +++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_transaction.cpp b/src/gausskernel/ddes/adapter/ss_transaction.cpp index a676eec25..30c950fcb 100644 --- a/src/gausskernel/ddes/adapter/ss_transaction.cpp +++ b/src/gausskernel/ddes/adapter/ss_transaction.cpp @@ -1140,7 +1140,14 @@ bool SSGetOldestXminFromAllStandby(TransactionId xmin, TransactionId xmax, Commi } while (ret != DMS_SUCCESS); } -/* broadcast to standby node update realtime-build logctrl enable */ +/** + * @brief Priamry node broadcast to standby node update realtime-build logctrl enable. + * + * @param canncelInReform true: happend when primary node reload recovery_time_target, + * need to canncel broadcast in reform; + * false happend when primary node enable recovery_time_target + * before reform finish, wait until broadcast finish. + */ void SSBroadcastRealtimeBuildLogCtrlEnable(bool canncelInReform) { dms_context_t dms_ctx; @@ -1161,6 +1168,10 @@ void SSBroadcastRealtimeBuildLogCtrlEnable(bool canncelInReform) .check_session_kill = (unsigned char)true }; + if (canncelInReform && SS_IN_REFORM) { + return; + } + do { ret = dms_broadcast_msg(&dms_ctx, &dms_broad_info); if (ret == DMS_SUCCESS || (canncelInReform && SS_IN_REFORM)) { @@ -1175,6 +1186,9 @@ void SSBroadcastRealtimeBuildLogCtrlEnable(bool canncelInReform) } } +/* + * Primary node notify standby nodes whether enable or disable recovery_time_target. + */ int SSUpdateRealtimeBuildLogCtrl(char* data, uint32 len) { if (unlikely(len != sizeof(SSBroadcastRealtimeBuildLogCtrl))) { @@ -1249,7 +1263,13 @@ int SSGetStandbyRealtimeBuildPtr(char* data, uint32 len) SSBroadcastRealtimeBuildPtr *receiveMessage = (SSBroadcastRealtimeBuildPtr *)data; XLogRecPtr realtimePtr = receiveMessage->realtimeBuildPtr; int srcId = receiveMessage->srcInstId; - + if (((0x1 << srcId) & g_instance.dms_cxt.SSReformInfo.new_bitmap) == 0) { + ereport(WARNING, (errmodule(MOD_DMS), + errmsg("[SS][On-demand] Get invalid realtime-build ptr from standby inst_id: %d, " + "replayEndRecPtr: %X/%X, ignore it.", + srcId, (uint32)(realtimePtr >> 32), (uint32)realtimePtr))); + return DMS_SUCCESS; + } realtime_build_ctrl_t *rtBuildCtrl = &g_instance.dms_cxt.SSRecoveryInfo.rtBuildCtrl[srcId]; if (g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus == DISABLE) { g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = ENABLE_LOG_CTRL; diff --git a/src/include/ddes/dms/ss_dms_recovery.h b/src/include/ddes/dms/ss_dms_recovery.h index 3cf6d713f..22e82e79e 100644 --- a/src/include/ddes/dms/ss_dms_recovery.h +++ b/src/include/ddes/dms/ss_dms_recovery.h @@ -178,10 +178,10 @@ typedef struct ss_recovery_info { bool disaster_cluster_promoting; // standby cluster is promoting volatile ondemand_recovery_pause_status_t ondemand_recovery_pause_status; bool realtime_build_in_reform; // used to avoid starting realtime build during reform - volatile realtime_build_log_ctrl_status realtimeBuildLogCtrlStatus; - slock_t sleepTimeSyncLock; - volatile int globalSleepTime; - realtime_build_ctrl_t rtBuildCtrl[DMS_MAX_INSTANCES]; + volatile realtime_build_log_ctrl_status realtimeBuildLogCtrlStatus; // used in realtime build log ctrl + slock_t sleepTimeSyncLock; // used in realtime build log ctrl + volatile int globalSleepTime; // used in realtime build log ctrl + realtime_build_ctrl_t rtBuildCtrl[DMS_MAX_INSTANCES]; // used in realtime build log ctrl } ss_recovery_info_t; typedef struct ondemand_htab_ctrl {