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 {