diff --git a/src/common/backend/utils/misc/guc/guc_storage.cpp b/src/common/backend/utils/misc/guc/guc_storage.cpp index ff7df7c0c..6bbac0691 100755 --- a/src/common/backend/utils/misc/guc/guc_storage.cpp +++ b/src/common/backend/utils/misc/guc/guc_storage.cpp @@ -7009,7 +7009,7 @@ static void assign_dcf_flow_control_rto(int newval, void *extra) if (ENABLE_DMS && !SS_DISASTER_CLUSTER && t_thrd.proc_cxt.MyProcPid == PostmasterPid) { // clean realtime-build log ctrl cache, before realtime-build log ctrl enable. if (g_instance.dms_cxt.dmsInited && SS_PRIMARY_MODE && oldval == 0 && newval > 0) { - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = false; + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; SpinLockInit(&g_instance.dms_cxt.SSRecoveryInfo.sleepTimeSyncLock); g_instance.dms_cxt.SSRecoveryInfo.globalSleepTime = 0; errno_t rc = memset_s(g_instance.dms_cxt.SSRecoveryInfo.rtBuildCtrl, @@ -7021,7 +7021,7 @@ static void assign_dcf_flow_control_rto(int newval, void *extra) g_instance.attr.attr_storage.dms_attr.realtime_build_target_rto = newval; // make realtime-build logctrl disable, when recovery_time_target is set to 0; if (g_instance.dms_cxt.dmsInited && SS_PRIMARY_MODE && oldval > 0 && newval == 0) { - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = false; + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; } // notify nodes, start or stop realtime-build log ctrl. diff --git a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp index b755964b2..dff16160e 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp @@ -1941,11 +1941,11 @@ static void FailoverCleanBackends() static void RestartRealtimeBuildCtrl() { - if (SS_IN_REFORM && g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl) { + if (SS_IN_REFORM && g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus > DISABLE) { ereport(LOG, (errmsg("[SS reform][On-demand] reform happened, disable realtime build log ctrl, " "and will make it enable again after reform if needed."))); } - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = false; + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; SpinLockInit(&g_instance.dms_cxt.SSRecoveryInfo.sleepTimeSyncLock); g_instance.dms_cxt.SSRecoveryInfo.globalSleepTime = 0; errno_t rc = memset_s(g_instance.dms_cxt.SSRecoveryInfo.rtBuildCtrl, @@ -2098,7 +2098,7 @@ static void CBReformStartNotify(void *db_handle, dms_reform_start_context_t *rs_ g_instance.dms_cxt.SSReformInfo.old_bitmap = g_instance.dms_cxt.SSReformerControl.list_stable; ereport(LOG, (errmodule(MOD_DMS), errmsg("[SS reform] old cluster node bitmap: %lu", g_instance.dms_cxt.SSReformInfo.old_bitmap))); - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = false; + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; if (g_instance.dms_cxt.SSRecoveryInfo.in_failover) { FailoverCleanBackends(); } else if (SSBackendNeedExitScenario()) { diff --git a/src/gausskernel/ddes/adapter/ss_transaction.cpp b/src/gausskernel/ddes/adapter/ss_transaction.cpp index e57521685..e2a0cd247 100644 --- a/src/gausskernel/ddes/adapter/ss_transaction.cpp +++ b/src/gausskernel/ddes/adapter/ss_transaction.cpp @@ -1177,11 +1177,18 @@ int SSUpdateRealtimeBuildLogCtrl(char* data, uint32 len) if (unlikely(len != sizeof(SSBroadcastRealtimeBuildLogCtrl))) { return DMS_ERROR; } - if (!ENABLE_ONDEMAND_REALTIME_BUILD) { + if (!ENABLE_ONDEMAND_REALTIME_BUILD || !SS_STANDBY_MODE) { return DMS_SUCCESS; } SSBroadcastRealtimeBuildLogCtrl *logCtrlEnable = (SSBroadcastRealtimeBuildLogCtrl *)data; - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = logCtrlEnable->enableLogCtrl; + + realtime_build_log_ctrl_status oldState = g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus; + if (!logCtrlEnable->enableLogCtrl) { + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; + } else if (oldState == DISABLE) { + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = ENABLE_LOG_CTRL; + } + ereport(LOG, (errmodule(MOD_DMS), errmsg("[On-demand] Update standby realtime-build log ctrl %s, " "enableLogCtrl: %s, enable_ondemand_realtime_build: true.", @@ -1240,12 +1247,12 @@ int SSGetStandbyRealtimeBuildPtr(char* data, uint32 len) XLogRecPtr realtimePtr = receiveMessage->realtimeBuildPtr; int srcId = receiveMessage->srcInstId; - if (!g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl) { - g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl = true; + if (g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus == DISABLE) { + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = ENABLE_LOG_CTRL; ereport(LOG, (errmodule(MOD_DMS), errmsg("[SS][On-demand] Get realtime-build ptr from standby inst_id: %d," "enable realtime-build log ctrl, replayEndRecPtr: %X/%X", - SS_PRIMARY_ID, (uint32)(realtimePtr >> 32), (uint32)realtimePtr))); + srcId, (uint32)(realtimePtr >> 32), (uint32)realtimePtr))); } realtime_build_ctrl_t *rtBuildCtrl = &g_instance.dms_cxt.SSRecoveryInfo.rtBuildCtrl[srcId]; diff --git a/src/gausskernel/process/threadpool/knl_instance.cpp b/src/gausskernel/process/threadpool/knl_instance.cpp index 273f5963f..9a03d8c05 100755 --- a/src/gausskernel/process/threadpool/knl_instance.cpp +++ b/src/gausskernel/process/threadpool/knl_instance.cpp @@ -215,7 +215,7 @@ static void knl_g_dms_init(knl_g_dms_context *dms_cxt) dms_cxt->SSRecoveryInfo.disaster_cluster_promoting = false; dms_cxt->SSRecoveryInfo.dorado_sharestorage_inited = false; dms_cxt->SSRecoveryInfo.ondemand_recovery_pause_status = NOT_PAUSE; - dms_cxt->SSRecoveryInfo.enableRealtimeBuildLogCtrl = false; + dms_cxt->SSRecoveryInfo.realtimeBuildLogCtrlStatus = DISABLE; dms_cxt->SSRecoveryInfo.globalSleepTime = 0; dms_cxt->SSRecoveryInfo.sleepTimeSyncLock = (slock_t)0; errno_t rc = memset_s(dms_cxt->SSRecoveryInfo.rtBuildCtrl, diff --git a/src/gausskernel/storage/access/transam/ondemand_extreme_rto/dispatcher.cpp b/src/gausskernel/storage/access/transam/ondemand_extreme_rto/dispatcher.cpp index 78154bba2..bc6d3d532 100644 --- a/src/gausskernel/storage/access/transam/ondemand_extreme_rto/dispatcher.cpp +++ b/src/gausskernel/storage/access/transam/ondemand_extreme_rto/dispatcher.cpp @@ -2525,6 +2525,13 @@ static void LogCtrlReportRealtimeBuildPtr() g_dispatcher->reportTime = currentTime; return; } + if (g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus == ENABLE_LOG_CTRL) { + g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus = ENABLE_REPORT_PTR; + ereport(LOG, (errmodule(MOD_DMS), + errmsg("[SS][On-demand] send primary node %d realtime-build ptr start, realtime-build %X/%X", + SS_PRIMARY_ID, (uint32)(minEnd >> 32), (uint32)minEnd))); + } + ereport(DEBUG4, (errmodule(MOD_DMS), errmsg("[SS][On-demand] send primary node %d realtime-build ptr start, realtime-build %X/%X", SS_PRIMARY_ID, (uint32)(minEnd >> 32), (uint32)minEnd))); diff --git a/src/include/ddes/dms/ss_dms_recovery.h b/src/include/ddes/dms/ss_dms_recovery.h index 27eaa958a..0f4697ce7 100644 --- a/src/include/ddes/dms/ss_dms_recovery.h +++ b/src/include/ddes/dms/ss_dms_recovery.h @@ -63,9 +63,9 @@ !g_instance.attr.attr_storage.ss_enable_dorado && \ !g_instance.attr.attr_storage.ss_stream_cluster) #define SS_PRIMARY_ENABLE_TARGET_RTO (ENABLE_REALTIME_BUILD_TARGET_RTO && \ - SS_NORMAL_PRIMARY && g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl > 0) + SS_NORMAL_PRIMARY && g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus > DISABLE) #define SS_STANDBY_ENABLE_TARGET_RTO (SS_NORMAL_STANDBY && \ - SS_ONDEMAND_REALTIME_BUILD_NORMAL && g_instance.dms_cxt.SSRecoveryInfo.enableRealtimeBuildLogCtrl > 0) + SS_ONDEMAND_REALTIME_BUILD_NORMAL && g_instance.dms_cxt.SSRecoveryInfo.realtimeBuildLogCtrlStatus > DISABLE) #define REFORM_CTRL_VERSION 1 typedef struct st_reformer_ctrl { uint32 version; @@ -148,6 +148,12 @@ typedef struct realtime_build_log_ctrl { int sleepTime; } realtime_build_ctrl_t; +typedef enum st_realtime_build_log_ctrl_status { + DISABLE = 0, // realtime-build log ctrl disable + ENABLE_LOG_CTRL, // primary: receive realtime-build ptr, standby: receive enable log ctrl message + ENABLE_REPORT_PTR // standby: start to report realtime-build ptr +} realtime_build_log_ctrl_status; + typedef struct ss_recovery_info { bool recovery_pause_flag; volatile failover_ckpt_status_t failover_ckpt_status; @@ -172,7 +178,7 @@ 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 bool enableRealtimeBuildLogCtrl; + volatile realtime_build_log_ctrl_status realtimeBuildLogCtrlStatus; slock_t sleepTimeSyncLock; volatile int globalSleepTime; realtime_build_ctrl_t rtBuildCtrl[DMS_MAX_INSTANCES];