From 5f6acdbf796622ce509ccc5759db88ac7f265a4f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 25 Nov 2020 22:20:07 +0800 Subject: [PATCH] refactor --- src/inc/tfs.h | 2 + src/tfs/src/tfs.c | 14 +++++++ src/tsdb/src/tsdbFile.c | 85 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 98 insertions(+), 3 deletions(-) diff --git a/src/inc/tfs.h b/src/inc/tfs.h index 7df3044205..d5576aa9bc 100644 --- a/src/inc/tfs.h +++ b/src/inc/tfs.h @@ -63,6 +63,8 @@ int tfsopen(TFILE *pf, int flags); int tfsclose(int fd); int tfsremove(TFILE *pf); int tfscopy(TFILE *sf, TFILE *df); +void tfsbasename(TFILE *pf, char *dest); +void tfsdirname(TFILE *pf, char *dest); // DIR APIs ==================================== int tfsMkdir(const char *rname); diff --git a/src/tfs/src/tfs.c b/src/tfs/src/tfs.c index 6b70bed2b4..b8fa83d613 100644 --- a/src/tfs/src/tfs.c +++ b/src/tfs/src/tfs.c @@ -265,6 +265,20 @@ int tfscopy(TFILE *sf, TFILE *df) { return 0; } +void tfsbasename(TFILE *pf, char *dest) { + char tname[TSDB_FILENAME_LEN] = "\0"; + + strncpy(tname, pf->aname, TSDB_FILENAME_LEN); + strncpy(dest, basename(tname), TSDB_FILENAME_LEN); +} + +void tfsdirname(TFILE *pf, char *dest) { + char tname[TSDB_FILENAME_LEN] = "\0"; + + strncpy(tname, pf->aname, TSDB_FILENAME_LEN); + strncpy(dest, dirname(tname), TSDB_FILENAME_LEN); +} + // DIR APIs ==================================== int tfsMkdir(const char *rname) { char aname[TSDB_FILENAME_LEN] = "\0"; diff --git a/src/tsdb/src/tsdbFile.c b/src/tsdb/src/tsdbFile.c index b200b7f042..12525b7768 100644 --- a/src/tsdb/src/tsdbFile.c +++ b/src/tsdb/src/tsdbFile.c @@ -24,8 +24,10 @@ const char *tsdbFileSuffix[] = {".head", ".data", ".last", ".stat", ".h", ".d", ".l", ".s"}; -static int compFGroup(const void *arg1, const void *arg2); -static int keyFGroupCompFunc(const void *key, const void *fgroup); +static int compFGroup(const void *arg1, const void *arg2); +static int keyFGroupCompFunc(const void *key, const void *fgroup); +static void tsdbScanAllFiles(STsdbRepo *pRepo, TFILE **pfArray, int *nfiles); +static int tsdbCompareFile(void *arg1, void *arg2); // STsdbFileH =========================================== STsdbFileH *tsdbNewFileH(STsdbCfg *pCfg) { @@ -68,7 +70,23 @@ void tsdbFreeFileH(STsdbFileH *pFileH) { int tsdbOpenFileH(STsdbRepo *pRepo) { ASSERT(pRepo != NULL && pRepo->tsdbFileH != NULL); - // TODO + TFILE *pfArray = NULL; + int nfiles = 0; + + // Scan the whole directory and get data + tsdbScanAllFiles(pRepo, &pfArray, &nfiles); + + if (nfiles == 0) return 0; + + // Sort the files + qsort((void *)pfArray, nfiles, sizeof(TFILE), tsdbCompareFile); + + // Loop to recover the files + int iter = 0; + while (true) { + if (iter >= nfiles) break; + // TODO + } return 0; } @@ -461,4 +479,65 @@ int tsdbApplyRetention(STsdbRepo *pRepo, SFidGroup *pFidGroup) { } return 0; +} + +static void tsdbScanAllFiles(STsdbRepo *pRepo, TFILE **pfArray, int *nfiles) { + TDIR * tdir = NULL; + char dirName[TSDB_FILENAME_LEN] = "\0"; + char bname[TSDB_FILENAME_LEN] = "\0"; + int arraySize = 0; + regex_t regex1 = {0}; + regex_t regex2 = {0}; + const TFILE *pf = NULL; + + regcomp(®ex1, "^v[0-9]+f[0-9]+\\.(head|data|last|stat)$", REG_EXTENDED); + regcomp(®ex2, "^v[0-9]+f[0-9]+\\.(h|d|l|s)$", REG_EXTENDED); + + snprintf(dirName, TSDB_FILENAME_LEN, "vnode/vnode%d/tsdb/data", REPO_ID(pRepo)); + + tdir = tfsOpendir(dirName); + + while ((pf = tfsReaddir(tdir)) != NULL) { + fsbasename(pf, bname); + + int code = regexec(®ex1, bname, 0, NULL, 0); + if (code != 0) { + tsdbWarn("vgId:%d file %s exists, ignore it", REPO_ID(pRepo), pf->aname); + rename(pf->aname); + continue; + } + + if (nfiles + 1 >= arraySize) { + if (arraySize = 0) { + arraySize = 1024; + } else { + arraySize = arraySize * 2; + } + + *pfArray = realloc(*pfArray, sizeof(TFILE) * arraySize); + } + + (*pfArray)[nfiles++] = *pf; + } + + tfsClosedir(tdir); +} + +static int tsdbCompareFile(void *arg1, void *arg2) { + char bname1[TSDB_FILENAME_LEN] = "\0"; + char bname2[TSDB_FILENAME_LEN] = "\0"; + TFILE *pf1 = (TFILE *)arg1; + TFILE *pf2 = (TFILE *)arg2; + + tfsbasename(pf1, bname1); + tfsbasename(pf2, bname2); + // TODO +} + +static int tsdbGetTFileFid(TFILE *pf) { + char bname[TSDB_FILENAME_LEN] = "\0"; + int fid = 0; + + tfsbasename(pf, bname); + } \ No newline at end of file -- GitLab