From c510e513d9eeb17933bd1c386ac055acb1ae50f1 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 19 Nov 2020 09:51:15 +0000 Subject: [PATCH] refactor --- src/common/src/tmount.c | 6 ++-- src/dnode/CMakeLists.txt | 1 - src/dnode/src/dnodeMain.c | 47 ++++++++++-------------- src/inc/dnode.h | 4 --- src/inc/taoserror.h | 8 ----- src/{tfs => }/inc/tfs.h | 3 ++ src/tfs/inc/tdisk.h | 3 +- src/tfs/inc/ttier.h | 3 ++ src/tfs/src/tdisk.c | 20 +++++++++-- src/tfs/src/tfs.c | 75 ++++++++++++++++++++++++++++++++++----- src/tfs/src/ttier.c | 12 +++++-- 11 files changed, 122 insertions(+), 60 deletions(-) rename src/{tfs => }/inc/tfs.h (90%) diff --git a/src/common/src/tmount.c b/src/common/src/tmount.c index 420fdd76de..57a916247d 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 34b3e3d577..5608cfd6d1 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 63e71cbb31..b2c03cd029 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 0925ec9206..eef4490800 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 882f0c6b15..ff91989e5f 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 bd4824bc34..3c0ae1ed75 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 3454bea49b..532dc6a39f 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 1d113c847a..f406e3d8c2 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 bcefafc0b1..83dfbb1b06 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 4400da40e8..09c6a7e707 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 8faa03e2ee..11fb067682 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 -- GitLab