more work
This commit is contained in:
parent
4d8d1df2e5
commit
4b33695f3c
|
@ -67,6 +67,7 @@ typedef struct STsdbFS STsdbFS;
|
||||||
typedef struct SRowMerger SRowMerger;
|
typedef struct SRowMerger SRowMerger;
|
||||||
|
|
||||||
#define TSDB_MAX_SUBBLOCKS 8
|
#define TSDB_MAX_SUBBLOCKS 8
|
||||||
|
#define TSDB_FHDR_SIZE 512
|
||||||
|
|
||||||
#define HAS_NONE ((int8_t)0x1)
|
#define HAS_NONE ((int8_t)0x1)
|
||||||
#define HAS_NULL ((int8_t)0x2)
|
#define HAS_NULL ((int8_t)0x2)
|
||||||
|
@ -165,15 +166,8 @@ void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, S
|
||||||
TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter);
|
TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter);
|
||||||
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
||||||
// tsdbFile.c ==============================================================================================
|
// tsdbFile.c ==============================================================================================
|
||||||
// SDataFSet
|
enum { TSDB_HEAD_FILE = 0, TSDB_DATA_FILE, TSDB_LAST_FILE, TSDB_SMA_FILE };
|
||||||
// SHeadFile
|
void tsdbDataFileName(STsdb *pTsdb, SDFileSet *pDFileSet, int8_t ftype, char fname[]);
|
||||||
void tsdbHeadFileName(STsdb *pTsdb, SHeadFile *pFile, char fname[]);
|
|
||||||
// SDataFile
|
|
||||||
void tsdbDataFileName(STsdb *pTsdb, SDataFile *pFile, char fname[]);
|
|
||||||
// SLastFile
|
|
||||||
void tsdbLastFileName(STsdb *pTsdb, SLastFile *pFile, char fname[]);
|
|
||||||
// SSmaFile
|
|
||||||
void tsdbSmaFileName(STsdb *pTsdb, SSmaFile *pFile, char fname[]);
|
|
||||||
// SDelFile
|
// SDelFile
|
||||||
#define tsdbDelFileCreate() \
|
#define tsdbDelFileCreate() \
|
||||||
((SDelFile){ \
|
((SDelFile){ \
|
||||||
|
@ -230,12 +224,10 @@ typedef struct {
|
||||||
TSKEY minKey;
|
TSKEY minKey;
|
||||||
} SRtn;
|
} SRtn;
|
||||||
|
|
||||||
#define TSDB_DATA_DIR_LEN 6 // adapt accordingly
|
|
||||||
struct STsdb {
|
struct STsdb {
|
||||||
char *path;
|
char *path;
|
||||||
SVnode *pVnode;
|
SVnode *pVnode;
|
||||||
TdThreadMutex mutex;
|
TdThreadMutex mutex;
|
||||||
char dir[TSDB_DATA_DIR_LEN];
|
|
||||||
bool repoLocked;
|
bool repoLocked;
|
||||||
STsdbKeepCfg keepCfg;
|
STsdbKeepCfg keepCfg;
|
||||||
SMemTable *mem;
|
SMemTable *mem;
|
||||||
|
@ -489,14 +481,10 @@ struct SSmaFile {
|
||||||
struct SDFileSet {
|
struct SDFileSet {
|
||||||
SDiskID diskId;
|
SDiskID diskId;
|
||||||
int32_t fid;
|
int32_t fid;
|
||||||
SHeadFile *pHeadFile;
|
SHeadFile fHead;
|
||||||
SDataFile *pDataFile;
|
SDataFile fData;
|
||||||
SLastFile *pLastFile;
|
SLastFile fLast;
|
||||||
SSmaFile *pSmaFile;
|
SSmaFile fSma;
|
||||||
// SHeadFile headFile;
|
|
||||||
// SDataFile dataFile;
|
|
||||||
// SLastFile lastFile;
|
|
||||||
// SSmaFile smaFile;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SRowIter {
|
struct SRowIter {
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SDelFile *pDelFile;
|
SDelFile *pDelFile;
|
||||||
SArray *aDFileSet; // SArray<aDFileSet *>
|
SArray *aDFileSet; // SArray<aDFileSet>
|
||||||
|
SDelFile delFile;
|
||||||
} STsdbFSState;
|
} STsdbFSState;
|
||||||
|
|
||||||
struct STsdbFS {
|
struct STsdbFS {
|
||||||
|
@ -105,10 +106,10 @@ static int32_t tsdbDFileSetToJson(const void *pObj, SJson *pJson) {
|
||||||
if (tjsonAddIntegerToObject(pJson, "level", pDFileSet->diskId.level) < 0) goto _err;
|
if (tjsonAddIntegerToObject(pJson, "level", pDFileSet->diskId.level) < 0) goto _err;
|
||||||
if (tjsonAddIntegerToObject(pJson, "id", pDFileSet->diskId.id) < 0) goto _err;
|
if (tjsonAddIntegerToObject(pJson, "id", pDFileSet->diskId.id) < 0) goto _err;
|
||||||
if (tjsonAddIntegerToObject(pJson, "fid", pDFileSet->fid) < 0) goto _err;
|
if (tjsonAddIntegerToObject(pJson, "fid", pDFileSet->fid) < 0) goto _err;
|
||||||
if (tjsonAddObject(pJson, "head", tsdbHeadFileToJson, pDFileSet->pHeadFile) < 0) goto _err;
|
// if (tjsonAddObject(pJson, "head", tsdbHeadFileToJson, pDFileSet->pHeadFile) < 0) goto _err;
|
||||||
if (tjsonAddObject(pJson, "data", tsdbDataFileToJson, pDFileSet->pDataFile) < 0) goto _err;
|
// if (tjsonAddObject(pJson, "data", tsdbDataFileToJson, pDFileSet->pDataFile) < 0) goto _err;
|
||||||
if (tjsonAddObject(pJson, "last", tsdbLastFileToJson, pDFileSet->pLastFile) < 0) goto _err;
|
// if (tjsonAddObject(pJson, "last", tsdbLastFileToJson, pDFileSet->pLastFile) < 0) goto _err;
|
||||||
if (tjsonAddObject(pJson, "sma", tsdbSmaFileToJson, pDFileSet->pSmaFile) < 0) goto _err;
|
// if (tjsonAddObject(pJson, "sma", tsdbSmaFileToJson, pDFileSet->pSmaFile) < 0) goto _err;
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -273,7 +274,8 @@ static int32_t tsdbLoadCurrentState(STsdbFS *pFS, STsdbFSState *pState) {
|
||||||
char *pData = NULL;
|
char *pData = NULL;
|
||||||
TdFilePtr pFD;
|
TdFilePtr pFD;
|
||||||
|
|
||||||
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s/CURRENT", pFS->pTsdb->path);
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pFS->pTsdb->pVnode->pTfs), TD_DIRSEP,
|
||||||
|
pFS->pTsdb->path, TD_DIRSEP);
|
||||||
|
|
||||||
if (!taosCheckExistFile(fname)) {
|
if (!taosCheckExistFile(fname)) {
|
||||||
// create an empry CURRENT file if not exists
|
// create an empry CURRENT file if not exists
|
||||||
|
@ -321,38 +323,6 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbFSOpenImpl(STsdbFS *pFS) {
|
|
||||||
int32_t code = 0;
|
|
||||||
int64_t size;
|
|
||||||
int64_t n;
|
|
||||||
|
|
||||||
// read CURRENT file
|
|
||||||
code = tsdbLoadCurrentState(pFS, pFS->cState);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
// decode the statue file
|
|
||||||
// code = tsdbDecodeFSState(pData, pFS->cState);
|
|
||||||
// if (code) goto _err;
|
|
||||||
|
|
||||||
// // scan and fix invalid tsdb FS
|
|
||||||
// code = tsdbScanAndFixFS(pFS);
|
|
||||||
// if (code) goto _err;
|
|
||||||
|
|
||||||
// if (pData) taosMemoryFree(pData);
|
|
||||||
return code;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
// if (pData) taosMemoryFree(pData);
|
|
||||||
tsdbError("vgId:%d tsdb fs open impl failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbFSCloseImpl(STsdbFS *pFS) {
|
|
||||||
int32_t code = 0;
|
|
||||||
// TODO
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbApplyDFileSetChange(STsdbFS *pFS, SDFileSet *pFrom, SDFileSet *pTo) {
|
static int32_t tsdbApplyDFileSetChange(STsdbFS *pFS, SDFileSet *pFrom, SDFileSet *pTo) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
// TODO
|
// TODO
|
||||||
|
@ -448,8 +418,25 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// EXPOSED APIS ====================================================================================
|
static void tsdbFSDestroy(STsdbFS *pFS) {
|
||||||
int32_t tsdbFSOpen(STsdb *pTsdb, STsdbFS **ppFS) {
|
if (pFS) {
|
||||||
|
if (pFS->nState) {
|
||||||
|
taosArrayDestroy(pFS->nState->aDFileSet);
|
||||||
|
taosMemoryFree(pFS->nState);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFS->cState) {
|
||||||
|
taosArrayDestroy(pFS->cState->aDFileSet);
|
||||||
|
taosMemoryFree(pFS->cState);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosThreadRwlockDestroy(&pFS->lock);
|
||||||
|
taosMemoryFree(pFS);
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tsdbFSCreate(STsdb *pTsdb, STsdbFS **ppFS) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STsdbFS *pFS = NULL;
|
STsdbFS *pFS = NULL;
|
||||||
|
|
||||||
|
@ -462,6 +449,7 @@ int32_t tsdbFSOpen(STsdb *pTsdb, STsdbFS **ppFS) {
|
||||||
|
|
||||||
code = taosThreadRwlockInit(&pFS->lock, NULL);
|
code = taosThreadRwlockInit(&pFS->lock, NULL);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
taosMemoryFree(pFS);
|
||||||
code = TAOS_SYSTEM_ERROR(code);
|
code = TAOS_SYSTEM_ERROR(code);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -473,7 +461,7 @@ int32_t tsdbFSOpen(STsdb *pTsdb, STsdbFS **ppFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pFS->cState->aDFileSet = taosArrayInit(0, sizeof(SDFileSet *));
|
pFS->cState->aDFileSet = taosArrayInit(0, sizeof(SDFileSet));
|
||||||
if (pFS->cState->aDFileSet == NULL) {
|
if (pFS->cState->aDFileSet == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
|
@ -484,16 +472,169 @@ int32_t tsdbFSOpen(STsdb *pTsdb, STsdbFS **ppFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pFS->nState->aDFileSet = taosArrayInit(0, sizeof(SDFileSet *));
|
pFS->nState->aDFileSet = taosArrayInit(0, sizeof(SDFileSet));
|
||||||
if (pFS->nState->aDFileSet == NULL) {
|
if (pFS->nState->aDFileSet == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbFSOpenImpl(pFS);
|
*ppFS = pFS;
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbError("vgId:%d tsdb fs create failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
||||||
|
tsdbFSDestroy(pFS);
|
||||||
|
*ppFS = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tsdbScanAndTryFixFS(STsdbFS *pFS, int8_t deepScan) {
|
||||||
|
int32_t code = 0;
|
||||||
|
STsdb *pTsdb = pFS->pTsdb;
|
||||||
|
STfs *pTfs = pTsdb->pVnode->pTfs;
|
||||||
|
int64_t size;
|
||||||
|
char fname[TSDB_FILENAME_LEN];
|
||||||
|
char pHdr[TSDB_FHDR_SIZE];
|
||||||
|
TdFilePtr pFD;
|
||||||
|
|
||||||
|
// SDelFile
|
||||||
|
if (pFS->cState->pDelFile) {
|
||||||
|
tsdbDelFileName(pTsdb, pFS->cState->pDelFile, fname);
|
||||||
|
if (taosStatFile(fname, &size, NULL)) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size != pFS->cState->pDelFile->size) {
|
||||||
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deepScan) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SArray<SDFileSet>
|
||||||
|
for (int32_t iSet = 0; iSet < taosArrayGetSize(pFS->cState->aDFileSet); iSet++) {
|
||||||
|
SDFileSet *pDFileSet = (SDFileSet *)taosArrayGet(pFS->cState->aDFileSet, iSet);
|
||||||
|
|
||||||
|
// head =========
|
||||||
|
tsdbDataFileName(pTsdb, pDFileSet, TSDB_HEAD_FILE, fname);
|
||||||
|
if (taosStatFile(fname, &size, NULL)) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deepScan) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// data =========
|
||||||
|
tsdbDataFileName(pTsdb, pDFileSet, TSDB_DATA_FILE, fname);
|
||||||
|
if (taosStatFile(fname, &size, NULL)) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < pDFileSet->fData.size) {
|
||||||
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
|
goto _err;
|
||||||
|
} else if (size > pDFileSet->fData.size) {
|
||||||
|
ASSERT(0);
|
||||||
|
// need to rollback the file
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deepScan) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// last ===========
|
||||||
|
tsdbDataFileName(pTsdb, pDFileSet, TSDB_LAST_FILE, fname);
|
||||||
|
if (taosStatFile(fname, &size, NULL)) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < pDFileSet->fLast.size) {
|
||||||
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
|
goto _err;
|
||||||
|
} else if (size > pDFileSet->fLast.size) {
|
||||||
|
ASSERT(0);
|
||||||
|
// need to rollback the file
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deepScan) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// sma =============
|
||||||
|
tsdbDataFileName(pTsdb, pDFileSet, TSDB_SMA_FILE, fname);
|
||||||
|
if (taosStatFile(fname, &size, NULL)) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < pDFileSet->fSma.size) {
|
||||||
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
|
goto _err;
|
||||||
|
} else if (size > pDFileSet->fSma.size) {
|
||||||
|
ASSERT(0);
|
||||||
|
// need to rollback the file
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deepScan) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove those invalid files (todo)
|
||||||
|
#if 0
|
||||||
|
STfsDir *tdir;
|
||||||
|
const STfsFile *pf;
|
||||||
|
|
||||||
|
tdir = tfsOpendir(pTfs, pTsdb->path);
|
||||||
|
if (tdir == NULL) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((pf = tfsReaddir(tdir))) {
|
||||||
|
tfsBasename(pf, fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfsClosedir(tdir);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbError("vgId:%d tsdb can and try fix fs failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPOSED APIS ====================================================================================
|
||||||
|
int32_t tsdbFSOpen(STsdb *pTsdb, STsdbFS **ppFS) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
// create handle
|
||||||
|
code = tsdbFSCreate(pTsdb, ppFS);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
*ppFS = pFS;
|
// load current state
|
||||||
|
code = tsdbLoadCurrentState(*ppFS, (*ppFS)->cState);
|
||||||
|
if (code) {
|
||||||
|
tsdbFSDestroy(*ppFS);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan and fix FS
|
||||||
|
code = tsdbScanAndTryFixFS(*ppFS, 0);
|
||||||
|
if (code) {
|
||||||
|
tsdbFSDestroy(*ppFS);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
@ -504,23 +645,7 @@ _err:
|
||||||
|
|
||||||
int32_t tsdbFSClose(STsdbFS *pFS) {
|
int32_t tsdbFSClose(STsdbFS *pFS) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
tsdbFSDestroy(pFS);
|
||||||
if (pFS) {
|
|
||||||
code = tsdbFSCloseImpl(pFS);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
taosArrayDestroy(pFS->nState->aDFileSet);
|
|
||||||
taosMemoryFree(pFS->nState);
|
|
||||||
taosArrayDestroy(pFS->cState->aDFileSet);
|
|
||||||
taosMemoryFree(pFS->cState);
|
|
||||||
taosThreadRwlockDestroy(&pFS->lock);
|
|
||||||
taosMemoryFree(pFS);
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
tsdbError("vgId:%d tsdb fs close failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,29 +15,48 @@
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
static const char *tsdbFileSuffix[] = {".del", ".cache", ".head", ".data", ".last", ".sma", ""};
|
void tsdbDataFileName(STsdb *pTsdb, SDFileSet *pDFileSet, int8_t ftype, char fname[]) {
|
||||||
|
STfs *pTfs = pTsdb->pVnode->pTfs;
|
||||||
|
|
||||||
|
switch (ftype) {
|
||||||
|
case TSDB_HEAD_FILE:
|
||||||
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%df%dver%" PRId64 "%s", tfsGetDiskPath(pTfs, pDFileSet->diskId),
|
||||||
|
TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), pDFileSet->fid, pDFileSet->fHead.commitID,
|
||||||
|
".head");
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_FILE:
|
||||||
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%df%dver%" PRId64 "%s", tfsGetDiskPath(pTfs, pDFileSet->diskId),
|
||||||
|
TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), pDFileSet->fid, pDFileSet->fData.commitID,
|
||||||
|
".data");
|
||||||
|
break;
|
||||||
|
case TSDB_LAST_FILE:
|
||||||
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%df%dver%" PRId64 "%s", tfsGetDiskPath(pTfs, pDFileSet->diskId),
|
||||||
|
TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), pDFileSet->fid, pDFileSet->fLast.commitID,
|
||||||
|
".last");
|
||||||
|
break;
|
||||||
|
case TSDB_SMA_FILE:
|
||||||
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%df%dver%" PRId64 "%s", tfsGetDiskPath(pTfs, pDFileSet->diskId),
|
||||||
|
TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), pDFileSet->fid, pDFileSet->fSma.commitID,
|
||||||
|
".sma");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SHeadFile ===============================================
|
// SHeadFile ===============================================
|
||||||
void tsdbHeadFileName(STsdb *pTsdb, SHeadFile *pFile, char fname[]) {
|
|
||||||
// snprintf(fname, TSDB_FILENAME_LEN - 1, "%s/v%df%dver%18d.head", );
|
|
||||||
}
|
|
||||||
|
|
||||||
// SDataFile ===============================================
|
// SDataFile ===============================================
|
||||||
void tsdbDataFileName(STsdb *pTsdb, SDataFile *pFile, char fname[]) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
// SLastFile ===============================================
|
// SLastFile ===============================================
|
||||||
void tsdbLastFileName(STsdb *pTsdb, SLastFile *pFile, char fname[]) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
// SSmaFile ===============================================
|
// SSmaFile ===============================================
|
||||||
void tsdbSmaFileName(STsdb *pTsdb, SSmaFile *pFile, char fname[]) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
// SDelFile ===============================================
|
// SDelFile ===============================================
|
||||||
void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]) {
|
void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]) {
|
||||||
// snprintf(fname, TSDB_FILENAME_LEN, "", pTsdb->path);
|
STfs *pTfs = pTsdb->pVnode->pTfs;
|
||||||
|
|
||||||
|
snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%dver%" PRId64 "%s", tfsGetPrimaryPath(pTfs), TD_DIRSEP, pTsdb->path,
|
||||||
|
TD_DIRSEP, TD_VID(pTsdb->pVnode), pFile->commitID, ".del");
|
||||||
}
|
}
|
|
@ -175,6 +175,8 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid
|
||||||
|
|
||||||
// update the state of pMemTable and other (todo)
|
// update the state of pMemTable and other (todo)
|
||||||
|
|
||||||
|
pMemTable->minVersion = TMIN(pMemTable->minVersion, version);
|
||||||
|
pMemTable->maxVersion = TMAX(pMemTable->maxVersion, version);
|
||||||
pMemTable->nDel++;
|
pMemTable->nDel++;
|
||||||
|
|
||||||
if (tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) {
|
if (tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) {
|
||||||
|
@ -521,7 +523,7 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTbData->minKey > key.ts) pTbData->minKey = key.ts;
|
pTbData->minKey = TMIN(pTbData->minKey, key.ts);
|
||||||
|
|
||||||
pLastRow = row.pTSRow;
|
pLastRow = row.pTSRow;
|
||||||
|
|
||||||
|
@ -553,14 +555,14 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
|
||||||
tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow);
|
tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pTbData->minVersion > version) pTbData->minVersion = version;
|
pTbData->minVersion = TMIN(pTbData->minVersion, version);
|
||||||
if (pTbData->maxVersion < version) pTbData->maxVersion = version;
|
pTbData->maxVersion = TMAX(pTbData->maxVersion, version);
|
||||||
|
|
||||||
// SMemTable
|
// SMemTable
|
||||||
if (pMemTable->minKey > pTbData->minKey) pMemTable->minKey = pTbData->minKey;
|
pMemTable->minKey = TMIN(pMemTable->minKey, pTbData->minKey);
|
||||||
if (pMemTable->maxKey < pTbData->maxKey) pMemTable->maxKey = pTbData->maxKey;
|
pMemTable->maxKey = TMAX(pMemTable->maxKey, pTbData->maxKey);
|
||||||
if (pMemTable->minVersion > pTbData->minVersion) pMemTable->minVersion = pTbData->minVersion;
|
pMemTable->minVersion = TMIN(pMemTable->minVersion, pTbData->minVersion);
|
||||||
if (pMemTable->maxVersion < pTbData->maxVersion) pMemTable->maxVersion = pTbData->maxVersion;
|
pMemTable->maxVersion = TMAX(pMemTable->maxVersion, pTbData->maxVersion);
|
||||||
pMemTable->nRow += nRow;
|
pMemTable->nRow += nRow;
|
||||||
|
|
||||||
pRsp->numOfRows = nRow;
|
pRsp->numOfRows = nRow;
|
||||||
|
|
|
@ -41,7 +41,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
|
||||||
int slen = 0;
|
int slen = 0;
|
||||||
|
|
||||||
*ppTsdb = NULL;
|
*ppTsdb = NULL;
|
||||||
slen = strlen(tfsGetPrimaryPath(pVnode->pTfs)) + strlen(pVnode->path) + strlen(dir) + 3;
|
slen = strlen(pVnode->path) + strlen(dir) + 2;
|
||||||
|
|
||||||
// create handle
|
// create handle
|
||||||
pTsdb = (STsdb *)taosMemoryCalloc(1, sizeof(*pTsdb) + slen);
|
pTsdb = (STsdb *)taosMemoryCalloc(1, sizeof(*pTsdb) + slen);
|
||||||
|
@ -50,10 +50,8 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(strlen(dir) < TSDB_DATA_DIR_LEN);
|
|
||||||
memcpy(pTsdb->dir, dir, strlen(dir));
|
|
||||||
pTsdb->path = (char *)&pTsdb[1];
|
pTsdb->path = (char *)&pTsdb[1];
|
||||||
sprintf(pTsdb->path, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP, dir);
|
sprintf(pTsdb->path, "%s%s%s", pVnode->path, TD_DIRSEP, dir);
|
||||||
taosRealPath(pTsdb->path, NULL, slen);
|
taosRealPath(pTsdb->path, NULL, slen);
|
||||||
pTsdb->pVnode = pVnode;
|
pTsdb->pVnode = pVnode;
|
||||||
pTsdb->repoLocked = false;
|
pTsdb->repoLocked = false;
|
||||||
|
@ -65,8 +63,8 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
|
||||||
}
|
}
|
||||||
// pTsdb->fs = tsdbNewFS(REPO_KEEP_CFG(pTsdb));
|
// pTsdb->fs = tsdbNewFS(REPO_KEEP_CFG(pTsdb));
|
||||||
|
|
||||||
// create dir (TODO: use tfsMkdir)
|
// create dir
|
||||||
taosMkDir(pTsdb->path);
|
tfsMkdir(pVnode->pTfs, pTsdb->path);
|
||||||
|
|
||||||
// open tsdb
|
// open tsdb
|
||||||
if (tsdbFSOpen(pTsdb, &pTsdb->fs) < 0) {
|
if (tsdbFSOpen(pTsdb, &pTsdb->fs) < 0) {
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
#define TSDB_FHDR_SIZE 512
|
|
||||||
#define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F)
|
#define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F)
|
||||||
|
|
||||||
// SDelFWriter ====================================================
|
// SDelFWriter ====================================================
|
||||||
|
@ -443,8 +442,8 @@ _err:
|
||||||
|
|
||||||
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SMapData *mBlockIdx, uint8_t **ppBuf) {
|
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SMapData *mBlockIdx, uint8_t **ppBuf) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int64_t offset = pReader->pSet->pHeadFile->offset;
|
int64_t offset = pReader->pSet->fHead.offset;
|
||||||
int64_t size = pReader->pSet->pHeadFile->size;
|
int64_t size = pReader->pSet->fHead.size - offset;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
uint32_t delimiter;
|
uint32_t delimiter;
|
||||||
|
|
||||||
|
@ -629,10 +628,10 @@ int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter, uint8_t **ppBuf) {
|
||||||
int64_t size = TSDB_FHDR_SIZE;
|
int64_t size = TSDB_FHDR_SIZE;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
uint8_t *pBuf = NULL;
|
uint8_t *pBuf = NULL;
|
||||||
SHeadFile *pHeadFile = pWriter->pSet->pHeadFile;
|
SHeadFile *pHeadFile = &pWriter->pSet->fHead;
|
||||||
SDataFile *pDataFile = pWriter->pSet->pDataFile;
|
SDataFile *pDataFile = &pWriter->pSet->fData;
|
||||||
SLastFile *pLastFile = pWriter->pSet->pLastFile;
|
SLastFile *pLastFile = &pWriter->pSet->fLast;
|
||||||
SSmaFile *pSmaFile = pWriter->pSet->pSmaFile;
|
SSmaFile *pSmaFile = &pWriter->pSet->fSma;
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
if (!ppBuf) ppBuf = &pBuf;
|
if (!ppBuf) ppBuf = &pBuf;
|
||||||
|
@ -724,7 +723,7 @@ _err:
|
||||||
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SMapData *mBlockIdx, uint8_t **ppBuf) {
|
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SMapData *mBlockIdx, uint8_t **ppBuf) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int64_t size = 0;
|
int64_t size = 0;
|
||||||
SHeadFile *pHeadFile = pWriter->pSet->pHeadFile;
|
SHeadFile *pHeadFile = &pWriter->pSet->fHead;
|
||||||
int64_t n = 0;
|
int64_t n = 0;
|
||||||
uint8_t *pBuf = NULL;
|
uint8_t *pBuf = NULL;
|
||||||
|
|
||||||
|
@ -766,7 +765,7 @@ _err:
|
||||||
|
|
||||||
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *mBlock, uint8_t **ppBuf, SBlockIdx *pBlockIdx) {
|
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *mBlock, uint8_t **ppBuf, SBlockIdx *pBlockIdx) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SHeadFile *pHeadFile = pWriter->pSet->pHeadFile;
|
SHeadFile *pHeadFile = &pWriter->pSet->fHead;
|
||||||
uint8_t *pBuf = NULL;
|
uint8_t *pBuf = NULL;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
Loading…
Reference in New Issue