[民生银行需求]cm两节点部署cm_server.conf参数third_party_gateway_ip支持以逗号分隔

This commit is contained in:
chen.zhu 2024-03-29 14:36:27 +08:00
parent 943abc13d7
commit 052f131ec9
2 changed files with 49 additions and 24 deletions

View File

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

View File

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