[TD-4352]<feature>refactor code,use meta-ver instead of tmp file
This commit is contained in:
parent
dc778057de
commit
a1ac1c6348
|
@ -38,7 +38,7 @@
|
||||||
#define TSDB_FILE_IS_OK(tf) (TSDB_FILE_STATE(tf) == TSDB_FILE_STATE_OK)
|
#define TSDB_FILE_IS_OK(tf) (TSDB_FILE_STATE(tf) == TSDB_FILE_STATE_OK)
|
||||||
#define TSDB_FILE_IS_BAD(tf) (TSDB_FILE_STATE(tf) == TSDB_FILE_STATE_BAD)
|
#define TSDB_FILE_IS_BAD(tf) (TSDB_FILE_STATE(tf) == TSDB_FILE_STATE_BAD)
|
||||||
|
|
||||||
typedef enum { TSDB_FILE_HEAD = 0, TSDB_FILE_DATA, TSDB_FILE_LAST, TSDB_FILE_MAX, TSDB_FILE_META, TSDB_FILE_META_TMP} TSDB_FILE_T;
|
typedef enum { TSDB_FILE_HEAD = 0, TSDB_FILE_DATA, TSDB_FILE_LAST, TSDB_FILE_MAX, TSDB_FILE_META } TSDB_FILE_T;
|
||||||
|
|
||||||
// =============== SMFile
|
// =============== SMFile
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -56,7 +56,7 @@ typedef struct {
|
||||||
uint8_t state;
|
uint8_t state;
|
||||||
} SMFile;
|
} SMFile;
|
||||||
|
|
||||||
void tsdbInitMFile(SMFile* pMFile, SDiskID did, int vid, uint32_t ver, bool tmp);
|
void tsdbInitMFile(SMFile* pMFile, SDiskID did, int vid, uint32_t ver);
|
||||||
void tsdbInitMFileEx(SMFile* pMFile, const SMFile* pOMFile);
|
void tsdbInitMFileEx(SMFile* pMFile, const SMFile* pOMFile);
|
||||||
int tsdbEncodeSMFile(void** buf, SMFile* pMFile);
|
int tsdbEncodeSMFile(void** buf, SMFile* pMFile);
|
||||||
void* tsdbDecodeSMFile(void* buf, SMFile* pMFile);
|
void* tsdbDecodeSMFile(void* buf, SMFile* pMFile);
|
||||||
|
|
|
@ -264,6 +264,35 @@ int tsdbWriteBlockIdx(SDFile *pHeadf, SArray *pIdxA, void **ppBuf) {
|
||||||
|
|
||||||
|
|
||||||
// =================== Commit Meta Data
|
// =================== Commit Meta Data
|
||||||
|
static int tsdbInitCommitMetaFile(STsdbRepo *pRepo, SMFile* pMf, bool open) {
|
||||||
|
STsdbFS * pfs = REPO_FS(pRepo);
|
||||||
|
SMFile * pOMFile = pfs->cstatus->pmf;
|
||||||
|
SDiskID did;
|
||||||
|
|
||||||
|
// Create/Open a meta file or open the existing file
|
||||||
|
if (pOMFile == NULL) {
|
||||||
|
// Create a new meta file
|
||||||
|
did.level = TFS_PRIMARY_LEVEL;
|
||||||
|
did.id = TFS_PRIMARY_ID;
|
||||||
|
tsdbInitMFile(pMf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)));
|
||||||
|
|
||||||
|
if (open && tsdbCreateMFile(pMf, true) < 0) {
|
||||||
|
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbInfo("vgId:%d meta file %s is created to commit", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pMf));
|
||||||
|
} else {
|
||||||
|
tsdbInitMFileEx(pMf, pOMFile);
|
||||||
|
if (open && tsdbOpenMFile(pMf, O_WRONLY) < 0) {
|
||||||
|
tsdbError("vgId:%d failed to open META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int tsdbCommitMeta(STsdbRepo *pRepo) {
|
static int tsdbCommitMeta(STsdbRepo *pRepo) {
|
||||||
STsdbFS * pfs = REPO_FS(pRepo);
|
STsdbFS * pfs = REPO_FS(pRepo);
|
||||||
SMemTable *pMem = pRepo->imem;
|
SMemTable *pMem = pRepo->imem;
|
||||||
|
@ -272,34 +301,25 @@ static int tsdbCommitMeta(STsdbRepo *pRepo) {
|
||||||
SActObj * pAct = NULL;
|
SActObj * pAct = NULL;
|
||||||
SActCont * pCont = NULL;
|
SActCont * pCont = NULL;
|
||||||
SListNode *pNode = NULL;
|
SListNode *pNode = NULL;
|
||||||
SDiskID did;
|
|
||||||
|
|
||||||
ASSERT(pOMFile != NULL || listNEles(pMem->actList) > 0);
|
ASSERT(pOMFile != NULL || listNEles(pMem->actList) > 0);
|
||||||
|
|
||||||
if (listNEles(pMem->actList) <= 0) {
|
if (listNEles(pMem->actList) <= 0) {
|
||||||
// no meta data to commit, just keep the old meta file
|
// no meta data to commit, just keep the old meta file
|
||||||
tsdbUpdateMFile(pfs, pOMFile);
|
tsdbUpdateMFile(pfs, pOMFile);
|
||||||
|
if (tsTsdbMetaCompactRatio > 0) {
|
||||||
|
if (tsdbInitCommitMetaFile(pRepo, &mf, false) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = tsdbCompactMetaFile(pRepo, pfs, &mf);
|
||||||
|
if (ret < 0) tsdbError("compact meta file error");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
// Create/Open a meta file or open the existing file
|
if (tsdbInitCommitMetaFile(pRepo, &mf, true) < 0) {
|
||||||
if (pOMFile == NULL) {
|
return -1;
|
||||||
// Create a new meta file
|
|
||||||
did.level = TFS_PRIMARY_LEVEL;
|
|
||||||
did.id = TFS_PRIMARY_ID;
|
|
||||||
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)), false);
|
|
||||||
|
|
||||||
if (tsdbCreateMFile(&mf, true) < 0) {
|
|
||||||
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbInfo("vgId:%d meta file %s is created to commit", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(&mf));
|
|
||||||
} else {
|
|
||||||
tsdbInitMFileEx(&mf, pOMFile);
|
|
||||||
if (tsdbOpenMFile(&mf, O_WRONLY) < 0) {
|
|
||||||
tsdbError("vgId:%d failed to open META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +497,7 @@ static int tsdbCompactMetaFile(STsdbRepo *pRepo, STsdbFS *pfs, SMFile *pMFile) {
|
||||||
// first create tmp meta file
|
// first create tmp meta file
|
||||||
did.level = TFS_PRIMARY_LEVEL;
|
did.level = TFS_PRIMARY_LEVEL;
|
||||||
did.id = TFS_PRIMARY_ID;
|
did.id = TFS_PRIMARY_ID;
|
||||||
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)), true);
|
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)) + 1);
|
||||||
|
|
||||||
if (tsdbCreateMFile(&mf, true) < 0) {
|
if (tsdbCreateMFile(&mf, true) < 0) {
|
||||||
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
|
@ -542,6 +562,7 @@ _err:
|
||||||
|
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
// rename meta.tmp -> meta
|
// rename meta.tmp -> meta
|
||||||
|
tsdbInfo("vgId:%d meta file rename %s -> %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(&mf), TSDB_FILE_FULL_NAME(pMFile));
|
||||||
taosRename(mf.f.aname,pMFile->f.aname);
|
taosRename(mf.f.aname,pMFile->f.aname);
|
||||||
tstrncpy(mf.f.aname, pMFile->f.aname, TSDB_FILENAME_LEN);
|
tstrncpy(mf.f.aname, pMFile->f.aname, TSDB_FILENAME_LEN);
|
||||||
tstrncpy(mf.f.rname, pMFile->f.rname, TSDB_FILENAME_LEN);
|
tstrncpy(mf.f.rname, pMFile->f.rname, TSDB_FILENAME_LEN);
|
||||||
|
|
|
@ -274,7 +274,7 @@ static int tsdbCreateMeta(STsdbRepo *pRepo) {
|
||||||
// Create a new meta file
|
// Create a new meta file
|
||||||
did.level = TFS_PRIMARY_LEVEL;
|
did.level = TFS_PRIMARY_LEVEL;
|
||||||
did.id = TFS_PRIMARY_ID;
|
did.id = TFS_PRIMARY_ID;
|
||||||
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)), false);
|
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)));
|
||||||
|
|
||||||
if (tsdbCreateMFile(&mf, true) < 0) {
|
if (tsdbCreateMFile(&mf, true) < 0) {
|
||||||
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
tsdbError("vgId:%d failed to create META file since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
|
|
|
@ -21,7 +21,6 @@ static const char *TSDB_FNAME_SUFFIX[] = {
|
||||||
"last", // TSDB_FILE_LAST
|
"last", // TSDB_FILE_LAST
|
||||||
"", // TSDB_FILE_MAX
|
"", // TSDB_FILE_MAX
|
||||||
"meta", // TSDB_FILE_META
|
"meta", // TSDB_FILE_META
|
||||||
"meta.tmp", // TSDB_FILE_META_TMP
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void tsdbGetFilename(int vid, int fid, uint32_t ver, TSDB_FILE_T ftype, char *fname);
|
static void tsdbGetFilename(int vid, int fid, uint32_t ver, TSDB_FILE_T ftype, char *fname);
|
||||||
|
@ -31,7 +30,7 @@ static void *tsdbDecodeDFInfo(void *buf, SDFInfo *pInfo);
|
||||||
static int tsdbRollBackDFile(SDFile *pDFile);
|
static int tsdbRollBackDFile(SDFile *pDFile);
|
||||||
|
|
||||||
// ============== SMFile
|
// ============== SMFile
|
||||||
void tsdbInitMFile(SMFile *pMFile, SDiskID did, int vid, uint32_t ver, bool tmp) {
|
void tsdbInitMFile(SMFile *pMFile, SDiskID did, int vid, uint32_t ver) {
|
||||||
char fname[TSDB_FILENAME_LEN];
|
char fname[TSDB_FILENAME_LEN];
|
||||||
|
|
||||||
TSDB_FILE_SET_STATE(pMFile, TSDB_FILE_STATE_OK);
|
TSDB_FILE_SET_STATE(pMFile, TSDB_FILE_STATE_OK);
|
||||||
|
@ -39,7 +38,7 @@ void tsdbInitMFile(SMFile *pMFile, SDiskID did, int vid, uint32_t ver, bool tmp)
|
||||||
memset(&(pMFile->info), 0, sizeof(pMFile->info));
|
memset(&(pMFile->info), 0, sizeof(pMFile->info));
|
||||||
pMFile->info.magic = TSDB_FILE_INIT_MAGIC;
|
pMFile->info.magic = TSDB_FILE_INIT_MAGIC;
|
||||||
|
|
||||||
tsdbGetFilename(vid, 0, ver, tmp ? TSDB_FILE_META_TMP : TSDB_FILE_META, fname);
|
tsdbGetFilename(vid, 0, ver, TSDB_FILE_META, fname);
|
||||||
tfsInitFile(TSDB_FILE_F(pMFile), did.level, did.id, fname);
|
tfsInitFile(TSDB_FILE_F(pMFile), did.level, did.id, fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -209,7 +209,7 @@ static int32_t tsdbSyncRecvMeta(SSyncH *pSynch) {
|
||||||
// Recv from remote
|
// Recv from remote
|
||||||
SMFile mf;
|
SMFile mf;
|
||||||
SDiskID did = {.level = TFS_PRIMARY_LEVEL, .id = TFS_PRIMARY_ID};
|
SDiskID did = {.level = TFS_PRIMARY_LEVEL, .id = TFS_PRIMARY_ID};
|
||||||
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)), false);
|
tsdbInitMFile(&mf, did, REPO_ID(pRepo), FS_TXN_VERSION(REPO_FS(pRepo)));
|
||||||
if (tsdbCreateMFile(&mf, false) < 0) {
|
if (tsdbCreateMFile(&mf, false) < 0) {
|
||||||
tsdbError("vgId:%d, failed to create file while recv metafile since %s", REPO_ID(pRepo), tstrerror(terrno));
|
tsdbError("vgId:%d, failed to create file while recv metafile since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue