diff --git a/src/common/src/tmount.c b/src/common/src/tmount.c index 420fdd76ded4ce580488599b88438392b82d1467..57a916247dd8e74c8102e9ccdd5d47692b156e12 100644 --- a/src/common/src/tmount.c +++ b/src/common/src/tmount.c @@ -193,7 +193,7 @@ static SDisk *tdGetDiskByName(char *dirName) { char fdirName[TSDB_FILENAME_LEN] = "\0"; SDiskID *pDiskID = NULL; - if (tdFormatDir(dirName, fdirName) < 0) { + if (tfsFormatDir(dirName, fdirName) < 0) { return NULL; } @@ -228,7 +228,7 @@ static void tdDecDiskFiles(SDisk *pDisk, bool lock) { } } -static int tdFormatDir(char *idir, char *odir) { +static int tfsFormatDir(char *idir, char *odir) { wordexp_t wep; int code = wordexp(idir, &wep, 0); @@ -295,7 +295,7 @@ static int tdAddDisk(SDiskCfg *pCfg) { return -1; } - if (tdFormatDir(pCfg->dir, dirName) < 0) { + if (tfsFormatDir(pCfg->dir, dirName) < 0) { uError("failed to add disk %s to tier %d level since %s", pCfg->dir, pCfg->level, tstrerror(terrno)); return -1; } diff --git a/src/dnode/CMakeLists.txt b/src/dnode/CMakeLists.txt index 34b3e3d57725eec16301d38aa17617c6b64a8390..5608cfd6d16826e399f9ea41dc026d2ab2459610 100644 --- a/src/dnode/CMakeLists.txt +++ b/src/dnode/CMakeLists.txt @@ -48,7 +48,6 @@ IF (TD_LINUX) COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg - COMMAND ${CMAKE_COMMAND} -E echo monitor 0 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg COMMENT "prepare taosd environment") ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD}) ENDIF () diff --git a/src/dnode/src/dnodeMain.c b/src/dnode/src/dnodeMain.c index 63e71cbb319aadb37f0cedcbd275e875646ac72c..b2c03cd02952ae30835c8cf6dbf8f86235ef99a4 100644 --- a/src/dnode/src/dnodeMain.c +++ b/src/dnode/src/dnodeMain.c @@ -37,8 +37,7 @@ #include "dnodeMPeer.h" #include "dnodeShell.h" #include "dnodeTelemetry.h" -#include "tpath.h" -#include "tmount.h" +#include "tfs.h" static SRunStatus tsRunStatus = TSDB_RUN_STATUS_STOPPED; @@ -183,45 +182,35 @@ static void dnodeCheckDataDirOpenned(char *dir) { } static int32_t dnodeInitStorage() { - if (tdInitMount(tsDiskCfg, tsDiskCfgNum) < 0) { - dError("failed to add disks to dnode tier since %s", tstrerror(terrno)); + if (tfsInit(tsDiskCfg, tsDiskCfgNum) < 0) { + dError("failed to init TFS since %s", tstrerror(terrno)); return -1; } - tdGetPrimaryPath(tsDataDir); - tdGetVnodeRootDir(tsDataDir, tsVnodeDir); + tfsPrimaryPath(tsDataDir); + sprintf(tsMnodeDir, "%s/mnode", tsDataDir); + sprintf(tsVnodeDir, "%s/vnode", tsDataDir); + sprintf(tsDnodeDir, "%s/dnode", tsDataDir); + sprintf(tsVnodeBakDir, "%s/vnode_bak", tsDataDir); //TODO(dengyihao): no need to init here - tdGetMnodeRootDir(tsDataDir, tsMnodeDir); if (dnodeCreateDir(tsMnodeDir) < 0) { - dError("failed to create mnode dir: %s, reason: %s", tsMnodeDir, strerror(errno)); + dError("failed to create dir: %s, reason: %s", tsMnodeDir, strerror(errno)); return -1; } - tdGetDnodeRootDir(tsDataDir, tsDnodeDir); if (dnodeCreateDir(tsDnodeDir) < 0) { - dError("failed to create dnode dir: %s, reason: %s", tsDnodeDir, strerror(errno)); + dError("failed to create dir: %s, reason: %s", tsDnodeDir, strerror(errno)); return -1; } - for (int i = 0; i < tsDnodeTier->nTiers; i++) { - char dirName[TSDB_FILENAME_LEN]; - - STier *pTier = tsDnodeTier->tiers + i; - for (int j = 0; j < pTier->nDisks; j++) { - SDisk *pDisk = tdGetDisk(tsDnodeTier, i, j); - - tdGetVnodeRootDir(pDisk->dir, dirName); - if (dnodeCreateDir(dirName) < 0) { - dError("failed to create vnode dir: %s, reason: %s", dirName, strerror(errno)); - return -1; - } + if (tfsCreateDir("vnode") < 0) { + dError("failed to create vnode dir since %s", tstrerror(terrno)); + return -1; + } - tdGetVnodeBackRootDir(pDisk->dir, dirName); - if (dnodeCreateDir(dirName) < 0) { - dError("failed to create vnode back dir: %s, reason: %s", dirName, strerror(errno)); - return -1; - } - } + if (tfsCreateDir("vnode_bak") < 0) { + dError("failed to create vnode_bak dir since %s", tstrerror(terrno)); + return -1; } dnodeCheckDataDirOpenned(tsDnodeDir); @@ -230,7 +219,7 @@ static int32_t dnodeInitStorage() { return 0; } -static void dnodeCleanupStorage() { tdDestroyMount(); } +static void dnodeCleanupStorage() { tfsDestroy(); } bool dnodeIsFirstDeploy() { return strcmp(tsFirst, tsLocalEp) == 0; diff --git a/src/inc/dnode.h b/src/inc/dnode.h index 0925ec9206e6c96c8aa6c2f8bac0ae009702b236..eef4490800a4191c2dee55c450cf99b8381bb64d 100644 --- a/src/inc/dnode.h +++ b/src/inc/dnode.h @@ -20,10 +20,6 @@ extern "C" { #endif -#include "taosdef.h" -#include "tglobal.h" -#include "hash.h" -#include "taoserror.h" #include "trpc.h" #include "taosmsg.h" diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h index 882f0c6b158ede9930a495dec870ffa63a5e6512..ff91989e5f15b00775fd02505704a3afccaab500 100644 --- a/src/inc/taoserror.h +++ b/src/inc/taoserror.h @@ -80,14 +80,6 @@ TAOS_DEFINE_ERROR(TSDB_CODE_REF_ID_REMOVED, 0, 0x0107, "Ref ID is TAOS_DEFINE_ERROR(TSDB_CODE_REF_INVALID_ID, 0, 0x0108, "Invalid Ref ID") TAOS_DEFINE_ERROR(TSDB_CODE_REF_ALREADY_EXIST, 0, 0x0109, "Ref is already there") TAOS_DEFINE_ERROR(TSDB_CODE_REF_NOT_EXIST, 0, 0x010A, "Ref is not there") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_INVALID_DISK_TIER, 0, 0x010B, "Invalid disk tier setting") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_TOO_MANY_DISKS, 0, 0x010C, "Too many disks in one tier") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_DISK_ALREADY_EXISTS, 0, 0x010D, "Disk already exists") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_DISK_NOT_DIRECTORY, 0, 0x010E, "Disk is not a directory") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_NO_DISK_SPACE, 0, 0x010F, "Dnode no disk space") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_DUPLICATE_PRIMARY_DISK, 0, 0x0110, "Duplicate primary disk") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_LACK_PRIMARY_DISK, 0, 0x0111, "Lack primary disk") -TAOS_DEFINE_ERROR(TSDB_CODE_COM_NO_DISK_AT_TIER, 0, 0x0112, "No disk at tier") //client TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INVALID_SQL, 0, 0x0200, "Invalid SQL statement") diff --git a/src/tfs/inc/tfs.h b/src/inc/tfs.h similarity index 90% rename from src/tfs/inc/tfs.h rename to src/inc/tfs.h index bd4824bc348673aa1e6c1db2e259e2699d79f718..3c0ae1ed75d848673b72b24b0e181b6b318dc61c 100644 --- a/src/tfs/inc/tfs.h +++ b/src/inc/tfs.h @@ -24,6 +24,9 @@ extern "C" { int tfsInit(SDiskCfg *pDiskCfg, int ndisk); void tfsDestroy(); +int tfsUpdateInfo(); +void tfsPrimaryPath(char *dst); +int tfsCreateDir(char *name); #ifdef __cplusplus } diff --git a/src/tfs/inc/tdisk.h b/src/tfs/inc/tdisk.h index 3454bea49b9dca89d65bdfbbaf6906b96036aef1..532dc6a39fb980623b6fc496df2defc2b9d3895d 100644 --- a/src/tfs/inc/tdisk.h +++ b/src/tfs/inc/tdisk.h @@ -38,8 +38,9 @@ typedef struct { SDiskMeta dmeta; } SDisk; -SDisk *tdNewDisk(SDiskID did, char *dir); +SDisk *tdNewDisk(int level, int id, char *dir); void tdFreeDisk(SDisk *pDisk); +int tdUpdateDiskInfo(SDisk *pDisk); #ifdef __cplusplus } diff --git a/src/tfs/inc/ttier.h b/src/tfs/inc/ttier.h index 1d113c847a913e747c223700c482cd2b624f91f5..f406e3d8c2bc2e4468bc9b305cb7c56855047f94 100644 --- a/src/tfs/inc/ttier.h +++ b/src/tfs/inc/ttier.h @@ -30,9 +30,12 @@ typedef struct { SDisk *disks[TSDB_MAX_DISK_PER_TIER]; } STier; +#define DISK_AT_TIER(pTier, id) ((pTier)->disks + (id)) + void tdInitTier(STier *pTier, int level); void tdDestroyTier(STier *pTier); SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg); +int tdUpdateTierInfo(STier *pTier); #ifdef __cplusplus } diff --git a/src/tfs/src/tdisk.c b/src/tfs/src/tdisk.c index bcefafc0b1e539abd916e23bdebc98f5ea69bc7e..83dfbb1b06ae9557a91feca184a69e4453790207 100644 --- a/src/tfs/src/tdisk.c +++ b/src/tfs/src/tdisk.c @@ -15,15 +15,15 @@ #include "tdisk.h" -SDisk *tdNewDisk(SDiskID did, char *dir) { +SDisk *tdNewDisk(int level, int id, char *dir) { SDisk *pDisk = (SDisk *)calloc(1, sizeof(*pDisk)); if (pDisk == NULL) { terrno = TSDB_CODE_FS_OUT_OF_MEMORY; return NULL; } - pDisk->level = did.level; - pDisk->id = did.id; + pDisk->level = level; + pDisk->id = id; strncpy(pDisk->dir, dir, TSDB_FILENAME_LEN); return pDisk; @@ -33,4 +33,18 @@ void tdFreeDisk(SDisk *pDisk) { if (pDisk) { free(pDisk) } +} + +int tdUpdateDiskInfo(SDisk *pDisk) { + SysDiskSize dstat; + if (taosGetDiskSize(pDisk->dir, &dstat) < 0) { + fError("failed to get dir %s information since %s", pDisk->dir, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + + pDisk->dmeta.size = dstat.tsize; + pDisk->dmeta.free = dstat.avail; + + return 0; } \ No newline at end of file diff --git a/src/tfs/src/tfs.c b/src/tfs/src/tfs.c index 4400da40e88eef09a320786d15617ab7b1ceeb38..09c6a7e70714d9fba81175c3a9970d5f48be3183 100644 --- a/src/tfs/src/tfs.c +++ b/src/tfs/src/tfs.c @@ -45,6 +45,7 @@ static SFS tdFileSystem = {0}; static SFS *pfs = &tdFileSystem; #define TIER_AT(level) (pfs->tiers + (level)) +#define DISK_AT(level, id) DISK_AT_TIER(TIER_AT(level), id) int tfsInit(SDiskCfg *pDiskCfg, int ndisk) { ASSERT(ndisk > 0); @@ -68,13 +69,13 @@ int tfsInit(SDiskCfg *pDiskCfg, int ndisk) { } for (int idisk = 0; idisk < ndisk; idisk++) { - if (tdAddDiskToFS(pDiskCfg + idisk) < 0) { + if (tfsAddDisk(pDiskCfg + idisk) < 0) { tfsDestroy(); return -1; } } - if (tdCheckFS() < 0) { + if (tfsCheck() < 0) { tfsDestroy(); return -1; } @@ -92,8 +93,46 @@ void tfsDestroy() { } } -static int tdAddDiskToFS(SDiskCfg *pCfg) { - if (tdCheckAndFormatCfg(pCfg) < 0) return -1; +int tfsUpdateInfo() { + tfsLock(); + + for (int level = 0; level < pfs->nlevel; level++) { + if (tdUpdateTierInfo(TIER_AT(level)) < 0) { + // TODO: deal with the error here + } + } + + tfsUnLock(); +} + +void tfsPrimaryPath(char *dst) { + strncpy(dst, DISK_AT) +} + +int tfsCreateDir(char *name) { + char dirName[TSDB_FILENAME_LEN] = "\0"; + + for (int level = 0; level < pfs->nlevel; level++) { + STier *pTier = TIER_AT(level); + for (int id = 0; id < pTier->ndisk; id++) { + SDisk *pDisk = DISK_AT_TIER(pTier, id); + + ASSERT(pDisk != NULL); + + snprintf(dirName, TSDB_FILENAME_LEN, "%s/%s", pDisk->dir, name); + + if (mkdir(dirName, 0755) != 0 && errno != EEXIST) { + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + } + } + + return 0; +} + +static int tfsAddDisk(SDiskCfg *pCfg) { + if (tfsCheckAndFormatCfg(pCfg) < 0) return -1; if (tdAddDiskToTier(pCfg, TIER_AT(pCfg->level)) < 0) { fError("failed to add disk %s to FS since %s", pCfg->dir, tstrerror(terrno)); @@ -105,7 +144,7 @@ static int tdAddDiskToFS(SDiskCfg *pCfg) { return 0; } -static int tdCheckAndFormatCfg(SDiskCfg *pCfg) { +static int tfsCheckAndFormatCfg(SDiskCfg *pCfg) { char dirName[TSDB_FILENAME_LEN] = "\0"; struct stat pstat; @@ -122,7 +161,7 @@ static int tdCheckAndFormatCfg(SDiskCfg *pCfg) { } - if (tdFormatDir(pCfg->dir, dirName) < 0) { + if (tfsFormatDir(pCfg->dir, dirName) < 0) { fError("failed to add disk %s to FS since invalid dir format", pCfg->dir); terrno = TSDB_CODE_FS_INVLD_CFG; return -1; @@ -157,7 +196,7 @@ static int tdCheckAndFormatCfg(SDiskCfg *pCfg) { return 0; } -static int tdFormatDir(char *idir, char *odir) { +static int tfsFormatDir(char *idir, char *odir) { wordexp_t wep = {0}; int code = wordexp(idir, &wep, 0); @@ -177,7 +216,7 @@ static int tdFormatDir(char *idir, char *odir) { } -static int tdCheckFS() { +static int tfsCheck() { if (DISK_AT(0, 0) == NULL) { fError("no primary disk is set"); terrno = TSDB_CODE_FS_NO_PRIMARY_DISK; @@ -192,5 +231,25 @@ static int tdCheckFS() { } } + return 0; +} + +static int tfsLock() { + int code = pthread_mutex_lock(&(pfs->lock)); + if (code != 0) { + terrno = TAOS_SYSTEM_ERROR(code); + return -1; + } + + return 0; +} + +static tfsUnLock() { + int code = pthread_mutex_unlock(&(pfs->lock)); + if (code != 0) { + terrno = TAOS_SYSTEM_ERROR(code); + return -1; + } + return 0; } \ No newline at end of file diff --git a/src/tfs/src/ttier.c b/src/tfs/src/ttier.c index 8faa03e2eee2030e607c4e56b55c450686234e29..11fb0676820d0a10d8c45a21695a1e245bad74f4 100644 --- a/src/tfs/src/ttier.c +++ b/src/tfs/src/ttier.c @@ -16,8 +16,6 @@ #include "ttier.h" #include "tglobal.h" -#define DISK_AT_TIER(pTier, id) ((pTier)->disks + (id)) - void tdInitTier(STier *pTier, int level) { pTier->level = level; } @@ -59,8 +57,16 @@ SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg) { } } - pTier->disks[id] = tdNewDisk({pCfg->level, id}, pCfg->dir); + pTier->disks[id] = tdNewDisk(pCfg->level, id, pCfg->dir); if (pTier->disks[id] == NULL) return -1; return 0; +} + +int tdUpdateTierInfo(STier *pTier) { + for (int id = 0; id < pTier->ndisk; id++) { + if (tdUpdateDiskInfo(DISK_AT_TIER(pTier, id)) < 0) { + // TODO: deal with the error here + } + } } \ No newline at end of file