first version of committing data
This commit is contained in:
parent
ecd1e28934
commit
253c7e64d6
|
@ -136,6 +136,7 @@ void tdInitDataCols(SDataCols *pCols, STSchema *pSchema);
|
||||||
void tdFreeDataCols(SDataCols *pCols);
|
void tdFreeDataCols(SDataCols *pCols);
|
||||||
void tdAppendDataRowToDataCol(SDataRow row, SDataCols *pCols);
|
void tdAppendDataRowToDataCol(SDataRow row, SDataCols *pCols);
|
||||||
void tdPopDataColsPoints(SDataCols *pCols, int pointsToPop);
|
void tdPopDataColsPoints(SDataCols *pCols, int pointsToPop);
|
||||||
|
int tdMergeDataCols(SDataCols *target, SDataCols *src, int rowsToMerge);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -382,6 +382,7 @@ static int tdFLenFromSchema(STSchema *pSchema) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdMergeDataCols(SDataCols *target, SDataCols *source) {
|
int tdMergeDataCols(SDataCols *target, SDataCols *source, int rowsToMerge) {
|
||||||
|
// TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -90,9 +90,9 @@ typedef struct {
|
||||||
|
|
||||||
STable *superList; // super table list TODO: change it to list container
|
STable *superList; // super table list TODO: change it to list container
|
||||||
|
|
||||||
void *map; // table map of (uid ===> table)
|
void *map; // table map of (uid ===> table)
|
||||||
|
|
||||||
SMetaFile *mfh; // meta file handle
|
SMetaFile *mfh; // meta file handle
|
||||||
int maxRowBytes;
|
int maxRowBytes;
|
||||||
int maxCols;
|
int maxCols;
|
||||||
} STsdbMeta;
|
} STsdbMeta;
|
||||||
|
@ -118,14 +118,14 @@ STSchema * tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable);
|
||||||
#define TSDB_TABLE_OF_ID(pHandle, id) ((pHandle)->pTables)[id]
|
#define TSDB_TABLE_OF_ID(pHandle, id) ((pHandle)->pTables)[id]
|
||||||
#define TSDB_GET_TABLE_OF_NAME(pHandle, name) /* TODO */
|
#define TSDB_GET_TABLE_OF_NAME(pHandle, name) /* TODO */
|
||||||
|
|
||||||
STsdbMeta* tsdbGetMeta(tsdb_repo_t* pRepo);
|
STsdbMeta *tsdbGetMeta(tsdb_repo_t *pRepo);
|
||||||
|
|
||||||
int32_t tsdbCreateTableImpl(STsdbMeta *pMeta, STableCfg *pCfg);
|
int32_t tsdbCreateTableImpl(STsdbMeta *pMeta, STableCfg *pCfg);
|
||||||
int32_t tsdbDropTableImpl(STsdbMeta *pMeta, STableId tableId);
|
int32_t tsdbDropTableImpl(STsdbMeta *pMeta, STableId tableId);
|
||||||
STable *tsdbIsValidTableToInsert(STsdbMeta *pMeta, STableId tableId);
|
STable *tsdbIsValidTableToInsert(STsdbMeta *pMeta, STableId tableId);
|
||||||
// int32_t tsdbInsertRowToTableImpl(SSkipListNode *pNode, STable *pTable);
|
// int32_t tsdbInsertRowToTableImpl(SSkipListNode *pNode, STable *pTable);
|
||||||
STable *tsdbGetTableByUid(STsdbMeta *pMeta, int64_t uid);
|
STable *tsdbGetTableByUid(STsdbMeta *pMeta, int64_t uid);
|
||||||
char *getTupleKey(const void * data);
|
char * getTupleKey(const void *data);
|
||||||
|
|
||||||
// ------------------------------ TSDB CACHE INTERFACES ------------------------------
|
// ------------------------------ TSDB CACHE INTERFACES ------------------------------
|
||||||
#define TSDB_DEFAULT_CACHE_BLOCK_SIZE 16 * 1024 * 1024 /* 16M */
|
#define TSDB_DEFAULT_CACHE_BLOCK_SIZE 16 * 1024 * 1024 /* 16M */
|
||||||
|
@ -191,8 +191,8 @@ typedef struct {
|
||||||
} SFileInfo;
|
} SFileInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int fd;
|
int fd;
|
||||||
char fname[128];
|
char fname[128];
|
||||||
SFileInfo info;
|
SFileInfo info;
|
||||||
} SFile;
|
} SFile;
|
||||||
|
|
||||||
|
@ -216,11 +216,14 @@ typedef struct {
|
||||||
|
|
||||||
STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles);
|
STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles);
|
||||||
void tsdbCloseFileH(STsdbFileH *pFileH);
|
void tsdbCloseFileH(STsdbFileH *pFileH);
|
||||||
int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader, int toClose);
|
int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader,
|
||||||
int tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables);
|
int toClose);
|
||||||
|
SFileGroup *tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables);
|
||||||
int tsdbOpenFile(SFile *pFile, int oflag);
|
int tsdbOpenFile(SFile *pFile, int oflag);
|
||||||
int tsdbCloseFile(SFile *pFile); SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid);
|
int tsdbCloseFile(SFile *pFile);
|
||||||
|
SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid);
|
||||||
int tsdbRemoveFileGroup(STsdbFileH *pFile, int fid);
|
int tsdbRemoveFileGroup(STsdbFileH *pFile, int fid);
|
||||||
|
int tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname);
|
||||||
|
|
||||||
#define TSDB_FGROUP_ITER_FORWARD 0
|
#define TSDB_FGROUP_ITER_FORWARD 0
|
||||||
#define TSDB_FGROUP_ITER_BACKWARD 1
|
#define TSDB_FGROUP_ITER_BACKWARD 1
|
||||||
|
@ -265,6 +268,8 @@ typedef struct {
|
||||||
TSKEY keyLast;
|
TSKEY keyLast;
|
||||||
} SCompBlock;
|
} SCompBlock;
|
||||||
|
|
||||||
|
// Maximum number of sub-blocks a super-block can have
|
||||||
|
#define TSDB_MAX_SUBBLOCKS 8
|
||||||
#define IS_SUPER_BLOCK(pBlock) ((pBlock)->numOfSubBlocks >= 1)
|
#define IS_SUPER_BLOCK(pBlock) ((pBlock)->numOfSubBlocks >= 1)
|
||||||
#define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)
|
#define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)
|
||||||
|
|
||||||
|
@ -276,15 +281,15 @@ typedef struct {
|
||||||
} SCompInfo;
|
} SCompInfo;
|
||||||
|
|
||||||
#define TSDB_COMPBLOCK_AT(pCompInfo, idx) ((pCompInfo)->blocks + (idx))
|
#define TSDB_COMPBLOCK_AT(pCompInfo, idx) ((pCompInfo)->blocks + (idx))
|
||||||
#define TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pCompBlock, size)\
|
#define TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pCompBlock, size) \
|
||||||
do {\
|
do { \
|
||||||
if (pCompBlock->numOfSubBlocks > 1) {\
|
if (pCompBlock->numOfSubBlocks > 1) { \
|
||||||
pCompBlock = pCompInfo->blocks + pCompBlock->offset;\
|
pCompBlock = pCompInfo->blocks + pCompBlock->offset; \
|
||||||
size = pCompBlock->numOfSubBlocks;\
|
size = pCompBlock->numOfSubBlocks; \
|
||||||
} else {\
|
} else { \
|
||||||
size = 1;\
|
size = 1; \
|
||||||
}\
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// TODO: take pre-calculation into account
|
// TODO: take pre-calculation into account
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -302,18 +307,11 @@ typedef struct {
|
||||||
SCompCol cols[];
|
SCompCol cols[];
|
||||||
} SCompData;
|
} SCompData;
|
||||||
|
|
||||||
STsdbFileH* tsdbGetFile(tsdb_repo_t* pRepo);
|
STsdbFileH *tsdbGetFile(tsdb_repo_t *pRepo);
|
||||||
|
|
||||||
int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast, SDataCols *pCols);
|
|
||||||
|
|
||||||
int tsdbLoadCompIdx(SFileGroup *pGroup, void *buf, int maxTables);
|
|
||||||
int tsdbLoadCompBlocks(SFileGroup *pGroup, SCompIdx *pIdx, void *buf);
|
|
||||||
int tsdbLoadCompCols(SFile *pFile, SCompBlock *pBlock, void *buf);
|
|
||||||
int tsdbLoadColData(SFile *pFile, SCompCol *pCol, int64_t blockBaseOffset, void *buf);
|
|
||||||
int tsdbLoadDataBlock(SFile *pFile, SCompBlock *pStartBlock, int numOfBlocks, SDataCols *pCols, SCompData *pCompData);
|
|
||||||
|
|
||||||
|
int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast,
|
||||||
|
SDataCols *pCols);
|
||||||
SFileGroup *tsdbSearchFGroup(STsdbFileH *pFileH, int fid);
|
SFileGroup *tsdbSearchFGroup(STsdbFileH *pFileH, int fid);
|
||||||
|
|
||||||
void tsdbGetKeyRangeOfFileId(int32_t daysPerFile, int8_t precision, int32_t fileId, TSKEY *minKey, TSKEY *maxKey);
|
void tsdbGetKeyRangeOfFileId(int32_t daysPerFile, int8_t precision, int32_t fileId, TSKEY *minKey, TSKEY *maxKey);
|
||||||
|
|
||||||
// TSDB repository definition
|
// TSDB repository definition
|
||||||
|
@ -348,6 +346,112 @@ typedef struct _tsdb_repo {
|
||||||
|
|
||||||
} STsdbRepo;
|
} STsdbRepo;
|
||||||
|
|
||||||
|
typedef enum { TSDB_WRITE_HELPER, TSDB_READ_HELPER } tsdb_rw_helper_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
tsdb_rw_helper_t type; // helper type
|
||||||
|
int maxTables;
|
||||||
|
int maxRowSize;
|
||||||
|
int maxRows;
|
||||||
|
int maxCols;
|
||||||
|
int minRowsPerFileBlock;
|
||||||
|
int maxRowsPerFileBlock;
|
||||||
|
int8_t compress;
|
||||||
|
} SHelperCfg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int fid;
|
||||||
|
TSKEY minKey;
|
||||||
|
TSKEY maxKey;
|
||||||
|
// For read/write purpose
|
||||||
|
SFile headF;
|
||||||
|
SFile dataF;
|
||||||
|
SFile lastF;
|
||||||
|
// For write purpose only
|
||||||
|
SFile nHeadF;
|
||||||
|
SFile nLastF;
|
||||||
|
} SHelperFile;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t uid;
|
||||||
|
int32_t tid;
|
||||||
|
int32_t sversion;
|
||||||
|
} SHelperTable;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
// Global configuration
|
||||||
|
SHelperCfg config;
|
||||||
|
|
||||||
|
SHelperFile files;
|
||||||
|
|
||||||
|
SHelperTable tableInfo;
|
||||||
|
|
||||||
|
// ---------- For read purpose
|
||||||
|
int8_t state; // current loading state
|
||||||
|
|
||||||
|
SCompIdx *pCompIdx;
|
||||||
|
size_t compIdxSize;
|
||||||
|
|
||||||
|
SCompInfo *pCompInfo;
|
||||||
|
size_t compInfoSize;
|
||||||
|
int blockIter; // For write purpose
|
||||||
|
|
||||||
|
SCompData *pCompData;
|
||||||
|
size_t compDataSize;
|
||||||
|
|
||||||
|
SDataCols *pDataCols[2];
|
||||||
|
|
||||||
|
// ---------- For read purpose
|
||||||
|
bool hasLast;
|
||||||
|
|
||||||
|
int newBlocks;
|
||||||
|
SCompIdx *pWCompIdx;
|
||||||
|
size_t wCompIdxSize;
|
||||||
|
|
||||||
|
SCompInfo *pWCompInfo;
|
||||||
|
size_t wCompInfoSize;
|
||||||
|
|
||||||
|
SCompData *pWCompData;
|
||||||
|
size_t wCompDataSize;
|
||||||
|
} SRWHelper;
|
||||||
|
|
||||||
|
// --------- Helper state
|
||||||
|
#define TSDB_HELPER_CLEAR_STATE 0x0 // Clear state
|
||||||
|
#define TSDB_HELPER_FILE_SET 0x1 // File is set
|
||||||
|
#define TSDB_HELPER_FILE_OPEN 0x2 // File is opened
|
||||||
|
|
||||||
|
#define TSDB_HELPER_IDX_LOAD 0x4 // SCompIdx part is loaded
|
||||||
|
#define TSDB_HELPER_INFO_LOAD 0x8 // SCompInfo part is loaded
|
||||||
|
#define TSDB_HELPER_FILE_DATA_LOAD 0x10 // SCompData part is loaded
|
||||||
|
|
||||||
|
#define TSDB_HELPER_TYPE(h) ((h)->config.type)
|
||||||
|
|
||||||
|
#define helperSetState(h, s) (((h)->state) |= (s))
|
||||||
|
#define helperClearState(h, s) ((h)->state &= (~(s)))
|
||||||
|
#define helperHasState(h, s) ((((h)->state) & (s)) == (s))
|
||||||
|
|
||||||
|
int tsdbInitHelper(SRWHelper *pHelper, SHelperCfg *pCfg);
|
||||||
|
void tsdbDestroyHelper(SRWHelper *pHelper);
|
||||||
|
void tsdbClearHelper(SRWHelper *pHelper);
|
||||||
|
|
||||||
|
// --------- For set operations
|
||||||
|
int tsdbSetHelperFile(SRWHelper *pHelper, SFileGroup *pGroup);
|
||||||
|
int tsdbOpenHelperFile(SRWHelper *pHelper);
|
||||||
|
void tsdbSetHelperTable(SRWHelper *pHelper, SHelperTable *pHelperTable, STSchema *pSchema);
|
||||||
|
int tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError);
|
||||||
|
|
||||||
|
// --------- For read operations
|
||||||
|
int tsdbLoadCompIdx(SRWHelper *pHelper, void *target);
|
||||||
|
int tsdbLoadCompInfo(SRWHelper *pHelper, void *target);
|
||||||
|
int tsdbLoadCompData(SRWHelper *pHelper, int blkIdx, void *target);
|
||||||
|
int tsdbLoadBlockDataCols(SRWHelper *pHelper, SDataCols *pDataCols, int32_t *colIds, int numOfColIds);
|
||||||
|
int tsdbLoadBlockData(SRWHelper *pHelper, int blkIdx, SDataCols *pDataCols);
|
||||||
|
|
||||||
|
// --------- For write operations
|
||||||
|
int tsdbWriteDataBlock(SRWHelper *pHelper, SDataCols *pDataCols);
|
||||||
|
int tsdbMoveLastBlockIfNeccessary(SRWHelper *pHelper);
|
||||||
|
int tsdbWriteCompInfo(SRWHelper *pHelper);
|
||||||
|
int tsdbWriteCompIdx(SRWHelper *pHelper);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
|
@ -33,7 +34,6 @@ const char *tsdbFileSuffix[] = {
|
||||||
|
|
||||||
static int compFGroupKey(const void *key, const void *fgroup);
|
static int compFGroupKey(const void *key, const void *fgroup);
|
||||||
static int compFGroup(const void *arg1, const void *arg2);
|
static int compFGroup(const void *arg1, const void *arg2);
|
||||||
static int tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname);
|
|
||||||
static int tsdbWriteFileHead(SFile *pFile);
|
static int tsdbWriteFileHead(SFile *pFile);
|
||||||
static int tsdbWriteHeadFileIdx(SFile *pFile, int maxTables);
|
static int tsdbWriteHeadFileIdx(SFile *pFile, int maxTables);
|
||||||
static int tsdbOpenFGroup(STsdbFileH *pFileH, char *dataDir, int fid);
|
static int tsdbOpenFGroup(STsdbFileH *pFileH, char *dataDir, int fid);
|
||||||
|
@ -91,24 +91,36 @@ static int tsdbOpenFGroup(STsdbFileH *pFileH, char *dataDir, int fid) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables) {
|
/**
|
||||||
if (pFileH->numOfFGroups >= pFileH->maxFGroups) return -1;
|
* Create the file group if the file group not exists.
|
||||||
|
*
|
||||||
|
* @return A pointer to
|
||||||
|
*/
|
||||||
|
SFileGroup *tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables) {
|
||||||
|
if (pFileH->numOfFGroups >= pFileH->maxFGroups) return NULL;
|
||||||
|
|
||||||
SFileGroup fGroup;
|
SFileGroup fGroup;
|
||||||
SFileGroup *pFGroup = &fGroup;
|
SFileGroup *pFGroup = &fGroup;
|
||||||
if (tsdbSearchFGroup(pFileH, fid) == NULL) { // if not exists, create one
|
|
||||||
|
SFileGroup *pGroup = tsdbSearchFGroup(pFileH, fid);
|
||||||
|
if (pGroup == NULL) { // if not exists, create one
|
||||||
pFGroup->fileId = fid;
|
pFGroup->fileId = fid;
|
||||||
for (int type = TSDB_FILE_TYPE_HEAD; type < TSDB_FILE_TYPE_MAX; type++) {
|
for (int type = TSDB_FILE_TYPE_HEAD; type < TSDB_FILE_TYPE_MAX; type++) {
|
||||||
if (tsdbCreateFile(dataDir, fid, tsdbFileSuffix[type], maxTables, &(pFGroup->files[type]), type == TSDB_FILE_TYPE_HEAD ? 1 : 0, 1) < 0) {
|
if (tsdbCreateFile(dataDir, fid, tsdbFileSuffix[type], maxTables, &(pFGroup->files[type]),
|
||||||
// TODO: deal with the ERROR here, remove those creaed file
|
type == TSDB_FILE_TYPE_HEAD ? 1 : 0, 1) < 0)
|
||||||
return -1;
|
goto _err;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pFileH->fGroup[pFileH->numOfFGroups++] = fGroup;
|
pFileH->fGroup[pFileH->numOfFGroups++] = fGroup;
|
||||||
qsort((void *)(pFileH->fGroup), pFileH->numOfFGroups, sizeof(SFileGroup), compFGroup);
|
qsort((void *)(pFileH->fGroup), pFileH->numOfFGroups, sizeof(SFileGroup), compFGroup);
|
||||||
|
return tsdbSearchFGroup(pFileH, fid);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
return pGroup;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
// TODO: deal with the err here
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbRemoveFileGroup(STsdbFileH *pFileH, int fid) {
|
int tsdbRemoveFileGroup(STsdbFileH *pFileH, int fid) {
|
||||||
|
@ -181,27 +193,27 @@ SFileGroup *tsdbGetFileGroupNext(SFileGroupIter *pIter) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbLoadDataBlock(SFile *pFile, SCompBlock *pStartBlock, int numOfBlocks, SDataCols *pCols, SCompData *pCompData) {
|
// int tsdbLoadDataBlock(SFile *pFile, SCompBlock *pStartBlock, int numOfBlocks, SDataCols *pCols, SCompData *pCompData) {
|
||||||
SCompBlock *pBlock = pStartBlock;
|
// SCompBlock *pBlock = pStartBlock;
|
||||||
for (int i = 0; i < numOfBlocks; i++) {
|
// for (int i = 0; i < numOfBlocks; i++) {
|
||||||
if (tsdbLoadCompCols(pFile, pBlock, (void *)pCompData) < 0) return -1;
|
// if (tsdbLoadCompCols(pFile, pBlock, (void *)pCompData) < 0) return -1;
|
||||||
pCols->numOfPoints += (pCompData->cols[0].len / 8);
|
// pCols->numOfPoints += (pCompData->cols[0].len / 8);
|
||||||
for (int iCol = 0; iCol < pBlock->numOfCols; iCol++) {
|
// for (int iCol = 0; iCol < pBlock->numOfCols; iCol++) {
|
||||||
SCompCol *pCompCol = &(pCompData->cols[iCol]);
|
// SCompCol *pCompCol = &(pCompData->cols[iCol]);
|
||||||
// pCols->numOfPoints += pBlock->numOfPoints;
|
// // pCols->numOfPoints += pBlock->numOfPoints;
|
||||||
int k = 0;
|
// int k = 0;
|
||||||
for (; k < pCols->numOfCols; k++) {
|
// for (; k < pCols->numOfCols; k++) {
|
||||||
if (pCompCol->colId == pCols->cols[k].colId) break;
|
// if (pCompCol->colId == pCols->cols[k].colId) break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (tsdbLoadColData(pFile, pCompCol, pBlock->offset,
|
// if (tsdbLoadColData(pFile, pCompCol, pBlock->offset,
|
||||||
(void *)((char *)(pCols->cols[k].pData) + pCols->cols[k].len)) < 0)
|
// (void *)((char *)(pCols->cols[k].pData) + pCols->cols[k].len)) < 0)
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
pStartBlock++;
|
// pStartBlock++;
|
||||||
}
|
// }
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast, SDataCols *pCols) {
|
int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast, SDataCols *pCols) {
|
||||||
SCompBlock *pSuperBlock = TSDB_COMPBLOCK_AT(pCompInfo, idx);
|
SCompBlock *pSuperBlock = TSDB_COMPBLOCK_AT(pCompInfo, idx);
|
||||||
|
@ -237,42 +249,42 @@ int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInf
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbLoadCompIdx(SFileGroup *pGroup, void *buf, int maxTables) {
|
// int tsdbLoadCompIdx(SFileGroup *pGroup, void *buf, int maxTables) {
|
||||||
SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
// SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
||||||
if (lseek(pFile->fd, TSDB_FILE_HEAD_SIZE, SEEK_SET) < 0) return -1;
|
// if (lseek(pFile->fd, TSDB_FILE_HEAD_SIZE, SEEK_SET) < 0) return -1;
|
||||||
|
|
||||||
if (read(pFile->fd, buf, sizeof(SCompIdx) * maxTables) < 0) return -1;
|
// if (read(pFile->fd, buf, sizeof(SCompIdx) * maxTables) < 0) return -1;
|
||||||
// TODO: need to check the correctness
|
// // TODO: need to check the correctness
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int tsdbLoadCompBlocks(SFileGroup *pGroup, SCompIdx *pIdx, void *buf) {
|
// int tsdbLoadCompBlocks(SFileGroup *pGroup, SCompIdx *pIdx, void *buf) {
|
||||||
SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
// SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
||||||
|
|
||||||
if (lseek(pFile->fd, pIdx->offset, SEEK_SET) < 0) return -1;
|
// if (lseek(pFile->fd, pIdx->offset, SEEK_SET) < 0) return -1;
|
||||||
|
|
||||||
if (read(pFile->fd, buf, pIdx->len) < 0) return -1;
|
// if (read(pFile->fd, buf, pIdx->len) < 0) return -1;
|
||||||
|
|
||||||
// TODO: need to check the correctness
|
// // TODO: need to check the correctness
|
||||||
|
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int tsdbLoadCompCols(SFile *pFile, SCompBlock *pBlock, void *buf) {
|
// int tsdbLoadCompCols(SFile *pFile, SCompBlock *pBlock, void *buf) {
|
||||||
// assert(pBlock->numOfSubBlocks == 0 || pBlock->numOfSubBlocks == 1);
|
// // assert(pBlock->numOfSubBlocks == 0 || pBlock->numOfSubBlocks == 1);
|
||||||
|
|
||||||
if (lseek(pFile->fd, pBlock->offset, SEEK_SET) < 0) return -1;
|
// if (lseek(pFile->fd, pBlock->offset, SEEK_SET) < 0) return -1;
|
||||||
size_t size = sizeof(SCompData) + sizeof(SCompCol) * pBlock->numOfCols;
|
// size_t size = sizeof(SCompData) + sizeof(SCompCol) * pBlock->numOfCols;
|
||||||
if (read(pFile->fd, buf, size) < 0) return -1;
|
// if (read(pFile->fd, buf, size) < 0) return -1;
|
||||||
|
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int tsdbLoadColData(SFile *pFile, SCompCol *pCol, int64_t blockBaseOffset, void *buf) {
|
// int tsdbLoadColData(SFile *pFile, SCompCol *pCol, int64_t blockBaseOffset, void *buf) {
|
||||||
if (lseek(pFile->fd, blockBaseOffset + pCol->offset, SEEK_SET) < 0) return -1;
|
// if (lseek(pFile->fd, blockBaseOffset + pCol->offset, SEEK_SET) < 0) return -1;
|
||||||
if (read(pFile->fd, buf, pCol->len) < 0) return -1;
|
// if (read(pFile->fd, buf, pCol->len) < 0) return -1;
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
static int compFGroupKey(const void *key, const void *fgroup) {
|
static int compFGroupKey(const void *key, const void *fgroup) {
|
||||||
int fid = *(int *)key;
|
int fid = *(int *)key;
|
||||||
|
@ -317,7 +329,7 @@ static int tsdbWriteHeadFileIdx(SFile *pFile, int maxTables) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname) {
|
int tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname) {
|
||||||
if (dataDir == NULL || fname == NULL) return -1;
|
if (dataDir == NULL || fname == NULL) return -1;
|
||||||
|
|
||||||
sprintf(fname, "%s/f%d%s", dataDir, fileId, suffix);
|
sprintf(fname, "%s/f%d%s", dataDir, fileId, suffix);
|
||||||
|
|
|
@ -55,11 +55,11 @@ static int32_t tsdbInsertDataToTable(tsdb_repo_t *repo, SSubmitBlk *pBlock);
|
||||||
static int32_t tsdbRestoreCfg(STsdbRepo *pRepo, STsdbCfg *pCfg);
|
static int32_t tsdbRestoreCfg(STsdbRepo *pRepo, STsdbCfg *pCfg);
|
||||||
static int32_t tsdbGetDataDirName(STsdbRepo *pRepo, char *fname);
|
static int32_t tsdbGetDataDirName(STsdbRepo *pRepo, char *fname);
|
||||||
static void * tsdbCommitData(void *arg);
|
static void * tsdbCommitData(void *arg);
|
||||||
static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SSkipListIterator **iters, SDataCols *pCols);
|
static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SSkipListIterator **iters, SRWHelper *pHelper, SDataCols *pDataCols);
|
||||||
static int tsdbHasDataInRange(SSkipListIterator *pIter, TSKEY minKey, TSKEY maxKey);
|
static TSKEY tsdbNextIterKey(SSkipListIterator *pIter);
|
||||||
static int tsdbHasDataToCommit(SSkipListIterator **iters, int nIters, TSKEY minKey, TSKEY maxKey);
|
static int tsdbHasDataToCommit(SSkipListIterator **iters, int nIters, TSKEY minKey, TSKEY maxKey);
|
||||||
static int tsdbWriteBlockToFileImpl(SFile *pFile, SDataCols *pCols, int pointsToWrite, int64_t *offset, int32_t *len,
|
// static int tsdbWriteBlockToFileImpl(SFile *pFile, SDataCols *pCols, int pointsToWrite, int64_t *offset, int32_t *len,
|
||||||
int64_t uid);
|
// int64_t uid);
|
||||||
|
|
||||||
#define TSDB_GET_TABLE_BY_ID(pRepo, sid) (((STSDBRepo *)pRepo)->pTableList)[sid]
|
#define TSDB_GET_TABLE_BY_ID(pRepo, sid) (((STSDBRepo *)pRepo)->pTableList)[sid]
|
||||||
#define TSDB_GET_TABLE_BY_NAME(pRepo, name)
|
#define TSDB_GET_TABLE_BY_NAME(pRepo, name)
|
||||||
|
@ -751,6 +751,8 @@ static int32_t tsdbInsertDataToTable(tsdb_repo_t *repo, SSubmitBlk *pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbReadRowsFromCache(SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead, SDataCols *pCols) {
|
static int tsdbReadRowsFromCache(SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead, SDataCols *pCols) {
|
||||||
|
if (pIter == NULL) return 0;
|
||||||
|
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -811,7 +813,8 @@ static void *tsdbCommitData(void *arg) {
|
||||||
STsdbRepo * pRepo = (STsdbRepo *)arg;
|
STsdbRepo * pRepo = (STsdbRepo *)arg;
|
||||||
STsdbMeta * pMeta = pRepo->tsdbMeta;
|
STsdbMeta * pMeta = pRepo->tsdbMeta;
|
||||||
STsdbCache *pCache = pRepo->tsdbCache;
|
STsdbCache *pCache = pRepo->tsdbCache;
|
||||||
STsdbCfg * pCfg = &(pRepo->config);
|
STsdbCfg * pCfg = &(pRepo->config);
|
||||||
|
SDataCols * pDataCols = NULL;
|
||||||
if (pCache->imem == NULL) return NULL;
|
if (pCache->imem == NULL) return NULL;
|
||||||
|
|
||||||
// Create the iterator to read from cache
|
// Create the iterator to read from cache
|
||||||
|
@ -821,24 +824,34 @@ static void *tsdbCommitData(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a data column buffer for commit
|
// Create a write helper for commit data
|
||||||
SDataCols *pDataCols = tdNewDataCols(pMeta->maxRowBytes, pMeta->maxCols, pCfg->maxRowsPerFileBlock);
|
SRWHelper whelper;
|
||||||
if (pDataCols == NULL) {
|
SHelperCfg hcfg = {
|
||||||
// TODO: deal with the error
|
.type = TSDB_WRITE_HELPER,
|
||||||
return NULL;
|
.maxTables = pCfg->maxTables,
|
||||||
}
|
.maxRowSize = pMeta->maxRowBytes,
|
||||||
|
.maxRows = pCfg->maxRowsPerFileBlock,
|
||||||
|
.maxCols = pMeta->maxCols,
|
||||||
|
.minRowsPerFileBlock = pCfg->minRowsPerFileBlock,
|
||||||
|
.compress = 2 // TODO make it a configuration
|
||||||
|
};
|
||||||
|
if (tsdbInitHelper(&whelper, &hcfg) < 0) goto _exit;
|
||||||
|
if ((pDataCols = tdNewDataCols(pMeta->maxRowBytes, pMeta->maxCols, pCfg->maxRowsPerFileBlock)) == NULL) goto _exit;
|
||||||
|
|
||||||
int sfid = tsdbGetKeyFileId(pCache->imem->keyFirst, pCfg->daysPerFile, pCfg->precision);
|
int sfid = tsdbGetKeyFileId(pCache->imem->keyFirst, pCfg->daysPerFile, pCfg->precision);
|
||||||
int efid = tsdbGetKeyFileId(pCache->imem->keyLast, pCfg->daysPerFile, pCfg->precision);
|
int efid = tsdbGetKeyFileId(pCache->imem->keyLast, pCfg->daysPerFile, pCfg->precision);
|
||||||
|
|
||||||
|
// Loop to commit to each file
|
||||||
for (int fid = sfid; fid <= efid; fid++) {
|
for (int fid = sfid; fid <= efid; fid++) {
|
||||||
if (tsdbCommitToFile(pRepo, fid, iters, pDataCols) < 0) {
|
if (tsdbCommitToFile(pRepo, fid, iters, &whelper, pDataCols) < 0) {
|
||||||
// TODO: deal with the error here
|
ASSERT(false);
|
||||||
// assert(0);
|
goto _exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
tdFreeDataCols(pDataCols);
|
tdFreeDataCols(pDataCols);
|
||||||
|
tsdbDestroyHelper(&whelper);
|
||||||
tsdbDestroyTableIters(iters, pCfg->maxTables);
|
tsdbDestroyTableIters(iters, pCfg->maxTables);
|
||||||
|
|
||||||
tsdbLockRepo(arg);
|
tsdbLockRepo(arg);
|
||||||
|
@ -849,7 +862,7 @@ static void *tsdbCommitData(void *arg) {
|
||||||
// TODO: free the skiplist
|
// TODO: free the skiplist
|
||||||
for (int i = 0; i < pCfg->maxTables; i++) {
|
for (int i = 0; i < pCfg->maxTables; i++) {
|
||||||
STable *pTable = pMeta->tables[i];
|
STable *pTable = pMeta->tables[i];
|
||||||
if (pTable && pTable->imem) { // Here has memory leak
|
if (pTable && pTable->imem) { // Here has memory leak
|
||||||
pTable->imem = NULL;
|
pTable->imem = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -858,19 +871,12 @@ static void *tsdbCommitData(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SSkipListIterator **iters, SDataCols *pCols) {
|
static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SSkipListIterator **iters, SRWHelper *pHelper, SDataCols *pDataCols) {
|
||||||
int isNewLastFile = 0;
|
|
||||||
|
|
||||||
STsdbMeta * pMeta = pRepo->tsdbMeta;
|
STsdbMeta * pMeta = pRepo->tsdbMeta;
|
||||||
STsdbFileH *pFileH = pRepo->tsdbFileH;
|
STsdbFileH *pFileH = pRepo->tsdbFileH;
|
||||||
STsdbCfg * pCfg = &pRepo->config;
|
STsdbCfg * pCfg = &pRepo->config;
|
||||||
SFile hFile, lFile;
|
|
||||||
SFileGroup *pGroup = NULL;
|
SFileGroup *pGroup = NULL;
|
||||||
SCompIdx * pIndices = NULL;
|
|
||||||
SCompInfo * pCompInfo = NULL;
|
|
||||||
// size_t compInfoSize = 0;
|
|
||||||
// SCompBlock compBlock;
|
|
||||||
// SCompBlock *pBlock = &compBlock;
|
|
||||||
|
|
||||||
TSKEY minKey = 0, maxKey = 0;
|
TSKEY minKey = 0, maxKey = 0;
|
||||||
tsdbGetKeyRangeOfFileId(pCfg->daysPerFile, pCfg->precision, fid, &minKey, &maxKey);
|
tsdbGetKeyRangeOfFileId(pCfg->daysPerFile, pCfg->precision, fid, &minKey, &maxKey);
|
||||||
|
@ -879,334 +885,212 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SSkipListIterator **iters
|
||||||
int hasDataToCommit = tsdbHasDataToCommit(iters, pCfg->maxTables, minKey, maxKey);
|
int hasDataToCommit = tsdbHasDataToCommit(iters, pCfg->maxTables, minKey, maxKey);
|
||||||
if (!hasDataToCommit) return 0; // No data to commit, just return
|
if (!hasDataToCommit) return 0; // No data to commit, just return
|
||||||
|
|
||||||
// TODO: make it more flexible
|
|
||||||
pCompInfo = (SCompInfo *)malloc(sizeof(SCompInfo) + sizeof(SCompBlock) * 1000);
|
|
||||||
|
|
||||||
// Create and open files for commit
|
// Create and open files for commit
|
||||||
tsdbGetDataDirName(pRepo, dataDir);
|
tsdbGetDataDirName(pRepo, dataDir);
|
||||||
if (tsdbCreateFGroup(pFileH, dataDir, fid, pCfg->maxTables) < 0) { /* TODO */
|
if ((pGroup = tsdbCreateFGroup(pFileH, dataDir, fid, pCfg->maxTables)) == NULL) goto _err;
|
||||||
}
|
|
||||||
pGroup = tsdbOpenFilesForCommit(pFileH, fid);
|
|
||||||
if (pGroup == NULL) { /* TODO */
|
|
||||||
}
|
|
||||||
tsdbCreateFile(dataDir, fid, ".h", pCfg->maxTables, &hFile, 1, 1);
|
|
||||||
tsdbOpenFile(&hFile, O_RDWR);
|
|
||||||
if (0 /*pGroup->files[TSDB_FILE_TYPE_LAST].size > TSDB_MAX_LAST_FILE_SIZE*/) {
|
|
||||||
// TODO: make it not to write the last file every time
|
|
||||||
tsdbCreateFile(dataDir, fid, ".l", pCfg->maxTables, &lFile, 0, 0);
|
|
||||||
isNewLastFile = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the SCompIdx
|
// Set the file to write/read
|
||||||
pIndices = (SCompIdx *)malloc(sizeof(SCompIdx) * pCfg->maxTables);
|
tsdbSetHelperFile(pHelper, pGroup);
|
||||||
if (pIndices == NULL) { /* TODO*/
|
|
||||||
}
|
|
||||||
if (tsdbLoadCompIdx(pGroup, (void *)pIndices, pCfg->maxTables) < 0) { /* TODO */
|
|
||||||
}
|
|
||||||
|
|
||||||
lseek(hFile.fd, TSDB_FILE_HEAD_SIZE + sizeof(SCompIdx) * pCfg->maxTables, SEEK_SET);
|
// Open files for write/read
|
||||||
|
if (tsdbOpenHelperFile(pHelper) < 0) goto _err;
|
||||||
|
|
||||||
// Loop to commit data in each table
|
// Loop to commit data in each table
|
||||||
for (int tid = 0; tid < pCfg->maxTables; tid++) {
|
for (int tid = 0; tid < pCfg->maxTables; tid++) {
|
||||||
STable * pTable = pMeta->tables[tid];
|
STable * pTable = pMeta->tables[tid];
|
||||||
SSkipListIterator *pIter = iters[tid];
|
SSkipListIterator *pIter = iters[tid];
|
||||||
SCompIdx * pIdx = &pIndices[tid];
|
|
||||||
|
|
||||||
int nNewBlocks = 0;
|
SHelperTable hTable = {.uid = pTable->tableId.uid, .tid = pTable->tableId.tid, .sversion = pTable->sversion};
|
||||||
|
tsdbSetHelperTable(pHelper, &hTable, tsdbGetTableSchema(pMeta, pTable));
|
||||||
if (pTable == NULL || pIter == NULL) continue;
|
tdInitDataCols(pDataCols, tsdbGetTableSchema(pMeta, pTable));
|
||||||
|
|
||||||
/* If no new data to write for this table, just write the old data to new file
|
|
||||||
* if there are.
|
|
||||||
*/
|
|
||||||
if (!tsdbHasDataInRange(pIter, minKey, maxKey)) {
|
|
||||||
// has old data
|
|
||||||
if (pIdx->len > 0) {
|
|
||||||
goto _table_over;
|
|
||||||
// if (isNewLastFile && pIdx->hasLast) {
|
|
||||||
if (0) {
|
|
||||||
// need to move the last block to new file
|
|
||||||
if ((pCompInfo = (SCompInfo *)realloc((void *)pCompInfo, pIdx->len)) == NULL) { /* TODO */
|
|
||||||
}
|
|
||||||
if (tsdbLoadCompBlocks(pGroup, pIdx, (void *)pCompInfo) < 0) { /* TODO */
|
|
||||||
}
|
|
||||||
|
|
||||||
tdInitDataCols(pCols, tsdbGetTableSchema(pMeta, pTable));
|
|
||||||
|
|
||||||
SCompBlock *pTBlock = TSDB_COMPBLOCK_AT(pCompInfo, pIdx->numOfSuperBlocks);
|
|
||||||
int nBlocks = 0;
|
|
||||||
|
|
||||||
TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pTBlock, nBlocks);
|
|
||||||
|
|
||||||
SCompData tBlock;
|
|
||||||
int64_t toffset;
|
|
||||||
int32_t tlen;
|
|
||||||
tsdbLoadDataBlock(&pGroup->files[TSDB_FILE_TYPE_LAST], pTBlock, nBlocks, pCols, &tBlock);
|
|
||||||
|
|
||||||
tsdbWriteBlockToFileImpl(&lFile, pCols, pCols->numOfPoints, &toffset, &tlen, pTable->tableId.uid);
|
|
||||||
pTBlock = TSDB_COMPBLOCK_AT(pCompInfo, pIdx->numOfSuperBlocks);
|
|
||||||
pTBlock->offset = toffset;
|
|
||||||
pTBlock->len = tlen;
|
|
||||||
pTBlock->numOfPoints = pCols->numOfPoints;
|
|
||||||
pTBlock->numOfSubBlocks = 1;
|
|
||||||
|
|
||||||
pIdx->offset = lseek(hFile.fd, 0, SEEK_CUR);
|
|
||||||
if (nBlocks > 1) {
|
|
||||||
pIdx->len -= (sizeof(SCompBlock) * nBlocks);
|
|
||||||
}
|
|
||||||
write(hFile.fd, (void *)pCompInfo, pIdx->len);
|
|
||||||
} else {
|
|
||||||
pIdx->offset = lseek(hFile.fd, 0, SEEK_CUR);
|
|
||||||
sendfile(pGroup->files[TSDB_FILE_TYPE_HEAD].fd, hFile.fd, NULL, pIdx->len);
|
|
||||||
hFile.info.size += pIdx->len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pCompInfo->delimiter = TSDB_FILE_DELIMITER;
|
|
||||||
pCompInfo->checksum = 0;
|
|
||||||
pCompInfo->uid = pTable->tableId.uid;
|
|
||||||
|
|
||||||
// Load SCompBlock part if neccessary
|
|
||||||
// int isCompBlockLoaded = 0;
|
|
||||||
if (0) {
|
|
||||||
// if (pIdx->offset > 0) {
|
|
||||||
if (pIdx->hasLast || tsdbHasDataInRange(pIter, minKey, pIdx->maxKey)) {
|
|
||||||
// has last block || cache key overlap with commit key
|
|
||||||
pCompInfo = (SCompInfo *)realloc((void *)pCompInfo, pIdx->len + sizeof(SCompBlock) * 100);
|
|
||||||
if (tsdbLoadCompBlocks(pGroup, pIdx, (void *)pCompInfo) < 0) { /* TODO */
|
|
||||||
}
|
|
||||||
// if (pCompInfo->uid == pTable->tableId.uid) isCompBlockLoaded = 1;
|
|
||||||
} else {
|
|
||||||
// TODO: No need to load the SCompBlock part, just sendfile the SCompBlock part
|
|
||||||
// and write those new blocks to it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tdInitDataCols(pCols, tsdbGetTableSchema(pMeta, pTable));
|
|
||||||
|
|
||||||
|
// Loop to write the data in the cache to files, if no data to write, just break
|
||||||
|
// the loop
|
||||||
int maxRowsToRead = pCfg->maxRowsPerFileBlock * 4 / 5;
|
int maxRowsToRead = pCfg->maxRowsPerFileBlock * 4 / 5;
|
||||||
while (1) {
|
while (true) {
|
||||||
tsdbReadRowsFromCache(pIter, maxKey, maxRowsToRead, pCols);
|
int rowsRead = tsdbReadRowsFromCache(pIter, maxKey, maxRowsToRead, pDataCols);
|
||||||
if (pCols->numOfPoints == 0) break;
|
ASSERT(rowsRead >= 0);
|
||||||
|
if (pDataCols->numOfPoints == 0) break;
|
||||||
|
|
||||||
int pointsWritten = pCols->numOfPoints;
|
int rowsWritten = tsdbWriteDataBlock(pHelper, pDataCols);
|
||||||
// TODO: all write to the end of .data file
|
if (rowsWritten < 0) goto _err;
|
||||||
int64_t toffset = 0;
|
assert(rowsWritten <= pDataCols->numOfPoints);
|
||||||
int32_t tlen = 0;
|
|
||||||
tsdbWriteBlockToFileImpl(&pGroup->files[TSDB_FILE_TYPE_DATA], pCols, pCols->numOfPoints, &toffset, &tlen, pTable->tableId.uid);
|
|
||||||
|
|
||||||
// Make the compBlock
|
tdPopDataColsPoints(pDataCols, rowsWritten);
|
||||||
SCompBlock *pTBlock = pCompInfo->blocks + nNewBlocks++;
|
maxRowsToRead = pCfg->maxRowsPerFileBlock * 4 / 5 - pDataCols->numOfPoints;
|
||||||
pTBlock->offset = toffset;
|
|
||||||
pTBlock->len = tlen;
|
|
||||||
pTBlock->keyFirst = dataColsKeyFirst(pCols);
|
|
||||||
pTBlock->keyLast = dataColsKeyLast(pCols);
|
|
||||||
pTBlock->last = 0;
|
|
||||||
pTBlock->algorithm = 0;
|
|
||||||
pTBlock->numOfPoints = pCols->numOfPoints;
|
|
||||||
pTBlock->sversion = pTable->sversion;
|
|
||||||
pTBlock->numOfSubBlocks = 1;
|
|
||||||
pTBlock->numOfCols = pCols->numOfCols;
|
|
||||||
|
|
||||||
if (dataColsKeyLast(pCols) > pIdx->maxKey) pIdx->maxKey = dataColsKeyLast(pCols);
|
|
||||||
|
|
||||||
tdPopDataColsPoints(pCols, pointsWritten);
|
|
||||||
maxRowsToRead = pCfg->maxRowsPerFileBlock * 4 / 5 - pCols->numOfPoints;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move the last block to the new .l file if neccessary
|
||||||
|
if (tsdbMoveLastBlockIfNeccessary(pHelper) < 0) goto _err;
|
||||||
|
|
||||||
_table_over:
|
|
||||||
// Write the SCompBlock part
|
// Write the SCompBlock part
|
||||||
pIdx->offset = lseek(hFile.fd, 0, SEEK_END);
|
if (tsdbWriteCompInfo(pHelper) < 0) goto _err;
|
||||||
if (pIdx->len > 0) {
|
|
||||||
int bytes = tsendfile(hFile.fd, pGroup->files[TSDB_FILE_TYPE_HEAD].fd, NULL, pIdx->len);
|
|
||||||
if (bytes < pIdx->len) {
|
|
||||||
printf("Failed to send file, reason: %s\n", strerror(errno));
|
|
||||||
}
|
|
||||||
if (nNewBlocks > 0) {
|
|
||||||
write(hFile.fd, (void *)(pCompInfo->blocks), sizeof(SCompBlock) * nNewBlocks);
|
|
||||||
pIdx->len += (sizeof(SCompBlock) * nNewBlocks);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (nNewBlocks > 0) {
|
|
||||||
write(hFile.fd, (void *)pCompInfo, sizeof(SCompInfo) + sizeof(SCompBlock) * nNewBlocks);
|
|
||||||
pIdx->len += sizeof(SCompInfo) + sizeof(SCompBlock) * nNewBlocks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pIdx->checksum = 0;
|
|
||||||
pIdx->numOfSuperBlocks += nNewBlocks;
|
|
||||||
pIdx->hasLast = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the SCompIdx part
|
if (tsdbWriteCompIdx(pHelper) < 0) goto _err;
|
||||||
if (lseek(hFile.fd, TSDB_FILE_HEAD_SIZE, SEEK_SET) < 0) {/* TODO */}
|
|
||||||
if (write(hFile.fd, (void *)pIndices, sizeof(SCompIdx) * pCfg->maxTables) < 0) {/* TODO */}
|
|
||||||
|
|
||||||
// close the files
|
tsdbCloseHelperFile(pHelper, 0);
|
||||||
for (int type = TSDB_FILE_TYPE_HEAD; type < TSDB_FILE_TYPE_MAX; type++) {
|
// TODO: make it atomic with some methods
|
||||||
tsdbCloseFile(&pGroup->files[type]);
|
pGroup->files[TSDB_FILE_TYPE_HEAD] = pHelper->files.headF;
|
||||||
}
|
pGroup->files[TSDB_FILE_TYPE_DATA] = pHelper->files.dataF;
|
||||||
tsdbCloseFile(&hFile);
|
pGroup->files[TSDB_FILE_TYPE_LAST] = pHelper->files.lastF;
|
||||||
if (isNewLastFile) tsdbCloseFile(&lFile);
|
|
||||||
// TODO: replace the .head and .last file
|
|
||||||
rename(hFile.fname, pGroup->files[TSDB_FILE_TYPE_HEAD].fname);
|
|
||||||
pGroup->files[TSDB_FILE_TYPE_HEAD].info = hFile.info;
|
|
||||||
if (isNewLastFile) {
|
|
||||||
rename(lFile.fname, pGroup->files[TSDB_FILE_TYPE_LAST].fname);
|
|
||||||
pGroup->files[TSDB_FILE_TYPE_LAST].info = lFile.info;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pIndices) free(pIndices);
|
|
||||||
if (pCompInfo) free(pCompInfo);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
static int tsdbHasDataInRange(SSkipListIterator *pIter, TSKEY minKey, TSKEY maxKey) {
|
_err:
|
||||||
if (pIter == NULL) return 0;
|
tsdbCloseHelperFile(pHelper, 1);
|
||||||
|
|
||||||
SSkipListNode *node = tSkipListIterGet(pIter);
|
|
||||||
if (node == NULL) return 0;
|
|
||||||
|
|
||||||
SDataRow row = SL_GET_NODE_DATA(node);
|
|
||||||
if (dataRowKey(row) >= minKey && dataRowKey(row) <= maxKey) return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tsdbHasDataToCommit(SSkipListIterator **iters, int nIters, TSKEY minKey, TSKEY maxKey) {
|
|
||||||
for (int i = 0; i < nIters; i++) {
|
|
||||||
SSkipListIterator *pIter = iters[i];
|
|
||||||
if (tsdbHasDataInRange(pIter, minKey, maxKey)) return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tsdbWriteBlockToFileImpl(SFile *pFile, SDataCols *pCols, int pointsToWrite, int64_t *offset, int32_t *len, int64_t uid) {
|
|
||||||
size_t size = sizeof(SCompData) + sizeof(SCompCol) * pCols->numOfCols;
|
|
||||||
SCompData *pCompData = (SCompData *)malloc(size);
|
|
||||||
if (pCompData == NULL) return -1;
|
|
||||||
|
|
||||||
pCompData->delimiter = TSDB_FILE_DELIMITER;
|
|
||||||
pCompData->uid = uid;
|
|
||||||
pCompData->numOfCols = pCols->numOfCols;
|
|
||||||
|
|
||||||
*offset = lseek(pFile->fd, 0, SEEK_END);
|
|
||||||
*len = size;
|
|
||||||
|
|
||||||
int toffset = size;
|
|
||||||
for (int iCol = 0; iCol < pCols->numOfCols; iCol++) {
|
|
||||||
SCompCol *pCompCol = pCompData->cols + iCol;
|
|
||||||
SDataCol *pDataCol = pCols->cols + iCol;
|
|
||||||
|
|
||||||
pCompCol->colId = pDataCol->colId;
|
|
||||||
pCompCol->type = pDataCol->type;
|
|
||||||
pCompCol->offset = toffset;
|
|
||||||
|
|
||||||
// TODO: add compression
|
|
||||||
pCompCol->len = TYPE_BYTES[pCompCol->type] * pointsToWrite;
|
|
||||||
toffset += pCompCol->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the block
|
|
||||||
if (write(pFile->fd, (void *)pCompData, size) < 0) goto _err;
|
|
||||||
*len += size;
|
|
||||||
for (int iCol = 0; iCol < pCols->numOfCols; iCol++) {
|
|
||||||
SDataCol *pDataCol = pCols->cols + iCol;
|
|
||||||
SCompCol *pCompCol = pCompData->cols + iCol;
|
|
||||||
if (write(pFile->fd, pDataCol->pData, pCompCol->len) < 0) goto _err;
|
|
||||||
*len += pCompCol->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pCompData == NULL) free((void *)pCompData);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
if (pCompData == NULL) free((void *)pCompData);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int compareKeyBlock(const void *arg1, const void *arg2) {
|
/**
|
||||||
TSKEY key = *(TSKEY *)arg1;
|
* Return the next iterator key.
|
||||||
SCompBlock *pBlock = (SCompBlock *)arg2;
|
*
|
||||||
|
* @return the next key if iter has
|
||||||
|
* -1 if iter not
|
||||||
|
*/
|
||||||
|
static TSKEY tsdbNextIterKey(SSkipListIterator *pIter) {
|
||||||
|
if (pIter == NULL) return -1;
|
||||||
|
|
||||||
if (key < pBlock->keyFirst) {
|
SSkipListNode *node = tSkipListIterGet(pIter);
|
||||||
return -1;
|
if (node == NULL) return -1;
|
||||||
} else if (key > pBlock->keyLast) {
|
|
||||||
return 1;
|
SDataRow row = SL_GET_NODE_DATA(node);
|
||||||
|
return dataRowKey(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tsdbHasDataToCommit(SSkipListIterator **iters, int nIters, TSKEY minKey, TSKEY maxKey) {
|
||||||
|
TSKEY nextKey;
|
||||||
|
for (int i = 0; i < nIters; i++) {
|
||||||
|
SSkipListIterator *pIter = iters[i];
|
||||||
|
nextKey = tsdbNextIterKey(pIter);
|
||||||
|
if (nextKey > 0 && (nextKey >= minKey && nextKey <= maxKey)) return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbWriteBlockToFile(STsdbRepo *pRepo, SFileGroup *pGroup, SCompIdx *pIdx, SCompInfo *pCompInfo, SDataCols *pCols, SCompBlock *pCompBlock, SFile *lFile, int64_t uid) {
|
// static int tsdbWriteBlockToFileImpl(SFile *pFile, SDataCols *pCols, int pointsToWrite, int64_t *offset, int32_t *len, int64_t uid) {
|
||||||
STsdbCfg * pCfg = &(pRepo->config);
|
// size_t size = sizeof(SCompData) + sizeof(SCompCol) * pCols->numOfCols;
|
||||||
SFile * pFile = NULL;
|
// SCompData *pCompData = (SCompData *)malloc(size);
|
||||||
int numOfPointsToWrite = 0;
|
// if (pCompData == NULL) return -1;
|
||||||
int64_t offset = 0;
|
|
||||||
int32_t len = 0;
|
|
||||||
|
|
||||||
memset((void *)pCompBlock, 0, sizeof(SCompBlock));
|
// pCompData->delimiter = TSDB_FILE_DELIMITER;
|
||||||
|
// pCompData->uid = uid;
|
||||||
|
// pCompData->numOfCols = pCols->numOfCols;
|
||||||
|
|
||||||
if (pCompInfo == NULL) {
|
// *offset = lseek(pFile->fd, 0, SEEK_END);
|
||||||
// Just append the data block to .data or .l or .last file
|
// *len = size;
|
||||||
numOfPointsToWrite = pCols->numOfPoints;
|
|
||||||
if (pCols->numOfPoints > pCfg->minRowsPerFileBlock) { // Write to .data file
|
|
||||||
pFile = &(pGroup->files[TSDB_FILE_TYPE_DATA]);
|
|
||||||
} else { // Write to .last or .l file
|
|
||||||
pCompBlock->last = 1;
|
|
||||||
if (lFile) {
|
|
||||||
pFile = lFile;
|
|
||||||
} else {
|
|
||||||
pFile = &(pGroup->files[TSDB_FILE_TYPE_LAST]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tsdbWriteBlockToFileImpl(pFile, pCols, numOfPointsToWrite, &offset, &len, uid);
|
|
||||||
pCompBlock->offset = offset;
|
|
||||||
pCompBlock->len = len;
|
|
||||||
pCompBlock->algorithm = 2; // TODO : add to configuration
|
|
||||||
pCompBlock->sversion = pCols->sversion;
|
|
||||||
pCompBlock->numOfPoints = pCols->numOfPoints;
|
|
||||||
pCompBlock->numOfSubBlocks = 1;
|
|
||||||
pCompBlock->numOfCols = pCols->numOfCols;
|
|
||||||
pCompBlock->keyFirst = dataColsKeyFirst(pCols);
|
|
||||||
pCompBlock->keyLast = dataColsKeyLast(pCols);
|
|
||||||
} else {
|
|
||||||
// Need to merge the block to either the last block or the other block
|
|
||||||
TSKEY keyFirst = dataColsKeyFirst(pCols);
|
|
||||||
SCompBlock *pMergeBlock = NULL;
|
|
||||||
|
|
||||||
// Search the block to merge in
|
// int toffset = size;
|
||||||
void *ptr = taosbsearch((void *)&keyFirst, (void *)(pCompInfo->blocks), sizeof(SCompBlock), pIdx->numOfSuperBlocks,
|
// for (int iCol = 0; iCol < pCols->numOfCols; iCol++) {
|
||||||
compareKeyBlock, TD_GE);
|
// SCompCol *pCompCol = pCompData->cols + iCol;
|
||||||
if (ptr == NULL) {
|
// SDataCol *pDataCol = pCols->cols + iCol;
|
||||||
// No block greater or equal than the key, but there are data in the .last file, need to merge the last file block
|
|
||||||
// and merge the data
|
|
||||||
pMergeBlock = TSDB_COMPBLOCK_AT(pCompInfo, pIdx->numOfSuperBlocks - 1);
|
|
||||||
} else {
|
|
||||||
pMergeBlock = (SCompBlock *)ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pMergeBlock->last) {
|
// pCompCol->colId = pDataCol->colId;
|
||||||
if (pMergeBlock->last + pCols->numOfPoints > pCfg->minRowsPerFileBlock) {
|
// pCompCol->type = pDataCol->type;
|
||||||
// Need to load the data from .last and combine data in pCols to write to .data file
|
// pCompCol->offset = toffset;
|
||||||
|
|
||||||
} else { // Just append the block to .last or .l file
|
// // TODO: add compression
|
||||||
if (lFile) {
|
// pCompCol->len = TYPE_BYTES[pCompCol->type] * pointsToWrite;
|
||||||
// read the block from .last file and merge with pCols, write to .l file
|
// toffset += pCompCol->len;
|
||||||
|
// }
|
||||||
|
|
||||||
} else {
|
// // Write the block
|
||||||
// tsdbWriteBlockToFileImpl();
|
// if (write(pFile->fd, (void *)pCompData, size) < 0) goto _err;
|
||||||
}
|
// *len += size;
|
||||||
}
|
// for (int iCol = 0; iCol < pCols->numOfCols; iCol++) {
|
||||||
} else { // The block need to merge in .data file
|
// SDataCol *pDataCol = pCols->cols + iCol;
|
||||||
|
// SCompCol *pCompCol = pCompData->cols + iCol;
|
||||||
|
// if (write(pFile->fd, pDataCol->pData, pCompCol->len) < 0) goto _err;
|
||||||
|
// *len += pCompCol->len;
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
// if (pCompData == NULL) free((void *)pCompData);
|
||||||
|
// return 0;
|
||||||
|
|
||||||
}
|
// _err:
|
||||||
|
// if (pCompData == NULL) free((void *)pCompData);
|
||||||
|
// return -1;
|
||||||
|
// }
|
||||||
|
|
||||||
return numOfPointsToWrite;
|
// static int compareKeyBlock(const void *arg1, const void *arg2) {
|
||||||
}
|
// TSKEY key = *(TSKEY *)arg1;
|
||||||
|
// SCompBlock *pBlock = (SCompBlock *)arg2;
|
||||||
|
|
||||||
|
// if (key < pBlock->keyFirst) {
|
||||||
|
// return -1;
|
||||||
|
// } else if (key > pBlock->keyLast) {
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// int tsdbWriteBlockToFile(STsdbRepo *pRepo, SFileGroup *pGroup, SCompIdx *pIdx, SCompInfo *pCompInfo, SDataCols *pCols, SCompBlock *pCompBlock, SFile *lFile, int64_t uid) {
|
||||||
|
// STsdbCfg * pCfg = &(pRepo->config);
|
||||||
|
// SFile * pFile = NULL;
|
||||||
|
// int numOfPointsToWrite = 0;
|
||||||
|
// int64_t offset = 0;
|
||||||
|
// int32_t len = 0;
|
||||||
|
|
||||||
|
// memset((void *)pCompBlock, 0, sizeof(SCompBlock));
|
||||||
|
|
||||||
|
// if (pCompInfo == NULL) {
|
||||||
|
// // Just append the data block to .data or .l or .last file
|
||||||
|
// numOfPointsToWrite = pCols->numOfPoints;
|
||||||
|
// if (pCols->numOfPoints > pCfg->minRowsPerFileBlock) { // Write to .data file
|
||||||
|
// pFile = &(pGroup->files[TSDB_FILE_TYPE_DATA]);
|
||||||
|
// } else { // Write to .last or .l file
|
||||||
|
// pCompBlock->last = 1;
|
||||||
|
// if (lFile) {
|
||||||
|
// pFile = lFile;
|
||||||
|
// } else {
|
||||||
|
// pFile = &(pGroup->files[TSDB_FILE_TYPE_LAST]);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// tsdbWriteBlockToFileImpl(pFile, pCols, numOfPointsToWrite, &offset, &len, uid);
|
||||||
|
// pCompBlock->offset = offset;
|
||||||
|
// pCompBlock->len = len;
|
||||||
|
// pCompBlock->algorithm = 2; // TODO : add to configuration
|
||||||
|
// pCompBlock->sversion = pCols->sversion;
|
||||||
|
// pCompBlock->numOfPoints = pCols->numOfPoints;
|
||||||
|
// pCompBlock->numOfSubBlocks = 1;
|
||||||
|
// pCompBlock->numOfCols = pCols->numOfCols;
|
||||||
|
// pCompBlock->keyFirst = dataColsKeyFirst(pCols);
|
||||||
|
// pCompBlock->keyLast = dataColsKeyLast(pCols);
|
||||||
|
// } else {
|
||||||
|
// // Need to merge the block to either the last block or the other block
|
||||||
|
// TSKEY keyFirst = dataColsKeyFirst(pCols);
|
||||||
|
// SCompBlock *pMergeBlock = NULL;
|
||||||
|
|
||||||
|
// // Search the block to merge in
|
||||||
|
// void *ptr = taosbsearch((void *)&keyFirst, (void *)(pCompInfo->blocks), sizeof(SCompBlock), pIdx->numOfSuperBlocks,
|
||||||
|
// compareKeyBlock, TD_GE);
|
||||||
|
// if (ptr == NULL) {
|
||||||
|
// // No block greater or equal than the key, but there are data in the .last file, need to merge the last file block
|
||||||
|
// // and merge the data
|
||||||
|
// pMergeBlock = TSDB_COMPBLOCK_AT(pCompInfo, pIdx->numOfSuperBlocks - 1);
|
||||||
|
// } else {
|
||||||
|
// pMergeBlock = (SCompBlock *)ptr;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (pMergeBlock->last) {
|
||||||
|
// if (pMergeBlock->last + pCols->numOfPoints > pCfg->minRowsPerFileBlock) {
|
||||||
|
// // Need to load the data from .last and combine data in pCols to write to .data file
|
||||||
|
|
||||||
|
// } else { // Just append the block to .last or .l file
|
||||||
|
// if (lFile) {
|
||||||
|
// // read the block from .last file and merge with pCols, write to .l file
|
||||||
|
|
||||||
|
// } else {
|
||||||
|
// // tsdbWriteBlockToFileImpl();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else { // The block need to merge in .data file
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return numOfPointsToWrite;
|
||||||
|
// }
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -369,14 +369,14 @@ static int32_t getFileCompInfo(STableCheckInfo* pCheckInfo, SFileGroup* fileGrou
|
||||||
fileGroup->files[TSDB_FILE_TYPE_HEAD].fd = open(fileGroup->files[TSDB_FILE_TYPE_HEAD].fname, O_RDONLY);
|
fileGroup->files[TSDB_FILE_TYPE_HEAD].fd = open(fileGroup->files[TSDB_FILE_TYPE_HEAD].fname, O_RDONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbLoadCompIdx(fileGroup, pCheckInfo->compIndex, 10000); // todo set dynamic max tables
|
// tsdbLoadCompIdx(fileGroup, pCheckInfo->compIndex, 10000); // todo set dynamic max tables
|
||||||
SCompIdx* compIndex = &pCheckInfo->compIndex[pCheckInfo->tableId.tid];
|
// SCompIdx* compIndex = &pCheckInfo->compIndex[pCheckInfo->tableId.tid];
|
||||||
|
|
||||||
if (compIndex->len == 0 || compIndex->numOfSuperBlocks == 0) { // no data block in this file, try next file
|
// if (compIndex->len == 0 || compIndex->numOfSuperBlocks == 0) { // no data block in this file, try next file
|
||||||
|
|
||||||
} else {
|
// } else {
|
||||||
tsdbLoadCompBlocks(fileGroup, compIndex, pCheckInfo->pCompInfo);
|
// tsdbLoadCompBlocks(fileGroup, compIndex, pCheckInfo->pCompInfo);
|
||||||
}
|
// }
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -444,7 +444,7 @@ static bool doLoadDataFromFileBlock(STsdbQueryHandle *pQueryHandle) {
|
||||||
pFile->fd = open(pFile->fname, O_RDONLY);
|
pFile->fd = open(pFile->fname, O_RDONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbLoadDataBlock(pFile, pBlock, 1, pCheckInfo->pDataCols, data);
|
// tsdbLoadDataBlock(pFile, pBlock, 1, pCheckInfo->pDataCols, data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -810,10 +810,10 @@ static bool getQualifiedDataBlock(STsdbQueryHandle *pQueryHandle, STableCheckInf
|
||||||
pFile->fd = open(pFile->fname, O_RDONLY);
|
pFile->fd = open(pFile->fname, O_RDONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsdbLoadDataBlock(pFile, &pCheckInfo->pCompInfo->blocks[cur->slot], 1,
|
// if (tsdbLoadDataBlock(pFile, &pCheckInfo->pCompInfo->blocks[cur->slot], 1,
|
||||||
pCheckInfo->pDataCols, data) == 0) {
|
// pCheckInfo->pDataCols, data) == 0) {
|
||||||
blockLoaded = true;
|
// blockLoaded = true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// dError("QInfo:%p fileId:%d total numOfBlks:%d blockId:%d load into memory failed due to error in disk files",
|
// dError("QInfo:%p fileId:%d total numOfBlks:%d blockId:%d load into memory failed due to error in disk files",
|
||||||
// GET_QINFO_ADDR(pQuery), pQuery->fileId, pQuery->numOfBlocks, blkIdx);
|
// GET_QINFO_ADDR(pQuery), pQuery->fileId, pQuery->numOfBlocks, blkIdx);
|
||||||
|
|
|
@ -54,7 +54,8 @@ TEST(TsdbTest, createRepo) {
|
||||||
|
|
||||||
// 1. Create a tsdb repository
|
// 1. Create a tsdb repository
|
||||||
tsdbSetDefaultCfg(&config);
|
tsdbSetDefaultCfg(&config);
|
||||||
tsdb_repo_t *pRepo = tsdbCreateRepo("/home/ubuntu/work/ttest/vnode0", &config, NULL);
|
tsdbCreateRepo("/home/ubuntu/work/ttest/vnode0", &config, NULL);
|
||||||
|
tsdb_repo_t *pRepo = tsdbOpenRepo("/home/ubuntu/work/ttest/vnode0", NULL);
|
||||||
ASSERT_NE(pRepo, nullptr);
|
ASSERT_NE(pRepo, nullptr);
|
||||||
|
|
||||||
// 2. Create a normal table
|
// 2. Create a normal table
|
||||||
|
@ -139,42 +140,42 @@ TEST(TsdbTest, createRepo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TEST(TsdbTest, DISABLED_openRepo) {
|
// TEST(TsdbTest, DISABLED_openRepo) {
|
||||||
TEST(TsdbTest, openRepo) {
|
// TEST(TsdbTest, openRepo) {
|
||||||
tsdb_repo_t *repo = tsdbOpenRepo("/home/ubuntu/work/ttest/vnode0", NULL);
|
// tsdb_repo_t *repo = tsdbOpenRepo("/home/ubuntu/work/ttest/vnode0", NULL);
|
||||||
ASSERT_NE(repo, nullptr);
|
// ASSERT_NE(repo, nullptr);
|
||||||
|
|
||||||
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
// STsdbRepo *pRepo = (STsdbRepo *)repo;
|
||||||
|
|
||||||
SFileGroup *pGroup = tsdbSearchFGroup(pRepo->tsdbFileH, 1833);
|
// SFileGroup *pGroup = tsdbSearchFGroup(pRepo->tsdbFileH, 1833);
|
||||||
|
|
||||||
for (int type = TSDB_FILE_TYPE_HEAD; type < TSDB_FILE_TYPE_MAX; type++) {
|
// for (int type = TSDB_FILE_TYPE_HEAD; type < TSDB_FILE_TYPE_MAX; type++) {
|
||||||
tsdbOpenFile(&pGroup->files[type], O_RDONLY);
|
// tsdbOpenFile(&pGroup->files[type], O_RDONLY);
|
||||||
}
|
// }
|
||||||
|
|
||||||
SCompIdx *pIdx = (SCompIdx *)calloc(pRepo->config.maxTables, sizeof(SCompIdx));
|
// SCompIdx *pIdx = (SCompIdx *)calloc(pRepo->config.maxTables, sizeof(SCompIdx));
|
||||||
tsdbLoadCompIdx(pGroup, (void *)pIdx, pRepo->config.maxTables);
|
// tsdbLoadCompIdx(pGroup, (void *)pIdx, pRepo->config.maxTables);
|
||||||
|
|
||||||
SCompInfo *pCompInfo = (SCompInfo *)malloc(sizeof(SCompInfo) + pIdx[1].len);
|
// SCompInfo *pCompInfo = (SCompInfo *)malloc(sizeof(SCompInfo) + pIdx[1].len);
|
||||||
|
|
||||||
tsdbLoadCompBlocks(pGroup, &pIdx[0], (void *)pCompInfo);
|
// tsdbLoadCompBlocks(pGroup, &pIdx[0], (void *)pCompInfo);
|
||||||
|
|
||||||
int blockIdx = 0;
|
// int blockIdx = 0;
|
||||||
SCompBlock *pBlock = &(pCompInfo->blocks[blockIdx]);
|
// SCompBlock *pBlock = &(pCompInfo->blocks[blockIdx]);
|
||||||
|
|
||||||
SCompData *pCompData = (SCompData *)malloc(sizeof(SCompData) + sizeof(SCompCol) * pBlock->numOfCols);
|
// SCompData *pCompData = (SCompData *)malloc(sizeof(SCompData) + sizeof(SCompCol) * pBlock->numOfCols);
|
||||||
|
|
||||||
tsdbLoadCompCols(&pGroup->files[TSDB_FILE_TYPE_DATA], pBlock, (void *)pCompData);
|
// tsdbLoadCompCols(&pGroup->files[TSDB_FILE_TYPE_DATA], pBlock, (void *)pCompData);
|
||||||
|
|
||||||
STable *pTable = tsdbGetTableByUid(pRepo->tsdbMeta, pCompData->uid);
|
// STable *pTable = tsdbGetTableByUid(pRepo->tsdbMeta, pCompData->uid);
|
||||||
SDataCols *pDataCols = tdNewDataCols(tdMaxRowBytesFromSchema(pTable->schema), 5, 10);
|
// SDataCols *pDataCols = tdNewDataCols(tdMaxRowBytesFromSchema(pTable->schema), 5, 10);
|
||||||
tdInitDataCols(pDataCols, pTable->schema);
|
// tdInitDataCols(pDataCols, pTable->schema);
|
||||||
|
|
||||||
tsdbLoadDataBlock(&pGroup->files[TSDB_FILE_TYPE_DATA], pBlock, 1, pDataCols, pCompData);
|
// tsdbLoadDataBlock(&pGroup->files[TSDB_FILE_TYPE_DATA], pBlock, 1, pDataCols, pCompData);
|
||||||
|
|
||||||
|
|
||||||
int k = 0;
|
// int k = 0;
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
TEST(TsdbTest, DISABLED_createFileGroup) {
|
TEST(TsdbTest, DISABLED_createFileGroup) {
|
||||||
SFileGroup fGroup;
|
SFileGroup fGroup;
|
||||||
|
|
Loading…
Reference in New Issue