Merge pull request #5625 from taosdata/hotfix/checktsdbfheader
update file header on start
This commit is contained in:
commit
9cb2020933
|
@ -33,6 +33,7 @@ static int tsdbScanDataDir(STsdbRepo *pRepo);
|
|||
static bool tsdbIsTFileInFS(STsdbFS *pfs, const TFILE *pf);
|
||||
static int tsdbRestoreCurrent(STsdbRepo *pRepo);
|
||||
static int tsdbComparTFILE(const void *arg1, const void *arg2);
|
||||
static void tsdbScanAndTryFixDFilesHeader(STsdbRepo *pRepo);
|
||||
|
||||
// ================== CURRENT file header info
|
||||
static int tsdbEncodeFSHeader(void **buf, SFSHeader *pHeader) {
|
||||
|
@ -246,6 +247,8 @@ int tsdbOpenFS(STsdbRepo *pRepo) {
|
|||
tsdbError("vgId:%d failed to open FS since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
tsdbScanAndTryFixDFilesHeader(pRepo);
|
||||
} else {
|
||||
if (tsdbRestoreCurrent(pRepo) < 0) {
|
||||
tsdbError("vgId:%d failed to restore current file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||
|
@ -1201,4 +1204,41 @@ static int tsdbComparTFILE(const void *arg1, const void *arg2) {
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void tsdbScanAndTryFixDFilesHeader(STsdbRepo *pRepo) {
|
||||
STsdbFS * pfs = REPO_FS(pRepo);
|
||||
SFSStatus *pStatus = pfs->cstatus;
|
||||
SDFInfo info;
|
||||
|
||||
for (size_t i = 0; i < taosArrayGetSize(pStatus->df); i++) {
|
||||
SDFileSet fset;
|
||||
tsdbInitDFileSetEx(&fset, (SDFileSet *)taosArrayGet(pStatus->df, i));
|
||||
|
||||
tsdbDebug("vgId:%d scan DFileSet %d header", REPO_ID(pRepo), fset.fid);
|
||||
|
||||
if (tsdbOpenDFileSet(&fset, O_RDWR) < 0) {
|
||||
tsdbError("vgId:%d failed to open DFileSet %d since %s, continue", REPO_ID(pRepo), fset.fid, tstrerror(terrno));
|
||||
continue;
|
||||
}
|
||||
|
||||
for (TSDB_FILE_T ftype = 0; ftype < TSDB_FILE_MAX; ftype++) {
|
||||
SDFile *pDFile = TSDB_DFILE_IN_SET(&fset, ftype);
|
||||
|
||||
if ((tsdbLoadDFileHeader(pDFile, &info) < 0) || pDFile->info.size != info.size ||
|
||||
pDFile->info.magic != info.magic) {
|
||||
if (tsdbUpdateDFileHeader(pDFile) < 0) {
|
||||
tsdbError("vgId:%d failed to update DFile header of %s since %s, continue", REPO_ID(pRepo),
|
||||
TSDB_FILE_FULL_NAME(pDFile), tstrerror(terrno));
|
||||
} else {
|
||||
tsdbInfo("vgId:%d DFile header of %s is updated", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile));
|
||||
TSDB_FILE_FSYNC(pDFile);
|
||||
}
|
||||
} else {
|
||||
tsdbDebug("vgId:%d DFile header of %s is correct", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile));
|
||||
}
|
||||
}
|
||||
|
||||
tsdbCloseDFileSet(&fset);
|
||||
}
|
||||
}
|
|
@ -567,6 +567,7 @@ void tsdbInitDFileSet(SDFileSet *pSet, SDiskID did, int vid, int fid, uint32_t v
|
|||
}
|
||||
|
||||
void tsdbInitDFileSetEx(SDFileSet *pSet, SDFileSet *pOSet) {
|
||||
pSet->fid = pOSet->fid;
|
||||
for (TSDB_FILE_T ftype = 0; ftype < TSDB_FILE_MAX; ftype++) {
|
||||
tsdbInitDFileEx(TSDB_DFILE_IN_SET(pSet, ftype), TSDB_DFILE_IN_SET(pOSet, ftype));
|
||||
}
|
||||
|
|
|
@ -917,7 +917,9 @@ static int32_t loadBlockInfo(STsdbQueryHandle * pQueryHandle, int32_t index, int
|
|||
pCheckInfo->compSize = compIndex->len;
|
||||
}
|
||||
|
||||
tsdbLoadBlockInfo(&(pQueryHandle->rhelper), (void*)(pCheckInfo->pCompInfo));
|
||||
if (tsdbLoadBlockInfo(&(pQueryHandle->rhelper), (void*)(pCheckInfo->pCompInfo)) < 0) {
|
||||
return terrno;
|
||||
}
|
||||
SBlockInfo* pCompInfo = pCheckInfo->pCompInfo;
|
||||
|
||||
TSKEY s = TSKEY_INITIAL_VAL, e = TSKEY_INITIAL_VAL;
|
||||
|
@ -2832,7 +2834,9 @@ int32_t tsdbRetrieveDataBlockStatisInfo(TsdbQueryHandleT* pQueryHandle, SDataSta
|
|||
}
|
||||
|
||||
int64_t stime = taosGetTimestampUs();
|
||||
tsdbLoadBlockStatis(&pHandle->rhelper, pBlockInfo->compBlock);
|
||||
if (tsdbLoadBlockStatis(&pHandle->rhelper, pBlockInfo->compBlock) < 0) {
|
||||
return terrno;
|
||||
}
|
||||
|
||||
int16_t* colIds = pHandle->defaultLoadColumn->pData;
|
||||
|
||||
|
|
|
@ -194,8 +194,8 @@ static int32_t tsdbSyncRecvMeta(SSyncH *pSynch) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (pLMFile == NULL || memcmp(&(pSynch->pmf->info), &(pLMFile->info), sizeof(SMFInfo)) != 0 ||
|
||||
TSDB_FILE_IS_BAD(pLMFile)) {
|
||||
if (pLMFile == NULL || pSynch->pmf->info.size != pLMFile->info.size ||
|
||||
pSynch->pmf->info.magic != pLMFile->info.magic || TSDB_FILE_IS_BAD(pLMFile)) {
|
||||
// Local has no meta file or has a different meta file, need to copy from remote
|
||||
pSynch->mfChanged = true;
|
||||
|
||||
|
@ -536,7 +536,7 @@ static bool tsdbIsTowFSetSame(SDFileSet *pSet1, SDFileSet *pSet2) {
|
|||
SDFile *pDFile1 = TSDB_DFILE_IN_SET(pSet1, ftype);
|
||||
SDFile *pDFile2 = TSDB_DFILE_IN_SET(pSet2, ftype);
|
||||
|
||||
if (memcmp((void *)(TSDB_FILE_INFO(pDFile1)), (void *)(TSDB_FILE_INFO(pDFile2)), sizeof(SDFInfo)) != 0) {
|
||||
if (pDFile1->info.size != pDFile2->info.size || pDFile1->info.magic != pDFile2->info.magic) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue