From a96e21aabd83133353be90fdb0beb6d3babcad89 Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Mon, 13 Nov 2023 14:49:50 +0800 Subject: [PATCH] enh: refactor dynamic config --- include/common/tglobal.h | 4 +- source/client/src/clientEnv.c | 2 +- source/common/src/tglobal.c | 665 +++++++++----------- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 5 +- source/libs/command/src/command.c | 2 +- 5 files changed, 295 insertions(+), 383 deletions(-) diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 8688e07932..58517a5db0 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -217,13 +217,13 @@ int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDi int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc); void taosCleanupCfg(); -void taosCfgDynamicOptions(const char *option, const char *value); + +int32_t taosCfgDynamicOptions(SConfig *pCfg, char *name, bool forServer); struct SConfig *taosGetCfg(); void taosSetAllDebugFlag(int32_t flag, bool rewrite); void taosSetDebugFlag(int32_t *pFlagPtr, const char *flagName, int32_t flagVal, bool rewrite); -int32_t taosApplyLocalCfg(SConfig *pCfg, char *name); void taosLocalCfgForbiddenToChange(char *name, bool *forbidden); int8_t taosGranted(); diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index b36ef20b53..da24bc0a3b 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -776,7 +776,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) { } else { tscInfo("set cfg:%s to %s", pItem->name, str); if (TSDB_OPTION_SHELL_ACTIVITY_TIMER == option || TSDB_OPTION_USE_ADAPTER == option) { - code = taosApplyLocalCfg(pCfg, pItem->name); + code = taosCfgDynamicOptions(pCfg, pItem->name, false); } } diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 02af482e63..dcc5d5610a 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -722,7 +722,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { if (cfgAddBool(pCfg, "disableStream", tsDisableStream, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0) return -1; if (cfgAddInt64(pCfg, "streamBufferSize", tsStreamBufferSize, 0, INT64_MAX, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; - if (cfgAddInt64(pCfg, "checkpointInterval", tsStreamCheckpointInterval, 60, 1200, CFG_SCOPE_SERVER, + if (cfgAddInt32(pCfg, "checkpointInterval", tsStreamCheckpointInterval, 60, 1200, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0) return -1; if (cfgAddFloat(pCfg, "streamSinkDataRate", tsSinkDataRate, 0.1, 5, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; @@ -1195,302 +1195,6 @@ static int32_t taosSetReleaseCfg(SConfig *pCfg) { return 0; } int32_t taosSetReleaseCfg(SConfig *pCfg); #endif -int32_t taosApplyLocalCfg(SConfig *pCfg, char *name) { - int32_t len = strlen(name); - char lowcaseName[CFG_NAME_MAX_LEN + 1] = {0}; - strntolower(lowcaseName, name, TMIN(CFG_NAME_MAX_LEN, len)); - bool matchItem = true; - - switch (lowcaseName[0]) { - case 'a': { - if (strcasecmp("asyncLog", name) == 0) { - tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval; - } else if (strcasecmp("assert", name) == 0) { - tsAssert = cfgGetItem(pCfg, "assert")->bval; - } else { - matchItem = false; - } - break; - } - case 'c': { - if (strcasecmp("compressMsgSize", name) == 0) { - tsCompressMsgSize = cfgGetItem(pCfg, "compressMsgSize")->i32; - } else if (strcasecmp("countAlwaysReturnValue", name) == 0) { - tsCountAlwaysReturnValue = cfgGetItem(pCfg, "countAlwaysReturnValue")->i32; - } else if (strcasecmp("cDebugFlag", name) == 0) { - cDebugFlag = cfgGetItem(pCfg, "cDebugFlag")->i32; - } else if (strcasecmp("crashReporting", name) == 0) { - tsEnableCrashReport = cfgGetItem(pCfg, "crashReporting")->bval; - } else { - matchItem = false; - } - break; - } - case 'd': { - if (strcasecmp("dDebugFlag", name) == 0) { - dDebugFlag = cfgGetItem(pCfg, "dDebugFlag")->i32; - } else if (strcasecmp("debugFlag", name) == 0) { - int32_t flag = cfgGetItem(pCfg, "debugFlag")->i32; - taosSetAllDebugFlag(flag, true); - } else { - matchItem = false; - } - break; - } - case 'e': { - if (strcasecmp("enableCoreFile", name) == 0) { - bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval; - taosSetCoreDump(enableCore); - } else if (strcasecmp("enableQueryHb", name) == 0) { - tsEnableQueryHb = cfgGetItem(pCfg, "enableQueryHb")->bval; - } else { - matchItem = false; - } - break; - } - case 'f': { - if (strcasecmp("fqdn", name) == 0) { - tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); - tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; - snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); - - char defaultFirstEp[TSDB_EP_LEN] = {0}; - snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); - - SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); - SEp firstEp = {0}; - taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); - snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); - cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); - } else if (strcasecmp("firstEp", name) == 0) { - tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); - tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; - snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); - - char defaultFirstEp[TSDB_EP_LEN] = {0}; - snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); - - SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); - SEp firstEp = {0}; - taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); - snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); - cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); - } else if (strcasecmp("fsDebugFlag", name) == 0) { - fsDebugFlag = cfgGetItem(pCfg, "fsDebugFlag")->i32; - } else { - matchItem = false; - } - break; - } - case 'i': { - if (strcasecmp("idxDebugFlag", name) == 0) { - idxDebugFlag = cfgGetItem(pCfg, "idxDebugFlag")->i32; - } else { - matchItem = false; - } - break; - } - case 'j': { - if (strcasecmp("jniDebugFlag", name) == 0) { - jniDebugFlag = cfgGetItem(pCfg, "jniDebugFlag")->i32; - } else { - matchItem = false; - } - break; - } - case 'k': { - if (strcasecmp("keepColumnName", name) == 0) { - tsKeepColumnName = cfgGetItem(pCfg, "keepColumnName")->bval; - } else if (strcasecmp("keepAliveIdle", name) == 0) { - tsKeepAliveIdle = cfgGetItem(pCfg, "keepAliveIdle")->i32; - } else { - matchItem = false; - } - break; - } - case 'l': { - if (strcasecmp("locale", name) == 0) { - const char *locale = cfgGetItem(pCfg, "locale")->str; - const char *charset = cfgGetItem(pCfg, "charset")->str; - taosSetSystemLocale(locale, charset); - osSetSystemLocale(locale, charset); - } else if (strcasecmp("logDir", name) == 0) { - tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX); - taosExpandDir(tsLogDir, tsLogDir, PATH_MAX); - } else if (strcasecmp("logKeepDays", name) == 0) { - tsLogKeepDays = cfgGetItem(pCfg, "logKeepDays")->i32; - } else { - matchItem = false; - } - break; - } - case 'm': { - switch (lowcaseName[1]) { - case 'a': { - if (strcasecmp("maxInsertBatchRows", name) == 0) { - tsMaxInsertBatchRows = cfgGetItem(pCfg, "maxInsertBatchRows")->i32; - } else if (strcasecmp("maxRetryWaitTime", name) == 0) { - tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32; - } else { - matchItem = false; - } - break; - } - case 'e': { - if (strcasecmp("metaCacheMaxSize", name) == 0) { - atomic_store_32(&tsMetaCacheMaxSize, cfgGetItem(pCfg, "metaCacheMaxSize")->i32); - } else { - matchItem = false; - } - break; - } - case 'i': { - if (strcasecmp("minimalTmpDirGB", name) == 0) { - tsTempSpace.reserved = (int64_t)(((double)cfgGetItem(pCfg, "minimalTmpDirGB")->fval) * 1024 * 1024 * 1024); - } else if (strcasecmp("minimalDataDirGB", name) == 0) { - tsDataSpace.reserved = (int64_t)(((double)cfgGetItem(pCfg, "minimalDataDirGB")->fval) * 1024 * 1024 * 1024); - } else if (strcasecmp("minSlidingTime", name) == 0) { - tsMinSlidingTime = cfgGetItem(pCfg, "minSlidingTime")->i32; - } else if (strcasecmp("minIntervalTime", name) == 0) { - tsMinIntervalTime = cfgGetItem(pCfg, "minIntervalTime")->i32; - } else if (strcasecmp("minimalLogDirGB", name) == 0) { - tsLogSpace.reserved = (int64_t)(((double)cfgGetItem(pCfg, "minimalLogDirGB")->fval) * 1024 * 1024 * 1024); - } else { - matchItem = false; - } - break; - } - default: - terrno = TSDB_CODE_CFG_NOT_FOUND; - return -1; - } - break; - } - case 'n': { - if (strcasecmp("numOfLogLines", name) == 0) { - tsNumOfLogLines = cfgGetItem(pCfg, "numOfLogLines")->i32; - } else { - matchItem = false; - } - break; - } - case 'q': { - if (strcasecmp("querySmaOptimize", name) == 0) { - tsQuerySmaOptimize = cfgGetItem(pCfg, "querySmaOptimize")->i32; - } else if (strcasecmp("queryPolicy", name) == 0) { - tsQueryPolicy = cfgGetItem(pCfg, "queryPolicy")->i32; - } else if (strcasecmp("qDebugFlag", name) == 0) { - qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32; - } else if (strcasecmp("queryPlannerTrace", name) == 0) { - tsQueryPlannerTrace = cfgGetItem(pCfg, "queryPlannerTrace")->bval; - } else if (strcasecmp("queryNodeChunkSize", name) == 0) { - tsQueryNodeChunkSize = cfgGetItem(pCfg, "queryNodeChunkSize")->i32; - } else if (strcasecmp("queryUseNodeAllocator", name) == 0) { - tsQueryUseNodeAllocator = cfgGetItem(pCfg, "queryUseNodeAllocator")->bval; - } else { - matchItem = false; - } - break; - } - case 'r': { - if (strcasecmp("rpcDebugFlag", name) == 0) { - rpcDebugFlag = cfgGetItem(pCfg, "rpcDebugFlag")->i32; - } else { - matchItem = false; - } - break; - } - case 's': { - if (strcasecmp("secondEp", name) == 0) { - SConfigItem *pSecondpItem = cfgGetItem(pCfg, "secondEp"); - SEp secondEp = {0}; - taosGetFqdnPortFromEp(strlen(pSecondpItem->str) == 0 ? tsFirst : pSecondpItem->str, &secondEp); - snprintf(tsSecond, sizeof(tsSecond), "%s:%u", secondEp.fqdn, secondEp.port); - cfgSetItem(pCfg, "secondEp", tsSecond, pSecondpItem->stype); - } else if (strcasecmp("smlChildTableName", name) == 0) { - tstrncpy(tsSmlChildTableName, cfgGetItem(pCfg, "smlChildTableName")->str, TSDB_TABLE_NAME_LEN); - } else if (strcasecmp("smlAutoChildTableNameDelimiter", name) == 0) { - tstrncpy(tsSmlAutoChildTableNameDelimiter, cfgGetItem(pCfg, "smlAutoChildTableNameDelimiter")->str, - TSDB_TABLE_NAME_LEN); - } else if (strcasecmp("smlTagName", name) == 0) { - tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN); - // } else if (strcasecmp("smlDataFormat", name) == 0) { - // tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval; - // } else if (strcasecmp("smlBatchSize", name) == 0) { - // tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32; - } else if (strcasecmp("smlTsDefaultName", name) == 0) { - tstrncpy(tsSmlTsDefaultName, cfgGetItem(pCfg, "smlTsDefaultName")->str, TSDB_COL_NAME_LEN); - } else if (strcasecmp("smlDot2Underline", name) == 0) { - tsSmlDot2Underline = cfgGetItem(pCfg, "smlDot2Underline")->bval; - } else if (strcasecmp("shellActivityTimer", name) == 0) { - tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32; - } else if (strcasecmp("serverPort", name) == 0) { - tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); - tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; - snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); - - char defaultFirstEp[TSDB_EP_LEN] = {0}; - snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); - - SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); - SEp firstEp = {0}; - taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); - snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); - cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); - } else if (strcasecmp("smaDebugFlag", name) == 0) { - smaDebugFlag = cfgGetItem(pCfg, "smaDebugFlag")->i32; - } else if (strcasecmp("slowLogThreshold", name) == 0) { - tsSlowLogThreshold = cfgGetItem(pCfg, "slowLogThreshold")->i32; - } else if (strcasecmp("slowLogScope", name) == 0) { - if (taosSetSlowLogScope(cfgGetItem(pCfg, "slowLogScope")->str)) { - return -1; - } - } else { - matchItem = false; - } - break; - } - case 't': { - if (strcasecmp("timezone", name) == 0) { - SConfigItem *pItem = cfgGetItem(pCfg, "timezone"); - osSetTimezone(pItem->str); - uDebug("timezone format changed from %s to %s", pItem->str, tsTimezoneStr); - cfgSetItem(pCfg, "timezone", tsTimezoneStr, pItem->stype); - } else if (strcasecmp("tempDir", name) == 0) { - tstrncpy(tsTempDir, cfgGetItem(pCfg, "tempDir")->str, PATH_MAX); - taosExpandDir(tsTempDir, tsTempDir, PATH_MAX); - if (taosMulMkDir(tsTempDir) != 0) { - uError("failed to create tempDir:%s since %s", tsTempDir, terrstr()); - return -1; - } - } else if (strcasecmp("telemetryServer", name) == 0) { - tstrncpy(tsTelemServer, cfgGetItem(pCfg, "telemetryServer")->str, TSDB_FQDN_LEN); - } else if (strcasecmp("tmrDebugFlag", name) == 0) { - tmrDebugFlag = cfgGetItem(pCfg, "tmrDebugFlag")->i32; - } else { - matchItem = false; - } - break; - } - case 'u': { - if (strcasecmp("uDebugFlag", name) == 0) { - uDebugFlag = cfgGetItem(pCfg, "uDebugFlag")->i32; - } else if (strcasecmp("useAdapter", name) == 0) { - tsUseAdapter = cfgGetItem(pCfg, "useAdapter")->bval; - } else { - matchItem = false; - } - break; - } - default: - terrno = TSDB_CODE_CFG_NOT_FOUND; - return -1; - } - - if (!matchItem) terrno = TSDB_CODE_CFG_NOT_FOUND; - return matchItem ? 0 : -1; -} - int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc) { if (tsCfg == NULL) osDefaultInit(); @@ -1628,48 +1332,98 @@ void taosCleanupCfg() { tsCfg = NULL; } } + typedef struct { const char *optionName; void *optionVar; } OptionNameAndVar; -void taosCfgDynamicOptions(const char *option, const char *value) { - if (strncasecmp(option, "debugFlag", 9) == 0) { - int32_t flag = atoi(value); - taosSetAllDebugFlag(flag, true); - return; +static int32_t taosCfgSetOption(OptionNameAndVar *pOptions, int32_t optionSize, SConfigItem *pItem, bool isDebugflag) { + terrno = TSDB_CODE_INVALID_CFG; + char *name = pItem->name; + for (int32_t d = 0; d < optionSize; ++d) { + const char *optName = pOptions[d].optionName; + int32_t optLen = strlen(optName); + if (strncasecmp(name, optName, optLen) != 0) continue; + switch (pItem->dtype) { + case CFG_DTYPE_BOOL: { + int32_t flag = pItem->i32; + bool *pVar = pOptions[d].optionVar; + uInfo("%s set from %d to %d", optName, *pVar, flag); + *pVar = flag; + terrno = TSDB_CODE_SUCCESS; + } break; + case CFG_DTYPE_INT32: { + int32_t flag = pItem->i32; + int32_t *pVar = pOptions[d].optionVar; + uInfo("%s set from %d to %d", optName, *pVar, flag); + *pVar = flag; + + if (isDebugflag) { + taosSetDebugFlag(pOptions[d].optionVar, optName, flag, true); + } + terrno = TSDB_CODE_SUCCESS; + } break; + case CFG_DTYPE_INT64: { + int64_t flag = pItem->i64; + int64_t *pVar = pOptions[d].optionVar; + uInfo("%s set from %" PRId64 " to %" PRId64, optName, *pVar, flag); + *pVar = flag; + terrno = TSDB_CODE_SUCCESS; + } break; + case CFG_DTYPE_FLOAT: + case CFG_DTYPE_DOUBLE: { + float flag = pItem->fval; + float *pVar = pOptions[d].optionVar; + uInfo("%s set from %f to %f", optName, *pVar, flag); + *pVar = flag; + terrno = TSDB_CODE_SUCCESS; + } break; + default: + terrno = TSDB_CODE_INVALID_CFG; + break; + } + + break; } - if (strcasecmp(option, "resetlog") == 0) { + return terrno == TSDB_CODE_SUCCESS ? 0 : -1; +} + +static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, char *name) { + terrno = TSDB_CODE_SUCCESS; + + SConfigItem *pItem = cfgGetItem(pCfg, name); + if (!pItem || (pItem->dynScope & CFG_DYN_SERVER) == 0) { + uError("failed to config:%s, not support", name); + terrno = TSDB_CODE_INVALID_CFG; + return -1; + } + + if (strncasecmp(name, "debugFlag", 9) == 0) { + int32_t flag = pItem->i32; + taosSetAllDebugFlag(flag, true); + return 0; + } + + if (strcasecmp(name, "resetlog") == 0) { taosResetLog(); cfgDumpCfg(tsCfg, 0, false); - return; + return 0; } { // 'bool/int32_t/int64_t/float/double' variables with general modification function - const int32_t nDebugFlag = 20; - static OptionNameAndVar options[] = { - {"dDebugFlag", &dDebugFlag}, - {"vDebugFlag", &vDebugFlag}, - {"mDebugFlag", &mDebugFlag}, - {"wDebugFlag", &wDebugFlag}, - {"sDebugFlag", &sDebugFlag}, - {"tsdbDebugFlag", &tsdbDebugFlag}, - {"tqDebugFlag", &tqDebugFlag}, - {"fsDebugFlag", &fsDebugFlag}, - {"udfDebugFlag", &udfDebugFlag}, - {"smaDebugFlag", &smaDebugFlag}, - {"idxDebugFlag", &idxDebugFlag}, - {"tdbDebugFlag", &tdbDebugFlag}, - {"tmrDebugFlag", &tmrDebugFlag}, - {"uDebugFlag", &uDebugFlag}, - {"smaDebugFlag", &smaDebugFlag}, - {"rpcDebugFlag", &rpcDebugFlag}, - {"qDebugFlag", &qDebugFlag}, - {"metaDebugFlag", &metaDebugFlag}, - {"jniDebugFlag", &jniDebugFlag}, - {"stDebugFlag", &stDebugFlag}, + static OptionNameAndVar debugOptions[] = { + {"dDebugFlag", &dDebugFlag}, {"vDebugFlag", &vDebugFlag}, {"mDebugFlag", &mDebugFlag}, + {"wDebugFlag", &wDebugFlag}, {"sDebugFlag", &sDebugFlag}, {"tsdbDebugFlag", &tsdbDebugFlag}, + {"tqDebugFlag", &tqDebugFlag}, {"fsDebugFlag", &fsDebugFlag}, {"udfDebugFlag", &udfDebugFlag}, + {"smaDebugFlag", &smaDebugFlag}, {"idxDebugFlag", &idxDebugFlag}, {"tdbDebugFlag", &tdbDebugFlag}, + {"tmrDebugFlag", &tmrDebugFlag}, {"uDebugFlag", &uDebugFlag}, {"smaDebugFlag", &smaDebugFlag}, + {"rpcDebugFlag", &rpcDebugFlag}, {"qDebugFlag", &qDebugFlag}, {"metaDebugFlag", &metaDebugFlag}, + {"jniDebugFlag", &jniDebugFlag}, {"stDebugFlag", &stDebugFlag}, + }; + static OptionNameAndVar options[] = { {"audit", &tsEnableAudit}, {"asynclog", &tsAsyncLog}, {"disableStream", &tsDisableStream}, @@ -1702,61 +1456,216 @@ void taosCfgDynamicOptions(const char *option, const char *value) { {"supportVnodes", &tsNumOfSupportVnodes}, }; - int32_t optionSize = tListLen(options); - for (int32_t d = 0; d < optionSize; ++d) { - const char *optName = options[d].optionName; - int32_t optLen = strlen(optName); - if (strncasecmp(option, optName, optLen) != 0) continue; - - SConfig *pCfg = taosGetCfg(); - SConfigItem *pItem = NULL; - - pItem = cfgGetItem(pCfg, optName); - if (!pItem || (pItem->dynScope & CFG_DYN_SERVER) == 0) { - uError("failed to config:%s, not support", optName); - break; - } - - switch (pItem->dtype) { - case CFG_DTYPE_BOOL: { - int32_t flag = atoi(value); - bool *pVar = options[d].optionVar; - uInfo("%s set from %d to %d", optName, *pVar, flag); - *pVar = flag; - } break; - case CFG_DTYPE_INT32: { - int32_t flag = taosStrHumanToInt32(value); - int32_t *pVar = options[d].optionVar; - uInfo("%s set from %d to %d", optName, *pVar, flag); - *pVar = flag; - - if (d < nDebugFlag) { - // debug flags - taosSetDebugFlag(options[d].optionVar, optName, flag, true); - } - } break; - case CFG_DTYPE_INT64: { - int64_t flag = taosStrHumanToInt64(value); - int64_t *pVar = options[d].optionVar; - uInfo("%s set from %" PRId64 " to %" PRId64, optName, *pVar, flag); - *pVar = flag; - } break; - case CFG_DTYPE_FLOAT: - case CFG_DTYPE_DOUBLE: { - float flag = (float)atof(value); - float *pVar = options[d].optionVar; - uInfo("%s set from %f to %f", optName, *pVar, flag); - *pVar = flag; - } break; - default: - break; - } - - return; + if (taosCfgSetOption(debugOptions, tListLen(debugOptions), pItem, true) != 0) { + taosCfgSetOption(options, tListLen(options), pItem, false); } } - uError("failed to cfg dynamic option:%s value:%s", option, value); + return terrno == TSDB_CODE_SUCCESS ? 0 : -1; +} + +static int32_t taosCfgDynamicOptionsForClient(SConfig *pCfg, char *name) { + terrno = TSDB_CODE_SUCCESS; + + SConfigItem *pItem = cfgGetItem(pCfg, name); + if (!pItem || (pItem->dynScope & CFG_DYN_CLIENT) == 0) { + uError("failed to config:%s, not support", name); + terrno = TSDB_CODE_INVALID_CFG; + return -1; + } + + int32_t len = strlen(name); + char lowcaseName[CFG_NAME_MAX_LEN + 1] = {0}; + strntolower(lowcaseName, name, TMIN(CFG_NAME_MAX_LEN, len)); + switch (lowcaseName[0]) { + case 'd': { + if (strcasecmp("debugFlag", name) == 0) { + int32_t flag = pItem->i32; + taosSetAllDebugFlag(flag, true); + } + break; + } + case 'e': { + if (strcasecmp("enableCoreFile", name) == 0) { + bool enableCore = pItem->bval; + taosSetCoreDump(enableCore); + uInfo("%s set to %d", name, enableCore); + } + break; + } + case 'f': { + if (strcasecmp("fqdn", name) == 0) { + tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); + tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; + snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); + + char defaultFirstEp[TSDB_EP_LEN] = {0}; + snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); + + SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); + SEp firstEp = {0}; + taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); + snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); + cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); + uInfo("localEp set to '%s', tsFirst set to '%s'", tsLocalEp, tsFirst); + } else if (strcasecmp("firstEp", name) == 0) { + tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); + tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; + snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); + + char defaultFirstEp[TSDB_EP_LEN] = {0}; + snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); + + SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); + SEp firstEp = {0}; + taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); + snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); + cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); + uInfo("localEp set to '%s', tsFirst set to '%s'", tsLocalEp, tsFirst); + } + break; + } + case 'l': { + if (strcasecmp("locale", name) == 0) { + const char *locale = cfgGetItem(pCfg, "locale")->str; + const char *charset = cfgGetItem(pCfg, "charset")->str; + taosSetSystemLocale(locale, charset); + osSetSystemLocale(locale, charset); + uInfo("locale set to '%s', charset set to '%s'", locale, charset); + } else if (strcasecmp("logDir", name) == 0) { + uInfo("%s set from '%s' to '%s'", name, tsLogDir, pItem->str); + tstrncpy(tsLogDir, pItem->str, PATH_MAX); + taosExpandDir(tsLogDir, tsLogDir, PATH_MAX); + } + break; + } + case 'm': { + if (strcasecmp("metaCacheMaxSize", name) == 0) { + atomic_store_32(&tsMetaCacheMaxSize, pItem->i32); + uInfo("%s set to %d", name, atomic_load_32(&tsMetaCacheMaxSize)); + } else if (strcasecmp("minimalTmpDirGB", name) == 0) { + tsTempSpace.reserved = (int64_t)(((double)pItem->fval) * 1024 * 1024 * 1024); + uInfo("%s set to %"PRId64, name, tsTempSpace.reserved); + } else if (strcasecmp("minimalDataDirGB", name) == 0) { + tsDataSpace.reserved = (int64_t)(((double)pItem->fval) * 1024 * 1024 * 1024); + uInfo("%s set to %"PRId64, name, tsDataSpace.reserved); + } else if (strcasecmp("minimalLogDirGB", name) == 0) { + tsLogSpace.reserved = (int64_t)(((double)pItem->fval) * 1024 * 1024 * 1024); + uInfo("%s set to %"PRId64, name, tsLogSpace.reserved); + } + break; + } + case 's': { + if (strcasecmp("secondEp", name) == 0) { + SEp secondEp = {0}; + taosGetFqdnPortFromEp(strlen(pItem->str) == 0 ? tsFirst : pItem->str, &secondEp); + snprintf(tsSecond, sizeof(tsSecond), "%s:%u", secondEp.fqdn, secondEp.port); + cfgSetItem(pCfg, "secondEp", tsSecond, pItem->stype); + uInfo("%s set to %s", name, tsSecond); + } else if (strcasecmp("smlChildTableName", name) == 0) { + uInfo("%s set from %s to %s", name, tsSmlChildTableName, pItem->str); + tstrncpy(tsSmlChildTableName, pItem->str, TSDB_TABLE_NAME_LEN); + } else if (strcasecmp("smlAutoChildTableNameDelimiter", name) == 0) { + uInfo("%s set from %s to %s", name, tsSmlAutoChildTableNameDelimiter, pItem->str); + tstrncpy(tsSmlAutoChildTableNameDelimiter, pItem->str, TSDB_TABLE_NAME_LEN); + } else if (strcasecmp("smlTagName", name) == 0) { + uInfo("%s set from %s to %s", name, tsSmlTagName, pItem->str); + tstrncpy(tsSmlTagName, pItem->str, TSDB_COL_NAME_LEN); + } else if (strcasecmp("smlTsDefaultName", name) == 0) { + uInfo("%s set from %s to %s", name, tsSmlTsDefaultName, pItem->str); + tstrncpy(tsSmlTsDefaultName, pItem->str, TSDB_COL_NAME_LEN); + } else if (strcasecmp("serverPort", name) == 0) { + tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN); + tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32; + snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort); + + char defaultFirstEp[TSDB_EP_LEN] = {0}; + snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort); + + SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp"); + SEp firstEp = {0}; + taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp); + snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port); + cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); + uInfo("localEp set to '%s', tsFirst set to '%s'", tsLocalEp, tsFirst); + } else if (strcasecmp("slowLogScope", name) == 0) { + if (taosSetSlowLogScope(pItem->str)) { + return -1; + } + uInfo("%s set to %s", name, pItem->str); + } + break; + } + case 't': { + if (strcasecmp("timezone", name) == 0) { + osSetTimezone(pItem->str); + uInfo("%s set from %s to %s", name, tsTimezoneStr, pItem->str); + cfgSetItem(pCfg, "timezone", tsTimezoneStr, pItem->stype); + } else if (strcasecmp("tempDir", name) == 0) { + uInfo("%s set from %s to %s", name, tsTempDir, pItem->str); + tstrncpy(tsTempDir, pItem->str, PATH_MAX); + taosExpandDir(tsTempDir, tsTempDir, PATH_MAX); + if (taosMulMkDir(tsTempDir) != 0) { + uError("failed to create tempDir:%s since %s", tsTempDir, terrstr()); + return -1; + } + } else if (strcasecmp("telemetryServer", name) == 0) { + uInfo("%s set from %s to %s", name, pItem->str, tsTelemServer); + tstrncpy(tsTelemServer, pItem->str, TSDB_FQDN_LEN); + } + break; + } + default: + terrno = TSDB_CODE_CFG_NOT_FOUND; + break; + } + + { // 'bool/int32_t/int64_t/float/double' variables with general modification function + static OptionNameAndVar debugOptions[] = { + {"cDebugFlag", &cDebugFlag}, {"dDebugFlag", &dDebugFlag}, {"fsDebugFlag", &fsDebugFlag}, + {"idxDebugFlag", &idxDebugFlag}, {"jniDebugFlag", &jniDebugFlag}, {"qDebugFlag", &qDebugFlag}, + {"rpcDebugFlag", &rpcDebugFlag}, {"smaDebugFlag", &smaDebugFlag}, {"tmrDebugFlag", &tmrDebugFlag}, + {"uDebugFlag", &uDebugFlag}, + }; + + static OptionNameAndVar options[] = { + {"asyncLog", &tsAsyncLog}, + {"assert", &tsAssert}, + {"compressMsgSize", &tsCompressMsgSize}, + {"countAlwaysReturnValue", &tsCountAlwaysReturnValue}, + {"crashReporting", &tsEnableCrashReport}, + {"enableCoreFile", &tsAsyncLog}, + {"enableQueryHb", &tsEnableQueryHb}, + {"keepColumnName", &tsKeepColumnName}, + {"keepAliveIdle", &tsKeepAliveIdle}, + {"logKeepDays", &tsLogKeepDays}, + {"maxInsertBatchRows", &tsMaxInsertBatchRows}, + {"maxRetryWaitTime", &tsMaxRetryWaitTime}, + {"minSlidingTime", &tsMinSlidingTime}, + {"minIntervalTime", &tsMinIntervalTime}, + {"numOfLogLines", &tsNumOfLogLines}, + {"querySmaOptimize", &tsQuerySmaOptimize}, + {"queryPolicy", &tsQueryPolicy}, + {"queryPlannerTrace", &tsQueryPlannerTrace}, + {"queryNodeChunkSize", &tsQueryNodeChunkSize}, + {"queryUseNodeAllocator", &tsQueryUseNodeAllocator}, + {"smlDot2Underline", &tsSmlDot2Underline}, + {"shellActivityTimer", &tsShellActivityTimer}, + {"slowLogThreshold", &tsSlowLogThreshold}, + {"useAdapter", &tsUseAdapter}, + }; + + if (taosCfgSetOption(debugOptions, tListLen(debugOptions), pItem, true) != 0) { + taosCfgSetOption(options, tListLen(options), pItem, false); + } + } + + return terrno == TSDB_CODE_SUCCESS ? 0 : -1; +} + +int32_t taosCfgDynamicOptions(SConfig *pCfg, char *name, bool forServer) { + if (forServer) return taosCfgDynamicOptionsForServer(pCfg, name); + return taosCfgDynamicOptionsForClient(pCfg, name); } void taosSetDebugFlag(int32_t *pFlagPtr, const char *flagName, int32_t flagVal, bool rewrite) { diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 991f17f326..ac94390619 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -218,7 +218,10 @@ int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { } dInfo("start to config, option:%s, value:%s", cfgReq.config, cfgReq.value); - taosCfgDynamicOptions(cfgReq.config, cfgReq.value); + + SConfig *pCfg = taosGetCfg(); + cfgSetItem(pCfg, cfgReq.config, cfgReq.value, CFG_STYPE_ALTER_CMD); + taosCfgDynamicOptions(pCfg, cfgReq.config, true); return 0; } diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index 12063d4883..6bae0e1022 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -842,7 +842,7 @@ static int32_t execAlterLocal(SAlterLocalStmt* pStmt) { return terrno; } - if (taosApplyLocalCfg(tsCfg, pStmt->config)) { + if (taosCfgDynamicOptions(tsCfg, pStmt->config, false)) { return terrno; }