diff --git a/src/cm_common/cm_misc.cpp b/src/cm_common/cm_misc.cpp index e0f90c0..14e89e5 100644 --- a/src/cm_common/cm_misc.cpp +++ b/src/cm_common/cm_misc.cpp @@ -1322,25 +1322,12 @@ 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}; - 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; + 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; } bool IsIPAddrValid(const char *ipAddr) diff --git a/src/cm_server/cms_monitor_main.cpp b/src/cm_server/cms_monitor_main.cpp index ca8a851..a3d6ae5 100644 --- a/src/cm_server/cms_monitor_main.cpp +++ b/src/cm_server/cms_monitor_main.cpp @@ -1047,15 +1047,52 @@ 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 (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); @@ -1079,10 +1116,11 @@ 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); @@ -1099,7 +1137,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 {