diff --git a/include/util/tdef.h b/include/util/tdef.h index 905a50886a..b813d590a4 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -539,6 +539,8 @@ typedef enum ELogicConditionType { #define TFS_MAX_LEVEL (TFS_MAX_TIERS - 1) #define TFS_PRIMARY_LEVEL 0 #define TFS_PRIMARY_ID 0 +#define TFS_ENTRY_DISABLE 0 +#define TFS_ENTRY_ENABLE 1 #define TFS_MIN_DISK_FREE_SIZE 50 * 1024 * 1024 enum { TRANS_STAT_INIT = 0, TRANS_STAT_EXECUTING, TRANS_STAT_EXECUTED, TRANS_STAT_ROLLBACKING, TRANS_STAT_ROLLBACKED }; @@ -548,7 +550,8 @@ enum { ENCRYPT_KEY_STAT_UNKNOWN = 0, ENCRYPT_KEY_STAT_UNSET, ENCRYPT_KEY_STAT_SE typedef struct { char dir[TSDB_FILENAME_LEN]; int32_t level; - int32_t primary; + int8_t primary; + int8_t enable; } SDiskCfg; typedef struct { diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index c68dc85c29..169bcf56a5 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -221,6 +221,8 @@ int32_t tsDiskCfgNum = 0; SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0}; int64_t tsMinDiskFreeSize = TFS_MIN_DISK_FREE_SIZE; +int a = sizeof(tsDiskCfg); + // stream scheduler bool tsDeployOnSnode = true; @@ -325,6 +327,7 @@ int32_t taosSetTfsCfg(SConfig *pCfg) { tstrncpy(tsDiskCfg[0].dir, pItem->str, TSDB_FILENAME_LEN); tsDiskCfg[0].level = 0; tsDiskCfg[0].primary = 1; + tsDiskCfg[0].enable = 1; tstrncpy(tsDataDir, pItem->str, PATH_MAX); if (taosMulMkDir(tsDataDir) != 0) { uError("failed to create dataDir:%s", tsDataDir); diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c index 5b1f31e6c6..d6031dee15 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c +++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c @@ -110,10 +110,8 @@ static bool dmCheckDiskSpace() { int32_t dmDiskInit() { SDnode *pDnode = dmInstance(); - SDiskCfg dCfg = {0}; + SDiskCfg dCfg = {.level = 0, .primary = 1, .enable = 1}; tstrncpy(dCfg.dir, tsDataDir, TSDB_FILENAME_LEN); - dCfg.level = 0; - dCfg.primary = 1; SDiskCfg *pDisks = tsDiskCfg; int32_t numOfDisks = tsDiskCfgNum; if (numOfDisks <= 0 || pDisks == NULL) { diff --git a/source/dnode/vnode/test/tsdbSmaTest.cpp b/source/dnode/vnode/test/tsdbSmaTest.cpp index 43eaacfff9..e0e4f45feb 100644 --- a/source/dnode/vnode/test/tsdbSmaTest.cpp +++ b/source/dnode/vnode/test/tsdbSmaTest.cpp @@ -368,6 +368,7 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { SDiskCfg pDisks = {0}; pDisks.level = 0; pDisks.primary = 1; + pDisks.enable = 1; strncpy(pDisks.dir, TD_DATA_DIR_PATH, TSDB_FILENAME_LEN); int32_t numOfDisks = 1; pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks); diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index e7c4573c14..dd93b25186 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -519,6 +519,18 @@ static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { return -1; } + if (pCfg->primary < 0 || pCfg->primary > 1) { + fError("failed to mount %s to FS since invalid primary %" PRIi8, pCfg->dir, pCfg->primary); + terrno = TSDB_CODE_FS_INVLD_CFG; + return -1; + } + + if (pCfg->enable < 0 || pCfg->enable > 1) { + fError("failed to mount %s to FS since invalid enable %" PRIi8, pCfg->dir, pCfg->enable); + terrno = TSDB_CODE_FS_INVLD_CFG; + return -1; + } + if (pCfg->primary) { if (pCfg->level != 0) { fError("failed to mount %s to FS since disk is primary but level %d not 0", pCfg->dir, pCfg->level); @@ -526,6 +538,12 @@ static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { return -1; } + if (pCfg->enable == 0) { + fError("failed to mount %s to FS since disk is primary but enable %" PRIi8 " not 1", pCfg->dir, pCfg->enable); + terrno = TSDB_CODE_FS_INVLD_CFG; + return -1; + } + if (TFS_PRIMARY_DISK(pTfs) != NULL) { fError("failed to mount %s to FS since duplicate primary mount", pCfg->dir); terrno = TSDB_CODE_FS_DUP_PRIMARY; diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index 1f16e585ae..2c895f698a 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -37,6 +37,7 @@ TEST_F(TfsTest, 01_Open_Close) { tstrncpy(dCfg.dir, root, TSDB_FILENAME_LEN); dCfg.level = 0; dCfg.primary = 1; + dCfg.enable = 1; taosRemoveDir(root); STfs *pTfs = tfsOpen(&dCfg, 1); @@ -63,6 +64,7 @@ TEST_F(TfsTest, 02_AllocDisk) { tstrncpy(dCfg.dir, root, TSDB_FILENAME_LEN); dCfg.level = 0; dCfg.primary = 1; + dCfg.enable = 1; taosRemoveDir(root); taosMkDir(root); @@ -114,6 +116,7 @@ TEST_F(TfsTest, 03_Dir) { tstrncpy(dCfg.dir, root, TSDB_FILENAME_LEN); dCfg.level = 0; dCfg.primary = 1; + dCfg.enable = 1; taosRemoveDir(root); taosMkDir(root); @@ -330,30 +333,39 @@ TEST_F(TfsTest, 05_MultiDisk) { tstrncpy(dCfg[0].dir, root01, TSDB_FILENAME_LEN); dCfg[0].level = 0; dCfg[0].primary = 0; + dCfg[0].enable = 1; tstrncpy(dCfg[1].dir, root00, TSDB_FILENAME_LEN); dCfg[1].level = 0; dCfg[1].primary = 0; + dCfg[1].enable = 1; tstrncpy(dCfg[2].dir, root20, TSDB_FILENAME_LEN); dCfg[2].level = 2; dCfg[2].primary = 0; + dCfg[2].enable = 1; tstrncpy(dCfg[3].dir, root21, TSDB_FILENAME_LEN); dCfg[3].level = 2; dCfg[3].primary = 0; + dCfg[3].enable = 1; tstrncpy(dCfg[4].dir, root22, TSDB_FILENAME_LEN); dCfg[4].level = 2; dCfg[4].primary = 0; + dCfg[4].enable = 1; tstrncpy(dCfg[5].dir, root23, TSDB_FILENAME_LEN); dCfg[5].level = 2; dCfg[5].primary = 0; + dCfg[5].enable = 1; tstrncpy(dCfg[6].dir, root10, TSDB_FILENAME_LEN); dCfg[6].level = 1; dCfg[6].primary = 0; + dCfg[6].enable = 1; tstrncpy(dCfg[7].dir, root11, TSDB_FILENAME_LEN); dCfg[7].level = 1; dCfg[7].primary = 0; + dCfg[7].enable = 1; tstrncpy(dCfg[8].dir, root12, TSDB_FILENAME_LEN); dCfg[8].level = 1; dCfg[8].primary = 0; + dCfg[8].enable = 1; taosRemoveDir(root00); taosRemoveDir(root01); diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index d05d616233..6aad5cae28 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -259,7 +259,7 @@ static int32_t cfgSetTimezone(SConfigItem *pItem, const char *value, ECfgSrcType } static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value, const char *level, const char *primary, - ECfgSrcType stype) { + const char *enable, ECfgSrcType stype) { taosThreadMutexLock(&pCfg->lock); SConfigItem *pItem = cfgGetItem(pCfg, name); @@ -283,6 +283,7 @@ static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value, tstrncpy(cfg.dir, pItem->str, sizeof(cfg.dir)); cfg.level = level ? atoi(level) : 0; cfg.primary = primary ? atoi(primary) : 1; + cfg.enable = enable ? atoi(enable) : 1; void *ret = taosArrayPush(pItem->array, &cfg); if (ret == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -899,16 +900,16 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) { } int32_t cfgLoadFromEnvVar(SConfig *pConfig) { - char line[1024], *name, *value, *value2, *value3; - int32_t olen, vlen, vlen2, vlen3; + char line[1024], *name, *value, *value2, *value3, *value4; + int32_t olen, vlen, vlen2, vlen3, vlen4; int32_t code = 0; char **pEnv = environ; line[1023] = 0; if (pEnv == NULL) return 0; while (*pEnv != NULL) { - name = value = value2 = value3 = NULL; - olen = vlen = vlen2 = vlen3 = 0; + name = value = value2 = value3 = value4 = NULL; + olen = vlen = vlen2 = vlen3 = vlen4 = 0; strncpy(line, *pEnv, sizeof(line) - 1); pEnv++; @@ -926,14 +927,18 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) { if (vlen2 != 0) { value2[vlen2] = 0; paGetToken(value2 + vlen2 + 1, &value3, &vlen3); - if (vlen3 != 0) value3[vlen3] = 0; + if (vlen3 != 0) { + value3[vlen3] = 0; + paGetToken(value3 + vlen3 + 1, &value4, &vlen4); + if(vlen4 != 0) value4[vlen4] = 0; + } } code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_VAR, true); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; if (strcasecmp(name, "dataDir") == 0) { - code = cfgSetTfsItem(pConfig, name, value, value2, value3, CFG_STYPE_ENV_VAR); + code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_VAR); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; } } @@ -943,8 +948,8 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) { } int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { - char buf[1024], *name, *value, *value2, *value3; - int32_t olen, vlen, vlen2, vlen3; + char buf[1024], *name, *value, *value2, *value3, *value4; + int32_t olen, vlen, vlen2, vlen3, vlen4; int32_t code = 0; int32_t index = 0; if (envCmd == NULL) return 0; @@ -954,8 +959,8 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { taosEnvToCfg(buf, buf); index++; - name = value = value2 = value3 = NULL; - olen = vlen = vlen2 = vlen3 = 0; + name = value = value2 = value3 = value4 = NULL; + olen = vlen = vlen2 = vlen3 = vlen4 = 0; paGetToken(buf, &name, &olen); if (olen == 0) continue; @@ -969,14 +974,18 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { if (vlen2 != 0) { value2[vlen2] = 0; paGetToken(value2 + vlen2 + 1, &value3, &vlen3); - if (vlen3 != 0) value3[vlen3] = 0; + if (vlen3 != 0) { + value3[vlen3] = 0; + paGetToken(value3 + vlen3 + 1, &value4, &vlen4); + if(vlen4 != 0) value4[vlen4] = 0; + } } code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_CMD, true); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; if (strcasecmp(name, "dataDir") == 0) { - code = cfgSetTfsItem(pConfig, name, value, value2, value3, CFG_STYPE_ENV_CMD); + code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_CMD); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; } } @@ -986,8 +995,8 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { } int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { - char line[1024], *name, *value, *value2, *value3; - int32_t olen, vlen, vlen2, vlen3; + char line[1024], *name, *value, *value2, *value3, *value4; + int32_t olen, vlen, vlen2, vlen3, vlen4; int32_t code = 0; ssize_t _bytes = 0; @@ -1012,8 +1021,8 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { } while (!taosEOFFile(pFile)) { - name = value = value2 = value3 = NULL; - olen = vlen = vlen2 = vlen3 = 0; + name = value = value2 = value3 = value4 = NULL; + olen = vlen = vlen2 = vlen3 = vlen4 = 0; _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes <= 0) { @@ -1034,14 +1043,18 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { if (vlen2 != 0) { value2[vlen2] = 0; paGetToken(value2 + vlen2 + 1, &value3, &vlen3); - if (vlen3 != 0) value3[vlen3] = 0; + if (vlen3 != 0) { + value3[vlen3] = 0; + paGetToken(value3 + vlen3 + 1, &value4, &vlen4); + if(vlen4 != 0) value4[vlen4] = 0; + } } code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_FILE, true); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; if (strcasecmp(name, "dataDir") == 0) { - code = cfgSetTfsItem(pConfig, name, value, value2, value3, CFG_STYPE_ENV_FILE); + code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_FILE); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; } } @@ -1053,8 +1066,8 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { } int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { - char line[1024], *name, *value, *value2, *value3; - int32_t olen, vlen, vlen2, vlen3; + char line[1024], *name, *value, *value2, *value3, *value4; + int32_t olen, vlen, vlen2, vlen3, vlen4; ssize_t _bytes = 0; int32_t code = 0; @@ -1072,8 +1085,8 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { } while (!taosEOFFile(pFile)) { - name = value = value2 = value3 = NULL; - olen = vlen = vlen2 = vlen3 = 0; + name = value = value2 = value3 = value4 = NULL; + olen = vlen = vlen2 = vlen3 = vlen4 = 0; _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes <= 0) { @@ -1114,7 +1127,11 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { if (vlen2 != 0) { value2[vlen2] = 0; paGetToken(value2 + vlen2 + 1, &value3, &vlen3); - if (vlen3 != 0) value3[vlen3] = 0; + if (vlen3 != 0) { + value3[vlen3] = 0; + paGetToken(value3 + vlen3 + 1, &value4, &vlen4); + if (vlen4 != 0) value4[vlen4] = 0; + } } code = cfgSetItem(pConfig, name, value, CFG_STYPE_CFG_FILE, true); @@ -1122,7 +1139,7 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { } if (strcasecmp(name, "dataDir") == 0) { - code = cfgSetTfsItem(pConfig, name, value, value2, value3, CFG_STYPE_CFG_FILE); + code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_CFG_FILE); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; } @@ -1212,8 +1229,8 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { // } int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { - char *cfgLineBuf = NULL, *name, *value, *value2, *value3; - int32_t olen, vlen, vlen2, vlen3; + char *cfgLineBuf = NULL, *name, *value, *value2, *value3, *value4; + int32_t olen, vlen, vlen2, vlen3, vlen4; int32_t code = 0; if (url == NULL || strlen(url) == 0) { uInfo("apoll url not load"); @@ -1289,14 +1306,18 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { if (vlen2 != 0) { value2[vlen2] = 0; paGetToken(value2 + vlen2 + 1, &value3, &vlen3); - if (vlen3 != 0) value3[vlen3] = 0; + if (vlen3 != 0) { + value3[vlen3] = 0; + paGetToken(value3 + vlen3 + 1, &value4, &vlen4); + if (vlen4 != 0) value4[vlen4] = 0; + } } code = cfgSetItem(pConfig, name, value, CFG_STYPE_APOLLO_URL, true); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; if (strcasecmp(name, "dataDir") == 0) { - code = cfgSetTfsItem(pConfig, name, value, value2, value3, CFG_STYPE_APOLLO_URL); + code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_APOLLO_URL); if (code != 0 && terrno != TSDB_CODE_CFG_NOT_FOUND) break; } }