diff --git a/src/cm_agent/cma_common.cpp b/src/cm_agent/cma_common.cpp index 3efed64cd65f292ee61bb1195b0828cd61d76a8c..269e7bcff1fefcb0f1b1b251af27af99bd50cac7 100644 --- a/src/cm_agent/cma_common.cpp +++ b/src/cm_agent/cma_common.cpp @@ -294,11 +294,9 @@ void get_connection_mode(char *config_file) return; } if (strlen(dstStr) != 0) { - if (strcasecmp(dstStr, "on") == 0 || strcasecmp(dstStr, "yes") == 0 || strcasecmp(dstStr, "true") == 0 || - strcasecmp(dstStr, "1") == 0) { + if (IsBoolCmParamTrue(dstStr)) { enable_xc_maintenance_mode = true; - } else if (strcasecmp(dstStr, "off") == 0 || strcasecmp(dstStr, "no") == 0 || - strcasecmp(dstStr, "false") == 0 || strcasecmp(dstStr, "0") == 0) { + } else if (IsBoolCmParamFalse(dstStr)) { enable_xc_maintenance_mode = false; } else { enable_xc_maintenance_mode = true; @@ -323,11 +321,9 @@ void get_start_mode(char *config_file) return; } if (strlen(dstStr) != 0) { - if (strcasecmp(dstStr, "on") == 0 || strcasecmp(dstStr, "yes") == 0 || strcasecmp(dstStr, "true") == 0 || - strcasecmp(dstStr, "1") == 0) { + if (IsBoolCmParamTrue(dstStr)) { security_mode = true; - } else if (strcasecmp(dstStr, "off") == 0 || strcasecmp(dstStr, "no") == 0 || - strcasecmp(dstStr, "false") == 0 || strcasecmp(dstStr, "0") == 0) { + } else if (IsBoolCmParamFalse(dstStr)) { security_mode = false; } else { security_mode = true; @@ -340,6 +336,35 @@ void get_start_mode(char *config_file) return; } + +/* used for cm_agent */ +void get_build_mode(char* config_file) +{ + const char *srcStr = "incremental_build"; + char dstStr[10] = {'\0'}; + + /* read parameter from cm_agent.conf by accurate parameter name */ + if (get_config_param(config_file, srcStr, dstStr, sizeof(dstStr)) < 0) { + write_runlog(ERROR, "get_config_param() get incremental_build fail.\n"); + return; + } + if (strlen(dstStr) != 0) { + if (IsBoolCmParamTrue(dstStr)) { + incremental_build = true; + } else if (IsBoolCmParamFalse(dstStr)) { + incremental_build = false; + } else { + incremental_build = true; + write_runlog(FATAL, "invalid value for parameter \"incremental_build\" in %s.\n", config_file); + } + } else { + incremental_build = true; + write_runlog(FATAL, "Get config parameter \"incremental_build\" value failed!\n"); + } + + return; +} + void ReloadParametersFromConfig() { write_runlog(LOG, "reload cm_agent parameters from config file.\n"); @@ -389,6 +414,9 @@ void ReloadParametersFromConfigfile() if (get_config_param(configDir, "security_mode", g_enableOnlineOrOffline, sizeof(g_enableOnlineOrOffline)) < 0) { write_runlog(ERROR, "get_config_param() get security_mode fail.\n"); } + if (get_config_param(configDir, "incremental_build", g_enableIncrementalBuild, sizeof(g_enableIncrementalBuild)) < 0) { + write_runlog(ERROR, "get_config_param() get incremental_build fail.\n"); + } if (get_config_param(configDir, "unix_socket_directory", g_unixSocketDirectory, sizeof(g_unixSocketDirectory)) < 0) { @@ -418,7 +446,7 @@ void ReloadParametersFromConfigfile() " agent_connect_retries=%u, agent_check_interval=%u, agent_kill_instance_timeout=%u, \n" " agent_phony_dead_check_interval=%u, enable_gtm_phony_dead_check=%u, disk_timeout=%u, \n" " log_threshold_check_interval=%u, log_max_size=%ld, log_max_count=%u, log_saved_days=%u, " - "upgrade_from=%u,\n enable_cn_auto_repair=%s, enable_log_compress=%s, security_mode=%s,\n" + "upgrade_from=%u,\n enable_cn_auto_repair=%s, enable_log_compress=%s, security_mode=%d,\n" " incremental_build=%d, unix_socket_directory=%s, " #ifndef ENABLE_MULTIPLE_NODES "enable_e2e_rto=%u, disaster_recovery_type=%d, environment_threshold=%s,\n" @@ -448,7 +476,7 @@ void ReloadParametersFromConfigfile() undocumentedVersion, g_enableCnAutoRepair, g_enableLogCompress, - g_enableOnlineOrOffline, + security_mode, incremental_build, g_unixSocketDirectory, g_enableE2ERto, diff --git a/src/cm_agent/cma_global_params.cpp b/src/cm_agent/cma_global_params.cpp index 16ea31369ddd86c2369b4f1e050a9e6e41828fa1..ae5918671195f359928cad0f6ec7b3f873b611a6 100644 --- a/src/cm_agent/cma_global_params.cpp +++ b/src/cm_agent/cma_global_params.cpp @@ -59,6 +59,7 @@ char g_cmLibnetManualStartPath[MAX_PATH_LEN] = {0}; char g_cmResumingCnStopPath[MAX_PATH_LEN] = {0}; /* on is online off is offline */ char g_enableOnlineOrOffline[BOOL_STR_MAX_LEN] = {0}; +char g_enableIncrementalBuild[BOOL_STR_MAX_LEN] = {0}; char g_unixSocketDirectory[MAXPGPATH] = {'\0'}; char g_votingDiskPath[MAX_PATH_LEN] = {0}; char g_enableCnAutoRepair[BOOL_STR_MAX_LEN] = {0}; diff --git a/src/cm_agent/cma_main.cpp b/src/cm_agent/cma_main.cpp index 6c5b50560d1abb92bca3c08f798a6192bdccec12..8d63e0b285e3d28ded82b83ee75173be08b9dbad 100644 --- a/src/cm_agent/cma_main.cpp +++ b/src/cm_agent/cma_main.cpp @@ -1385,6 +1385,10 @@ void GetAgentConfigEx() (void)fprintf(stderr, "get_config_param() get security_mode fail.\n"); } + if (get_config_param(configDir, "incremental_build", g_enableIncrementalBuild, sizeof(g_enableIncrementalBuild)) < 0) { + (void)fprintf(stderr, "get_config_param() get incremental_build fail.\n"); + } + if (get_config_param(configDir, "unix_socket_directory", g_unixSocketDirectory, sizeof(g_unixSocketDirectory)) < 0) { (void)fprintf(stderr, "get_config_param() get unix_socket_directory fail.\n"); diff --git a/src/cm_common/cm_elog.cpp b/src/cm_common/cm_elog.cpp index d82a119f671e56d4a82a6e942747344c977b8349..b8a3bbf290bf63cd058908226c6e6ea578f0ed1d 100644 --- a/src/cm_common/cm_elog.cpp +++ b/src/cm_common/cm_elog.cpp @@ -990,50 +990,6 @@ void get_log_level(const char* config_file) return; /* default value warning */ } -/* used for cm_agent */ -void get_build_mode(const char* config_file) -{ - char buf[BUF_LEN]; - - if (config_file == NULL) { - return; - } - - FILE *fd = fopen(config_file, "r"); - if (fd == NULL) { - (void)printf("FATAL can not open config file: %s errno:%s\n", config_file, strerror(errno)); - exit(1); - } - - while (!feof(fd)) { - errno_t rc = memset_s(buf, BUF_LEN, 0, BUF_LEN); - securec_check_errno(rc, (void)rc); - (void)fgets(buf, BUF_LEN, fd); - - /* skip # comment */ - if (is_comment_line(buf) == 1) { - continue; - } - - /* check all lines */ - if (strstr(buf, "incremental_build") != NULL) { - if ((strstr(buf, "on") != NULL) || (strstr(buf, "true") != NULL) || (strstr(buf, "yes") != NULL) || - (strstr(buf, "1") != NULL)) { - incremental_build = true; - } else if ((strstr(buf, "off") != NULL) || (strstr(buf, "false") != NULL) || (strstr(buf, "no") != NULL) || - (strstr(buf, "0") != NULL)) { - incremental_build = false; - } else { - incremental_build = true; - write_runlog(FATAL, "invalid value for parameter \"incremental_build\" in %s.\n", config_file); - } - } - } - - (void)fclose(fd); - return; -} - /* used for cm_agent and cm_server */ void get_log_file_size(const char* config_file) { diff --git a/src/cm_common/cm_misc.cpp b/src/cm_common/cm_misc.cpp index d06117943a3298572ee943550c0cf9320afb4045..efca885ea7967312a73b0e1c87032d97f8a0dfcf 100644 --- a/src/cm_common/cm_misc.cpp +++ b/src/cm_common/cm_misc.cpp @@ -1374,3 +1374,28 @@ bool IsNeedCheckFloatIp() } return false; } + +bool IsStringInList(const char *str, const char * const *strList, uint32 listNums) +{ + if (str == NULL) { + return false; + } + for (uint32 i = 0; i < listNums; i++) { + if (strcasecmp(strList[i], str) == 0) { + return true; + } + } + + return false; +} + +uint32 GetArrayLength(const char* arr[]) { + if (arr == NULL) { + return 0; + } + uint32 length = 0; + for (const char **p = arr; *p != NULL; p++) { + length++; + } + return length; +} \ No newline at end of file diff --git a/src/cm_common/cm_misc_base.cpp b/src/cm_common/cm_misc_base.cpp index 0734ca80613c6e0f8fc4c736d7120ff8c728d90a..29d1c13780eb29072f16d1729b23774e7d64fea4 100644 --- a/src/cm_common/cm_misc_base.cpp +++ b/src/cm_common/cm_misc_base.cpp @@ -184,20 +184,28 @@ int GetHomePath(char *outputEnvValue, uint32 envValueLen, int32 logLevel) return 0; } -bool IsBoolCmParamTrue(const char *param) +bool IsBoolCmParamTrue(const char *value) { - return (strcasecmp(param, "on") == 0) || (strcasecmp(param, "yes") == 0) || (strcasecmp(param, "true") == 0) || - (strcasecmp(param, "1") == 0); + return (strcasecmp(value, "on") == 0) || (strcasecmp(value, "yes") == 0) || + (strcasecmp(value, "true") == 0) || (strcasecmp(value, "1") == 0) || + (strcasecmp(value, "y") == 0) || (strcasecmp(value, "t") == 0); +} + +bool IsBoolCmParamFalse(const char *value) +{ + return (strcasecmp(value, "off") == 0) || (strcasecmp(value, "no") == 0) || + (strcasecmp(value, "false") == 0) || (strcasecmp(value, "0") == 0) || + (strcasecmp(value, "n") == 0) || (strcasecmp(value, "f") == 0); } bool CheckBoolConfigParam(const char* value) { - if (strcasecmp(value, "on") == 0 || strcasecmp(value, "yes") == 0 || strcasecmp(value, "true") == 0 || - strcasecmp(value, "1") == 0 || strcasecmp(value, "off") == 0 || strcasecmp(value, "no") == 0 || - strcasecmp(value, "false") == 0 || strcasecmp(value, "0") == 0) { - return true; - } - return false; + return (strcasecmp(value, "on") == 0) || (strcasecmp(value, "yes") == 0) || + (strcasecmp(value, "true") == 0) || (strcasecmp(value, "1") == 0) || + (strcasecmp(value, "y") == 0) || (strcasecmp(value, "t") == 0) || + (strcasecmp(value, "off") == 0) || (strcasecmp(value, "no") == 0) || + (strcasecmp(value, "false") == 0) || (strcasecmp(value, "0") == 0) || + (strcasecmp(value, "n") == 0) || (strcasecmp(value, "f") == 0); } bool IsSharedStorageMode() diff --git a/src/cm_ctl/ctl_param_check.cpp b/src/cm_ctl/ctl_param_check.cpp index 50b3cfad7e8959d6f1d419c988fb931117ccfd97..948178d30fbf200bb96cb36e6e754c941d842820 100644 --- a/src/cm_ctl/ctl_param_check.cpp +++ b/src/cm_ctl/ctl_param_check.cpp @@ -154,6 +154,10 @@ const char *g_boolValueList[] = { "no", "0", "1", + "y", + "n", + "t", + "f", }; const char *g_ddbLogLevelList[] { @@ -486,17 +490,6 @@ static status_t ParseParamInfo(const char *infoStr, ParamEnumEntry &varList) return CM_SUCCESS; } -static bool IsStringInList(const char *str, const char * const *strList, uint32 listNums) -{ - for (uint32 i = 0; i < listNums; i++) { - if (strcmp(strList[i], str) == 0) { - return true; - } - } - - return false; -} - static bool IsValueInRange(const char *listValue, const char *value) { int ret; @@ -841,7 +834,8 @@ static status_t CheckDdbLogLevel(const char *param, const char *value) } while (ptr != NULL) { - if (!IsStringInList(ptr, g_ddbLogLevelList, (uint32)lengthof(g_ddbLogLevelList))) { + uint32 listNums = lengthof(g_ddbLogLevelList); + if (!IsStringInList(ptr, g_ddbLogLevelList, listNums)) { write_runlog(ERROR, "The %s is outside the valid range for parameter \"%s\".\n", ptr, param); return CM_ERROR; } diff --git a/src/include/cm/cm_agent/cma_global_params.h b/src/include/cm/cm_agent/cma_global_params.h index 1eb6adfe207974f1ae573692ae0c9ee27dec6981..bf0812dc056f347e60e64e0ad938b52c79fa8821 100644 --- a/src/include/cm/cm_agent/cma_global_params.h +++ b/src/include/cm/cm_agent/cma_global_params.h @@ -163,6 +163,7 @@ extern char g_votingDiskPath[MAX_PATH_LEN]; extern char g_logBasePath[MAXPGPATH]; extern char g_enableCnAutoRepair[BOOL_STR_MAX_LEN]; extern char g_enableOnlineOrOffline[BOOL_STR_MAX_LEN]; +extern char g_enableIncrementalBuild[BOOL_STR_MAX_LEN]; extern char g_enableLogCompress[BOOL_STR_MAX_LEN]; extern char instance_maintance_path[MAX_PATH_LEN]; diff --git a/src/include/cm/cm_agent/cma_main.h b/src/include/cm/cm_agent/cma_main.h index 78d2be5e41c7393026cb1b7a772cc037ce1363f9..114815330ba0b6599230fcf071a0eafeb52b2aa4 100644 --- a/src/include/cm/cm_agent/cma_main.h +++ b/src/include/cm/cm_agent/cma_main.h @@ -124,6 +124,11 @@ void sortLogFileByTimeAsc(LogFile* logFile, int low, int high); */ void get_start_mode(char* config_file); +/* + * get the mode of the build + */ +void get_build_mode(char* config_file); + /* * used for connection mode or option between cm_agent and cn/dn. */ diff --git a/src/include/cm/cm_misc.h b/src/include/cm/cm_misc.h index 2a9f06397cc94abbbba904876e808c4565dbf98e..01dcd3943a626e8d0245a8c73e32dede89c88481 100644 --- a/src/include/cm/cm_misc.h +++ b/src/include/cm/cm_misc.h @@ -244,6 +244,8 @@ extern void print_environ(void); extern const char* CmGetmsgtype(const CM_StringInfo msg, int datalen); extern const char* CmGetmsgbytes(CM_StringInfo msg, int datalen); extern const char* CmGetmsgbytesPtr(const CM_Result *msg, int datalen); +extern bool IsStringInList(const char *str, const char * const *strList, uint32 listNums); +extern uint32 GetArrayLength(const char* arr[]); /** * @brief diff --git a/src/include/cm/cm_misc_base.h b/src/include/cm/cm_misc_base.h index a72240b5c1749a13b72ab9904e0900f0bb8cb47a..b14d4e11170ec44d2e4f002f4bcab4f4871b18f6 100644 --- a/src/include/cm/cm_misc_base.h +++ b/src/include/cm/cm_misc_base.h @@ -55,7 +55,6 @@ extern int GetHomePath(char *outputEnvValue, uint32 envValueLen, int32 logLevel extern void CmUsleep(unsigned int usec); bool IsSharedStorageMode(); -bool IsBoolCmParamTrue(const char *param); status_t TcpSendMsg(int socket, const char *buf, size_t remainSize, uint32 timeout = CM_TCP_TIMEOUT); status_t TcpRecvMsg(int socket, char *buf, size_t remainSize, uint32 timeout = CM_TCP_TIMEOUT); long GetCurMonotonicTimeSec(); @@ -63,5 +62,7 @@ void InitPthreadCondMonotonic(pthread_cond_t *cond); bool CmFileExist(const char *file_path); bool CheckBoolConfigParam(const char* value); +bool IsBoolCmParamTrue(const char *value); +bool IsBoolCmParamFalse(const char *value); #endif // CM_MISC_API_H diff --git a/src/include/opengauss/cm/elog.h b/src/include/opengauss/cm/elog.h index 09f84f4c218158ec943b6970de2db230837920f5..7af630a29d40664ec6a5ca1e60ab02405910a841 100644 --- a/src/include/opengauss/cm/elog.h +++ b/src/include/opengauss/cm/elog.h @@ -153,7 +153,6 @@ void switchLogFile(void); void get_log_paramter(const char* confDir); int get_cm_thread_count(const char* config_file); -void get_build_mode(const char* config_file); /* trim blank characters on both ends */ char* trim(char* src); int is_comment_line(const char* str);