From ca28c99f809c91588bca1cbd7e61e263489226fb Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 23 May 2023 11:19:24 +0800 Subject: [PATCH] more code --- include/util/tarray2.h | 15 ++++++++--- .../dnode/vnode/src/tsdb/dev/inc/tsdbFSet.h | 1 + .../dnode/vnode/src/tsdb/dev/inc/tsdbFile.h | 6 ++--- source/dnode/vnode/src/tsdb/dev/tsdbCommit.c | 2 +- source/dnode/vnode/src/tsdb/dev/tsdbFS.c | 12 ++++----- source/dnode/vnode/src/tsdb/dev/tsdbFSet.c | 23 ++++++++++++++++- source/dnode/vnode/src/tsdb/dev/tsdbFile.c | 25 +++++++++++-------- 7 files changed, 59 insertions(+), 25 deletions(-) diff --git a/include/util/tarray2.h b/include/util/tarray2.h index 9ddf0143d3..3b36bd920e 100644 --- a/include/util/tarray2.h +++ b/include/util/tarray2.h @@ -114,9 +114,18 @@ static FORCE_INLINE int32_t tarray2_make_room( // #define TARRAY2_APPEND(a, e) TARRAY2_INSERT(a, (a)->size, e) #define TARRAY2_APPEND_P(a, ep) TARRAY2_APPEND(a, *(ep)) -#define TARRAY2_SEARCH(a, ep, cmp, flag) \ - (((a)->size == 0) ? NULL \ - : taosbsearch(ep, (a)->data, (a)->size, sizeof(typeof((a)->data[0])), (__compar_fn_t)cmp, flag)) +// return (TYPE *) +#define TARRAY2_SEARCH(a, ep, cmp, flag) \ + ((typeof((a)->data))(((a)->size == 0) ? NULL \ + : taosbsearch(ep, (a)->data, (a)->size, sizeof(typeof((a)->data[0])), \ + (__compar_fn_t)cmp, flag))) + +// return (TYPE) +#define TARRAY2_SEARCH_EX(a, ep, cmp, flag) \ + ({ \ + typeof((a)->data) __p = TARRAY2_SEARCH(a, ep, cmp, flag); \ + __p ? __p[0] : NULL; \ + }) #define TARRAY2_SEARCH_IDX(a, ep, cmp, flag) \ ({ \ diff --git a/source/dnode/vnode/src/tsdb/dev/inc/tsdbFSet.h b/source/dnode/vnode/src/tsdb/dev/inc/tsdbFSet.h index 3cee85cdf5..20da1259f9 100644 --- a/source/dnode/vnode/src/tsdb/dev/inc/tsdbFSet.h +++ b/source/dnode/vnode/src/tsdb/dev/inc/tsdbFSet.h @@ -41,6 +41,7 @@ typedef enum { int32_t tsdbTFileSetInit(int32_t fid, STFileSet **fset); int32_t tsdbTFileSetInitEx(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset); int32_t tsdbTFileSetClear(STFileSet **fset); +int32_t tsdbTFileSetRemove(STFileSet **fset); // to/from json int32_t tsdbTFileSetToJson(const STFileSet *fset, cJSON *json); int32_t tsdbJsonToTFileSet(STsdb *pTsdb, const cJSON *json, STFileSet **fset); diff --git a/source/dnode/vnode/src/tsdb/dev/inc/tsdbFile.h b/source/dnode/vnode/src/tsdb/dev/inc/tsdbFile.h index 24eb31855c..990f3d0fa8 100644 --- a/source/dnode/vnode/src/tsdb/dev/inc/tsdbFile.h +++ b/source/dnode/vnode/src/tsdb/dev/inc/tsdbFile.h @@ -34,8 +34,8 @@ typedef enum { } tsdb_ftype_t; enum { - TSDB_FSTATE_EXIST = 1, - TSDB_FSTATE_REMOVED, + TSDB_FSTATE_LIVE = 1, + TSDB_FSTATE_DEAD, }; #define TSDB_FTYPE_MIN TSDB_FTYPE_HEAD @@ -50,7 +50,7 @@ int32_t tsdbTFileName(STsdb *pTsdb, const STFile *f, char fname[]); int32_t tsdbTFileObjInit(STsdb *pTsdb, const STFile *f, STFileObj **fobj); int32_t tsdbTFileObjRef(STFileObj *fobj); int32_t tsdbTFileObjUnref(STFileObj *fobj); -int32_t tsdbTFileRemove(STFileObj *fobj); +int32_t tsdbTFileObjRemove(STFileObj *fobj); int32_t tsdbTFileObjCmpr(const STFileObj **fobj1, const STFileObj **fobj2); struct STFile { diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbCommit.c b/source/dnode/vnode/src/tsdb/dev/tsdbCommit.c index ba334d9cb3..3010d2f27e 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbCommit.c @@ -331,7 +331,7 @@ static int32_t open_committer(STsdb *pTsdb, SCommitInfo *pInfo, SCommitter *pCom pCommitter->minRow = pInfo->info.config.tsdbCfg.minRows; pCommitter->maxRow = pInfo->info.config.tsdbCfg.maxRows; pCommitter->cmprAlg = pInfo->info.config.tsdbCfg.compression; - pCommitter->sttTrigger = 1; // TODO + pCommitter->sttTrigger = 4; // TODO pCommitter->aTbDataP = tsdbMemTableGetTbDataArray(pTsdb->imem); if (pCommitter->aTbDataP == NULL) { diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbFS.c b/source/dnode/vnode/src/tsdb/dev/tsdbFS.c index b6686d05af..f862c59b18 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbFS.c @@ -252,8 +252,8 @@ static int32_t apply_commit(STFileSystem *fs) { if (fset1 && fset2) { if (fset1->fid < fset2->fid) { - // delete fset1 (TODO: should set file remove) - TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetClear); + // delete fset1 + TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetRemove); } else if (fset1->fid > fset2->fid) { // create new file set with fid of fset2->fid code = tsdbTFileSetInitEx(fs->pTsdb, fset2, &fset1); @@ -270,8 +270,8 @@ static int32_t apply_commit(STFileSystem *fs) { i2++; } } else if (fset1) { - // delete fset1 (TODO: should set file remove) - TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetClear); + // delete fset1 + TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetRemove); } else { // create new file set with fid of fset2->fid code = tsdbTFileSetInitEx(fs->pTsdb, fset2, &fset1); @@ -481,7 +481,7 @@ static int32_t edit_fs(STFileSystem *fs, const TFileOpArray *opArray) { if (!fset || fset->fid != op->fid) { STFileSet tfset = {.fid = op->fid}; fset = &tfset; - fset = TARRAY2_SEARCH(fsetArray, &fset, tsdbTFileSetCmprFn, TD_EQ); + fset = TARRAY2_SEARCH_EX(fsetArray, &fset, tsdbTFileSetCmprFn, TD_EQ); if (!fset) { code = tsdbTFileSetInit(op->fid, &fset); @@ -589,6 +589,6 @@ int32_t tsdbFSEditAbort(STFileSystem *fs) { int32_t tsdbFSGetFSet(STFileSystem *fs, int32_t fid, const STFileSet **fset) { STFileSet tfset = {.fid = fid}; fset[0] = &tfset; - fset[0] = TARRAY2_SEARCH(&fs->cstate, fset, tsdbTFileSetCmprFn, TD_EQ); + fset[0] = TARRAY2_SEARCH_EX(&fs->cstate, fset, tsdbTFileSetCmprFn, TD_EQ); return 0; } \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbFSet.c b/source/dnode/vnode/src/tsdb/dev/tsdbFSet.c index acedef0e8d..fd48b6eea7 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbFSet.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbFSet.c @@ -21,6 +21,7 @@ static int32_t tsdbSttLvlInit(int32_t level, SSttLvl **lvl) { TARRAY2_INIT(&lvl[0]->farr); return 0; } + static void tsdbSttLvlClearFObj(void *data) { tsdbTFileObjUnref(*(STFileObj **)data); } static int32_t tsdbSttLvlClear(SSttLvl **lvl) { TARRAY2_CLEAR_FREE(&lvl[0]->farr, tsdbSttLvlClearFObj); @@ -28,6 +29,7 @@ static int32_t tsdbSttLvlClear(SSttLvl **lvl) { lvl[0] = NULL; return 0; } + static int32_t tsdbSttLvlInitEx(STsdb *pTsdb, const SSttLvl *lvl1, SSttLvl **lvl) { int32_t code = tsdbSttLvlInit(lvl1->level, lvl); if (code) return code; @@ -46,6 +48,13 @@ static int32_t tsdbSttLvlInitEx(STsdb *pTsdb, const SSttLvl *lvl1, SSttLvl **lvl return 0; } +static void tsdbSttLvlRemoveFObj(void *data) { tsdbTFileObjRemove(*(STFileObj **)data); } +static void tsdbSttLvlRemove(SSttLvl **lvl) { + TARRAY2_CLEAR_FREE(&lvl[0]->farr, tsdbSttLvlRemoveFObj); + taosMemoryFree(lvl[0]); + lvl[0] = NULL; +} + static int32_t tsdbSttLvlCmprFn(const SSttLvl **lvl1, const SSttLvl **lvl2) { if (lvl1[0]->level < lvl2[0]->level) return -1; if (lvl1[0]->level > lvl2[0]->level) return 1; @@ -291,10 +300,22 @@ int32_t tsdbTFileSetClear(STFileSet **fset) { return 0; } +int32_t tsdbTFileSetRemove(STFileSet **fset) { + for (tsdb_ftype_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) { + if (fset[0]->farr[ftype] == NULL) continue; + tsdbTFileObjRemove(fset[0]->farr[ftype]); + } + + TARRAY2_CLEAR_FREE(&fset[0]->lvlArr, tsdbSttLvlRemove); + taosMemoryFree(fset[0]); + fset[0] = NULL; + return 0; +} + SSttLvl *tsdbTFileSetGetLvl(const STFileSet *fset, int32_t level) { SSttLvl tlvl = {.level = level}; SSttLvl *lvl = &tlvl; - return TARRAY2_SEARCH(&fset->lvlArr, &lvl, tsdbSttLvlCmprFn, TD_EQ); + return TARRAY2_SEARCH_EX(&fset->lvlArr, lvl, tsdbSttLvlCmprFn, TD_EQ); } int32_t tsdbTFileSetCmprFn(const STFileSet **fset1, const STFileSet **fset2) { diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbFile.c b/source/dnode/vnode/src/tsdb/dev/tsdbFile.c index 83f332dbe1..dbf35d99cd 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbFile.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbFile.c @@ -41,6 +41,11 @@ static const struct { [TSDB_FTYPE_STT] = {"stt", stt_to_json, stt_from_json}, }; +static void remove_file(const char *fname) { + taosRemoveFile(fname); + tsdbInfo("file:%s is removed", fname); +} + static int32_t tfile_to_json(const STFile *file, cJSON *json) { /* did.level */ if (cJSON_AddNumberToObject(json, "did.level", file->did.level) == NULL) { @@ -201,7 +206,7 @@ int32_t tsdbTFileObjInit(STsdb *pTsdb, const STFile *f, STFileObj **fobj) { taosThreadMutexInit(&fobj[0]->mutex, NULL); fobj[0]->f = *f; - fobj[0]->state = TSDB_FSTATE_EXIST; + fobj[0]->state = TSDB_FSTATE_LIVE; fobj[0]->ref = 1; tsdbTFileName(pTsdb, f, fobj[0]->fname); return 0; @@ -210,23 +215,20 @@ int32_t tsdbTFileObjInit(STsdb *pTsdb, const STFile *f, STFileObj **fobj) { int32_t tsdbTFileObjRef(STFileObj *fobj) { int32_t nRef; taosThreadMutexLock(&fobj->mutex); + ASSERT(fobj->ref > 0 && fobj->state == TSDB_FSTATE_LIVE); nRef = fobj->ref++; taosThreadMutexUnlock(&fobj->mutex); - ASSERT(nRef > 0); return 0; } int32_t tsdbTFileObjUnref(STFileObj *fobj) { - int32_t nRef; - taosThreadMutexLock(&fobj->mutex); - nRef = --fobj->ref; + int32_t nRef = --fobj->ref; taosThreadMutexUnlock(&fobj->mutex); ASSERT(nRef >= 0); if (nRef == 0) { - if (fobj->state == TSDB_FSTATE_REMOVED) { - // TODO: add the file name - taosRemoveFile(fobj->fname); + if (fobj->state == TSDB_FSTATE_DEAD) { + remove_file(fobj->fname); } taosMemoryFree(fobj); } @@ -234,13 +236,14 @@ int32_t tsdbTFileObjUnref(STFileObj *fobj) { return 0; } -int32_t tsdbTFileRemove(STFileObj *fobj) { +int32_t tsdbTFileObjRemove(STFileObj *fobj) { taosThreadMutexLock(&fobj->mutex); - fobj->state = TSDB_FSTATE_REMOVED; + ASSERT(fobj->state == TSDB_FSTATE_LIVE && fobj->ref > 0); + fobj->state = TSDB_FSTATE_DEAD; int32_t nRef = --fobj->ref; taosThreadMutexUnlock(&fobj->mutex); if (nRef == 0) { - taosRemoveFile(fobj->fname); + remove_file(fobj->fname); taosMemoryFree(fobj); } return 0;