回合6.0.0[bugfix] 修复实时构建流控有概率出现主机收到挂掉节点的消息的问题

This commit is contained in:
congzhou2603
2025-05-23 14:52:40 +08:00
committed by jinyangzhen
parent 2b1934d28f
commit 4beef76427
2 changed files with 26 additions and 6 deletions

View File

@ -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;

View File

@ -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 {