diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 4e9a9bd801..bb3f0964de 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -326,7 +326,6 @@ int32_t tDeserializeSConfigArray(SDecoder *pDecoder, SArray *array); int32_t setAllConfigs(SConfig *pCfg); void printConfigNotMatch(SArray *array); -int32_t compareSConfigItemArrays(SArray *mArray, const SArray *dArray, SArray *diffArray); bool isConifgItemLazyMode(SConfigItem *item); int32_t taosUpdateTfsItemDisable(SConfig *pCfg, const char *value, void *pTfs); diff --git a/include/os/osTimezone.h b/include/os/osTimezone.h index f770a9dba0..10aed0a964 100644 --- a/include/os/osTimezone.h +++ b/include/os/osTimezone.h @@ -35,6 +35,7 @@ time_t mktime_z(timezone_t, struct tm *); timezone_t tzalloc(char const *); void tzfree(timezone_t); void getTimezoneStr(char *tz); +void truncateTimezoneString(char *tz); #endif diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 84e0ffb313..5b3a015553 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -713,11 +713,11 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { 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_LAZY, - CFG_CATEGORY_GLOBAL)); + CFG_CATEGORY_LOCAL)); tsNumOfRpcSessions = TRANGE(tsNumOfRpcSessions, 100, 100000); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfRpcSessions", tsNumOfRpcSessions, 1, 100000, CFG_SCOPE_BOTH, - CFG_DYN_BOTH_LAZY, CFG_CATEGORY_GLOBAL)); + CFG_DYN_BOTH_LAZY, CFG_CATEGORY_LOCAL)); tsShareConnLimit = TRANGE(tsShareConnLimit, 1, 512); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "shareConnLimit", tsShareConnLimit, 1, 512, CFG_SCOPE_BOTH, CFG_DYN_BOTH_LAZY, @@ -734,7 +734,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 16); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfTaskQueueThreads", tsNumOfTaskQueueThreads, 4, 1024, CFG_SCOPE_CLIENT, - CFG_DYN_CLIENT_LAZY, CFG_CATEGORY_GLOBAL)); + CFG_DYN_CLIENT_LAZY, CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN( cfgAddBool(pCfg, "experimental", tsExperimental, CFG_SCOPE_BOTH, CFG_DYN_BOTH_LAZY, CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddBool(pCfg, "multiResultFunctionStarReturnTags", tsMultiResultFunctionStarReturnTags, @@ -864,12 +864,12 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfSnodeSharedThreads", tsNumOfSnodeStreamThreads, 2, 1024, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfSnodeUniqueThreads", tsNumOfSnodeWriteThreads, 2, 1024, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_LOCAL)); - TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "rpcQueueMemoryAllowed", tsQueueMemoryAllowed, TSDB_MAX_MSG_SIZE * RPC_MEMORY_USAGE_RATIO * 10L, INT64_MAX, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); + TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "rpcQueueMemoryAllowed", tsQueueMemoryAllowed, TSDB_MAX_MSG_SIZE * RPC_MEMORY_USAGE_RATIO * 10L, INT64_MAX, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "syncElectInterval", tsElectInterval, 10, 1000 * 60 * 24 * 2, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "syncHeartbeatInterval", tsHeartbeatInterval, 10, 1000 * 60 * 24 * 2, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "syncHeartbeatTimeout", tsHeartbeatTimeout, 10, 1000 * 60 * 24 * 2, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "syncSnapReplMaxWaitN", tsSnapReplMaxWaitN, 16, (TSDB_SYNC_SNAP_BUFFER_SIZE >> 2), CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); - TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "syncLogBufferMemoryAllowed", tsLogBufferMemoryAllowed, TSDB_MAX_MSG_SIZE * 10L, INT64_MAX, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER,CFG_CATEGORY_GLOBAL)); + TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "syncLogBufferMemoryAllowed", tsLogBufferMemoryAllowed, TSDB_MAX_MSG_SIZE * 10L, INT64_MAX, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER,CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "arbHeartBeatIntervalSec", tsArbHeartBeatIntervalSec, 1, 60 * 24 * 2, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "arbCheckSyncIntervalSec", tsArbCheckSyncIntervalSec, 1, 60 * 24 * 2, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); @@ -947,9 +947,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddFloat(pCfg, "fPrecision", tsFPrecision, 0.0f, 100000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_GLOBAL)); - SConfigItem *pItem = NULL; - TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "fPrecision"); - tsFPrecision = pItem->fval; + TAOS_CHECK_RETURN(cfgAddFloat(pCfg, "dPrecision", tsDPrecision, 0.0f, 1000000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "maxRange", tsMaxRange, 0, 65536, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "curRange", tsCurRange, 0, 65536, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_GLOBAL)); @@ -3196,57 +3194,6 @@ _exit: return code; } -bool compareSConfigItem(const SConfigItem *item1, const SConfigItem *item2) { - switch (item1->dtype) { - case CFG_DTYPE_BOOL: - if (item1->bval != item2->bval) return false; - break; - case CFG_DTYPE_FLOAT: - if (item1->fval != item2->fval) return false; - break; - case CFG_DTYPE_INT32: - if (item1->i32 != item2->i32) return false; - break; - case CFG_DTYPE_INT64: - if (item1->i64 != item2->i64) return false; - break; - case CFG_DTYPE_STRING: - case CFG_DTYPE_DIR: - case CFG_DTYPE_LOCALE: - case CFG_DTYPE_CHARSET: - case CFG_DTYPE_TIMEZONE: - if (strcmp(item1->str, item2->str) != 0) return false; - break; - default: - return false; - } - return true; -} - -int32_t compareSConfigItemArrays(SArray *mArray, const SArray *dArray, SArray *diffArray) { - int32_t code = 0; - int32_t msz = taosArrayGetSize(mArray); - int32_t dsz = taosArrayGetSize(dArray); - - if (msz != dsz) { - return TSDB_CODE_FAILED; - } - - for (int i = 0; i < msz; i++) { - SConfigItem *mItem = (SConfigItem *)taosArrayGet(mArray, i); - SConfigItem *dItem = (SConfigItem *)taosArrayGet(dArray, i); - if (!compareSConfigItem(mItem, dItem)) { - code = TSDB_CODE_FAILED; - if (taosArrayPush(diffArray, mItem) == NULL) { - code = terrno; - return code; - } - } - } - - return code; -} - void printConfigNotMatch(SArray *array) { uError( "The global configuration parameters in the configuration file do not match those in the cluster. Please " diff --git a/source/dnode/mnode/impl/src/mndConfig.c b/source/dnode/mnode/impl/src/mndConfig.c index 0d4265f8e7..099fff7aee 100644 --- a/source/dnode/mnode/impl/src/mndConfig.c +++ b/source/dnode/mnode/impl/src/mndConfig.c @@ -40,6 +40,7 @@ static int32_t initConfigArrayFromSdb(SMnode *pMnode, SArray *array); static int32_t mndTryRebuildConfigSdb(SRpcMsg *pReq); static void cfgArrayCleanUp(SArray *array); static void cfgObjArrayCleanUp(SArray *array); +int32_t compareSConfigItemArrays(SMnode *pMnode, const SArray *dArray, SArray *diffArray); static int32_t mndConfigUpdateTrans(SMnode *pMnode, const char *name, char *pValue, ECfgDataType dtype, int32_t tsmmConfigVersion); @@ -250,7 +251,12 @@ static int32_t mndProcessConfigReq(SRpcMsg *pReq) { configRsp.cver = vObj->i32; if (configRsp.forceReadConfig) { // compare config array from configReq with current config array - if (compareSConfigItemArrays(taosGetGlobalCfg(tsCfg), configReq.array, array)) { + code = compareSConfigItemArrays(pMnode, configReq.array, array); + if (code != TSDB_CODE_SUCCESS) { + mError("failed to compare config array, since %s", tstrerror(code)); + goto _OVER; + } + if (taosArrayGetSize(array) > 0) { configRsp.array = array; } else { configRsp.isConifgVerified = 1; @@ -293,7 +299,7 @@ _OVER: } sdbRelease(pMnode->pSdb, vObj); cfgArrayCleanUp(array); - return TSDB_CODE_SUCCESS; + return code; } int32_t mndInitWriteCfg(SMnode *pMnode) { @@ -921,4 +927,85 @@ _OVER: tFreeSShowVariablesRsp(&rsp); TAOS_RETURN(code); +} + +int32_t compareSConfigItem(const SConfigObj *item1, SConfigItem *item2, bool *compare) { + switch (item1->dtype) { + case CFG_DTYPE_BOOL: + if (item1->bval != item2->bval) { + item2->bval = item1->bval; + *compare = false; + } + break; + case CFG_DTYPE_FLOAT: + if (item1->fval != item2->fval) { + item2->fval = item1->fval; + *compare = false; + } + break; + case CFG_DTYPE_INT32: + if (item1->i32 != item2->i32) { + item2->i32 = item1->i32; + *compare = false; + } + break; + case CFG_DTYPE_INT64: + if (item1->i64 != item2->i64) { + item2->i64 = item1->i64; + *compare = false; + } + break; + case CFG_DTYPE_STRING: + case CFG_DTYPE_DIR: + case CFG_DTYPE_LOCALE: + case CFG_DTYPE_CHARSET: + case CFG_DTYPE_TIMEZONE: + if (strcmp(item1->str, item2->str) != 0) { + taosMemoryFree(item2->str); + item2->str = taosStrdup(item1->str); + if (item2->str == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + *compare = false; + } + break; + default: + *compare = false; + return TSDB_CODE_INVALID_CFG; + } + *compare = true; + return TSDB_CODE_SUCCESS; +} + +int32_t compareSConfigItemArrays(SMnode *pMnode, const SArray *dArray, SArray *diffArray) { + int32_t code = 0; + int32_t dsz = taosArrayGetSize(dArray); + bool compare = false; + + for (int i = 0; i < dsz; i++) { + SConfigItem *dItem = (SConfigItem *)taosArrayGet(dArray, i); + SConfigObj *mObj = sdbAcquire(pMnode->pSdb, SDB_CFG, dItem->name); + if (mObj == NULL) { + code = terrno; + mError("failed to acquire config:%s from sdb, since %s", dItem->name, tstrerror(code)); + return code; + } + + code = compareSConfigItem(mObj, dItem, &compare); + if (code != TSDB_CODE_SUCCESS) { + sdbRelease(pMnode->pSdb, mObj); + return code; + } + + if (!compare) { + if (taosArrayPush(diffArray, dItem) == NULL) { + sdbRelease(pMnode->pSdb, mObj); + return terrno; + } + } + + sdbRelease(pMnode->pSdb, mObj); + } + + return code; } \ No newline at end of file diff --git a/source/os/src/osTimezone.c b/source/os/src/osTimezone.c index cad3f426f2..4b06930118 100644 --- a/source/os/src/osTimezone.c +++ b/source/os/src/osTimezone.c @@ -872,6 +872,13 @@ END: } #endif +void truncateTimezoneString(char *tz) { + char *spacePos = strchr(tz, ' '); + if (spacePos != NULL) { + *spacePos = '\0'; + } +} + int32_t taosGetSystemTimezone(char *outTimezoneStr) { #ifdef WINDOWS char value[100] = {0}; diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index 9ca53c8202..a67015e11d 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -97,6 +97,7 @@ int32_t cfgLoadFromArray(SConfig *pCfg, SArray *pArgs) { } int32_t cfgUpdateFromArray(SConfig *pCfg, SArray *pArgs) { + int32_t code = TSDB_CODE_SUCCESS; int32_t size = taosArrayGetSize(pArgs); for (int32_t i = 0; i < size; ++i) { SConfigItem *pItemNew = taosArrayGet(pArgs, i); @@ -124,9 +125,6 @@ int32_t cfgUpdateFromArray(SConfig *pCfg, SArray *pArgs) { break; case CFG_DTYPE_STRING: case CFG_DTYPE_DIR: - case CFG_DTYPE_LOCALE: - case CFG_DTYPE_CHARSET: - case CFG_DTYPE_TIMEZONE: taosMemoryFree(pItemOld->str); pItemOld->str = taosStrdup(pItemNew->str); if (pItemOld->str == NULL) { @@ -134,6 +132,22 @@ int32_t cfgUpdateFromArray(SConfig *pCfg, SArray *pArgs) { TAOS_RETURN(terrno); } break; + case CFG_DTYPE_LOCALE: + case CFG_DTYPE_CHARSET: + code = cfgSetItemVal(pItemOld, pItemNew->name, pItemNew->str, pItemNew->stype); + if (code != TSDB_CODE_SUCCESS) { + (void)taosThreadMutexUnlock(&pCfg->lock); + TAOS_RETURN(code); + } + break; + case CFG_DTYPE_TIMEZONE: + truncateTimezoneString(pItemNew->str); + code = cfgSetItemVal(pItemOld, pItemNew->name, pItemNew->str, pItemNew->stype); + if (code != TSDB_CODE_SUCCESS) { + (void)taosThreadMutexUnlock(&pCfg->lock); + TAOS_RETURN(code); + } + break; default: break; } diff --git a/tests/army/alter/alterConfig.py b/tests/army/alter/alterConfig.py index 3fd0a51576..2b85e16a90 100644 --- a/tests/army/alter/alterConfig.py +++ b/tests/army/alter/alterConfig.py @@ -176,7 +176,12 @@ class TDTestCase(TBase): def alter_err_case(self): tdSql.error(f"alter local 'audit 0'",expectErrInfo="Config not found") tdSql.error(f"alter dnode 1 'audit 1'",expectErrInfo="Invalid config option") - + + def alter_dnode_1_case(self): + tdSql.execute("alter dnode 1 'numOfRpcThreads' '5'") + tdSql.execute("alter dnode 1 'rpcQueueMemoryAllowed' '15242880'") + tdSql.execute("alter dnode 1 'syncLogBufferMemoryAllowed' '115728640'") + # run def run(self): tdLog.debug(f"start to excute {__file__}") @@ -191,6 +196,7 @@ class TDTestCase(TBase): self.alterBypassFlag() # TS-5007 self.alter_err_case() + self.alter_dnode_1_case() tdLog.success(f"{__file__} successfully executed") diff --git a/tests/script/tsim/show/basic.sim b/tests/script/tsim/show/basic.sim index 7569cd832c..0acb97f1b6 100644 --- a/tests/script/tsim/show/basic.sim +++ b/tests/script/tsim/show/basic.sim @@ -230,7 +230,7 @@ endi sql_error show create stable t0; sql show variables; -if $rows != 93 then +if $rows != 88 then return -1 endi diff --git a/tests/script/tsim/valgrind/checkError1.sim b/tests/script/tsim/valgrind/checkError1.sim index 64f9cdec1f..8ac43ebaf3 100644 --- a/tests/script/tsim/valgrind/checkError1.sim +++ b/tests/script/tsim/valgrind/checkError1.sim @@ -120,7 +120,7 @@ if $rows != 3 then endi sql show variables; -if $rows != 93 then +if $rows != 88 then return -1 endi diff --git a/tests/system-test/2-query/db.py b/tests/system-test/2-query/db.py index 66776e0a23..895df852c7 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -47,7 +47,7 @@ class TDTestCase: def case2(self): tdSql.query("show variables") - tdSql.checkRows(93) + tdSql.checkRows(88) for i in range(self.replicaVar): tdSql.query("show dnode %d variables like 'debugFlag'" % (i + 1))