make update file group atomic
This commit is contained in:
parent
ffb2a5482a
commit
1619faa0c4
|
@ -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) {
|
||||||
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) {
|
||||||
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) {
|
||||||
#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;
|
||||||
|
|
Loading…
Reference in New Issue