!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;
|
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
|
Function : parse_datanodename_result
|
||||||
@ -1946,11 +1878,6 @@ char* get_AZ_value(const char* value, const char* data_dir)
|
|||||||
|
|
||||||
if (NULL == nodenameList) {
|
if (NULL == nodenameList) {
|
||||||
// try dn
|
// try dn
|
||||||
resultStatus = get_nodename_list_by_AZ(az1, data_dir, &nodenameList);
|
|
||||||
PROCESS_STATUS(resultStatus);
|
|
||||||
if (nodenameList == NULL) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = strlen(q) + 1;
|
len = strlen(q) + 1;
|
||||||
s = (char *)pg_malloc_zero(len * sizeof(char));
|
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) {
|
while (vptr != NULL) {
|
||||||
p = vptr;
|
p = vptr;
|
||||||
|
|
||||||
if (!contain_nodename(nodenameList, p)) {
|
if (CheckDataNameValue(p, data_dir) == false) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
vptr = strtok_r(NULL, delims, &vouter_ptr);
|
vptr = strtok_r(NULL, delims, &vouter_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
GS_FREE(s);
|
GS_FREE(s);
|
||||||
len = strlen(nodenameList);
|
nodenameList = (char *)pg_malloc_zero(len * sizeof(char));
|
||||||
nRet = snprintf_s(nodenameList, len + 1, len, "%s", q);
|
nRet = snprintf_s(nodenameList, len, len - 1, "%s", q);
|
||||||
securec_check_ss_c(nRet, nodenameList, "\0");
|
securec_check_ss_c(nRet, nodenameList, "\0");
|
||||||
} else if ('\0' == nodenameList[0]) {
|
} else if ('\0' == nodenameList[0]) {
|
||||||
(void)write_stderr("ERROR: There is no standby node name. Please make sure the value of "
|
(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;
|
int parse_rc;
|
||||||
SyncRepConfigData *pconf = NULL;
|
SyncRepConfigData *pconf = NULL;
|
||||||
syncrep_scanner_yyscan_t yyscanner;
|
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;
|
char* data_dir = t_thrd.proc_cxt.DataDir;
|
||||||
uint32 idx;
|
uint32 idx;
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
int resultStatus;
|
|
||||||
|
|
||||||
/* Reset communication variables to ensure a fresh start */
|
/* Reset communication variables to ensure a fresh start */
|
||||||
t_thrd.syncrepgram_cxt.syncrep_parse_result = NULL;
|
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;
|
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;
|
p = pconf->member_names;
|
||||||
for (int i = 1; i <= pconf->nmembers; i++) {
|
for (int i = 1; i <= pconf->nmembers; i++) {
|
||||||
if (!contain_nodename(nodenameList, p)) {
|
if (!CheckDataNameValue(p, data_dir)) {
|
||||||
// The value of pamameter synchronous_standby_names is incorrect.
|
|
||||||
free(nodenameList);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
p += strlen(p) + 1;
|
p += strlen(p) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(nodenameList);
|
|
||||||
|
|
||||||
pass:
|
pass:
|
||||||
*extra = (void *)pconf;
|
*extra = (void *)pconf;
|
||||||
if (t_thrd.syncrepgram_cxt.syncrep_parse_result) {
|
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 void set_cm_read_flag(bool falg);
|
||||||
extern char* getAZNamebyPriority(uint32 azPriority);
|
extern char* getAZNamebyPriority(uint32 azPriority);
|
||||||
extern int cmconfig_getenv(const char* env_var, char* output_env_value, uint32 env_value_len);
|
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_dynamic_dn_role(void);
|
||||||
extern int get_nodename_list_by_AZ(const char* AZName, const char* data_dir, char** nodeNameList);
|
extern int get_nodename_list_by_AZ(const char* AZName, const char* data_dir, char** nodeNameList);
|
||||||
extern int checkPath(const char* fileName);
|
extern int checkPath(const char* fileName);
|
||||||
extern bool has_static_config();
|
extern bool has_static_config();
|
||||||
|
extern bool CheckDataNameValue(const char *datanodeName, const char *dataDir);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1319,39 +1319,6 @@ int read_single_file(const char *file_path, int *err_no, uint32 nodeId, const ch
|
|||||||
return 0;
|
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)
|
int get_dynamic_dn_role(void)
|
||||||
{
|
{
|
||||||
char path[MAXPGPATH];
|
char path[MAXPGPATH];
|
||||||
@ -1610,3 +1577,71 @@ bool has_static_config()
|
|||||||
|
|
||||||
return false;
|
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