!977 [2.0分支已合入,同步到master]fix 集群内多个节点坏死,gs_dropnode无法正常执行
Merge pull request !977 from cchen676/new_master
This commit is contained in:
@ -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 "
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user