diff --git a/src/inc/tfs.h b/src/inc/tfs.h index 7df30442058f20a9a101e14b43888157ffde2114..d5576aa9bccef42909a4b9158840a3d107c0fa81 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 6b70bed2b42ade54f2cd30e3b4b9e40da8db3174..b8fa83d61391e1f3962853aab2e888a3de0bcba7 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 b200b7f0428815afbf6891c3164f23eb11a25a3b..12525b7768af20845d05bcbe92e2a3d7f58a296e 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