diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbFS.c b/source/dnode/vnode/src/tsdb/dev/tsdbFS.c index f56ed94081..298531ab8c 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbFS.c @@ -31,6 +31,24 @@ static int32_t destroy_file_system(struct STFileSystem **ppFS) { return 0; } +static int32_t get_current_file_name(STsdb *pTsdb, char fname[]) { + snprintf(fname, TSDB_FILENAME_LEN, "%s%s%s", pTsdb->path, TD_DIRSEP, "current.json"); + return 0; +} + +static int32_t get_temp_current_file_name(STsdb *pTsdb, char fname[], EFsEditType etype) { + switch (etype) { + case TSDB_FS_EDIT_COMMIT: + snprintf(fname, TSDB_FILENAME_LEN, "%s%s%s", pTsdb->path, TD_DIRSEP, "current.json.commit"); + break; + default: + snprintf(fname, TSDB_FILENAME_LEN, "%s%s%s", pTsdb->path, TD_DIRSEP, "current.json.t"); + break; + } + + return 0; +} + static int32_t open_file_system(struct STFileSystem *pFS, int8_t rollback) { // TODO return 0; @@ -41,6 +59,16 @@ static int32_t close_file_system(struct STFileSystem *pFS) { return 0; } +static int32_t write_fs_to_file(struct STFileSystem *pFS, const char *fname) { + // TODO + return 0; +} + +static int32_t read_fs_from_file(struct STFileSystem *pFS, const char *fname) { + // TODO + return 0; +} + int32_t tsdbOpenFileSystem(STsdb *pTsdb, struct STFileSystem **ppFS, int8_t rollback) { int32_t code; int32_t lino; @@ -68,3 +96,75 @@ int32_t tsdbCloseFileSystem(struct STFileSystem **ppFS) { destroy_file_system(ppFS); return 0; } + +int32_t tsdbFileSystemEditBegin(struct STFileSystem *pFS, const SArray *aFileOp, EFsEditType etype) { + int32_t code = 0; + int32_t lino = 0; + char fname[TSDB_FILENAME_LEN]; + + get_temp_current_file_name(pFS->pTsdb, fname, etype); + + tsem_wait(&pFS->canEdit); + + code = write_fs_to_file(pFS, fname); + TSDB_CHECK_CODE(code, lino, _exit); + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", // + TD_VID(pFS->pTsdb->pVnode), // + __func__, // + lino, // + tstrerror(code)); + } + return code; +} + +int32_t tsdbFileSystemEditCommit(struct STFileSystem *pFS, EFsEditType etype) { + int32_t code = 0; + int32_t lino = 0; + char ofname[TSDB_FILENAME_LEN]; + char nfname[TSDB_FILENAME_LEN]; + + get_current_file_name(pFS->pTsdb, nfname); + get_temp_current_file_name(pFS->pTsdb, ofname, etype); + + code = taosRenameFile(ofname, nfname); + if (code) { + code = TAOS_SYSTEM_ERROR(errno); + TSDB_CHECK_CODE(code, lino, _exit); + } + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", // + TD_VID(pFS->pTsdb->pVnode), // + __func__, // + lino, // + tstrerror(code)); + } + tsem_post(&pFS->canEdit); + return code; +} + +int32_t tsdbFileSystemEditAbort(struct STFileSystem *pFS, EFsEditType etype) { + int32_t code = 0; + int32_t lino = 0; + char fname[TSDB_FILENAME_LEN]; + + get_temp_current_file_name(pFS->pTsdb, fname, etype); + + code = taosRemoveFile(fname); + TSDB_CHECK_CODE(code, lino, _exit); + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", // + TD_VID(pFS->pTsdb->pVnode), // + __func__, // + lino, // + tstrerror(code)); + } + tsem_post(&pFS->canEdit); + return code; +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbFS.h b/source/dnode/vnode/src/tsdb/dev/tsdbFS.h index eeac3a1404..6b22914670 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbFS.h +++ b/source/dnode/vnode/src/tsdb/dev/tsdbFS.h @@ -25,16 +25,24 @@ extern "C" { /* Exposed Handle */ struct STFileSystem; +typedef enum { + TSDB_FS_EDIT_COMMIT = 0, + TSDB_FS_EDIT_MERGE, +} EFsEditType; + /* Exposed APIs */ // open/close int32_t tsdbOpenFileSystem(STsdb *pTsdb, struct STFileSystem **ppFS, int8_t rollback); int32_t tsdbCloseFileSystem(struct STFileSystem **ppFS); // txn -// int32_t tsdb +int32_t tsdbFileSystemEditBegin(struct STFileSystem *pFS, const SArray *aFileOp, EFsEditType etype); +int32_t tsdbFileSystemEditCommit(struct STFileSystem *pFS, EFsEditType etype); +int32_t tsdbFileSystemEditAbort(struct STFileSystem *pFS, EFsEditType etype); /* Exposed Structs */ struct STFileSystem { STsdb *pTsdb; + tsem_t canEdit; int32_t nFileSet; struct SFileSet *aFileSet; };