From 90a2dac7d646df7d04874b397ec8867abce0ea83 Mon Sep 17 00:00:00 2001 From: xiao-77 Date: Wed, 13 Nov 2024 13:56:39 +0800 Subject: [PATCH] Add decode for local/global.json --- include/common/tglobal.h | 4 +- source/common/src/tglobal.c | 180 +++++++++++++++----- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 3 + 3 files changed, 146 insertions(+), 41 deletions(-) diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 89aee31b6a..4095b650f2 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -300,8 +300,8 @@ int32_t persistLocalConfig(const char *path); int32_t localConfigSerialize(SArray *array, char **serialized); int32_t tSerializeSConfigArray(SEncoder *pEncoder, SArray *array); int32_t tDeserializeSConfigArray(SDecoder *pDecoder, SArray *array); - -void printConfigNotMatch(SArray *array); +int32_t setAllConfigs(SConfig *pCfg); +void printConfigNotMatch(SArray *array); int32_t compareSConfigItemArrays(SArray *mArray, const SArray *dArray, SArray *diffArray); #ifdef __cplusplus diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index c8f0759eb1..7462bfe1cd 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -660,7 +660,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "randErrorScope", tsRandErrScope, 0, INT64_MAX, CFG_SCOPE_BOTH, CFG_DYN_BOTH, CFG_CATEGORY_GLOBAL)); - TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "safetyCheckLevel", tsSafetyCheckLevel, 0, 5, CFG_SCOPE_BOTH, CFG_DYN_BOTH,CFG_CATEGORY_GLOBAL)); + TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "safetyCheckLevel", tsSafetyCheckLevel, 0, 5, CFG_SCOPE_BOTH, CFG_DYN_BOTH, + CFG_CATEGORY_GLOBAL)); tsNumOfRpcThreads = tsNumOfCores / 2; tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 2, TSDB_MAX_RPC_THREADS); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfRpcThreads", tsNumOfRpcThreads, 1, 1024, CFG_SCOPE_BOTH, CFG_DYN_BOTH, @@ -1890,6 +1891,140 @@ static int32_t cfgInitWrapper(SConfig **pCfg) { TAOS_RETURN(TSDB_CODE_SUCCESS); } +int32_t setAllConfigs(SConfig *pCfg) { + int32_t code = 0; + int32_t lino = -1; + TAOS_CHECK_GOTO(taosSetClientCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosUpdateServerCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetServerCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetReleaseCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetTfsCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetS3Cfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetSystemCfg(tsCfg), &lino, _exit); + TAOS_CHECK_GOTO(taosSetFileHandlesLimit(), &lino, _exit); +_exit: + TAOS_RETURN(code); +} + +int32_t cfgDeserialize(SArray *array, char *buf, bool isGlobal) { + cJSON *pRoot = cJSON_Parse(buf); + if (pRoot == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + if (isGlobal) { + cJSON *pItem = cJSON_GetObjectItem(pRoot, "version"); + if (pItem == NULL) { + cJSON_Delete(pRoot); + return TSDB_CODE_OUT_OF_MEMORY; + } + tsConfigVersion = pItem->valueint; + } + + int32_t sz = taosArrayGetSize(array); + cJSON *configs = cJSON_GetObjectItem(pRoot, "configs"); + if (configs == NULL) { + cJSON_Delete(pRoot); + return TSDB_CODE_OUT_OF_MEMORY; + } + for (int i = 0; i < sz; i++) { + SConfigItem *item = (SConfigItem *)taosArrayGet(array, i); + cJSON *pItem = cJSON_GetObjectItem(configs, item->name); + if (pItem == NULL) { + continue; + } + switch (item->dtype) { + { + case CFG_DTYPE_NONE: + break; + case CFG_DTYPE_BOOL: + item->bval = cJSON_IsTrue(pItem); + break; + case CFG_DTYPE_INT32: + item->i32 = pItem->valueint; + break; + case CFG_DTYPE_INT64: + item->i64 = atoll(cJSON_GetStringValue(pItem)); + break; + case CFG_DTYPE_FLOAT: + case CFG_DTYPE_DOUBLE: + item->fval = pItem->valuedouble; + break; + case CFG_DTYPE_STRING: + case CFG_DTYPE_DIR: + case CFG_DTYPE_LOCALE: + case CFG_DTYPE_CHARSET: + case CFG_DTYPE_TIMEZONE: + tstrncpy(item->str, pItem->valuestring, strlen(pItem->valuestring)); + break; + } + } + } + cJSON_Delete(pRoot); + return TSDB_CODE_SUCCESS; +} + +int32_t readCfgFile(const char *path, bool isGlobal) { + int32_t code = 0; + char filename[CONFIG_FILE_LEN] = {0}; + SArray *array = NULL; + if (isGlobal) { + array = cfgGetGlobalCfg(tsCfg); + snprintf(filename, sizeof(filename), "%s%sconfig%sglobal.json", path, TD_DIRSEP, TD_DIRSEP); + } else { + array = cfgGetLocalCfg(tsCfg); + snprintf(filename, sizeof(filename), "%s%sconfig%slocal.json", path, TD_DIRSEP, TD_DIRSEP); + } + + int64_t fileSize = 0; + char *buf = NULL; + if (taosStatFile(filename, &fileSize, NULL, NULL) != 0) { + if (terrno != ENOENT) { + uError("failed to stat file:%s , since %s", filename, tstrerror(code)); + code = terrno; + } + TAOS_RETURN(TSDB_CODE_SUCCESS); + } + TdFilePtr pFile = taosOpenFile(filename, TD_FILE_READ); + if (pFile == NULL) { + code = terrno; + TAOS_RETURN(code); + } + buf = (char *)taosMemoryMalloc(fileSize + 1); + if (taosReadFile(pFile, buf, fileSize) != fileSize) { + uError("failed to read file:%s , config since %s", filename, tstrerror(code)); + (void)taosCloseFile(&pFile); + taosMemoryFree(buf); + TAOS_RETURN(terrno); + } + char *serialized = NULL; + code = cfgDeserialize(array, buf, isGlobal); + if (code != TSDB_CODE_SUCCESS) { + uError("failed to deserialize config from %s since %s", filename, tstrerror(code)); + TAOS_RETURN(code); + } + TAOS_RETURN(code); +} + +int32_t tryLoadCfgFromDataDir(SConfig *pCfg) { + int32_t code = 0; + SConfigItem *pItem = NULL; + TAOS_CHECK_GET_CFG_ITEM(tsCfg, pItem, "forceReadConfig"); + tsForceReadConfig = pItem->i32; + if (!tsForceReadConfig) { + code = readCfgFile(tsDataDir, false); + if (code != TSDB_CODE_SUCCESS) { + uError("failed to read local config from %s since %s", tsDataDir, tstrerror(code)); + TAOS_RETURN(code); + } + code = readCfgFile(tsDataDir, true); + if (code != TSDB_CODE_SUCCESS) { + uError("failed to read global config from %s since %s", tsDataDir, tstrerror(code)); + TAOS_RETURN(code); + } + } + TAOS_RETURN(code); +} + int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc) { if (tsCfg != NULL) TAOS_RETURN(TSDB_CODE_SUCCESS); @@ -1924,6 +2059,7 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile tsCfg = NULL; TAOS_RETURN(code); } + tryLoadCfgFromDataDir(tsCfg); if (tsc) { TAOS_CHECK_GOTO(taosSetClientCfg(tsCfg), &lino, _exit); @@ -2602,6 +2738,7 @@ int32_t localConfigSerialize(SArray *array, char **serialized) { return TSDB_CODE_SUCCESS; } +// TODO:close file when error int32_t persistGlobalConfig(SArray *array, const char *path, int32_t version) { // TODO: just tmp ,refactor later int32_t code = 0; @@ -2634,6 +2771,7 @@ int32_t persistGlobalConfig(SArray *array, const char *path, int32_t version) { TAOS_RETURN(code); } taosWriteFile(pConfigFile, serialized, strlen(serialized)); + (void)taosCloseFile(&pConfigFile); return TSDB_CODE_SUCCESS; } @@ -2669,6 +2807,7 @@ int32_t persistLocalConfig(const char *path) { TAOS_RETURN(code); } taosWriteFile(pConfigFile, serialized, strlen(serialized)); + (void)taosCloseFile(&pConfigFile); return TSDB_CODE_SUCCESS; } @@ -2836,41 +2975,4 @@ void printConfigNotMatch(SArray *array) { } } } -} - -// void printConfigNotMatch(SArray *array) { -// uError( -// "The global configuration parameters in the configuration file do not match those in the cluster. Please " -// "turn off the forceReadConfigFile option or modify the global configuration parameters that are not " -// "configured."); -// int32_t sz = taosArrayGetSize(array); -// for (int i = 0; i < sz; i++) { -// SConfigItem *item = (SConfigItem *)taosArrayGet(array, i); -// switch (item->dtype) { -// { -// case CFG_DTYPE_NONE: -// break; -// case CFG_DTYPE_BOOL: -// uError("config %s in cluster value is:%d", item->name, item->bval); -// break; -// case CFG_DTYPE_INT32: -// uError("config %s in cluster value is:%d", item->name, item->i32); -// break; -// case CFG_DTYPE_INT64: -// uError("config %s in cluster value is:%" PRId64, item->name, item->i64); -// break; -// case CFG_DTYPE_FLOAT: -// case CFG_DTYPE_DOUBLE: -// uError("config %s in cluster value is:%f", item->name, item->fval); -// break; -// case CFG_DTYPE_STRING: -// case CFG_DTYPE_DIR: -// case CFG_DTYPE_LOCALE: -// case CFG_DTYPE_CHARSET: -// case CFG_DTYPE_TIMEZONE: -// uError("config %s in cluster value is:%s", item->name, item->str); -// break; -// } -// } -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 0b13f1041f..8f72758cd9 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -312,10 +312,13 @@ static void dmProcessConfigRsp(SDnodeMgmt *pMgmt, SRpcMsg *pRsp) { } } if (!configRsp.isVersionVerified) { + cfgLoadFromArray(tsCfg, configRsp.array); persistGlobalConfig(cfgGetGlobalCfg(tsCfg), pMgmt->path, configRsp.cver); } } + setAllConfigs(tsCfg); persistLocalConfig(pMgmt->path); + setAllConfigs(tsCfg); } _exit: tFreeSConfigRsp(&configRsp);