diff --git a/src/bin/gs_guc/cluster_guc.cpp b/src/bin/gs_guc/cluster_guc.cpp index 7d995c252..f1456dbb2 100644 --- a/src/bin/gs_guc/cluster_guc.cpp +++ b/src/bin/gs_guc/cluster_guc.cpp @@ -1696,74 +1696,6 @@ int get_nodename_number_from_nodelist(const char* namelist) return count; } -/* - ****************************************************************************** - ****************************************************************************** - Function : check_datanodename_value - Description : check the input datanode Name. - Input :nodeName data node name - return :true input datanode name is correct - false input datanode name is incorrect - ****************************************************************************** - */ -bool CheckDataNameValue(const char *datanodeName, const char *dataDir) -{ - int nRet; - uint32 nodeIdx = 0; - uint32 datanodeIdx = 0; - int dnIdMaxLen = 64; - char dnId[dnIdMaxLen]; - - if ((datanodeName == NULL) || (*datanodeName == '\0')) { - return false; - } - - dataNodeInfo *dnI = NULL; - - for (datanodeIdx = 0; datanodeIdx < g_currentNode->datanodeCount; datanodeIdx++) { - dataNodeInfo *dniTmp = &(g_currentNode->datanode[datanodeIdx]); - if (strcmp(dniTmp->datanodeLocalDataPath, dataDir) == 0) { - dnI = dniTmp; - break; - } - } - - if (dnI == NULL) { - write_stderr("Failed: cannot find the expected data dir\n"); - return false; - } - - for (nodeIdx = 0; nodeIdx < g_node_num; ++nodeIdx) { - staticNodeConfig *dest = &(g_node[nodeIdx]); - for (datanodeIdx = 0; datanodeIdx < dest->datanodeCount; ++datanodeIdx) { - dataNodeInfo *dn = &(dest->datanode[datanodeIdx]); - if (dn->datanodeId == 0 || dn->datanodeId == dnI->datanodeId) { - continue; - } - nRet = memset_s(dnId, sizeof(dnId), '\0', sizeof(dnId)); - securec_check_c(nRet, "\0", "\0"); - nRet = snprintf_s( - dnId, sizeof(dnId) / sizeof(char), sizeof(dnId) / sizeof(char) - 1, "dn_%4d", dn->datanodeId); - securec_check_ss_c(nRet, "\0", "\0"); - if (strncmp(dnId, datanodeName, - ((strlen(dnId) > strlen(datanodeName)) ? strlen(dnId) : strlen(datanodeName))) != 0) { - continue; - } - for (int peerIndex = 0; peerIndex < CM_MAX_DATANODE_STANDBY_NUM; ++peerIndex) { - peerDatanodeInfo *peerDatanode = &(dnI->peerDatanodes[peerIndex]); - if (strlen(peerDatanode->datanodePeerHAIP[0]) == 0) { - continue; - } - if (strcmp(peerDatanode->datanodePeerHAIP[0], dn->datanodeLocalHAIP[0]) == 0 && - peerDatanode->datanodePeerHAPort == dn->datanodeLocalHAPort) { - return true; - } - } - } - } - return false; -} - /* ****************************************************************************** Function : parse_datanodename_result @@ -1946,11 +1878,6 @@ char* get_AZ_value(const char* value, const char* data_dir) if (NULL == nodenameList) { // try dn - resultStatus = get_nodename_list_by_AZ(az1, data_dir, &nodenameList); - PROCESS_STATUS(resultStatus); - if (nodenameList == NULL) { - goto failed; - } len = strlen(q) + 1; s = (char *)pg_malloc_zero(len * sizeof(char)); @@ -1961,15 +1888,15 @@ char* get_AZ_value(const char* value, const char* data_dir) while (vptr != NULL) { p = vptr; - if (!contain_nodename(nodenameList, p)) { + if (CheckDataNameValue(p, data_dir) == false) { goto failed; } vptr = strtok_r(NULL, delims, &vouter_ptr); } GS_FREE(s); - len = strlen(nodenameList); - nRet = snprintf_s(nodenameList, len + 1, len, "%s", q); + nodenameList = (char *)pg_malloc_zero(len * sizeof(char)); + nRet = snprintf_s(nodenameList, len, len - 1, "%s", q); securec_check_ss_c(nRet, nodenameList, "\0"); } else if ('\0' == nodenameList[0]) { (void)write_stderr("ERROR: There is no standby node name. Please make sure the value of " diff --git a/src/gausskernel/storage/replication/syncrep.cpp b/src/gausskernel/storage/replication/syncrep.cpp index 6ae81d7b8..46e8ace80 100644 --- a/src/gausskernel/storage/replication/syncrep.cpp +++ b/src/gausskernel/storage/replication/syncrep.cpp @@ -1473,12 +1473,9 @@ bool check_synchronous_standby_names(char **newval, void **extra, GucSource sour int parse_rc; SyncRepConfigData *pconf = NULL; syncrep_scanner_yyscan_t yyscanner; - char* nodenameList = NULL; - char* az1 = g_instance.attr.attr_storage.available_zone; char* data_dir = t_thrd.proc_cxt.DataDir; uint32 idx; char* p = NULL; - int resultStatus; /* Reset communication variables to ensure a fresh start */ t_thrd.syncrepgram_cxt.syncrep_parse_result = NULL; @@ -1527,23 +1524,14 @@ bool check_synchronous_standby_names(char **newval, void **extra, GucSource sour } g_local_node_name = g_node[g_local_node_idx].nodeName; - resultStatus = get_nodename_list_by_AZ(az1, data_dir, &nodenameList); - if (nodenameList == NULL) { - return false; - } - p = pconf->member_names; for (int i = 1; i <= pconf->nmembers; i++) { - if (!contain_nodename(nodenameList, p)) { - // The value of pamameter synchronous_standby_names is incorrect. - free(nodenameList); + if (!CheckDataNameValue(p, data_dir)) { return false; } p += strlen(p) + 1; } - free(nodenameList); - pass: *extra = (void *)pconf; if (t_thrd.syncrepgram_cxt.syncrep_parse_result) { diff --git a/src/include/common/config/cm_config.h b/src/include/common/config/cm_config.h index b26ca991e..568d84b09 100644 --- a/src/include/common/config/cm_config.h +++ b/src/include/common/config/cm_config.h @@ -433,10 +433,10 @@ extern int node_index_Comparator(const void* arg1, const void* arg2); extern void set_cm_read_flag(bool falg); extern char* getAZNamebyPriority(uint32 azPriority); extern int cmconfig_getenv(const char* env_var, char* output_env_value, uint32 env_value_len); -extern bool contain_nodename(const char* namelist, const char* name); extern int get_dynamic_dn_role(void); extern int get_nodename_list_by_AZ(const char* AZName, const char* data_dir, char** nodeNameList); extern int checkPath(const char* fileName); extern bool has_static_config(); +extern bool CheckDataNameValue(const char *datanodeName, const char *dataDir); #endif diff --git a/src/lib/config/cm_config.cpp b/src/lib/config/cm_config.cpp index 30333aec1..8df0b2952 100644 --- a/src/lib/config/cm_config.cpp +++ b/src/lib/config/cm_config.cpp @@ -1319,39 +1319,6 @@ int read_single_file(const char *file_path, int *err_no, uint32 nodeId, const ch return 0; } -bool contain_nodename(const char* namelist, const char* name) -{ - char* ptr = NULL; - char* outer_ptr = NULL; - char delims[] = ","; - size_t len = 0; - char* buffer = NULL; - int nRet = 0; - - len = strlen(namelist) + 1; - buffer = (char*)calloc(len, sizeof(char)); - if (buffer == NULL) { - fprintf(stderr, "Cannot alloc memory\n"); - return false; - } - nRet = snprintf_s(buffer, len, len - 1, "%s", namelist); - securec_check_ss_c(nRet, buffer, "\0"); - - ptr = strtok_r(buffer, delims, &outer_ptr); - while (NULL != ptr) { - if (strcmp(ptr, name) == 0) { - free(buffer); - buffer = NULL; - return true; - } - ptr = strtok_r(NULL, delims, &outer_ptr); - } - - free(buffer); - buffer = NULL; - return false; -} - int get_dynamic_dn_role(void) { char path[MAXPGPATH]; @@ -1610,3 +1577,71 @@ bool has_static_config() return false; } + +/* + ****************************************************************************** + ****************************************************************************** + Function : check_datanodename_value + Description : check the input datanode Name. + Input :nodeName data node name + return :true input datanode name is correct + false input datanode name is incorrect + ****************************************************************************** + */ +bool CheckDataNameValue(const char *datanodeName, const char *dataDir) +{ + int nRet; + uint32 nodeIdx = 0; + uint32 datanodeIdx = 0; + int dnIdMaxLen = 64; + char dnId[dnIdMaxLen]; + + if ((datanodeName == NULL) || (*datanodeName == '\0')) { + return false; + } + + dataNodeInfo *dnI = NULL; + + for (datanodeIdx = 0; datanodeIdx < g_currentNode->datanodeCount; datanodeIdx++) { + dataNodeInfo *dniTmp = &(g_currentNode->datanode[datanodeIdx]); + if (strcmp(dniTmp->datanodeLocalDataPath, dataDir) == 0) { + dnI = dniTmp; + break; + } + } + + if (dnI == NULL) { + fprintf(stderr, "Failed: cannot find the expected data dir\n"); + return false; + } + + for (nodeIdx = 0; nodeIdx < g_node_num; ++nodeIdx) { + staticNodeConfig *dest = &(g_node[nodeIdx]); + for (datanodeIdx = 0; datanodeIdx < dest->datanodeCount; ++datanodeIdx) { + dataNodeInfo *dn = &(dest->datanode[datanodeIdx]); + if (dn->datanodeId == 0 || dn->datanodeId == dnI->datanodeId) { + continue; + } + nRet = memset_s(dnId, sizeof(dnId), '\0', sizeof(dnId)); + securec_check_c(nRet, "\0", "\0"); + nRet = snprintf_s( + dnId, sizeof(dnId) / sizeof(char), sizeof(dnId) / sizeof(char) - 1, "dn_%4d", dn->datanodeId); + securec_check_ss_c(nRet, "\0", "\0"); + if (strncmp(dnId, datanodeName, + ((strlen(dnId) > strlen(datanodeName)) ? strlen(dnId) : strlen(datanodeName))) != 0) { + continue; + } + for (int peerIndex = 0; peerIndex < CM_MAX_DATANODE_STANDBY_NUM; ++peerIndex) { + peerDatanodeInfo *peerDatanode = &(dnI->peerDatanodes[peerIndex]); + if (strlen(peerDatanode->datanodePeerHAIP[0]) == 0) { + continue; + } + if (strcmp(peerDatanode->datanodePeerHAIP[0], dn->datanodeLocalHAIP[0]) == 0 && + peerDatanode->datanodePeerHAPort == dn->datanodeLocalHAPort) { + return true; + } + } + } + } + return false; +}