!1527 修复gs_guc/reload方式设置分组同步复制参数失败

Merge pull request !1527 from 胡正超/anyxfix
This commit is contained in:
opengauss-bot 2022-02-28 03:07:34 +00:00 committed by Gitee
commit ef7949c398
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
1 changed files with 65 additions and 6 deletions

View File

@ -1033,6 +1033,66 @@ append_string_info(char **optLines, const char *newContext)
return optLinesResult;
}
static void
parse_next_sync_groups(char **pgroup, char *result)
{
if (**pgroup == '\0') {
result[0] = '\0';
return;
}
char *this_group = *pgroup;
char *p = *pgroup;
while (*p != '\0' && *p != ')') p++;
while (*p != '\0' && *p != ',') p++;
if (*p == ',') {
*p = '\0';
p++;
}
*pgroup = p;
errno_t rc = snprintf_s(result, MAX_VALUE_LEN, MAX_VALUE_LEN - 1, "'%s'", this_group);
securec_check_ss_c(rc, "\0", "\0");
return;
}
static int
transform_az_name(char *config_value, char *allAZString, int allAZStringBufLen, const char *data_dir)
{
char *azString = NULL;
char *buf = allAZString;
int buflen = allAZStringBufLen;
char *allgroup = xstrdup(config_value);
char *pgrp = allgroup + 1; // trim first "'"
char this_group[MAX_VALUE_LEN] = {0x00};
allgroup[strlen(allgroup) - 1] = '\0'; // trim last "'"
parse_next_sync_groups(&pgrp, this_group);
while (this_group[0] != '\0') {
azString = get_AZ_value(this_group, data_dir);
if (NULL == azString) {
GS_FREE(allgroup);
return FAILURE;
}
int azStringLen = strlen(azString);
azString[0] = ' ';
azString[azStringLen - 1] = ',';
errno_t rc = strncpy_s(buf, buflen, azString, azStringLen);
securec_check_c(rc, "\0", "\0");
buf += azStringLen;
buflen -= azStringLen;
GS_FREE(azString);
parse_next_sync_groups(&pgrp, this_group);
}
GS_FREE(allgroup);
allAZString[0] = allAZString[strlen(allAZString) - 1] = '\'';
return SUCCESS;
}
#ifndef ENABLE_MULTIPLE_NODES
/*******************************************************************************
Function : IsLastNotNullReplconninfo
@ -1194,17 +1254,16 @@ do_gucset(const char *action_type, const char *data_dir)
// get AZ string
if (NULL != config_value[i]) {
char *azString = NULL;
azString = get_AZ_value(config_value[i], data_dir);
if (NULL == azString) {
result_status = FAILURE;
char allAZString[MAX_VALUE_LEN] = {0x00};
result_status = transform_az_name(config_value[i], allAZString, MAX_VALUE_LEN, data_dir);
if (result_status == FAILURE) {
continue;
}
tmpAZStr = xstrdup(config_value[i]);
GS_FREE(config_value[i]);
config_value[i] = xstrdup(azString);
GS_FREE(azString);
config_value[i] = xstrdup(allAZString);
}
}