From 605aa06a5f2232a68dedd6e433a048e706b10779 Mon Sep 17 00:00:00 2001 From: "chen.zhu" Date: Fri, 29 Mar 2024 14:36:27 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B0=91=E7=94=9F=E9=93=B6=E8=A1=8C=E9=9C=80?= =?UTF-8?q?=E6=B1=82]cm=E4=B8=A4=E8=8A=82=E7=82=B9=E9=83=A8=E7=BD=B2cm=5Fs?= =?UTF-8?q?erver.conf=E5=8F=82=E6=95=B0third=5Fparty=5Fgateway=5Fip?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=A5=E9=80=97=E5=8F=B7=E5=88=86=E9=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cm_server/cms_monitor_main.cpp | 53 ++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/src/cm_server/cms_monitor_main.cpp b/src/cm_server/cms_monitor_main.cpp index 55f2f4a..9811dec 100644 --- a/src/cm_server/cms_monitor_main.cpp +++ b/src/cm_server/cms_monitor_main.cpp @@ -1056,15 +1056,51 @@ static inline void DdbSetDdbWorkMode(ddb_work_mode workMode, unsigned int voteNu } } +/* + * if reachale is true: + * all ip is reachable, return CM_SUCCESS + * else return CM_ERROR + * if reachale is false: + * all ip is not reachable, return CM_SUCCESS + * else return CM_ERROR + */ +static status_t CheckAllIpStatus(char *ip, bool reachable) +{ + if (ip == nullptr) { + return CM_ERROR; + } + + char tmpIp[CM_IP_LENGTH]; + errno_t rc = strcpy_s(tmpIp, CM_IP_LENGTH, ip); + securec_check_errno(rc, (void)rc); + char *saveptr = NULL; + char *token = strtok_r(tmpIp, ",", &saveptr); + status_t ret = CM_SUCCESS; + bool flag = false; + while (token != NULL) { + if (reachable && IsReachableIP(token) != CM_SUCCESS) { + ret = CM_ERROR; + break; + } else if (!reachable && IsReachableIP(token) == CM_SUCCESS) { + ret = CM_ERROR; + break; + } + flag = true; + token = strtok_r(NULL, ",", &saveptr); + } + + return flag ? ret : CM_ERROR; +} + static void DdbMinorityWorkModeSetInMajority() { uint32 minVoteNum = 1; - if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) == CM_SUCCESS) { - // third party gateway is reachable, setting a small vote num to make sure current node works as primary. + if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, true) == CM_SUCCESS) { + // all third party gateway is reachable, setting a small vote num to make sure current node works as primary. write_runlog(LOG, "promote node to primary\n"); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 0); } else { - // third party gateway is not reachable, setting a big vote num to make sure current node works as standby. + // not all third party gateway is reachable, setting a big vote num to make sure current node works as standby. minVoteNum += MAX_VOTE_NUM; DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 1); @@ -1088,10 +1124,15 @@ static void DdbMinorityWorkModeSetInMajority() static void DdbMinorityWorkModeSetInMinority() { uint32 minVoteNum = 1; - if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) == CM_SUCCESS && g_bigVoteNumInMinorityMode == 1) { + if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, true) == CM_SUCCESS && g_bigVoteNumInMinorityMode == 1) { write_runlog(LOG, "reset minority work mode and become primary.\n"); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 0); - } else if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) != CM_SUCCESS && g_bigVoteNumInMinorityMode == 0) { + } else if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, false) == CM_SUCCESS + && g_bigVoteNumInMinorityMode == 0) { + /* + * every third party gateway is not reachable, + * setting a big vote num to make sure current node works as standby. + */ minVoteNum += MAX_VOTE_NUM; write_runlog(LOG, "reset minority work mode and become standby.\n"); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 1); @@ -1108,7 +1149,7 @@ static void DdbMinorityWorkModeSetInMinority() static void DdbMinorityWorkModeSetInStartup() { uint32 minVoteNum = 1; - if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) == CM_SUCCESS) { + if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, true) == CM_SUCCESS) { write_runlog(LOG, "start up with minority work mode and minVoteNum: %d.\n", minVoteNum); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 0); } else { -- Gitee