diff --git a/src/cm_common/cm_misc.cpp b/src/cm_common/cm_misc.cpp index 14e89e5..e0f90c0 100644 --- a/src/cm_common/cm_misc.cpp +++ b/src/cm_common/cm_misc.cpp @@ -1322,12 +1322,25 @@ status_t IsReachableIP(char *ip) if (ip == nullptr) { return CM_ERROR; } - + char tmpIp[CM_IP_LENGTH]; + int rc = -1; + rc = strcpy_s(tmpIp, CM_IP_LENGTH, ip); + securec_check_errno(rc, (void)rc); + char *saveptr = NULL; + char *token = strtok_r(tmpIp, ",", &saveptr); char cmd[MAXPGPATH] = {0}; - int rc = snprintf_s(cmd, MAXPGPATH, MAXPGPATH - 1, "timeout 2 ping -c 2 %s > /dev/null 2>&1", ip); - securec_check_intval(rc, (void)rc); - rc = system(cmd); - return rc == 0 ? CM_SUCCESS : CM_ERROR; + while (token != NULL) { + rc = memset_s(cmd, MAXPGPATH, 0, MAXPGPATH); + securec_check_errno(rc, (void)rc); + rc = snprintf_s(cmd, MAXPGPATH, MAXPGPATH - 1, "timeout 2 ping -c 2 %s > /dev/null 2>&1", token); + securec_check_intval(rc, (void)rc); + rc = system(cmd); + if (rc == 0) { + return CM_SUCCESS; + } + token = strtok_r(NULL, ",", &saveptr); + } + return CM_ERROR; } bool IsIPAddrValid(const char *ipAddr) diff --git a/src/cm_server/cms_monitor_main.cpp b/src/cm_server/cms_monitor_main.cpp index a3d6ae5..ca8a851 100644 --- a/src/cm_server/cms_monitor_main.cpp +++ b/src/cm_server/cms_monitor_main.cpp @@ -1047,52 +1047,15 @@ 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]; - int rc = -1; - 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 (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. + 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. write_runlog(LOG, "promote node to primary\n"); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 0); } else { - // not all third party gateway is reachable, setting a big vote num to make sure current node works as standby. + // third party gateway is not 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); @@ -1116,11 +1079,10 @@ static void DdbMinorityWorkModeSetInMajority() static void DdbMinorityWorkModeSetInMinority() { uint32 minVoteNum = 1; - if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, true) == CM_SUCCESS && g_bigVoteNumInMinorityMode == 1) { + if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) == 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 (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. + } else if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) != CM_SUCCESS && g_bigVoteNumInMinorityMode == 0) { minVoteNum += MAX_VOTE_NUM; write_runlog(LOG, "reset minority work mode and become standby.\n"); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 1); @@ -1137,7 +1099,7 @@ static void DdbMinorityWorkModeSetInMinority() static void DdbMinorityWorkModeSetInStartup() { uint32 minVoteNum = 1; - if (CheckAllIpStatus(g_paramsOn2Nodes.thirdPartyGatewayIp, true) == CM_SUCCESS) { + if (IsReachableIP(g_paramsOn2Nodes.thirdPartyGatewayIp) == CM_SUCCESS) { write_runlog(LOG, "start up with minority work mode and minVoteNum: %d.\n", minVoteNum); DdbSetDdbWorkMode(DDB_WORK_MODE_MINORITY, minVoteNum, 0); } else {