!977 [2.0分支已合入,同步到master]fix 集群内多个节点坏死,gs_dropnode无法正常执行

Merge pull request !977 from cchen676/new_master
This commit is contained in:
opengauss-bot
2021-05-21 10:19:20 +08:00
committed by Gitee
4 changed files with 73 additions and 123 deletions

View File

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

View File

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

View File

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

View File

@ -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;
}