From 1619faa0c4de1d1ba87334d9a7369c61e0be836d Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 31 Jul 2020 10:26:25 +0800 Subject: [PATCH] make update file group atomic --- src/tsdb/src/tsdbMemTable.c | 16 ++++++--- src/tsdb/src/tsdbRWHelper.c | 69 +++++++++++++++---------------------- 2 files changed, 39 insertions(+), 46 deletions(-) diff --git a/src/tsdb/src/tsdbMemTable.c b/src/tsdb/src/tsdbMemTable.c index 0cb032a730..d5e90bcd60 100644 --- a/src/tsdb/src/tsdbMemTable.c +++ b/src/tsdb/src/tsdbMemTable.c @@ -656,12 +656,20 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe tsdbCloseHelperFile(pHelper, 0); pthread_rwlock_wrlock(&(pFileH->fhlock)); + #ifdef TSDB_IDX - pGroup->files[TSDB_FILE_TYPE_IDX] = *(helperIdxF(pHelper)); + rename(helperNewIdxF(pHelper)->fname, helperIdxF(pHelper)->fname); + pGroup->files[TSDB_FILE_TYPE_IDX].info = helperNewIdxF(pHelper)->info; #endif - pGroup->files[TSDB_FILE_TYPE_HEAD] = *(helperHeadF(pHelper)); - pGroup->files[TSDB_FILE_TYPE_DATA] = *(helperDataF(pHelper)); - pGroup->files[TSDB_FILE_TYPE_LAST] = *(helperLastF(pHelper)); + + rename(helperNewHeadF(pHelper)->fname, helperHeadF(pHelper)->fname); + pGroup->files[TSDB_FILE_TYPE_HEAD].info = helperNewHeadF(pHelper)->info; + + rename(helperNewLastF(pHelper)->fname, helperLastF(pHelper)->fname); + pGroup->files[TSDB_FILE_TYPE_LAST].info = helperNewLastF(pHelper)->info; + + pGroup->files[TSDB_FILE_TYPE_DATA].info = helperDataF(pHelper)->info; + pthread_rwlock_unlock(&(pFileH->fhlock)); return 0; diff --git a/src/tsdb/src/tsdbRWHelper.c b/src/tsdb/src/tsdbRWHelper.c index b25e5ac432..b04d08f850 100644 --- a/src/tsdb/src/tsdbRWHelper.c +++ b/src/tsdb/src/tsdbRWHelper.c @@ -180,8 +180,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { pFile = helperDataF(pHelper); if (pFile->fd > 0) { if (helperType(pHelper) == TSDB_WRITE_HELPER) { - tsdbUpdateFileHeader(pFile, 0); - fsync(pFile->fd); + if (!hasError) { + tsdbUpdateFileHeader(pFile, 0); + fsync(pFile->fd); + } else { + // TODO: shrink back to origin + } } close(pFile->fd); pFile->fd = -1; @@ -190,7 +194,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { pFile = helperLastF(pHelper); if (pFile->fd > 0) { if (helperType(pHelper) == TSDB_WRITE_HELPER && !TSDB_NLAST_FILE_OPENED(pHelper)) { - fsync(pFile->fd); + if (!hasError) { + tsdbUpdateFileHeader(pFile, 0); + fsync(pFile->fd); + } else { + // TODO: shrink back to origin + } } close(pFile->fd); pFile->fd = -1; @@ -200,60 +209,36 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { #ifdef TSDB_IDX pFile = helperNewIdxF(pHelper); if (pFile->fd > 0) { - if (!hasError) tsdbUpdateFileHeader(pFile, 0); - fsync(pFile->fd); + if (!hasError) { + tsdbUpdateFileHeader(pFile, 0); + fsync(pFile->fd); + } close(pFile->fd); pFile->fd = -1; - if (hasError) { - (void)remove(pFile->fname); - } else { - if (rename(pFile->fname, helperIdxF(pHelper)->fname) < 0) { - tsdbError("failed to rename file from %s to %s since %s", pFile->fname, helperIdxF(pHelper)->fname, - strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - helperIdxF(pHelper)->info = pFile->info; - } + if (hasError) (void)remove(pFile->fname); } #endif pFile = helperNewHeadF(pHelper); if (pFile->fd > 0) { - if (!hasError) tsdbUpdateFileHeader(pFile, 0); - fsync(pFile->fd); + if (!hasError) { + tsdbUpdateFileHeader(pFile, 0); + fsync(pFile->fd); + } close(pFile->fd); pFile->fd = -1; - if (hasError) { - (void)remove(pFile->fname); - } else { - if (rename(pFile->fname, helperHeadF(pHelper)->fname) < 0) { - tsdbError("failed to rename file from %s to %s since %s", pFile->fname, helperHeadF(pHelper)->fname, - strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - helperHeadF(pHelper)->info = pFile->info; - } + if (hasError) (void)remove(pFile->fname); } pFile = helperNewLastF(pHelper); if (pFile->fd > 0) { - if (!hasError) tsdbUpdateFileHeader(pFile, 0); - fsync(pFile->fd); + if (!hasError) { + tsdbUpdateFileHeader(pFile, 0); + fsync(pFile->fd); + } close(pFile->fd); pFile->fd = -1; - if (hasError) { - (void)remove(pFile->fname); - } else { - if (rename(pFile->fname, helperLastF(pHelper)->fname) < 0) { - tsdbError("failed to rename file from %s to %s since %s", pFile->fname, helperLastF(pHelper)->fname, - strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - helperLastF(pHelper)->info = helperNewLastF(pHelper)->info; - } + if (hasError) (void)remove(pFile->fname); } } return 0;