提交 1619faa0 编写于 作者: H Hongze Cheng

make update file group atomic

上级 ffb2a548
...@@ -656,12 +656,20 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe ...@@ -656,12 +656,20 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe
tsdbCloseHelperFile(pHelper, 0); tsdbCloseHelperFile(pHelper, 0);
pthread_rwlock_wrlock(&(pFileH->fhlock)); pthread_rwlock_wrlock(&(pFileH->fhlock));
#ifdef TSDB_IDX #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 #endif
pGroup->files[TSDB_FILE_TYPE_HEAD] = *(helperHeadF(pHelper));
pGroup->files[TSDB_FILE_TYPE_DATA] = *(helperDataF(pHelper)); rename(helperNewHeadF(pHelper)->fname, helperHeadF(pHelper)->fname);
pGroup->files[TSDB_FILE_TYPE_LAST] = *(helperLastF(pHelper)); 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)); pthread_rwlock_unlock(&(pFileH->fhlock));
return 0; return 0;
......
...@@ -180,8 +180,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { ...@@ -180,8 +180,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) {
pFile = helperDataF(pHelper); pFile = helperDataF(pHelper);
if (pFile->fd > 0) { if (pFile->fd > 0) {
if (helperType(pHelper) == TSDB_WRITE_HELPER) { if (helperType(pHelper) == TSDB_WRITE_HELPER) {
tsdbUpdateFileHeader(pFile, 0); if (!hasError) {
fsync(pFile->fd); tsdbUpdateFileHeader(pFile, 0);
fsync(pFile->fd);
} else {
// TODO: shrink back to origin
}
} }
close(pFile->fd); close(pFile->fd);
pFile->fd = -1; pFile->fd = -1;
...@@ -190,7 +194,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { ...@@ -190,7 +194,12 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) {
pFile = helperLastF(pHelper); pFile = helperLastF(pHelper);
if (pFile->fd > 0) { if (pFile->fd > 0) {
if (helperType(pHelper) == TSDB_WRITE_HELPER && !TSDB_NLAST_FILE_OPENED(pHelper)) { 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); close(pFile->fd);
pFile->fd = -1; pFile->fd = -1;
...@@ -200,60 +209,36 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) { ...@@ -200,60 +209,36 @@ int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError) {
#ifdef TSDB_IDX #ifdef TSDB_IDX
pFile = helperNewIdxF(pHelper); pFile = helperNewIdxF(pHelper);
if (pFile->fd > 0) { if (pFile->fd > 0) {
if (!hasError) tsdbUpdateFileHeader(pFile, 0); if (!hasError) {
fsync(pFile->fd); tsdbUpdateFileHeader(pFile, 0);
fsync(pFile->fd);
}
close(pFile->fd); close(pFile->fd);
pFile->fd = -1; pFile->fd = -1;
if (hasError) { if (hasError) (void)remove(pFile->fname);
(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;
}
} }
#endif #endif
pFile = helperNewHeadF(pHelper); pFile = helperNewHeadF(pHelper);
if (pFile->fd > 0) { if (pFile->fd > 0) {
if (!hasError) tsdbUpdateFileHeader(pFile, 0); if (!hasError) {
fsync(pFile->fd); tsdbUpdateFileHeader(pFile, 0);
fsync(pFile->fd);
}
close(pFile->fd); close(pFile->fd);
pFile->fd = -1; pFile->fd = -1;
if (hasError) { if (hasError) (void)remove(pFile->fname);
(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;
}
} }
pFile = helperNewLastF(pHelper); pFile = helperNewLastF(pHelper);
if (pFile->fd > 0) { if (pFile->fd > 0) {
if (!hasError) tsdbUpdateFileHeader(pFile, 0); if (!hasError) {
fsync(pFile->fd); tsdbUpdateFileHeader(pFile, 0);
fsync(pFile->fd);
}
close(pFile->fd); close(pFile->fd);
pFile->fd = -1; pFile->fd = -1;
if (hasError) { if (hasError) (void)remove(pFile->fname);
(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;
}
} }
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册