Merge pull request #16256 from taosdata/refact/tsdb_last
refactor: refactor the last file structure, as well as the related write and read procedure.
This commit is contained in:
commit
98a6f36cc2
|
@ -38,22 +38,18 @@ typedef struct STagVal STagVal;
|
||||||
typedef struct STag STag;
|
typedef struct STag STag;
|
||||||
|
|
||||||
// bitmap
|
// bitmap
|
||||||
#define N1(n) ((1 << (n)) - 1)
|
const static uint8_t BIT2_MAP[4][4] = {{0b00000000, 0b00000001, 0b00000010, 0},
|
||||||
#define BIT1_SIZE(n) (((n)-1) / 8 + 1)
|
{0b00000000, 0b00000100, 0b00001000, 2},
|
||||||
#define BIT2_SIZE(n) (((n)-1) / 4 + 1)
|
{0b00000000, 0b00010000, 0b00100000, 4},
|
||||||
#define SET_BIT1(p, i, v) \
|
{0b00000000, 0b01000000, 0b10000000, 6}};
|
||||||
do { \
|
|
||||||
(p)[(i) / 8] &= N1((i) % 8); \
|
|
||||||
(p)[(i) / 8] |= (((uint8_t)(v)) << (((i) % 8))); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define GET_BIT1(p, i) (((p)[(i) / 8] >> ((i) % 8)) & ((uint8_t)1))
|
#define N1(n) ((((uint8_t)1) << (n)) - 1)
|
||||||
#define SET_BIT2(p, i, v) \
|
#define BIT1_SIZE(n) ((((n)-1) >> 3) + 1)
|
||||||
do { \
|
#define BIT2_SIZE(n) ((((n)-1) >> 2) + 1)
|
||||||
p[(i) / 4] &= N1((i) % 4 * 2); \
|
#define SET_BIT1(p, i, v) ((p)[(i) >> 3] = (p)[(i) >> 3] & N1((i)&7) | (((uint8_t)(v)) << ((i)&7)))
|
||||||
(p)[(i) / 4] |= (((uint8_t)(v)) << (((i) % 4) * 2)); \
|
#define GET_BIT1(p, i) (((p)[(i) >> 3] >> ((i)&7)) & ((uint8_t)1))
|
||||||
} while (0)
|
#define SET_BIT2(p, i, v) ((p)[(i) >> 2] = (p)[(i) >> 2] & N1(BIT2_MAP[(i)&3][3]) | BIT2_MAP[(i)&3][(v)])
|
||||||
#define GET_BIT2(p, i) (((p)[(i) / 4] >> (((i) % 4) * 2)) & ((uint8_t)3))
|
#define GET_BIT2(p, i) (((p)[(i) >> 2] >> BIT2_MAP[(i)&3][3]) & ((uint8_t)3))
|
||||||
|
|
||||||
// STSchema
|
// STSchema
|
||||||
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
||||||
|
@ -171,7 +167,7 @@ struct SColVal {
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
struct STagVal {
|
struct STagVal {
|
||||||
// char colName[TSDB_COL_NAME_LEN]; // only used for tmq_get_meta
|
// char colName[TSDB_COL_NAME_LEN]; // only used for tmq_get_meta
|
||||||
union {
|
union {
|
||||||
int16_t cid;
|
int16_t cid;
|
||||||
char *pKey;
|
char *pKey;
|
||||||
|
|
|
@ -123,7 +123,7 @@ void createNewTable(TAOS* pConn, int32_t index) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
for(int32_t i = 0; i < 100000; i += 20) {
|
for(int32_t i = 0; i < 3280; i += 20) {
|
||||||
char sql[1024] = {0};
|
char sql[1024] = {0};
|
||||||
sprintf(sql,
|
sprintf(sql,
|
||||||
"insert into tu%d values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
|
"insert into tu%d values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
|
||||||
|
@ -679,30 +679,28 @@ TEST(testCase, projection_query_tables) {
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "explain verbose true select _wstart,count(*),a from st1 partition by a interval(1s)");
|
pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)");
|
||||||
printResult(pRes);
|
if (taos_errno(pRes) != 0) {
|
||||||
// pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)");
|
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
||||||
// if (taos_errno(pRes) != 0) {
|
}
|
||||||
// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
taos_free_result(pRes);
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
pRes = taos_query(pConn, "create stable st2 (ts timestamp, k int) tags(a int)");
|
||||||
//
|
if (taos_errno(pRes) != 0) {
|
||||||
// pRes = taos_query(pConn, "create stable st2 (ts timestamp, k int) tags(a int)");
|
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
||||||
// if (taos_errno(pRes) != 0) {
|
}
|
||||||
// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
taos_free_result(pRes);
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
pRes = taos_query(pConn, "create table tu using st1 tags(1)");
|
||||||
//
|
if (taos_errno(pRes) != 0) {
|
||||||
// pRes = taos_query(pConn, "create table tu using st1 tags(1)");
|
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
||||||
// if (taos_errno(pRes) != 0) {
|
}
|
||||||
// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
taos_free_result(pRes);
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
for(int32_t i = 0; i < 2; ++i) {
|
||||||
//
|
printf("create table :%d\n", i);
|
||||||
// for(int32_t i = 0; i < 1; ++i) {
|
createNewTable(pConn, i);
|
||||||
// printf("create table :%d\n", i);
|
}
|
||||||
// createNewTable(pConn, i);
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// pRes = taos_query(pConn, "select * from tu");
|
// pRes = taos_query(pConn, "select * from tu");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
|
|
@ -392,10 +392,10 @@ tDataTypeDescriptor tDataTypes[TSDB_DATA_TYPE_MAX] = {
|
||||||
getStatics_i64},
|
getStatics_i64},
|
||||||
{TSDB_DATA_TYPE_FLOAT, 5, FLOAT_BYTES, "FLOAT", 0, 0, tsCompressFloat, tsDecompressFloat, getStatics_f},
|
{TSDB_DATA_TYPE_FLOAT, 5, FLOAT_BYTES, "FLOAT", 0, 0, tsCompressFloat, tsDecompressFloat, getStatics_f},
|
||||||
{TSDB_DATA_TYPE_DOUBLE, 6, DOUBLE_BYTES, "DOUBLE", 0, 0, tsCompressDouble, tsDecompressDouble, getStatics_d},
|
{TSDB_DATA_TYPE_DOUBLE, 6, DOUBLE_BYTES, "DOUBLE", 0, 0, tsCompressDouble, tsDecompressDouble, getStatics_d},
|
||||||
{TSDB_DATA_TYPE_VARCHAR, 6, 0, "VARCHAR", 0, 0, tsCompressString, tsDecompressString, getStatics_bin},
|
{TSDB_DATA_TYPE_VARCHAR, 6, 1, "VARCHAR", 0, 0, tsCompressString, tsDecompressString, getStatics_bin},
|
||||||
{TSDB_DATA_TYPE_TIMESTAMP, 9, LONG_BYTES, "TIMESTAMP", INT64_MIN, INT64_MAX, tsCompressTimestamp,
|
{TSDB_DATA_TYPE_TIMESTAMP, 9, LONG_BYTES, "TIMESTAMP", INT64_MIN, INT64_MAX, tsCompressTimestamp,
|
||||||
tsDecompressTimestamp, getStatics_i64},
|
tsDecompressTimestamp, getStatics_i64},
|
||||||
{TSDB_DATA_TYPE_NCHAR, 5, 8, "NCHAR", 0, 0, tsCompressString, tsDecompressString, getStatics_nchr},
|
{TSDB_DATA_TYPE_NCHAR, 5, 1, "NCHAR", 0, 0, tsCompressString, tsDecompressString, getStatics_nchr},
|
||||||
{TSDB_DATA_TYPE_UTINYINT, 16, CHAR_BYTES, "TINYINT UNSIGNED", 0, UINT8_MAX, tsCompressTinyint, tsDecompressTinyint,
|
{TSDB_DATA_TYPE_UTINYINT, 16, CHAR_BYTES, "TINYINT UNSIGNED", 0, UINT8_MAX, tsCompressTinyint, tsDecompressTinyint,
|
||||||
getStatics_u8},
|
getStatics_u8},
|
||||||
{TSDB_DATA_TYPE_USMALLINT, 17, SHORT_BYTES, "SMALLINT UNSIGNED", 0, UINT16_MAX, tsCompressSmallint,
|
{TSDB_DATA_TYPE_USMALLINT, 17, SHORT_BYTES, "SMALLINT UNSIGNED", 0, UINT16_MAX, tsCompressSmallint,
|
||||||
|
|
|
@ -66,7 +66,6 @@ int32_t metaCacheOpen(SMeta* pMeta);
|
||||||
void metaCacheClose(SMeta* pMeta);
|
void metaCacheClose(SMeta* pMeta);
|
||||||
int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo);
|
int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo);
|
||||||
int32_t metaCacheDrop(SMeta* pMeta, int64_t uid);
|
int32_t metaCacheDrop(SMeta* pMeta, int64_t uid);
|
||||||
int32_t metaCacheGet(SMeta* pMeta, int64_t uid, SMetaInfo* pInfo);
|
|
||||||
|
|
||||||
struct SMeta {
|
struct SMeta {
|
||||||
TdThreadRwlock lock;
|
TdThreadRwlock lock;
|
||||||
|
|
|
@ -45,7 +45,7 @@ typedef struct SBlockIdx SBlockIdx;
|
||||||
typedef struct SBlock SBlock;
|
typedef struct SBlock SBlock;
|
||||||
typedef struct SBlockL SBlockL;
|
typedef struct SBlockL SBlockL;
|
||||||
typedef struct SColData SColData;
|
typedef struct SColData SColData;
|
||||||
typedef struct SBlockDataHdr SBlockDataHdr;
|
typedef struct SDiskDataHdr SDiskDataHdr;
|
||||||
typedef struct SBlockData SBlockData;
|
typedef struct SBlockData SBlockData;
|
||||||
typedef struct SDelFile SDelFile;
|
typedef struct SDelFile SDelFile;
|
||||||
typedef struct SHeadFile SHeadFile;
|
typedef struct SHeadFile SHeadFile;
|
||||||
|
@ -61,7 +61,11 @@ typedef struct SRowIter SRowIter;
|
||||||
typedef struct STsdbFS STsdbFS;
|
typedef struct STsdbFS STsdbFS;
|
||||||
typedef struct SRowMerger SRowMerger;
|
typedef struct SRowMerger SRowMerger;
|
||||||
typedef struct STsdbReadSnap STsdbReadSnap;
|
typedef struct STsdbReadSnap STsdbReadSnap;
|
||||||
|
typedef struct SBlockInfo SBlockInfo;
|
||||||
|
typedef struct SSmaInfo SSmaInfo;
|
||||||
|
typedef struct SBlockCol SBlockCol;
|
||||||
|
|
||||||
|
#define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F)
|
||||||
#define TSDB_MAX_SUBBLOCKS 8
|
#define TSDB_MAX_SUBBLOCKS 8
|
||||||
#define TSDB_FHDR_SIZE 512
|
#define TSDB_FHDR_SIZE 512
|
||||||
|
|
||||||
|
@ -113,10 +117,14 @@ int32_t tPutBlock(uint8_t *p, void *ph);
|
||||||
int32_t tGetBlock(uint8_t *p, void *ph);
|
int32_t tGetBlock(uint8_t *p, void *ph);
|
||||||
int32_t tBlockCmprFn(const void *p1, const void *p2);
|
int32_t tBlockCmprFn(const void *p1, const void *p2);
|
||||||
bool tBlockHasSma(SBlock *pBlock);
|
bool tBlockHasSma(SBlock *pBlock);
|
||||||
|
// SBlockL
|
||||||
|
int32_t tPutBlockL(uint8_t *p, void *ph);
|
||||||
|
int32_t tGetBlockL(uint8_t *p, void *ph);
|
||||||
// SBlockIdx
|
// SBlockIdx
|
||||||
int32_t tPutBlockIdx(uint8_t *p, void *ph);
|
int32_t tPutBlockIdx(uint8_t *p, void *ph);
|
||||||
int32_t tGetBlockIdx(uint8_t *p, void *ph);
|
int32_t tGetBlockIdx(uint8_t *p, void *ph);
|
||||||
int32_t tCmprBlockIdx(void const *lhs, void const *rhs);
|
int32_t tCmprBlockIdx(void const *lhs, void const *rhs);
|
||||||
|
int32_t tCmprBlockL(void const *lhs, void const *rhs);
|
||||||
// SColdata
|
// SColdata
|
||||||
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t smaOn);
|
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t smaOn);
|
||||||
void tColDataReset(SColData *pColData);
|
void tColDataReset(SColData *pColData);
|
||||||
|
@ -131,20 +139,25 @@ int32_t tGetColData(uint8_t *p, SColData *pColData);
|
||||||
#define tBlockDataLastRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1)
|
#define tBlockDataLastRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1)
|
||||||
#define tBlockDataFirstKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA))
|
#define tBlockDataFirstKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA))
|
||||||
#define tBlockDataLastKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA))
|
#define tBlockDataLastKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA))
|
||||||
int32_t tBlockDataInit(SBlockData *pBlockData);
|
|
||||||
|
int32_t tBlockDataCreate(SBlockData *pBlockData);
|
||||||
|
void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear);
|
||||||
|
int32_t tBlockDataInit(SBlockData *pBlockData, int64_t suid, int64_t uid, STSchema *pTSchema);
|
||||||
|
int32_t tBlockDataInitEx(SBlockData *pBlockData, SBlockData *pBlockDataFrom);
|
||||||
void tBlockDataReset(SBlockData *pBlockData);
|
void tBlockDataReset(SBlockData *pBlockData);
|
||||||
int32_t tBlockDataSetSchema(SBlockData *pBlockData, STSchema *pTSchema);
|
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
|
||||||
int32_t tBlockDataCorrectSchema(SBlockData *pBlockData, SBlockData *pBlockDataFrom);
|
void tBlockDataClear(SBlockData *pBlockData);
|
||||||
void tBlockDataClearData(SBlockData *pBlockData);
|
|
||||||
void tBlockDataClear(SBlockData *pBlockData, int8_t deepClear);
|
|
||||||
int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData);
|
|
||||||
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema);
|
|
||||||
int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
|
|
||||||
int32_t tBlockDataCopy(SBlockData *pBlockDataSrc, SBlockData *pBlockDataDest);
|
|
||||||
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
|
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
|
||||||
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
|
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
|
||||||
int32_t tPutBlockData(uint8_t *p, SBlockData *pBlockData);
|
int32_t tBlockDataCopy(SBlockData *pBlockDataSrc, SBlockData *pBlockDataDest);
|
||||||
int32_t tGetBlockData(uint8_t *p, SBlockData *pBlockData);
|
int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
|
||||||
|
int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData);
|
||||||
|
int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[],
|
||||||
|
int32_t aBufN[]);
|
||||||
|
int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]);
|
||||||
|
// SDiskDataHdr
|
||||||
|
int32_t tPutDiskDataHdr(uint8_t *p, void *ph);
|
||||||
|
int32_t tGetDiskDataHdr(uint8_t *p, void *ph);
|
||||||
// SDelIdx
|
// SDelIdx
|
||||||
int32_t tPutDelIdx(uint8_t *p, void *ph);
|
int32_t tPutDelIdx(uint8_t *p, void *ph);
|
||||||
int32_t tGetDelIdx(uint8_t *p, void *ph);
|
int32_t tGetDelIdx(uint8_t *p, void *ph);
|
||||||
|
@ -168,13 +181,25 @@ void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *m
|
||||||
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
|
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
|
||||||
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
|
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
|
||||||
void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg);
|
void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg);
|
||||||
|
int32_t tPutColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
||||||
|
int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
||||||
|
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
|
||||||
|
int32_t *szOut, uint8_t **ppBuf);
|
||||||
|
int32_t tsdbDecmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t szOut,
|
||||||
|
uint8_t **ppBuf);
|
||||||
|
int32_t tsdbCmprColData(SColData *pColData, int8_t cmprAlg, SBlockCol *pBlockCol, uint8_t **ppOut, int32_t nOut,
|
||||||
|
uint8_t **ppBuf);
|
||||||
|
int32_t tsdbDecmprColData(uint8_t *pIn, SBlockCol *pBlockCol, int8_t cmprAlg, int32_t nVal, SColData *pColData,
|
||||||
|
uint8_t **ppBuf);
|
||||||
|
int32_t tsdbReadAndCheck(TdFilePtr pFD, int64_t offset, uint8_t **ppOut, int32_t size, int8_t toCheck);
|
||||||
// tsdbMemTable ==============================================================================================
|
// tsdbMemTable ==============================================================================================
|
||||||
// SMemTable
|
// SMemTable
|
||||||
int32_t tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable);
|
int32_t tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable);
|
||||||
void tsdbMemTableDestroy(SMemTable *pMemTable);
|
void tsdbMemTableDestroy(SMemTable *pMemTable);
|
||||||
void tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData);
|
STbData *tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid);
|
||||||
void tsdbRefMemTable(SMemTable *pMemTable);
|
void tsdbRefMemTable(SMemTable *pMemTable);
|
||||||
void tsdbUnrefMemTable(SMemTable *pMemTable);
|
void tsdbUnrefMemTable(SMemTable *pMemTable);
|
||||||
|
SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable);
|
||||||
// STbDataIter
|
// STbDataIter
|
||||||
int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter **ppIter);
|
int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter **ppIter);
|
||||||
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
||||||
|
@ -223,33 +248,33 @@ int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile);
|
||||||
int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pSet);
|
int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pSet);
|
||||||
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
|
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
|
||||||
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
|
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
|
||||||
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx, uint8_t **ppBuf);
|
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx);
|
||||||
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *pMapData, uint8_t **ppBuf, SBlockIdx *pBlockIdx);
|
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *pMapData, SBlockIdx *pBlockIdx);
|
||||||
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2,
|
int32_t tsdbWriteBlockL(SDataFWriter *pWriter, SArray *aBlockL);
|
||||||
SBlockIdx *pBlockIdx, SBlock *pBlock, int8_t cmprAlg);
|
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo,
|
||||||
|
int8_t cmprAlg, int8_t toLast);
|
||||||
|
|
||||||
int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo);
|
int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo);
|
||||||
// SDataFReader
|
// SDataFReader
|
||||||
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
|
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
|
||||||
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
|
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
|
||||||
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx, uint8_t **ppBuf);
|
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx);
|
||||||
int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *pMapData, uint8_t **ppBuf);
|
int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *pMapData);
|
||||||
int32_t tsdbReadColData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, int16_t *aColId, int32_t nCol,
|
int32_t tsdbReadBlockL(SDataFReader *pReader, SArray *aBlockL);
|
||||||
SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2);
|
int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg);
|
||||||
int32_t tsdbReadBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, SBlockData *pBlockData,
|
int32_t tsdbReadDataBlock(SDataFReader *pReader, SBlock *pBlock, SBlockData *pBlockData);
|
||||||
uint8_t **ppBuf1, uint8_t **ppBuf2);
|
int32_t tsdbReadLastBlock(SDataFReader *pReader, SBlockL *pBlockL, SBlockData *pBlockData);
|
||||||
int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg, uint8_t **ppBuf);
|
|
||||||
// SDelFWriter
|
// SDelFWriter
|
||||||
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb);
|
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb);
|
||||||
int32_t tsdbDelFWriterClose(SDelFWriter **ppWriter, int8_t sync);
|
int32_t tsdbDelFWriterClose(SDelFWriter **ppWriter, int8_t sync);
|
||||||
int32_t tsdbWriteDelData(SDelFWriter *pWriter, SArray *aDelData, uint8_t **ppBuf, SDelIdx *pDelIdx);
|
int32_t tsdbWriteDelData(SDelFWriter *pWriter, SArray *aDelData, SDelIdx *pDelIdx);
|
||||||
int32_t tsdbWriteDelIdx(SDelFWriter *pWriter, SArray *aDelIdx, uint8_t **ppBuf);
|
int32_t tsdbWriteDelIdx(SDelFWriter *pWriter, SArray *aDelIdx);
|
||||||
int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter);
|
int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter);
|
||||||
// SDelFReader
|
// SDelFReader
|
||||||
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb, uint8_t **ppBuf);
|
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb);
|
||||||
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
|
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
|
||||||
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, uint8_t **ppBuf);
|
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData);
|
||||||
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx, uint8_t **ppBuf);
|
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx);
|
||||||
// tsdbRead.c ==============================================================================================
|
// tsdbRead.c ==============================================================================================
|
||||||
int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap);
|
int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap);
|
||||||
void tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap);
|
void tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap);
|
||||||
|
@ -277,13 +302,6 @@ size_t tsdbCacheGetCapacity(SVnode *pVnode);
|
||||||
int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);
|
int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);
|
||||||
|
|
||||||
// structs =======================
|
// structs =======================
|
||||||
typedef struct {
|
|
||||||
int minFid;
|
|
||||||
int midFid;
|
|
||||||
int maxFid;
|
|
||||||
TSKEY minKey;
|
|
||||||
} SRtn;
|
|
||||||
|
|
||||||
struct STsdbFS {
|
struct STsdbFS {
|
||||||
SDelFile *pDelFile;
|
SDelFile *pDelFile;
|
||||||
SArray *aDFileSet; // SArray<SDFileSet>
|
SArray *aDFileSet; // SArray<SDFileSet>
|
||||||
|
@ -312,30 +330,23 @@ struct SMemSkipListNode {
|
||||||
SMemSkipListNode *forwards[0];
|
SMemSkipListNode *forwards[0];
|
||||||
};
|
};
|
||||||
typedef struct SMemSkipList {
|
typedef struct SMemSkipList {
|
||||||
uint32_t seed;
|
|
||||||
int64_t size;
|
int64_t size;
|
||||||
|
uint32_t seed;
|
||||||
int8_t maxLevel;
|
int8_t maxLevel;
|
||||||
int8_t level;
|
int8_t level;
|
||||||
SMemSkipListNode *pHead;
|
SMemSkipListNode *pHead;
|
||||||
SMemSkipListNode *pTail;
|
SMemSkipListNode *pTail;
|
||||||
} SMemSkipList;
|
} SMemSkipList;
|
||||||
|
|
||||||
struct SDelDataInfo {
|
|
||||||
tb_uid_t suid;
|
|
||||||
tb_uid_t uid;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct STbData {
|
struct STbData {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
TSKEY minKey;
|
TSKEY minKey;
|
||||||
TSKEY maxKey;
|
TSKEY maxKey;
|
||||||
int64_t minVersion;
|
|
||||||
int64_t maxVersion;
|
|
||||||
int32_t maxSkmVer;
|
|
||||||
SDelData *pHead;
|
SDelData *pHead;
|
||||||
SDelData *pTail;
|
SDelData *pTail;
|
||||||
SMemSkipList sl;
|
SMemSkipList sl;
|
||||||
|
STbData *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemTable {
|
struct SMemTable {
|
||||||
|
@ -345,11 +356,13 @@ struct SMemTable {
|
||||||
volatile int32_t nRef;
|
volatile int32_t nRef;
|
||||||
TSKEY minKey;
|
TSKEY minKey;
|
||||||
TSKEY maxKey;
|
TSKEY maxKey;
|
||||||
int64_t minVersion;
|
|
||||||
int64_t maxVersion;
|
|
||||||
int64_t nRow;
|
int64_t nRow;
|
||||||
int64_t nDel;
|
int64_t nDel;
|
||||||
SArray *aTbData; // SArray<STbData*>
|
struct {
|
||||||
|
int32_t nTbData;
|
||||||
|
int32_t nBucket;
|
||||||
|
STbData **aBucket;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TSDBROW {
|
struct TSDBROW {
|
||||||
|
@ -380,63 +393,51 @@ struct SMapData {
|
||||||
uint8_t *pData;
|
uint8_t *pData;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
struct SBlockCol {
|
||||||
int16_t cid;
|
int16_t cid;
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int8_t smaOn;
|
int8_t smaOn;
|
||||||
int8_t flag; // HAS_NONE|HAS_NULL|HAS_VALUE
|
int8_t flag; // HAS_NONE|HAS_NULL|HAS_VALUE
|
||||||
int32_t offset;
|
|
||||||
int32_t szBitmap; // bitmap size
|
|
||||||
int32_t szOffset; // size of offset, only for variant-length data type
|
|
||||||
int32_t szValue; // compressed column value size
|
|
||||||
int32_t szOrigin; // original column value size (only save for variant data type)
|
int32_t szOrigin; // original column value size (only save for variant data type)
|
||||||
} SBlockCol;
|
int32_t szBitmap; // bitmap size, 0 only for flag == HAS_VAL
|
||||||
|
int32_t szOffset; // offset size, 0 only for non-variant-length type
|
||||||
|
int32_t szValue; // value size, 0 when flag == (HAS_NULL | HAS_NONE)
|
||||||
|
int32_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
struct SBlockInfo {
|
||||||
int32_t nRow;
|
int64_t offset; // block data offset
|
||||||
int8_t cmprAlg;
|
int32_t szBlock;
|
||||||
int64_t offset; // block data offset
|
int32_t szKey;
|
||||||
int32_t szBlockCol; // SBlockCol size
|
};
|
||||||
int32_t szVersion; // VERSION size
|
|
||||||
int32_t szTSKEY; // TSKEY size
|
struct SSmaInfo {
|
||||||
int32_t szBlock; // total block size
|
int64_t offset;
|
||||||
int64_t sOffset; // sma offset
|
int32_t size;
|
||||||
int32_t nSma; // sma size
|
};
|
||||||
} SSubBlock;
|
|
||||||
|
|
||||||
struct SBlock {
|
struct SBlock {
|
||||||
TSDBKEY minKey;
|
TSDBKEY minKey;
|
||||||
TSDBKEY maxKey;
|
TSDBKEY maxKey;
|
||||||
int64_t minVersion;
|
int64_t minVer;
|
||||||
int64_t maxVersion;
|
int64_t maxVer;
|
||||||
int32_t nRow;
|
int32_t nRow;
|
||||||
int8_t last;
|
int8_t hasDup;
|
||||||
int8_t hasDup;
|
int8_t nSubBlock;
|
||||||
int8_t nSubBlock;
|
SBlockInfo aSubBlock[TSDB_MAX_SUBBLOCKS];
|
||||||
SSubBlock aSubBlock[TSDB_MAX_SUBBLOCKS];
|
SSmaInfo smaInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SBlockL {
|
struct SBlockL {
|
||||||
struct {
|
int64_t suid;
|
||||||
int64_t uid;
|
int64_t minUid;
|
||||||
int64_t version;
|
int64_t maxUid;
|
||||||
TSKEY ts;
|
TSKEY minKey;
|
||||||
} minKey;
|
TSKEY maxKey;
|
||||||
struct {
|
int64_t minVer;
|
||||||
int64_t uid;
|
int64_t maxVer;
|
||||||
int64_t version;
|
int32_t nRow;
|
||||||
TSKEY ts;
|
SBlockInfo bInfo;
|
||||||
} maxKey;
|
|
||||||
int64_t minVer;
|
|
||||||
int64_t maxVer;
|
|
||||||
int32_t nRow;
|
|
||||||
int8_t cmprAlg;
|
|
||||||
int64_t offset;
|
|
||||||
int32_t szBlock;
|
|
||||||
int32_t szBlockCol;
|
|
||||||
int32_t szUid;
|
|
||||||
int32_t szVer;
|
|
||||||
int32_t szTSKEY;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SColData {
|
struct SColData {
|
||||||
|
@ -451,10 +452,17 @@ struct SColData {
|
||||||
uint8_t *pData;
|
uint8_t *pData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// (SBlockData){.suid = 0, .uid = 0}: block data not initialized
|
||||||
|
// (SBlockData){.suid = suid, .uid = uid}: block data for ONE child table int .data file
|
||||||
|
// (SBlockData){.suid = suid, .uid = 0}: block data for N child tables int .last file
|
||||||
|
// (SBlockData){.suid = 0, .uid = uid}: block data for 1 normal table int .last/.data file
|
||||||
struct SBlockData {
|
struct SBlockData {
|
||||||
int32_t nRow;
|
int64_t suid; // 0 means normal table block data, otherwise child table block data
|
||||||
int64_t *aVersion;
|
int64_t uid; // 0 means block data in .last file, otherwise in .data file
|
||||||
TSKEY *aTSKEY;
|
int32_t nRow; // number of rows
|
||||||
|
int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0)
|
||||||
|
int64_t *aVersion; // versions of each row
|
||||||
|
TSKEY *aTSKEY; // timestamp of each row
|
||||||
SArray *aIdx; // SArray<int32_t>
|
SArray *aIdx; // SArray<int32_t>
|
||||||
SArray *aColData; // SArray<SColData>
|
SArray *aColData; // SArray<SColData>
|
||||||
};
|
};
|
||||||
|
@ -492,13 +500,18 @@ struct SDelIdx {
|
||||||
int64_t size;
|
int64_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
struct SDiskDataHdr {
|
||||||
struct SBlockDataHdr {
|
|
||||||
uint32_t delimiter;
|
uint32_t delimiter;
|
||||||
|
uint32_t fmtVer;
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
int64_t uid;
|
int64_t uid;
|
||||||
|
int32_t szUid;
|
||||||
|
int32_t szVer;
|
||||||
|
int32_t szKey;
|
||||||
|
int32_t szBlkCol;
|
||||||
|
int32_t nRow;
|
||||||
|
int8_t cmprAlg;
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
struct SDelFile {
|
struct SDelFile {
|
||||||
volatile int32_t nRef;
|
volatile int32_t nRef;
|
||||||
|
@ -528,6 +541,7 @@ struct SLastFile {
|
||||||
|
|
||||||
int64_t commitID;
|
int64_t commitID;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
|
int64_t offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SSmaFile {
|
struct SSmaFile {
|
||||||
|
@ -562,6 +576,8 @@ struct SDelFWriter {
|
||||||
STsdb *pTsdb;
|
STsdb *pTsdb;
|
||||||
SDelFile fDel;
|
SDelFile fDel;
|
||||||
TdFilePtr pWriteH;
|
TdFilePtr pWriteH;
|
||||||
|
|
||||||
|
uint8_t *aBuf[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SDataFWriter {
|
struct SDataFWriter {
|
||||||
|
@ -577,6 +593,8 @@ struct SDataFWriter {
|
||||||
SDataFile fData;
|
SDataFile fData;
|
||||||
SLastFile fLast;
|
SLastFile fLast;
|
||||||
SSmaFile fSma;
|
SSmaFile fSma;
|
||||||
|
|
||||||
|
uint8_t *aBuf[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct STsdbReadSnap {
|
struct STsdbReadSnap {
|
||||||
|
|
|
@ -369,6 +369,7 @@ struct SSma {
|
||||||
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
SNAP_DATA_CFG = 0,
|
||||||
SNAP_DATA_META = 1,
|
SNAP_DATA_META = 1,
|
||||||
SNAP_DATA_TSDB = 2,
|
SNAP_DATA_TSDB = 2,
|
||||||
SNAP_DATA_DEL = 3,
|
SNAP_DATA_DEL = 3,
|
||||||
|
|
|
@ -127,7 +127,7 @@ _err:
|
||||||
// return 0;
|
// return 0;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid) {
|
bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid) {
|
||||||
// query uid.idx
|
// query uid.idx
|
||||||
if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), NULL, NULL) < 0) {
|
if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), NULL, NULL) < 0) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -512,18 +512,65 @@ STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema **ppTSchema) {
|
int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema **ppTSchema) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STSchema *pTSchema = NULL;
|
|
||||||
SSkmDbKey skmDbKey = {.uid = suid ? suid : uid, .sver = sver};
|
|
||||||
void *pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
|
SSkmDbKey skmDbKey;
|
||||||
|
if (sver <= 0) {
|
||||||
|
SMetaInfo info;
|
||||||
|
if (metaGetInfo(pMeta, suid ? suid : uid, &info) == 0) {
|
||||||
|
sver = info.skmVer;
|
||||||
|
} else {
|
||||||
|
TBC *pSkmDbC = NULL;
|
||||||
|
int c;
|
||||||
|
|
||||||
// query
|
skmDbKey.uid = suid ? suid : uid;
|
||||||
|
skmDbKey.sver = INT32_MAX;
|
||||||
|
|
||||||
|
tdbTbcOpen(pMeta->pSkmDb, &pSkmDbC, NULL);
|
||||||
|
metaRLock(pMeta);
|
||||||
|
|
||||||
|
if (tdbTbcMoveTo(pSkmDbC, &skmDbKey, sizeof(skmDbKey), &c) < 0) {
|
||||||
|
metaULock(pMeta);
|
||||||
|
tdbTbcClose(pSkmDbC);
|
||||||
|
code = TSDB_CODE_NOT_FOUND;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(c);
|
||||||
|
|
||||||
|
if (c < 0) {
|
||||||
|
tdbTbcMoveToPrev(pSkmDbC);
|
||||||
|
}
|
||||||
|
|
||||||
|
const void *pKey = NULL;
|
||||||
|
int32_t nKey = 0;
|
||||||
|
tdbTbcGet(pSkmDbC, &pKey, &nKey, NULL, NULL);
|
||||||
|
|
||||||
|
if (((SSkmDbKey *)pKey)->uid != skmDbKey.uid) {
|
||||||
|
metaULock(pMeta);
|
||||||
|
tdbTbcClose(pSkmDbC);
|
||||||
|
code = TSDB_CODE_NOT_FOUND;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
sver = ((SSkmDbKey *)pKey)->sver;
|
||||||
|
|
||||||
|
metaULock(pMeta);
|
||||||
|
tdbTbcClose(pSkmDbC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(sver > 0);
|
||||||
|
|
||||||
|
skmDbKey.uid = suid ? suid : uid;
|
||||||
|
skmDbKey.sver = sver;
|
||||||
metaRLock(pMeta);
|
metaRLock(pMeta);
|
||||||
if (tdbTbGet(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), &pData, &nData) < 0) {
|
if (tdbTbGet(pMeta->pSkmDb, &skmDbKey, sizeof(SSkmDbKey), &pData, &nData) < 0) {
|
||||||
code = TSDB_CODE_NOT_FOUND;
|
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
goto _err;
|
code = TSDB_CODE_NOT_FOUND;
|
||||||
|
goto _exit;
|
||||||
}
|
}
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
|
|
||||||
|
@ -545,15 +592,13 @@ int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sv
|
||||||
SSchema *pSchema = pSchemaWrapper->pSchema + i;
|
SSchema *pSchema = pSchemaWrapper->pSchema + i;
|
||||||
tdAddColToSchema(&sb, pSchema->type, pSchema->flags, pSchema->colId, pSchema->bytes);
|
tdAddColToSchema(&sb, pSchema->type, pSchema->flags, pSchema->colId, pSchema->bytes);
|
||||||
}
|
}
|
||||||
pTSchema = tdGetSchemaFromBuilder(&sb);
|
STSchema *pTSchema = tdGetSchemaFromBuilder(&sb);
|
||||||
tdDestroyTSchemaBuilder(&sb);
|
tdDestroyTSchemaBuilder(&sb);
|
||||||
|
|
||||||
*ppTSchema = pTSchema;
|
*ppTSchema = pTSchema;
|
||||||
taosMemoryFree(pSchemaWrapper->pSchema);
|
taosMemoryFree(pSchemaWrapper->pSchema);
|
||||||
return code;
|
|
||||||
|
|
||||||
_err:
|
_exit:
|
||||||
*ppTSchema = NULL;
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,6 +1051,8 @@ int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t metaCacheGet(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo);
|
||||||
|
|
||||||
int32_t metaGetInfo(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo) {
|
int32_t metaGetInfo(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
void *pData = NULL;
|
void *pData = NULL;
|
||||||
|
|
|
@ -357,10 +357,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
metaSaveToTbDb(pMeta, &nStbEntry);
|
metaSaveToTbDb(pMeta, &nStbEntry);
|
||||||
|
|
||||||
// update uid index
|
// update uid index
|
||||||
SMetaInfo info;
|
metaUpdateUidIdx(pMeta, &nStbEntry);
|
||||||
metaGetEntryInfo(&nStbEntry, &info);
|
|
||||||
tdbTbcUpsert(pUidIdxc, &pReq->suid, sizeof(tb_uid_t),
|
|
||||||
&(SUidIdxVal){.suid = info.suid, .version = info.version, .skmVer = info.skmVer}, sizeof(SUidIdxVal), 0);
|
|
||||||
|
|
||||||
if (oStbEntry.pBuf) taosMemoryFree(oStbEntry.pBuf);
|
if (oStbEntry.pBuf) taosMemoryFree(oStbEntry.pBuf);
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
|
@ -884,7 +881,8 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
}
|
}
|
||||||
|
|
||||||
SCtbIdxKey ctbIdxKey = {.suid = ctbEntry.ctbEntry.suid, .uid = uid};
|
SCtbIdxKey ctbIdxKey = {.suid = ctbEntry.ctbEntry.suid, .uid = uid};
|
||||||
tdbTbUpsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), ctbEntry.ctbEntry.pTags, ((STag*)(ctbEntry.ctbEntry.pTags))->len, &pMeta->txn);
|
tdbTbUpsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), ctbEntry.ctbEntry.pTags,
|
||||||
|
((STag *)(ctbEntry.ctbEntry.pTags))->len, &pMeta->txn);
|
||||||
|
|
||||||
tDecoderClear(&dc1);
|
tDecoderClear(&dc1);
|
||||||
tDecoderClear(&dc2);
|
tDecoderClear(&dc2);
|
||||||
|
@ -1091,7 +1089,8 @@ static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
|
SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
|
||||||
|
|
||||||
return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), pME->ctbEntry.pTags, ((STag*)(pME->ctbEntry.pTags))->len, &pMeta->txn);
|
return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), pME->ctbEntry.pTags,
|
||||||
|
((STag *)(pME->ctbEntry.pTags))->len, &pMeta->txn);
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
||||||
|
|
|
@ -266,14 +266,14 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
|
||||||
}
|
}
|
||||||
|
|
||||||
for (++iCol; iCol < nCol; ++iCol) {
|
for (++iCol; iCol < nCol; ++iCol) {
|
||||||
SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol);
|
SLastCol *tTsVal1 = (SLastCol *)taosArrayGet(pLast, iCol);
|
||||||
if (keyTs >= tTsVal->ts) {
|
if (keyTs >= tTsVal1->ts) {
|
||||||
SColVal *tColVal = &tTsVal->colVal;
|
SColVal *tColVal = &tTsVal1->colVal;
|
||||||
|
|
||||||
SColVal colVal = {0};
|
SColVal colVal = {0};
|
||||||
tTSRowGetVal(row, pTSchema, iCol, &colVal);
|
tTSRowGetVal(row, pTSchema, iCol, &colVal);
|
||||||
if (colVal.isNone || colVal.isNull) {
|
if (colVal.isNone || colVal.isNull) {
|
||||||
if (keyTs == tTsVal->ts && !tColVal->isNone && !tColVal->isNull) {
|
if (keyTs == tTsVal1->ts && !tColVal->isNone && !tColVal->isNull) {
|
||||||
invalidate = true;
|
invalidate = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -284,6 +284,7 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_invalidate:
|
||||||
taosMemoryFreeClear(pTSchema);
|
taosMemoryFreeClear(pTSchema);
|
||||||
|
|
||||||
taosLRUCacheRelease(pCache, h, invalidate);
|
taosLRUCacheRelease(pCache, h, invalidate);
|
||||||
|
@ -322,7 +323,7 @@ static int32_t getTableDelDataFromDelIdx(SDelFReader *pDelReader, SDelIdx *pDelI
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pDelIdx) {
|
if (pDelIdx) {
|
||||||
code = tsdbReadDelData(pDelReader, pDelIdx, aDelData, NULL);
|
code = tsdbReadDelData(pDelReader, pDelIdx, aDelData);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -393,8 +394,7 @@ static int32_t getTableDelIdx(SDelFReader *pDelFReader, tb_uid_t suid, tb_uid_t
|
||||||
SDelIdx idx = {.suid = suid, .uid = uid};
|
SDelIdx idx = {.suid = suid, .uid = uid};
|
||||||
|
|
||||||
// tMapDataReset(&delIdxMap);
|
// tMapDataReset(&delIdxMap);
|
||||||
// code = tsdbReadDelIdx(pDelFReader, &delIdxMap, NULL);
|
code = tsdbReadDelIdx(pDelFReader, pDelIdxArray);
|
||||||
code = tsdbReadDelIdx(pDelFReader, pDelIdxArray, NULL);
|
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// code = tMapDataSearch(&delIdxMap, &idx, tGetDelIdx, tCmprDelIdx, pDelIdx);
|
// code = tMapDataSearch(&delIdxMap, &idx, tGetDelIdx, tCmprDelIdx, pDelIdx);
|
||||||
|
@ -410,6 +410,178 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SFSLASTNEXTROW_FS,
|
||||||
|
SFSLASTNEXTROW_FILESET,
|
||||||
|
SFSLASTNEXTROW_BLOCKDATA,
|
||||||
|
SFSLASTNEXTROW_BLOCKROW
|
||||||
|
} SFSLASTNEXTROWSTATES;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SFSLASTNEXTROWSTATES state; // [input]
|
||||||
|
STsdb *pTsdb; // [input]
|
||||||
|
SBlockIdx *pBlockIdxExp; // [input]
|
||||||
|
STSchema *pTSchema; // [input]
|
||||||
|
int32_t nFileSet;
|
||||||
|
int32_t iFileSet;
|
||||||
|
SArray *aDFileSet;
|
||||||
|
SDataFReader *pDataFReader;
|
||||||
|
SArray *aBlockL;
|
||||||
|
SBlockL *pBlockL;
|
||||||
|
SBlockData *pBlockDataL;
|
||||||
|
SBlockData blockDataL;
|
||||||
|
int32_t nRow;
|
||||||
|
int32_t iRow;
|
||||||
|
TSDBROW row;
|
||||||
|
/*
|
||||||
|
SArray *aBlockIdx;
|
||||||
|
SBlockIdx *pBlockIdx;
|
||||||
|
SMapData blockMap;
|
||||||
|
int32_t nBlock;
|
||||||
|
int32_t iBlock;
|
||||||
|
SBlock block;
|
||||||
|
*/
|
||||||
|
} SFSLastNextRowIter;
|
||||||
|
|
||||||
|
static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) {
|
||||||
|
SFSLastNextRowIter *state = (SFSLastNextRowIter *)iter;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
switch (state->state) {
|
||||||
|
case SFSLASTNEXTROW_FS:
|
||||||
|
// state->aDFileSet = state->pTsdb->pFS->cState->aDFileSet;
|
||||||
|
state->nFileSet = taosArrayGetSize(state->aDFileSet);
|
||||||
|
state->iFileSet = state->nFileSet;
|
||||||
|
|
||||||
|
state->pBlockDataL = NULL;
|
||||||
|
|
||||||
|
case SFSLASTNEXTROW_FILESET: {
|
||||||
|
SDFileSet *pFileSet = NULL;
|
||||||
|
_next_fileset:
|
||||||
|
if (--state->iFileSet >= 0) {
|
||||||
|
pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet);
|
||||||
|
} else {
|
||||||
|
if (state->pBlockDataL) {
|
||||||
|
tBlockDataDestroy(state->pBlockDataL, 1);
|
||||||
|
state->pBlockDataL = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppRow = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbDataFReaderOpen(&state->pDataFReader, state->pTsdb, pFileSet);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
if (!state->aBlockL) {
|
||||||
|
state->aBlockL = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
|
} else {
|
||||||
|
taosArrayClear(state->aBlockL);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbReadBlockL(state->pDataFReader, state->aBlockL);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
// SBlockL *pBlockL = (SBlockL *)taosArrayGet(state->aBlockL, state->iBlockL);
|
||||||
|
|
||||||
|
state->pBlockL = taosArraySearch(state->aBlockL, state->pBlockIdxExp, tCmprBlockL, TD_EQ);
|
||||||
|
if (!state->pBlockL) {
|
||||||
|
goto _next_fileset;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t suid = state->pBlockL->suid;
|
||||||
|
int64_t uid = state->pBlockL->maxUid;
|
||||||
|
|
||||||
|
if (!state->pBlockDataL) {
|
||||||
|
state->pBlockDataL = &state->blockDataL;
|
||||||
|
}
|
||||||
|
code = tBlockDataInit(state->pBlockDataL, suid, suid ? 0 : uid, state->pTSchema);
|
||||||
|
if (code) goto _err;
|
||||||
|
}
|
||||||
|
case SFSLASTNEXTROW_BLOCKDATA:
|
||||||
|
code = tsdbReadLastBlock(state->pDataFReader, state->pBlockL, state->pBlockDataL);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
state->nRow = state->blockDataL.nRow;
|
||||||
|
state->iRow = state->nRow - 1;
|
||||||
|
|
||||||
|
if (!state->pBlockDataL->uid) {
|
||||||
|
while (state->pBlockIdxExp->uid != state->pBlockDataL->aUid[state->iRow]) {
|
||||||
|
--state->iRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state->state = SFSLASTNEXTROW_BLOCKROW;
|
||||||
|
case SFSLASTNEXTROW_BLOCKROW:
|
||||||
|
if (state->pBlockDataL->uid) {
|
||||||
|
if (state->iRow >= 0) {
|
||||||
|
state->row = tsdbRowFromBlockData(state->pBlockDataL, state->iRow);
|
||||||
|
*ppRow = &state->row;
|
||||||
|
|
||||||
|
if (--state->iRow < 0) {
|
||||||
|
state->state = SFSLASTNEXTROW_FILESET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (state->iRow >= 0 && state->pBlockIdxExp->uid == state->pBlockDataL->aUid[state->iRow]) {
|
||||||
|
state->row = tsdbRowFromBlockData(state->pBlockDataL, state->iRow);
|
||||||
|
*ppRow = &state->row;
|
||||||
|
|
||||||
|
if (--state->iRow < 0 || state->pBlockIdxExp->uid != state->pBlockDataL->aUid[state->iRow]) {
|
||||||
|
state->state = SFSLASTNEXTROW_FILESET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_err:
|
||||||
|
if (state->pDataFReader) {
|
||||||
|
tsdbDataFReaderClose(&state->pDataFReader);
|
||||||
|
state->pDataFReader = NULL;
|
||||||
|
}
|
||||||
|
if (state->aBlockL) {
|
||||||
|
taosArrayDestroy(state->aBlockL);
|
||||||
|
state->aBlockL = NULL;
|
||||||
|
}
|
||||||
|
if (state->pBlockDataL) {
|
||||||
|
tBlockDataDestroy(state->pBlockDataL, 1);
|
||||||
|
state->pBlockDataL = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppRow = NULL;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t clearNextRowFromFSLast(void *iter) {
|
||||||
|
SFSLastNextRowIter *state = (SFSLastNextRowIter *)iter;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->pDataFReader) {
|
||||||
|
tsdbDataFReaderClose(&state->pDataFReader);
|
||||||
|
state->pDataFReader = NULL;
|
||||||
|
}
|
||||||
|
if (state->aBlockL) {
|
||||||
|
taosArrayDestroy(state->aBlockL);
|
||||||
|
state->aBlockL = NULL;
|
||||||
|
}
|
||||||
|
if (state->pBlockDataL) {
|
||||||
|
tBlockDataDestroy(state->pBlockDataL, 1);
|
||||||
|
state->pBlockDataL = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
typedef enum SFSNEXTROWSTATES {
|
typedef enum SFSNEXTROWSTATES {
|
||||||
SFSNEXTROW_FS,
|
SFSNEXTROW_FS,
|
||||||
SFSNEXTROW_FILESET,
|
SFSNEXTROW_FILESET,
|
||||||
|
@ -456,9 +628,9 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
if (--state->iFileSet >= 0) {
|
if (--state->iFileSet >= 0) {
|
||||||
pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet);
|
pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet);
|
||||||
} else {
|
} else {
|
||||||
// tBlockDataClear(&state->blockData, 1);
|
// tBlockDataDestroy(&state->blockData, 1);
|
||||||
if (state->pBlockData) {
|
if (state->pBlockData) {
|
||||||
tBlockDataClear(state->pBlockData, 1);
|
tBlockDataDestroy(state->pBlockData, 1);
|
||||||
state->pBlockData = NULL;
|
state->pBlockData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,13 +642,12 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// tMapDataReset(&state->blockIdxMap);
|
// tMapDataReset(&state->blockIdxMap);
|
||||||
// code = tsdbReadBlockIdx(state->pDataFReader, &state->blockIdxMap, NULL);
|
|
||||||
if (!state->aBlockIdx) {
|
if (!state->aBlockIdx) {
|
||||||
state->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
state->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
} else {
|
} else {
|
||||||
taosArrayClear(state->aBlockIdx);
|
taosArrayClear(state->aBlockIdx);
|
||||||
}
|
}
|
||||||
code = tsdbReadBlockIdx(state->pDataFReader, state->aBlockIdx, NULL);
|
code = tsdbReadBlockIdx(state->pDataFReader, state->aBlockIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
/* if (state->pBlockIdx) { */
|
/* if (state->pBlockIdx) { */
|
||||||
|
@ -492,8 +663,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tMapDataReset(&state->blockMap);
|
tMapDataReset(&state->blockMap);
|
||||||
code = tsdbReadBlock(state->pDataFReader, state->pBlockIdx, &state->blockMap, NULL);
|
code = tsdbReadBlock(state->pDataFReader, state->pBlockIdx, &state->blockMap);
|
||||||
/* code = tsdbReadBlock(state->pDataFReader, &state->blockIdx, &state->blockMap, NULL); */
|
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
state->nBlock = state->blockMap.nItem;
|
state->nBlock = state->blockMap.nItem;
|
||||||
|
@ -502,7 +672,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
if (!state->pBlockData) {
|
if (!state->pBlockData) {
|
||||||
state->pBlockData = &state->blockData;
|
state->pBlockData = &state->blockData;
|
||||||
|
|
||||||
tBlockDataInit(&state->blockData);
|
tBlockDataCreate(&state->blockData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case SFSNEXTROW_BLOCKDATA:
|
case SFSNEXTROW_BLOCKDATA:
|
||||||
|
@ -515,7 +685,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
|
|
||||||
tMapDataGetItemByIdx(&state->blockMap, state->iBlock, &block, tGetBlock);
|
tMapDataGetItemByIdx(&state->blockMap, state->iBlock, &block, tGetBlock);
|
||||||
/* code = tsdbReadBlockData(state->pDataFReader, &state->blockIdx, &block, &state->blockData, NULL, NULL); */
|
/* code = tsdbReadBlockData(state->pDataFReader, &state->blockIdx, &block, &state->blockData, NULL, NULL); */
|
||||||
code = tsdbReadBlockData(state->pDataFReader, state->pBlockIdx, &block, state->pBlockData, NULL, NULL);
|
code = tsdbReadDataBlock(state->pDataFReader, &block, state->pBlockData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
state->nRow = state->blockData.nRow;
|
state->nRow = state->blockData.nRow;
|
||||||
|
@ -560,8 +730,8 @@ _err:
|
||||||
state->aBlockIdx = NULL;
|
state->aBlockIdx = NULL;
|
||||||
}
|
}
|
||||||
if (state->pBlockData) {
|
if (state->pBlockData) {
|
||||||
// tBlockDataClear(&state->blockData, 1);
|
// tBlockDataDestroy(&state->blockData, 1);
|
||||||
tBlockDataClear(state->pBlockData, 1);
|
tBlockDataDestroy(state->pBlockData, 1);
|
||||||
state->pBlockData = NULL;
|
state->pBlockData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -587,8 +757,8 @@ int32_t clearNextRowFromFS(void *iter) {
|
||||||
state->aBlockIdx = NULL;
|
state->aBlockIdx = NULL;
|
||||||
}
|
}
|
||||||
if (state->pBlockData) {
|
if (state->pBlockData) {
|
||||||
// tBlockDataClear(&state->blockData, 1);
|
// tBlockDataDestroy(&state->blockData, 1);
|
||||||
tBlockDataClear(state->pBlockData, 1);
|
tBlockDataDestroy(state->pBlockData, 1);
|
||||||
state->pBlockData = NULL;
|
state->pBlockData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,18 +900,19 @@ typedef struct {
|
||||||
SArray *pSkyline;
|
SArray *pSkyline;
|
||||||
int64_t iSkyline;
|
int64_t iSkyline;
|
||||||
|
|
||||||
SBlockIdx idx;
|
SBlockIdx idx;
|
||||||
SMemNextRowIter memState;
|
SMemNextRowIter memState;
|
||||||
SMemNextRowIter imemState;
|
SMemNextRowIter imemState;
|
||||||
SFSNextRowIter fsState;
|
SFSLastNextRowIter fsLastState;
|
||||||
TSDBROW memRow, imemRow, fsRow;
|
SFSNextRowIter fsState;
|
||||||
|
TSDBROW memRow, imemRow, fsLastRow, fsRow;
|
||||||
|
|
||||||
TsdbNextRowState input[3];
|
TsdbNextRowState input[4];
|
||||||
STsdbReadSnap *pReadSnap;
|
STsdbReadSnap *pReadSnap;
|
||||||
STsdb *pTsdb;
|
STsdb *pTsdb;
|
||||||
} CacheNextRowIter;
|
} CacheNextRowIter;
|
||||||
|
|
||||||
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb) {
|
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
tb_uid_t suid = getTableSuidByUid(uid, pTsdb);
|
tb_uid_t suid = getTableSuidByUid(uid, pTsdb);
|
||||||
|
@ -750,12 +921,12 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
STbData *pMem = NULL;
|
STbData *pMem = NULL;
|
||||||
if (pIter->pReadSnap->pMem) {
|
if (pIter->pReadSnap->pMem) {
|
||||||
tsdbGetTbDataFromMemTable(pIter->pReadSnap->pMem, suid, uid, &pMem);
|
pMem = tsdbGetTbDataFromMemTable(pIter->pReadSnap->pMem, suid, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
STbData *pIMem = NULL;
|
STbData *pIMem = NULL;
|
||||||
if (pIter->pReadSnap->pIMem) {
|
if (pIter->pReadSnap->pIMem) {
|
||||||
tsdbGetTbDataFromMemTable(pIter->pReadSnap->pIMem, suid, uid, &pIMem);
|
pIMem = tsdbGetTbDataFromMemTable(pIter->pReadSnap->pIMem, suid, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
pIter->pTsdb = pTsdb;
|
pIter->pTsdb = pTsdb;
|
||||||
|
@ -768,7 +939,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
if (pDelFile) {
|
if (pDelFile) {
|
||||||
SDelFReader *pDelFReader;
|
SDelFReader *pDelFReader;
|
||||||
|
|
||||||
code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb, NULL);
|
code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
|
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
|
||||||
|
@ -787,6 +958,12 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
pIter->idx = (SBlockIdx){.suid = suid, .uid = uid};
|
pIter->idx = (SBlockIdx){.suid = suid, .uid = uid};
|
||||||
|
|
||||||
|
pIter->fsLastState.state = (SFSLASTNEXTROWSTATES) SFSNEXTROW_FS;
|
||||||
|
pIter->fsLastState.pTsdb = pTsdb;
|
||||||
|
pIter->fsLastState.aDFileSet = pIter->pReadSnap->fs.aDFileSet;
|
||||||
|
pIter->fsLastState.pBlockIdxExp = &pIter->idx;
|
||||||
|
pIter->fsLastState.pTSchema = pTSchema;
|
||||||
|
|
||||||
pIter->fsState.state = SFSNEXTROW_FS;
|
pIter->fsState.state = SFSNEXTROW_FS;
|
||||||
pIter->fsState.pTsdb = pTsdb;
|
pIter->fsState.pTsdb = pTsdb;
|
||||||
pIter->fsState.aDFileSet = pIter->pReadSnap->fs.aDFileSet;
|
pIter->fsState.aDFileSet = pIter->pReadSnap->fs.aDFileSet;
|
||||||
|
@ -794,7 +971,9 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
pIter->input[0] = (TsdbNextRowState){&pIter->memRow, true, false, &pIter->memState, getNextRowFromMem, NULL};
|
pIter->input[0] = (TsdbNextRowState){&pIter->memRow, true, false, &pIter->memState, getNextRowFromMem, NULL};
|
||||||
pIter->input[1] = (TsdbNextRowState){&pIter->imemRow, true, false, &pIter->imemState, getNextRowFromMem, NULL};
|
pIter->input[1] = (TsdbNextRowState){&pIter->imemRow, true, false, &pIter->imemState, getNextRowFromMem, NULL};
|
||||||
pIter->input[2] =
|
pIter->input[2] = (TsdbNextRowState){&pIter->fsLastRow, false, true, &pIter->fsLastState, getNextRowFromFSLast,
|
||||||
|
clearNextRowFromFSLast};
|
||||||
|
pIter->input[3] =
|
||||||
(TsdbNextRowState){&pIter->fsRow, false, true, &pIter->fsState, getNextRowFromFS, clearNextRowFromFS};
|
(TsdbNextRowState){&pIter->fsRow, false, true, &pIter->fsState, getNextRowFromFS, clearNextRowFromFS};
|
||||||
|
|
||||||
if (pMem) {
|
if (pMem) {
|
||||||
|
@ -819,7 +998,7 @@ _err:
|
||||||
static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
|
static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
if (pIter->input[i].nextRowClearFn) {
|
if (pIter->input[i].nextRowClearFn) {
|
||||||
pIter->input[i].nextRowClearFn(pIter->input[i].iter);
|
pIter->input[i].nextRowClearFn(pIter->input[i].iter);
|
||||||
}
|
}
|
||||||
|
@ -831,7 +1010,6 @@ static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
|
||||||
|
|
||||||
tsdbUntakeReadSnap(pIter->pTsdb, pIter->pReadSnap);
|
tsdbUntakeReadSnap(pIter->pTsdb, pIter->pReadSnap);
|
||||||
|
|
||||||
return code;
|
|
||||||
_err:
|
_err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -840,7 +1018,7 @@ _err:
|
||||||
static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow) {
|
static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
if (pIter->input[i].next && !pIter->input[i].stop) {
|
if (pIter->input[i].next && !pIter->input[i].stop) {
|
||||||
code = pIter->input[i].nextRowFn(pIter->input[i].iter, &pIter->input[i].pRow);
|
code = pIter->input[i].nextRowFn(pIter->input[i].iter, &pIter->input[i].pRow);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -852,18 +1030,18 @@ static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIter->input[0].stop && pIter->input[1].stop && pIter->input[2].stop) {
|
if (pIter->input[0].stop && pIter->input[1].stop && pIter->input[2].stop && pIter->input[3].stop) {
|
||||||
*ppRow = NULL;
|
*ppRow = NULL;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// select maxpoint(s) from mem, imem, fs
|
// select maxpoint(s) from mem, imem, fs and last
|
||||||
TSDBROW *max[3] = {0};
|
TSDBROW *max[4] = {0};
|
||||||
int iMax[3] = {-1, -1, -1};
|
int iMax[4] = {-1, -1, -1, -1};
|
||||||
int nMax = 0;
|
int nMax = 0;
|
||||||
TSKEY maxKey = TSKEY_MIN;
|
TSKEY maxKey = TSKEY_MIN;
|
||||||
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
if (!pIter->input[i].stop && pIter->input[i].pRow != NULL) {
|
if (!pIter->input[i].stop && pIter->input[i].pRow != NULL) {
|
||||||
TSDBKEY key = TSDBROW_KEY(pIter->input[i].pRow);
|
TSDBKEY key = TSDBROW_KEY(pIter->input[i].pRow);
|
||||||
|
|
||||||
|
@ -881,13 +1059,13 @@ static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete detection
|
// delete detection
|
||||||
TSDBROW *merge[3] = {0};
|
TSDBROW *merge[4] = {0};
|
||||||
int iMerge[3] = {-1, -1, -1};
|
int iMerge[4] = {-1, -1, -1, -1};
|
||||||
int nMerge = 0;
|
int nMerge = 0;
|
||||||
for (int i = 0; i < nMax; ++i) {
|
for (int i = 0; i < nMax; ++i) {
|
||||||
TSDBKEY maxKey = TSDBROW_KEY(max[i]);
|
TSDBKEY maxKey1 = TSDBROW_KEY(max[i]);
|
||||||
|
|
||||||
bool deleted = tsdbKeyDeleted(&maxKey, pIter->pSkyline, &pIter->iSkyline);
|
bool deleted = tsdbKeyDeleted(&maxKey1, pIter->pSkyline, &pIter->iSkyline);
|
||||||
if (!deleted) {
|
if (!deleted) {
|
||||||
iMerge[nMerge] = iMax[i];
|
iMerge[nMerge] = iMax[i];
|
||||||
merge[nMerge++] = max[i];
|
merge[nMerge++] = max[i];
|
||||||
|
@ -923,7 +1101,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb);
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
TSDBROW *pRow = NULL;
|
TSDBROW *pRow = NULL;
|
||||||
|
@ -1020,7 +1198,7 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb);
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
TSDBROW *pRow = NULL;
|
TSDBROW *pRow = NULL;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -576,10 +576,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
fSet.pHeadF->nRef = 0;
|
*fSet.pHeadF = *pSet->pHeadF;
|
||||||
fSet.pHeadF->commitID = pSet->pHeadF->commitID;
|
|
||||||
fSet.pHeadF->size = pSet->pHeadF->size;
|
|
||||||
fSet.pHeadF->offset = pSet->pHeadF->offset;
|
|
||||||
|
|
||||||
// data
|
// data
|
||||||
fSet.pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
|
fSet.pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
|
||||||
|
@ -587,9 +584,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
fSet.pDataF->nRef = 0;
|
*fSet.pDataF = *pSet->pDataF;
|
||||||
fSet.pDataF->commitID = pSet->pDataF->commitID;
|
|
||||||
fSet.pDataF->size = pSet->pDataF->size;
|
|
||||||
|
|
||||||
// data
|
// data
|
||||||
fSet.pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile));
|
fSet.pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile));
|
||||||
|
@ -597,9 +592,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
fSet.pLastF->nRef = 0;
|
*fSet.pLastF = *pSet->pLastF;
|
||||||
fSet.pLastF->commitID = pSet->pLastF->commitID;
|
|
||||||
fSet.pLastF->size = pSet->pLastF->size;
|
|
||||||
|
|
||||||
// last
|
// last
|
||||||
fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
|
fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
|
||||||
|
@ -607,9 +600,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
fSet.pSmaF->nRef = 0;
|
*fSet.pSmaF = *pSet->pSmaF;
|
||||||
fSet.pSmaF->commitID = pSet->pSmaF->commitID;
|
|
||||||
fSet.pSmaF->size = pSet->pSmaF->size;
|
|
||||||
|
|
||||||
if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) {
|
if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -58,6 +58,7 @@ int32_t tPutLastFile(uint8_t *p, SLastFile *pLastFile) {
|
||||||
|
|
||||||
n += tPutI64v(p ? p + n : p, pLastFile->commitID);
|
n += tPutI64v(p ? p + n : p, pLastFile->commitID);
|
||||||
n += tPutI64v(p ? p + n : p, pLastFile->size);
|
n += tPutI64v(p ? p + n : p, pLastFile->size);
|
||||||
|
n += tPutI64v(p ? p + n : p, pLastFile->offset);
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
@ -67,6 +68,7 @@ static int32_t tGetLastFile(uint8_t *p, SLastFile *pLastFile) {
|
||||||
|
|
||||||
n += tGetI64v(p + n, &pLastFile->commitID);
|
n += tGetI64v(p + n, &pLastFile->commitID);
|
||||||
n += tGetI64v(p + n, &pLastFile->size);
|
n += tGetI64v(p + n, &pLastFile->size);
|
||||||
|
n += tGetI64v(p + n, &pLastFile->offset);
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
@ -186,11 +188,16 @@ int32_t tPutDFileSet(uint8_t *p, SDFileSet *pSet) {
|
||||||
n += tPutI32v(p ? p + n : p, pSet->diskId.level);
|
n += tPutI32v(p ? p + n : p, pSet->diskId.level);
|
||||||
n += tPutI32v(p ? p + n : p, pSet->diskId.id);
|
n += tPutI32v(p ? p + n : p, pSet->diskId.id);
|
||||||
n += tPutI32v(p ? p + n : p, pSet->fid);
|
n += tPutI32v(p ? p + n : p, pSet->fid);
|
||||||
|
|
||||||
|
// data
|
||||||
n += tPutHeadFile(p ? p + n : p, pSet->pHeadF);
|
n += tPutHeadFile(p ? p + n : p, pSet->pHeadF);
|
||||||
n += tPutDataFile(p ? p + n : p, pSet->pDataF);
|
n += tPutDataFile(p ? p + n : p, pSet->pDataF);
|
||||||
n += tPutLastFile(p ? p + n : p, pSet->pLastF);
|
|
||||||
n += tPutSmaFile(p ? p + n : p, pSet->pSmaF);
|
n += tPutSmaFile(p ? p + n : p, pSet->pSmaF);
|
||||||
|
|
||||||
|
// last
|
||||||
|
n += tPutU8(p ? p + n : p, 1); // for future compatibility
|
||||||
|
n += tPutLastFile(p ? p + n : p, pSet->pLastF);
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,11 +207,17 @@ int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet) {
|
||||||
n += tGetI32v(p + n, &pSet->diskId.level);
|
n += tGetI32v(p + n, &pSet->diskId.level);
|
||||||
n += tGetI32v(p + n, &pSet->diskId.id);
|
n += tGetI32v(p + n, &pSet->diskId.id);
|
||||||
n += tGetI32v(p + n, &pSet->fid);
|
n += tGetI32v(p + n, &pSet->fid);
|
||||||
|
|
||||||
|
// data
|
||||||
n += tGetHeadFile(p + n, pSet->pHeadF);
|
n += tGetHeadFile(p + n, pSet->pHeadF);
|
||||||
n += tGetDataFile(p + n, pSet->pDataF);
|
n += tGetDataFile(p + n, pSet->pDataF);
|
||||||
n += tGetLastFile(p + n, pSet->pLastF);
|
|
||||||
n += tGetSmaFile(p + n, pSet->pSmaF);
|
n += tGetSmaFile(p + n, pSet->pSmaF);
|
||||||
|
|
||||||
|
// last
|
||||||
|
uint8_t nLast;
|
||||||
|
n += tGetU8(p + n, &nLast);
|
||||||
|
n += tGetLastFile(p + n, pSet->pLastF);
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
|
#define MEM_MIN_HASH 1024
|
||||||
#define SL_MAX_LEVEL 5
|
#define SL_MAX_LEVEL 5
|
||||||
|
|
||||||
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
||||||
|
@ -45,12 +46,12 @@ int32_t tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable) {
|
||||||
pMemTable->nRef = 1;
|
pMemTable->nRef = 1;
|
||||||
pMemTable->minKey = TSKEY_MAX;
|
pMemTable->minKey = TSKEY_MAX;
|
||||||
pMemTable->maxKey = TSKEY_MIN;
|
pMemTable->maxKey = TSKEY_MIN;
|
||||||
pMemTable->minVersion = VERSION_MAX;
|
|
||||||
pMemTable->maxVersion = VERSION_MIN;
|
|
||||||
pMemTable->nRow = 0;
|
pMemTable->nRow = 0;
|
||||||
pMemTable->nDel = 0;
|
pMemTable->nDel = 0;
|
||||||
pMemTable->aTbData = taosArrayInit(128, sizeof(STbData *));
|
pMemTable->nTbData = 0;
|
||||||
if (pMemTable->aTbData == NULL) {
|
pMemTable->nBucket = MEM_MIN_HASH;
|
||||||
|
pMemTable->aBucket = (STbData **)taosMemoryCalloc(pMemTable->nBucket, sizeof(STbData *));
|
||||||
|
if (pMemTable->aBucket == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFree(pMemTable);
|
taosMemoryFree(pMemTable);
|
||||||
goto _err;
|
goto _err;
|
||||||
|
@ -68,37 +69,30 @@ _err:
|
||||||
void tsdbMemTableDestroy(SMemTable *pMemTable) {
|
void tsdbMemTableDestroy(SMemTable *pMemTable) {
|
||||||
if (pMemTable) {
|
if (pMemTable) {
|
||||||
vnodeBufPoolUnRef(pMemTable->pPool);
|
vnodeBufPoolUnRef(pMemTable->pPool);
|
||||||
taosArrayDestroy(pMemTable->aTbData);
|
taosMemoryFree(pMemTable->aBucket);
|
||||||
taosMemoryFree(pMemTable);
|
taosMemoryFree(pMemTable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tbDataPCmprFn(const void *p1, const void *p2) {
|
static FORCE_INLINE STbData *tsdbGetTbDataFromMemTableImpl(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid) {
|
||||||
STbData *pTbData1 = *(STbData **)p1;
|
STbData *pTbData = pMemTable->aBucket[TABS(uid) % pMemTable->nBucket];
|
||||||
STbData *pTbData2 = *(STbData **)p2;
|
|
||||||
|
|
||||||
if (pTbData1->suid < pTbData2->suid) {
|
while (pTbData) {
|
||||||
return -1;
|
if (pTbData->uid == uid) break;
|
||||||
} else if (pTbData1->suid > pTbData2->suid) {
|
pTbData = pTbData->next;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTbData1->uid < pTbData2->uid) {
|
return pTbData;
|
||||||
return -1;
|
|
||||||
} else if (pTbData1->uid > pTbData2->uid) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
void tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData) {
|
|
||||||
STbData *pTbData = &(STbData){.suid = suid, .uid = uid};
|
STbData *tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid) {
|
||||||
|
STbData *pTbData;
|
||||||
|
|
||||||
taosRLockLatch(&pMemTable->latch);
|
taosRLockLatch(&pMemTable->latch);
|
||||||
void *p = taosArraySearch(pMemTable->aTbData, &pTbData, tbDataPCmprFn, TD_EQ);
|
pTbData = tsdbGetTbDataFromMemTableImpl(pMemTable, suid, uid);
|
||||||
taosRUnLockLatch(&pMemTable->latch);
|
taosRUnLockLatch(&pMemTable->latch);
|
||||||
|
|
||||||
*ppTbData = p ? *(STbData **)p : NULL;
|
return pTbData;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlock,
|
int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlock,
|
||||||
|
@ -184,10 +178,6 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid
|
||||||
pTbData->pTail = pDelData;
|
pTbData->pTail = pDelData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) {
|
if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) {
|
||||||
|
@ -320,18 +310,44 @@ _exit:
|
||||||
return pIter->pRow;
|
return pIter->pRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t tsdbMemTableRehash(SMemTable *pMemTable) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
int32_t nBucket = pMemTable->nBucket * 2;
|
||||||
|
STbData **aBucket = (STbData **)taosMemoryCalloc(nBucket, sizeof(STbData *));
|
||||||
|
if (aBucket == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t iBucket = 0; iBucket < pMemTable->nBucket; iBucket++) {
|
||||||
|
STbData *pTbData = pMemTable->aBucket[iBucket];
|
||||||
|
|
||||||
|
while (pTbData) {
|
||||||
|
STbData *pNext = pTbData->next;
|
||||||
|
|
||||||
|
int32_t idx = TABS(pTbData->uid) % nBucket;
|
||||||
|
pTbData->next = aBucket[idx];
|
||||||
|
aBucket[idx] = pTbData;
|
||||||
|
|
||||||
|
pTbData = pNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pMemTable->aBucket);
|
||||||
|
pMemTable->nBucket = nBucket;
|
||||||
|
pMemTable->aBucket = aBucket;
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t tsdbGetOrCreateTbData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData) {
|
static int32_t tsdbGetOrCreateTbData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t idx = 0;
|
|
||||||
STbData *pTbData = NULL;
|
|
||||||
STbData *pTbDataT = &(STbData){.suid = suid, .uid = uid};
|
|
||||||
|
|
||||||
// get
|
// get
|
||||||
idx = taosArraySearchIdx(pMemTable->aTbData, &pTbDataT, tbDataPCmprFn, TD_GE);
|
STbData *pTbData = tsdbGetTbDataFromMemTableImpl(pMemTable, suid, uid);
|
||||||
if (idx >= 0) {
|
if (pTbData) goto _exit;
|
||||||
pTbData = (STbData *)taosArrayGetP(pMemTable->aTbData, idx);
|
|
||||||
if (tbDataPCmprFn(&pTbDataT, &pTbData) == 0) goto _exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create
|
// create
|
||||||
SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse;
|
SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse;
|
||||||
|
@ -346,9 +362,6 @@ static int32_t tsdbGetOrCreateTbData(SMemTable *pMemTable, tb_uid_t suid, tb_uid
|
||||||
pTbData->uid = uid;
|
pTbData->uid = uid;
|
||||||
pTbData->minKey = TSKEY_MAX;
|
pTbData->minKey = TSKEY_MAX;
|
||||||
pTbData->maxKey = TSKEY_MIN;
|
pTbData->maxKey = TSKEY_MIN;
|
||||||
pTbData->minVersion = VERSION_MAX;
|
|
||||||
pTbData->maxVersion = VERSION_MIN;
|
|
||||||
pTbData->maxSkmVer = -1;
|
|
||||||
pTbData->pHead = NULL;
|
pTbData->pHead = NULL;
|
||||||
pTbData->pTail = NULL;
|
pTbData->pTail = NULL;
|
||||||
pTbData->sl.seed = taosRand();
|
pTbData->sl.seed = taosRand();
|
||||||
|
@ -367,21 +380,23 @@ static int32_t tsdbGetOrCreateTbData(SMemTable *pMemTable, tb_uid_t suid, tb_uid
|
||||||
SL_NODE_FORWARD(pTbData->sl.pTail, iLevel) = NULL;
|
SL_NODE_FORWARD(pTbData->sl.pTail, iLevel) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *p;
|
taosWLockLatch(&pMemTable->latch);
|
||||||
if (idx < 0) {
|
|
||||||
idx = taosArrayGetSize(pMemTable->aTbData);
|
if (pMemTable->nTbData >= pMemTable->nBucket) {
|
||||||
|
code = tsdbMemTableRehash(pMemTable);
|
||||||
|
if (code) {
|
||||||
|
taosWUnLockLatch(&pMemTable->latch);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosWLockLatch(&pMemTable->latch);
|
int32_t idx = TABS(uid) % pMemTable->nBucket;
|
||||||
p = taosArrayInsert(pMemTable->aTbData, idx, &pTbData);
|
pTbData->next = pMemTable->aBucket[idx];
|
||||||
|
pMemTable->aBucket[idx] = pTbData;
|
||||||
|
pMemTable->nTbData++;
|
||||||
|
|
||||||
taosWUnLockLatch(&pMemTable->latch);
|
taosWUnLockLatch(&pMemTable->latch);
|
||||||
|
|
||||||
tsdbDebug("vgId:%d, add table data %p at idx:%d", TD_VID(pMemTable->pTsdb->pVnode), pTbData, idx);
|
|
||||||
|
|
||||||
if (p == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
_exit:
|
_exit:
|
||||||
*ppTbData = pTbData;
|
*ppTbData = pTbData;
|
||||||
return code;
|
return code;
|
||||||
|
@ -591,15 +606,9 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
|
||||||
tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb);
|
tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb);
|
||||||
}
|
}
|
||||||
|
|
||||||
pTbData->minVersion = TMIN(pTbData->minVersion, version);
|
|
||||||
pTbData->maxVersion = TMAX(pTbData->maxVersion, version);
|
|
||||||
pTbData->maxSkmVer = TMAX(pTbData->maxSkmVer, pMsgIter->sversion);
|
|
||||||
|
|
||||||
// SMemTable
|
// SMemTable
|
||||||
pMemTable->minKey = TMIN(pMemTable->minKey, pTbData->minKey);
|
pMemTable->minKey = TMIN(pMemTable->minKey, pTbData->minKey);
|
||||||
pMemTable->maxKey = TMAX(pMemTable->maxKey, pTbData->maxKey);
|
pMemTable->maxKey = TMAX(pMemTable->maxKey, pTbData->maxKey);
|
||||||
pMemTable->minVersion = TMIN(pMemTable->minVersion, pTbData->minVersion);
|
|
||||||
pMemTable->maxVersion = TMAX(pMemTable->maxVersion, pTbData->maxVersion);
|
|
||||||
pMemTable->nRow += nRow;
|
pMemTable->nRow += nRow;
|
||||||
|
|
||||||
pRsp->numOfRows = nRow;
|
pRsp->numOfRows = nRow;
|
||||||
|
@ -624,3 +633,41 @@ void tsdbUnrefMemTable(SMemTable *pMemTable) {
|
||||||
tsdbMemTableDestroy(pMemTable);
|
tsdbMemTableDestroy(pMemTable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tbDataPCmprFn(const void *p1, const void *p2) {
|
||||||
|
STbData *pTbData1 = *(STbData **)p1;
|
||||||
|
STbData *pTbData2 = *(STbData **)p2;
|
||||||
|
|
||||||
|
if (pTbData1->suid < pTbData2->suid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pTbData1->suid > pTbData2->suid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pTbData1->uid < pTbData2->uid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pTbData1->uid > pTbData2->uid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable) {
|
||||||
|
SArray *aTbDataP = taosArrayInit(pMemTable->nTbData, sizeof(STbData *));
|
||||||
|
if (aTbDataP == NULL) goto _exit;
|
||||||
|
|
||||||
|
for (int32_t iBucket = 0; iBucket < pMemTable->nBucket; iBucket++) {
|
||||||
|
STbData *pTbData = pMemTable->aBucket[iBucket];
|
||||||
|
|
||||||
|
while (pTbData) {
|
||||||
|
taosArrayPush(aTbDataP, &pTbData);
|
||||||
|
pTbData = pTbData->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArraySort(aTbDataP, tbDataPCmprFn);
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return aTbDataP;
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -27,12 +27,16 @@ struct STsdbSnapReader {
|
||||||
int32_t fid;
|
int32_t fid;
|
||||||
SDataFReader* pDataFReader;
|
SDataFReader* pDataFReader;
|
||||||
SArray* aBlockIdx; // SArray<SBlockIdx>
|
SArray* aBlockIdx; // SArray<SBlockIdx>
|
||||||
int32_t iBlockIdx;
|
SArray* aBlockL; // SArray<SBlockL>
|
||||||
SBlockIdx* pBlockIdx;
|
SBlockIdx* pBlockIdx;
|
||||||
SMapData mBlock; // SMapData<SBlock>
|
SBlockL* pBlockL;
|
||||||
int32_t iBlock;
|
|
||||||
SBlockData oBlockData;
|
int32_t iBlockIdx;
|
||||||
SBlockData nBlockData;
|
int32_t iBlockL;
|
||||||
|
SMapData mBlock; // SMapData<SBlock>
|
||||||
|
int32_t iBlock;
|
||||||
|
SBlockData oBlockData;
|
||||||
|
SBlockData nBlockData;
|
||||||
// for del file
|
// for del file
|
||||||
int8_t delDone;
|
int8_t delDone;
|
||||||
SDelFReader* pDelFReader;
|
SDelFReader* pDelFReader;
|
||||||
|
@ -47,114 +51,116 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) {
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (pReader->pDataFReader == NULL) {
|
if (pReader->pDataFReader == NULL) {
|
||||||
SDFileSet* pSet =
|
// next
|
||||||
taosArraySearch(pReader->fs.aDFileSet, &(SDFileSet){.fid = pReader->fid}, tDFileSetCmprFn, TD_GT);
|
SDFileSet dFileSet = {.fid = pReader->fid};
|
||||||
|
SDFileSet* pSet = taosArraySearch(pReader->fs.aDFileSet, &dFileSet, tDFileSetCmprFn, TD_GT);
|
||||||
if (pSet == NULL) goto _exit;
|
if (pSet == NULL) goto _exit;
|
||||||
|
|
||||||
pReader->fid = pSet->fid;
|
pReader->fid = pSet->fid;
|
||||||
code = tsdbDataFReaderOpen(&pReader->pDataFReader, pReader->pTsdb, pSet);
|
|
||||||
|
// load
|
||||||
|
code = tsdbDataFReaderOpen(&pReader->pDataFReader, pTsdb, pSet);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// SBlockIdx
|
code = tsdbReadBlockIdx(pReader->pDataFReader, pReader->aBlockIdx);
|
||||||
code = tsdbReadBlockIdx(pReader->pDataFReader, pReader->aBlockIdx, NULL);
|
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
|
code = tsdbReadBlockL(pReader->pDataFReader, pReader->aBlockL);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
// init
|
||||||
pReader->iBlockIdx = 0;
|
pReader->iBlockIdx = 0;
|
||||||
pReader->pBlockIdx = NULL;
|
if (pReader->iBlockIdx < taosArrayGetSize(pReader->aBlockIdx)) {
|
||||||
|
pReader->pBlockIdx = (SBlockIdx*)taosArrayGet(pReader->aBlockIdx, pReader->iBlockIdx);
|
||||||
|
|
||||||
|
code = tsdbReadBlock(pReader->pDataFReader, pReader->pBlockIdx, &pReader->mBlock);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
pReader->iBlock = 0;
|
||||||
|
} else {
|
||||||
|
pReader->pBlockIdx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->iBlockL = 0;
|
||||||
|
while (true) {
|
||||||
|
if (pReader->iBlockL >= taosArrayGetSize(pReader->aBlockL)) {
|
||||||
|
pReader->pBlockL = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->pBlockL = (SBlockL*)taosArrayGet(pReader->aBlockL, pReader->iBlockL);
|
||||||
|
if (pReader->pBlockL->minVer <= pReader->ever && pReader->pBlockL->maxVer >= pReader->sver) {
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->iBlockL++;
|
||||||
|
}
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, vnode snapshot tsdb open data file to read for %s, fid:%d", TD_VID(pTsdb->pVnode), pTsdb->path,
|
tsdbInfo("vgId:%d, vnode snapshot tsdb open data file to read for %s, fid:%d", TD_VID(pTsdb->pVnode), pTsdb->path,
|
||||||
pReader->fid);
|
pReader->fid);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (pReader->pBlockIdx == NULL) {
|
if (pReader->pBlockIdx && pReader->pBlockL) {
|
||||||
if (pReader->iBlockIdx >= taosArrayGetSize(pReader->aBlockIdx)) {
|
TABLEID id = {.suid = pReader->pBlockL->suid, .uid = pReader->pBlockL->minUid};
|
||||||
tsdbDataFReaderClose(&pReader->pDataFReader);
|
|
||||||
break;
|
ASSERT(0);
|
||||||
|
|
||||||
|
// if (tTABLEIDCmprFn(pReader->pBlockIdx, &minId) < 0) {
|
||||||
|
// // TODO
|
||||||
|
// } else if (tTABLEIDCmprFn(pReader->pBlockIdx, &maxId) < 0) {
|
||||||
|
// // TODO
|
||||||
|
// } else {
|
||||||
|
// // TODO
|
||||||
|
// }
|
||||||
|
} else if (pReader->pBlockIdx) {
|
||||||
|
while (pReader->iBlock < pReader->mBlock.nItem) {
|
||||||
|
SBlock block;
|
||||||
|
tMapDataGetItemByIdx(&pReader->mBlock, pReader->iBlock, &block, tGetBlock);
|
||||||
|
|
||||||
|
if (block.minVer <= pReader->ever && block.maxVer >= pReader->sver) {
|
||||||
|
// load data (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// next
|
||||||
|
pReader->iBlock++;
|
||||||
|
if (*ppData) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pReader->pBlockIdx = (SBlockIdx*)taosArrayGet(pReader->aBlockIdx, pReader->iBlockIdx);
|
|
||||||
pReader->iBlockIdx++;
|
|
||||||
|
|
||||||
code = tsdbReadBlock(pReader->pDataFReader, pReader->pBlockIdx, &pReader->mBlock, NULL);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
pReader->iBlock = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SBlock block;
|
|
||||||
SBlock* pBlock = █
|
|
||||||
while (true) {
|
|
||||||
if (pReader->iBlock >= pReader->mBlock.nItem) {
|
if (pReader->iBlock >= pReader->mBlock.nItem) {
|
||||||
pReader->pBlockIdx = NULL;
|
pReader->iBlockIdx++;
|
||||||
break;
|
if (pReader->iBlockIdx < taosArrayGetSize(pReader->aBlockIdx)) {
|
||||||
|
pReader->pBlockIdx = (SBlockIdx*)taosArrayGet(pReader->aBlockIdx, pReader->iBlockIdx);
|
||||||
|
|
||||||
|
code = tsdbReadBlock(pReader->pDataFReader, pReader->pBlockIdx, &pReader->mBlock);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
pReader->iBlock = 0;
|
||||||
|
} else {
|
||||||
|
pReader->pBlockIdx = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tMapDataGetItemByIdx(&pReader->mBlock, pReader->iBlock, pBlock, tGetBlock);
|
if (*ppData) goto _exit;
|
||||||
pReader->iBlock++;
|
} else if (pReader->pBlockL) {
|
||||||
|
while (pReader->pBlockL) {
|
||||||
|
if (pReader->pBlockL->minVer <= pReader->ever && pReader->pBlockL->maxVer >= pReader->sver) {
|
||||||
|
// load data (todo)
|
||||||
|
}
|
||||||
|
|
||||||
if (pBlock->minVersion > pReader->ever || pBlock->maxVersion < pReader->sver) continue;
|
// next
|
||||||
|
pReader->iBlockL++;
|
||||||
|
if (pReader->iBlockL < taosArrayGetSize(pReader->aBlockL)) {
|
||||||
|
pReader->pBlockL = (SBlockL*)taosArrayGetSize(pReader->aBlockL);
|
||||||
|
} else {
|
||||||
|
pReader->pBlockL = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
code = tsdbReadBlockData(pReader->pDataFReader, pReader->pBlockIdx, pBlock, &pReader->oBlockData, NULL, NULL);
|
if (*ppData) goto _exit;
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
// filter
|
|
||||||
tBlockDataReset(&pReader->nBlockData);
|
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pReader->oBlockData.aIdx); iColData++) {
|
|
||||||
SColData* pColDataO = tBlockDataGetColDataByIdx(&pReader->oBlockData, iColData);
|
|
||||||
SColData* pColDataN = NULL;
|
|
||||||
|
|
||||||
code = tBlockDataAddColData(&pReader->nBlockData, taosArrayGetSize(pReader->nBlockData.aIdx), &pColDataN);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
tColDataInit(pColDataN, pColDataO->cid, pColDataO->type, pColDataO->smaOn);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
for (int32_t iRow = 0; iRow < pReader->oBlockData.nRow; iRow++) {
|
tsdbDataFReaderClose(&pReader->pDataFReader);
|
||||||
TSDBROW row = tsdbRowFromBlockData(&pReader->oBlockData, iRow);
|
break;
|
||||||
int64_t version = TSDBROW_VERSION(&row);
|
|
||||||
|
|
||||||
tsdbTrace("vgId:%d, vnode snapshot tsdb read for %s, %" PRId64 "(%" PRId64 " , %" PRId64 ")",
|
|
||||||
TD_VID(pReader->pTsdb->pVnode), pReader->pTsdb->path, version, pReader->sver, pReader->ever);
|
|
||||||
|
|
||||||
if (version < pReader->sver || version > pReader->ever) continue;
|
|
||||||
|
|
||||||
code = tBlockDataAppendRow(&pReader->nBlockData, &row, NULL);
|
|
||||||
if (code) goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pReader->nBlockData.nRow <= 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// org data
|
|
||||||
// compress data (todo)
|
|
||||||
int32_t size = sizeof(TABLEID) + tPutBlockData(NULL, &pReader->nBlockData);
|
|
||||||
|
|
||||||
*ppData = taosMemoryMalloc(sizeof(SSnapDataHdr) + size);
|
|
||||||
if (*ppData == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
SSnapDataHdr* pHdr = (SSnapDataHdr*)(*ppData);
|
|
||||||
pHdr->type = pReader->type;
|
|
||||||
pHdr->size = size;
|
|
||||||
|
|
||||||
TABLEID* pId = (TABLEID*)(&pHdr[1]);
|
|
||||||
pId->suid = pReader->pBlockIdx->suid;
|
|
||||||
pId->uid = pReader->pBlockIdx->uid;
|
|
||||||
|
|
||||||
tPutBlockData((uint8_t*)(&pId[1]), &pReader->nBlockData);
|
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, vnode snapshot read data for %s, fid:%d suid:%" PRId64 " uid:%" PRId64
|
|
||||||
" iBlock:%d minVersion:%d maxVersion:%d nRow:%d out of %d size:%d",
|
|
||||||
TD_VID(pTsdb->pVnode), pTsdb->path, pReader->fid, pReader->pBlockIdx->suid, pReader->pBlockIdx->uid,
|
|
||||||
pReader->iBlock - 1, pBlock->minVersion, pBlock->maxVersion, pReader->nBlockData.nRow, pBlock->nRow,
|
|
||||||
size);
|
|
||||||
|
|
||||||
goto _exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,11 +185,11 @@ static int32_t tsdbSnapReadDel(STsdbSnapReader* pReader, uint8_t** ppData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// open
|
// open
|
||||||
code = tsdbDelFReaderOpen(&pReader->pDelFReader, pDelFile, pTsdb, NULL);
|
code = tsdbDelFReaderOpen(&pReader->pDelFReader, pDelFile, pTsdb);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// read index
|
// read index
|
||||||
code = tsdbReadDelIdx(pReader->pDelFReader, pReader->aDelIdx, NULL);
|
code = tsdbReadDelIdx(pReader->pDelFReader, pReader->aDelIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
pReader->iDelIdx = 0;
|
pReader->iDelIdx = 0;
|
||||||
|
@ -199,7 +205,7 @@ static int32_t tsdbSnapReadDel(STsdbSnapReader* pReader, uint8_t** ppData) {
|
||||||
|
|
||||||
pReader->iDelIdx++;
|
pReader->iDelIdx++;
|
||||||
|
|
||||||
code = tsdbReadDelData(pReader->pDelFReader, pDelIdx, pReader->aDelData, NULL);
|
code = tsdbReadDelData(pReader->pDelFReader, pDelIdx, pReader->aDelData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
@ -292,10 +298,15 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
pReader->aBlockL = taosArrayInit(0, sizeof(SBlockL));
|
||||||
|
if (pReader->aBlockL == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
pReader->mBlock = tMapDataInit();
|
pReader->mBlock = tMapDataInit();
|
||||||
code = tBlockDataInit(&pReader->oBlockData);
|
code = tBlockDataCreate(&pReader->oBlockData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
code = tBlockDataInit(&pReader->nBlockData);
|
code = tBlockDataCreate(&pReader->nBlockData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
pReader->aDelIdx = taosArrayInit(0, sizeof(SDelIdx));
|
pReader->aDelIdx = taosArrayInit(0, sizeof(SDelIdx));
|
||||||
|
@ -327,10 +338,11 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) {
|
||||||
if (pReader->pDataFReader) {
|
if (pReader->pDataFReader) {
|
||||||
tsdbDataFReaderClose(&pReader->pDataFReader);
|
tsdbDataFReaderClose(&pReader->pDataFReader);
|
||||||
}
|
}
|
||||||
|
taosArrayDestroy(pReader->aBlockL);
|
||||||
taosArrayDestroy(pReader->aBlockIdx);
|
taosArrayDestroy(pReader->aBlockIdx);
|
||||||
tMapDataClear(&pReader->mBlock);
|
tMapDataClear(&pReader->mBlock);
|
||||||
tBlockDataClear(&pReader->oBlockData, 1);
|
tBlockDataDestroy(&pReader->oBlockData, 1);
|
||||||
tBlockDataClear(&pReader->nBlockData, 1);
|
tBlockDataDestroy(&pReader->nBlockData, 1);
|
||||||
|
|
||||||
if (pReader->pDelFReader) {
|
if (pReader->pDelFReader) {
|
||||||
tsdbDelFReaderClose(&pReader->pDelFReader);
|
tsdbDelFReaderClose(&pReader->pDelFReader);
|
||||||
|
@ -405,6 +417,7 @@ struct STsdbSnapWriter {
|
||||||
int8_t cmprAlg;
|
int8_t cmprAlg;
|
||||||
int64_t commitID;
|
int64_t commitID;
|
||||||
|
|
||||||
|
uint8_t* aBuf[5];
|
||||||
// for data file
|
// for data file
|
||||||
SBlockData bData;
|
SBlockData bData;
|
||||||
|
|
||||||
|
@ -418,6 +431,9 @@ struct STsdbSnapWriter {
|
||||||
SBlockData* pBlockData;
|
SBlockData* pBlockData;
|
||||||
int32_t iRow;
|
int32_t iRow;
|
||||||
SBlockData bDataR;
|
SBlockData bDataR;
|
||||||
|
SArray* aBlockL; // SArray<SBlockL>
|
||||||
|
int32_t iBlockL;
|
||||||
|
SBlockData lDataR;
|
||||||
|
|
||||||
SDataFWriter* pDataFWriter;
|
SDataFWriter* pDataFWriter;
|
||||||
SBlockIdx* pBlockIdxW; // NULL when no committing table
|
SBlockIdx* pBlockIdxW; // NULL when no committing table
|
||||||
|
@ -427,6 +443,7 @@ struct STsdbSnapWriter {
|
||||||
|
|
||||||
SMapData mBlockW; // SMapData<SBlock>
|
SMapData mBlockW; // SMapData<SBlock>
|
||||||
SArray* aBlockIdxW; // SArray<SBlockIdx>
|
SArray* aBlockIdxW; // SArray<SBlockIdx>
|
||||||
|
SArray* aBlockLW; // SArray<SBlockL>
|
||||||
|
|
||||||
// for del file
|
// for del file
|
||||||
SDelFReader* pDelFReader;
|
SDelFReader* pDelFReader;
|
||||||
|
@ -437,25 +454,6 @@ struct STsdbSnapWriter {
|
||||||
SArray* aDelIdxW;
|
SArray* aDelIdxW;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int32_t tsdbSnapWriteAppendData(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData) {
|
|
||||||
int32_t code = 0;
|
|
||||||
int32_t iRow = 0; // todo
|
|
||||||
int32_t nRow = 0; // todo
|
|
||||||
SBlockData* pBlockData = NULL; // todo
|
|
||||||
|
|
||||||
while (iRow < nRow) {
|
|
||||||
code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pBlockData, iRow), NULL);
|
|
||||||
if (code) goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
tsdbError("vgId:%d, tsdb snapshot write append data for %s failed since %s", TD_VID(pWriter->pTsdb->pVnode),
|
|
||||||
pWriter->pTsdb->path, tstrerror(code));
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -467,20 +465,21 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
if (pWriter->pBlockData) {
|
if (pWriter->pBlockData) {
|
||||||
ASSERT(pWriter->iRow < pWriter->pBlockData->nRow);
|
ASSERT(pWriter->iRow < pWriter->pBlockData->nRow);
|
||||||
while (pWriter->iRow < pWriter->pBlockData->nRow) {
|
while (pWriter->iRow < pWriter->pBlockData->nRow) {
|
||||||
code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow), NULL);
|
code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow), NULL,
|
||||||
|
0); // todo
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (pWriter->bDataW.nRow >= pWriter->maxRow * 4 / 5) {
|
if (pWriter->bDataW.nRow >= pWriter->maxRow * 4 / 5) {
|
||||||
pWriter->blockW.last = 0;
|
// pWriter->blockW.last = 0;
|
||||||
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
// code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
||||||
&pWriter->blockW, pWriter->cmprAlg);
|
// &pWriter->blockW, pWriter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
tBlockReset(&pWriter->blockW);
|
tBlockReset(&pWriter->blockW);
|
||||||
tBlockDataClearData(&pWriter->bDataW);
|
tBlockDataClear(&pWriter->bDataW);
|
||||||
}
|
}
|
||||||
|
|
||||||
pWriter->iRow++;
|
pWriter->iRow++;
|
||||||
|
@ -489,16 +488,16 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
// write remain data if has
|
// write remain data if has
|
||||||
if (pWriter->bDataW.nRow > 0) {
|
if (pWriter->bDataW.nRow > 0) {
|
||||||
pWriter->blockW.last = 0;
|
// pWriter->blockW.last = 0;
|
||||||
if (pWriter->bDataW.nRow < pWriter->minRow) {
|
if (pWriter->bDataW.nRow < pWriter->minRow) {
|
||||||
if (pWriter->iBlock > pWriter->mBlock.nItem) {
|
if (pWriter->iBlock > pWriter->mBlock.nItem) {
|
||||||
pWriter->blockW.last = 1;
|
// pWriter->blockW.last = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
// code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
||||||
&pWriter->blockW, pWriter->cmprAlg);
|
// &pWriter->blockW, pWriter->cmprAlg);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -510,16 +509,16 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
SBlock block;
|
SBlock block;
|
||||||
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
|
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
|
||||||
|
|
||||||
if (block.last) {
|
// if (block.last) {
|
||||||
code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, &pWriter->bDataR, NULL, NULL);
|
// code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, &pWriter->bDataR, NULL, NULL);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
tBlockReset(&block);
|
// tBlockReset(&block);
|
||||||
block.last = 1;
|
// block.last = 1;
|
||||||
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataR, NULL, NULL, pWriter->pBlockIdxW, &block,
|
// code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataR, NULL, NULL, pWriter->pBlockIdxW, &block,
|
||||||
pWriter->cmprAlg);
|
// pWriter->cmprAlg);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
}
|
// }
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -528,8 +527,8 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SBlock
|
// SBlock
|
||||||
code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, NULL, pWriter->pBlockIdxW);
|
// code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, NULL, pWriter->pBlockIdxW);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
// SBlockIdx
|
// SBlockIdx
|
||||||
if (taosArrayPush(pWriter->aBlockIdxW, pWriter->pBlockIdxW) == NULL) {
|
if (taosArrayPush(pWriter->aBlockIdxW, pWriter->pBlockIdxW) == NULL) {
|
||||||
|
@ -550,7 +549,7 @@ _err:
|
||||||
static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* pBlockIdx) {
|
static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* pBlockIdx) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
code = tsdbReadBlock(pWriter->pDataFReader, pBlockIdx, &pWriter->mBlock, NULL);
|
code = tsdbReadBlock(pWriter->pDataFReader, pBlockIdx, &pWriter->mBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// SBlockData
|
// SBlockData
|
||||||
|
@ -559,16 +558,17 @@ static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* p
|
||||||
for (int32_t iBlock = 0; iBlock < pWriter->mBlock.nItem; iBlock++) {
|
for (int32_t iBlock = 0; iBlock < pWriter->mBlock.nItem; iBlock++) {
|
||||||
tMapDataGetItemByIdx(&pWriter->mBlock, iBlock, &block, tGetBlock);
|
tMapDataGetItemByIdx(&pWriter->mBlock, iBlock, &block, tGetBlock);
|
||||||
|
|
||||||
if (block.last) {
|
// if (block.last) {
|
||||||
code = tsdbReadBlockData(pWriter->pDataFReader, pBlockIdx, &block, &pWriter->bDataR, NULL, NULL);
|
// code = tsdbReadBlockData(pWriter->pDataFReader, pBlockIdx, &block, &pWriter->bDataR, NULL, NULL);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
tBlockReset(&block);
|
// tBlockReset(&block);
|
||||||
block.last = 1;
|
// block.last = 1;
|
||||||
code =
|
// code =
|
||||||
tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataR, NULL, NULL, pBlockIdx, &block, pWriter->cmprAlg);
|
// tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataR, NULL, NULL, pBlockIdx, &block,
|
||||||
if (code) goto _err;
|
// pWriter->cmprAlg);
|
||||||
}
|
// if (code) goto _err;
|
||||||
|
// }
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -576,7 +576,7 @@ static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* p
|
||||||
|
|
||||||
// SBlock
|
// SBlock
|
||||||
SBlockIdx blockIdx = {.suid = pBlockIdx->suid, .uid = pBlockIdx->uid};
|
SBlockIdx blockIdx = {.suid = pBlockIdx->suid, .uid = pBlockIdx->uid};
|
||||||
code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, NULL, &blockIdx);
|
code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, &blockIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// SBlockIdx
|
// SBlockIdx
|
||||||
|
@ -601,9 +601,9 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
TSDBROW row;
|
TSDBROW row;
|
||||||
TSDBROW* pRow = &row;
|
TSDBROW* pRow = &row;
|
||||||
|
|
||||||
// correct schema
|
// // correct schema
|
||||||
code = tBlockDataCorrectSchema(&pWriter->bDataW, pBlockData);
|
// code = tBlockDataCorrectSchema(&pWriter->bDataW, pBlockData);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
// loop to merge
|
// loop to merge
|
||||||
*pRow = tsdbRowFromBlockData(pBlockData, iRow);
|
*pRow = tsdbRowFromBlockData(pBlockData, iRow);
|
||||||
|
@ -618,8 +618,8 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
ASSERT(c);
|
ASSERT(c);
|
||||||
|
|
||||||
if (c < 0) {
|
if (c < 0) {
|
||||||
code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
|
// code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
iRow++;
|
iRow++;
|
||||||
if (iRow < pWriter->pBlockData->nRow) {
|
if (iRow < pWriter->pBlockData->nRow) {
|
||||||
|
@ -628,8 +628,8 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
pRow = NULL;
|
pRow = NULL;
|
||||||
}
|
}
|
||||||
} else if (c > 0) {
|
} else if (c > 0) {
|
||||||
code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow), NULL);
|
// code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow),
|
||||||
if (code) goto _err;
|
// NULL); if (code) goto _err;
|
||||||
|
|
||||||
pWriter->iRow++;
|
pWriter->iRow++;
|
||||||
if (pWriter->iRow >= pWriter->pBlockData->nRow) {
|
if (pWriter->iRow >= pWriter->pBlockData->nRow) {
|
||||||
|
@ -647,16 +647,15 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
|
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
|
||||||
|
|
||||||
if (block.last) {
|
// if (block.last) {
|
||||||
pWriter->pBlockData = &pWriter->bDataR;
|
// pWriter->pBlockData = &pWriter->bDataR;
|
||||||
|
|
||||||
code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL, NULL);
|
// code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL,
|
||||||
if (code) goto _err;
|
// NULL); if (code) goto _err; pWriter->iRow = 0;
|
||||||
pWriter->iRow = 0;
|
|
||||||
|
|
||||||
pWriter->iBlock++;
|
// pWriter->iBlock++;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
c = tsdbKeyCmprFn(&block.maxKey, &key);
|
c = tsdbKeyCmprFn(&block.maxKey, &key);
|
||||||
|
|
||||||
|
@ -664,16 +663,16 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
if (c < 0) {
|
if (c < 0) {
|
||||||
if (pWriter->bDataW.nRow) {
|
if (pWriter->bDataW.nRow) {
|
||||||
pWriter->blockW.last = 0;
|
// pWriter->blockW.last = 0;
|
||||||
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
// code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
||||||
&pWriter->blockW, pWriter->cmprAlg);
|
// &pWriter->blockW, pWriter->cmprAlg);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
tBlockReset(&pWriter->blockW);
|
tBlockReset(&pWriter->blockW);
|
||||||
tBlockDataClearData(&pWriter->bDataW);
|
tBlockDataClear(&pWriter->bDataW);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
|
||||||
|
@ -687,9 +686,10 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
if (c > 0) {
|
if (c > 0) {
|
||||||
pWriter->pBlockData = &pWriter->bDataR;
|
pWriter->pBlockData = &pWriter->bDataR;
|
||||||
code =
|
// code =
|
||||||
tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL, NULL);
|
// tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL,
|
||||||
if (code) goto _err;
|
// NULL);
|
||||||
|
// if (code) goto _err;
|
||||||
pWriter->iRow = 0;
|
pWriter->iRow = 0;
|
||||||
|
|
||||||
pWriter->iBlock++;
|
pWriter->iBlock++;
|
||||||
|
@ -700,8 +700,8 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
if (pWriter->pBlockData) continue;
|
if (pWriter->pBlockData) continue;
|
||||||
|
|
||||||
code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
|
// code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
iRow++;
|
iRow++;
|
||||||
if (iRow < pBlockData->nRow) {
|
if (iRow < pBlockData->nRow) {
|
||||||
|
@ -715,15 +715,15 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) {
|
||||||
if (pWriter->bDataW.nRow < pWriter->maxRow * 4 / 5) continue;
|
if (pWriter->bDataW.nRow < pWriter->maxRow * 4 / 5) continue;
|
||||||
|
|
||||||
_write_block:
|
_write_block:
|
||||||
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
// code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
|
||||||
&pWriter->blockW, pWriter->cmprAlg);
|
// &pWriter->blockW, pWriter->cmprAlg);
|
||||||
if (code) goto _err;
|
// if (code) goto _err;
|
||||||
|
|
||||||
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
tBlockReset(&pWriter->blockW);
|
tBlockReset(&pWriter->blockW);
|
||||||
tBlockDataClearData(&pWriter->bDataW);
|
tBlockDataClear(&pWriter->bDataW);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -789,7 +789,7 @@ static int32_t tsdbSnapWriteTableData(STsdbSnapWriter* pWriter, TABLEID id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWriter->pBlockIdx) {
|
if (pWriter->pBlockIdx) {
|
||||||
code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlock, NULL);
|
code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} else {
|
} else {
|
||||||
tMapDataReset(&pWriter->mBlock);
|
tMapDataReset(&pWriter->mBlock);
|
||||||
|
@ -831,9 +831,11 @@ static int32_t tsdbSnapWriteDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
|
|
||||||
if (pWriter->pDataFWriter == NULL) goto _exit;
|
if (pWriter->pDataFWriter == NULL) goto _exit;
|
||||||
|
|
||||||
|
// finish current table
|
||||||
code = tsdbSnapWriteTableDataEnd(pWriter);
|
code = tsdbSnapWriteTableDataEnd(pWriter);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
|
// move remain table
|
||||||
while (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) {
|
while (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) {
|
||||||
code = tsdbSnapMoveWriteTableData(pWriter, (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx));
|
code = tsdbSnapMoveWriteTableData(pWriter, (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx));
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -841,8 +843,16 @@ static int32_t tsdbSnapWriteDataEnd(STsdbSnapWriter* pWriter) {
|
||||||
pWriter->iBlockIdx++;
|
pWriter->iBlockIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbWriteBlockIdx(pWriter->pDataFWriter, pWriter->aBlockIdxW, NULL);
|
// write remain stuff
|
||||||
if (code) goto _err;
|
if (taosArrayGetSize(pWriter->aBlockLW) > 0) {
|
||||||
|
code = tsdbWriteBlockL(pWriter->pDataFWriter, pWriter->aBlockIdxW);
|
||||||
|
if (code) goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosArrayGetSize(pWriter->aBlockIdx) > 0) {
|
||||||
|
code = tsdbWriteBlockIdx(pWriter->pDataFWriter, pWriter->aBlockIdxW);
|
||||||
|
if (code) goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
code = tsdbFSUpsertFSet(&pWriter->fs, &pWriter->pDataFWriter->wSet);
|
code = tsdbFSUpsertFSet(&pWriter->fs, &pWriter->pDataFWriter->wSet);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -866,19 +876,22 @@ _err:
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData) {
|
static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STsdb* pTsdb = pWriter->pTsdb;
|
STsdb* pTsdb = pWriter->pTsdb;
|
||||||
TABLEID id = *(TABLEID*)(pData + sizeof(SSnapDataHdr));
|
SSnapDataHdr* pHdr = (SSnapDataHdr*)pData;
|
||||||
int64_t n;
|
TABLEID id = *(TABLEID*)(pData + sizeof(SSnapDataHdr));
|
||||||
|
int64_t n;
|
||||||
|
|
||||||
// decode
|
// decode
|
||||||
SBlockData* pBlockData = &pWriter->bData;
|
SBlockData* pBlockData = &pWriter->bData;
|
||||||
n = tGetBlockData(pData + sizeof(SSnapDataHdr) + sizeof(TABLEID), pBlockData);
|
code = tDecmprBlockData(pData + sizeof(SSnapDataHdr) + sizeof(TABLEID), pHdr->size - sizeof(TABLEID), pBlockData,
|
||||||
ASSERT(n + sizeof(SSnapDataHdr) + sizeof(TABLEID) == nData);
|
pWriter->aBuf);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
TSDBKEY keyFirst = tBlockDataFirstKey(pBlockData);
|
TSDBKEY keyFirst = {.version = pBlockData->aVersion[0], .ts = pBlockData->aTSKEY[0]};
|
||||||
TSDBKEY keyLast = tBlockDataLastKey(pBlockData);
|
TSDBKEY keyLast = {.version = pBlockData->aVersion[pBlockData->nRow - 1],
|
||||||
|
.ts = pBlockData->aTSKEY[pBlockData->nRow - 1]};
|
||||||
|
|
||||||
int32_t fid = tsdbKeyFid(keyFirst.ts, pWriter->minutes, pWriter->precision);
|
int32_t fid = tsdbKeyFid(keyFirst.ts, pWriter->minutes, pWriter->precision);
|
||||||
ASSERT(fid == tsdbKeyFid(keyLast.ts, pWriter->minutes, pWriter->precision));
|
ASSERT(fid == tsdbKeyFid(keyLast.ts, pWriter->minutes, pWriter->precision));
|
||||||
|
@ -895,11 +908,15 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
|
||||||
code = tsdbDataFReaderOpen(&pWriter->pDataFReader, pTsdb, pSet);
|
code = tsdbDataFReaderOpen(&pWriter->pDataFReader, pTsdb, pSet);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = tsdbReadBlockIdx(pWriter->pDataFReader, pWriter->aBlockIdx, NULL);
|
code = tsdbReadBlockIdx(pWriter->pDataFReader, pWriter->aBlockIdx);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
code = tsdbReadBlockL(pWriter->pDataFReader, pWriter->aBlockL);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(pWriter->pDataFReader == NULL);
|
ASSERT(pWriter->pDataFReader == NULL);
|
||||||
taosArrayClear(pWriter->aBlockIdx);
|
taosArrayClear(pWriter->aBlockIdx);
|
||||||
|
taosArrayClear(pWriter->aBlockL);
|
||||||
}
|
}
|
||||||
pWriter->iBlockIdx = 0;
|
pWriter->iBlockIdx = 0;
|
||||||
pWriter->pBlockIdx = NULL;
|
pWriter->pBlockIdx = NULL;
|
||||||
|
@ -907,7 +924,9 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
|
||||||
pWriter->iBlock = 0;
|
pWriter->iBlock = 0;
|
||||||
pWriter->pBlockData = NULL;
|
pWriter->pBlockData = NULL;
|
||||||
pWriter->iRow = 0;
|
pWriter->iRow = 0;
|
||||||
|
pWriter->iBlockL = 0;
|
||||||
tBlockDataReset(&pWriter->bDataR);
|
tBlockDataReset(&pWriter->bDataR);
|
||||||
|
tBlockDataReset(&pWriter->lDataR);
|
||||||
|
|
||||||
// write
|
// write
|
||||||
SHeadFile fHead;
|
SHeadFile fHead;
|
||||||
|
@ -928,7 +947,7 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
|
||||||
wSet.fid = fid;
|
wSet.fid = fid;
|
||||||
fHead = (SHeadFile){.commitID = pWriter->commitID, .offset = 0, .size = 0};
|
fHead = (SHeadFile){.commitID = pWriter->commitID, .offset = 0, .size = 0};
|
||||||
fData = (SDataFile){.commitID = pWriter->commitID, .size = 0};
|
fData = (SDataFile){.commitID = pWriter->commitID, .size = 0};
|
||||||
fLast = (SLastFile){.commitID = pWriter->commitID, .size = 0};
|
fLast = (SLastFile){.commitID = pWriter->commitID, .size = 0, .offset = 0};
|
||||||
fSma = (SSmaFile){.commitID = pWriter->commitID, .size = 0};
|
fSma = (SSmaFile){.commitID = pWriter->commitID, .size = 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,6 +955,7 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
taosArrayClear(pWriter->aBlockIdxW);
|
taosArrayClear(pWriter->aBlockIdxW);
|
||||||
|
taosArrayClear(pWriter->aBlockLW);
|
||||||
tMapDataReset(&pWriter->mBlockW);
|
tMapDataReset(&pWriter->mBlockW);
|
||||||
pWriter->pBlockIdxW = NULL;
|
pWriter->pBlockIdxW = NULL;
|
||||||
tBlockDataReset(&pWriter->bDataW);
|
tBlockDataReset(&pWriter->bDataW);
|
||||||
|
@ -963,10 +983,10 @@ static int32_t tsdbSnapWriteDel(STsdbSnapWriter* pWriter, uint8_t* pData, uint32
|
||||||
|
|
||||||
// reader
|
// reader
|
||||||
if (pDelFile) {
|
if (pDelFile) {
|
||||||
code = tsdbDelFReaderOpen(&pWriter->pDelFReader, pDelFile, pTsdb, NULL);
|
code = tsdbDelFReaderOpen(&pWriter->pDelFReader, pDelFile, pTsdb);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = tsdbReadDelIdx(pWriter->pDelFReader, pWriter->aDelIdxR, NULL);
|
code = tsdbReadDelIdx(pWriter->pDelFReader, pWriter->aDelIdxR);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,52 +1000,16 @@ static int32_t tsdbSnapWriteDel(STsdbSnapWriter* pWriter, uint8_t* pData, uint32
|
||||||
TABLEID id = *(TABLEID*)(pData + sizeof(SSnapDataHdr));
|
TABLEID id = *(TABLEID*)(pData + sizeof(SSnapDataHdr));
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SDelIdx* pDelIdx = NULL;
|
if (pWriter->iDelIdx >= taosArrayGetSize(pWriter->aDelIdxR)) break;
|
||||||
int64_t n = sizeof(SSnapDataHdr) + sizeof(TABLEID);
|
if (tTABLEIDCmprFn(taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx), &id) >= 0) break;
|
||||||
SDelData delData;
|
|
||||||
SDelIdx delIdx;
|
|
||||||
int8_t toBreak = 0;
|
|
||||||
|
|
||||||
if (pWriter->iDelIdx < taosArrayGetSize(pWriter->aDelIdxR)) {
|
SDelIdx* pDelIdx = (SDelIdx*)taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx);
|
||||||
pDelIdx = (SDelIdx*)taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pDelIdx) {
|
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData);
|
||||||
int32_t c = tTABLEIDCmprFn(&id, pDelIdx);
|
if (code) goto _err;
|
||||||
if (c < 0) {
|
|
||||||
goto _new_del;
|
|
||||||
} else {
|
|
||||||
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, NULL);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
pWriter->iDelIdx++;
|
SDelIdx delIdx = *pDelIdx;
|
||||||
if (c == 0) {
|
code = tsdbWriteDelData(pWriter->pDelFWriter, pWriter->aDelData, &delIdx);
|
||||||
toBreak = 1;
|
|
||||||
delIdx = (SDelIdx){.suid = id.suid, .uid = id.uid};
|
|
||||||
goto _merge_del;
|
|
||||||
} else {
|
|
||||||
delIdx = (SDelIdx){.suid = pDelIdx->suid, .uid = pDelIdx->uid};
|
|
||||||
goto _write_del;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_new_del:
|
|
||||||
toBreak = 1;
|
|
||||||
delIdx = (SDelIdx){.suid = id.suid, .uid = id.uid};
|
|
||||||
taosArrayClear(pWriter->aDelData);
|
|
||||||
|
|
||||||
_merge_del:
|
|
||||||
while (n < nData) {
|
|
||||||
n += tGetDelData(pData + n, &delData);
|
|
||||||
if (taosArrayPush(pWriter->aDelData, &delData) == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_write_del:
|
|
||||||
code = tsdbWriteDelData(pWriter->pDelFWriter, pWriter->aDelData, NULL, &delIdx);
|
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (taosArrayPush(pWriter->aDelIdxW, &delIdx) == NULL) {
|
if (taosArrayPush(pWriter->aDelIdxW, &delIdx) == NULL) {
|
||||||
|
@ -1033,7 +1017,40 @@ static int32_t tsdbSnapWriteDel(STsdbSnapWriter* pWriter, uint8_t* pData, uint32
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toBreak) break;
|
pWriter->iDelIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pWriter->iDelIdx < taosArrayGetSize(pWriter->aDelIdxR) &&
|
||||||
|
tTABLEIDCmprFn(taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx), &id) == 0) {
|
||||||
|
SDelIdx* pDelIdx = (SDelIdx*)taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx);
|
||||||
|
|
||||||
|
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
pWriter->iDelIdx++;
|
||||||
|
} else {
|
||||||
|
taosArrayClear(pWriter->aDelData);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t n = sizeof(SSnapDataHdr) + sizeof(TABLEID);
|
||||||
|
while (n < nData) {
|
||||||
|
SDelData delData;
|
||||||
|
|
||||||
|
n += tGetDelData(pData + n, &delData);
|
||||||
|
|
||||||
|
if (taosArrayPush(pWriter->aDelData, &delData) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDelIdx delIdx = {.suid = id.suid, .uid = id.uid};
|
||||||
|
code = tsdbWriteDelData(pWriter->pDelFWriter, pWriter->aDelData, &delIdx);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
if (taosArrayPush(pWriter->aDelIdxW, &delIdx) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
|
@ -1054,11 +1071,11 @@ static int32_t tsdbSnapWriteDelEnd(STsdbSnapWriter* pWriter) {
|
||||||
for (; pWriter->iDelIdx < taosArrayGetSize(pWriter->aDelIdxR); pWriter->iDelIdx++) {
|
for (; pWriter->iDelIdx < taosArrayGetSize(pWriter->aDelIdxR); pWriter->iDelIdx++) {
|
||||||
SDelIdx* pDelIdx = (SDelIdx*)taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx);
|
SDelIdx* pDelIdx = (SDelIdx*)taosArrayGet(pWriter->aDelIdxR, pWriter->iDelIdx);
|
||||||
|
|
||||||
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, NULL);
|
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
SDelIdx delIdx = (SDelIdx){.suid = pDelIdx->suid, .uid = pDelIdx->uid};
|
SDelIdx delIdx = *pDelIdx;
|
||||||
code = tsdbWriteDelData(pWriter->pDelFWriter, pWriter->aDelData, NULL, &delIdx);
|
code = tsdbWriteDelData(pWriter->pDelFWriter, pWriter->aDelData, &delIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (taosArrayPush(pWriter->aDelIdxR, &delIdx) == NULL) {
|
if (taosArrayPush(pWriter->aDelIdxR, &delIdx) == NULL) {
|
||||||
|
@ -1117,7 +1134,7 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
|
||||||
pWriter->commitID = pTsdb->pVnode->state.commitID;
|
pWriter->commitID = pTsdb->pVnode->state.commitID;
|
||||||
|
|
||||||
// for data file
|
// for data file
|
||||||
code = tBlockDataInit(&pWriter->bData);
|
code = tBlockDataCreate(&pWriter->bData);
|
||||||
|
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
pWriter->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
pWriter->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
|
@ -1125,17 +1142,29 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
code = tBlockDataInit(&pWriter->bDataR);
|
code = tBlockDataCreate(&pWriter->bDataR);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
|
pWriter->aBlockL = taosArrayInit(0, sizeof(SBlockL));
|
||||||
|
if (pWriter->aBlockL == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
pWriter->aBlockIdxW = taosArrayInit(0, sizeof(SBlockIdx));
|
pWriter->aBlockIdxW = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
if (pWriter->aBlockIdxW == NULL) {
|
if (pWriter->aBlockIdxW == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
code = tBlockDataInit(&pWriter->bDataW);
|
code = tBlockDataCreate(&pWriter->bDataW);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
|
pWriter->aBlockLW = taosArrayInit(0, sizeof(SBlockL));
|
||||||
|
if (pWriter->aBlockLW == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
// for del file
|
// for del file
|
||||||
pWriter->aDelIdxR = taosArrayInit(0, sizeof(SDelIdx));
|
pWriter->aDelIdxR = taosArrayInit(0, sizeof(SDelIdx));
|
||||||
if (pWriter->aDelIdxR == NULL) {
|
if (pWriter->aDelIdxR == NULL) {
|
||||||
|
@ -1186,6 +1215,10 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int32_t iBuf = 0; iBuf < sizeof(pWriter->aBuf) / sizeof(uint8_t*); iBuf++) {
|
||||||
|
tFree(pWriter->aBuf[iBuf]);
|
||||||
|
}
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, vnode snapshot tsdb writer close for %s", TD_VID(pWriter->pTsdb->pVnode), pWriter->pTsdb->path);
|
tsdbInfo("vgId:%d, vnode snapshot tsdb writer close for %s", TD_VID(pWriter->pTsdb->pVnode), pWriter->pTsdb->path);
|
||||||
taosMemoryFree(pWriter);
|
taosMemoryFree(pWriter);
|
||||||
*ppWriter = NULL;
|
*ppWriter = NULL;
|
||||||
|
@ -1224,6 +1257,7 @@ int32_t tsdbSnapWrite(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData)
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
tsdbDebug("vgId:%d, tsdb snapshot write for %s succeed", TD_VID(pWriter->pTsdb->pVnode), pWriter->pTsdb->path);
|
tsdbDebug("vgId:%d, tsdb snapshot write for %s succeed", TD_VID(pWriter->pTsdb->pVnode), pWriter->pTsdb->path);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -76,6 +76,12 @@ static UNUSED_FUNC void* u_realloc(void* p, size_t __size) {
|
||||||
#define realloc u_realloc
|
#define realloc u_realloc
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define T_LONG_JMP(_obj, _c) \
|
||||||
|
do { \
|
||||||
|
assert((_c) != -1); \
|
||||||
|
longjmp((_obj), (_c)); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
#define CLEAR_QUERY_STATUS(q, st) ((q)->status &= (~(st)))
|
#define CLEAR_QUERY_STATUS(q, st) ((q)->status &= (~(st)))
|
||||||
#define QUERY_IS_INTERVAL_QUERY(_q) ((_q)->interval.interval > 0)
|
#define QUERY_IS_INTERVAL_QUERY(_q) ((_q)->interval.interval > 0)
|
||||||
|
|
||||||
|
|
|
@ -5574,6 +5574,7 @@ int32_t twaFunction(SqlFunctionCtx* pCtx) {
|
||||||
if (pCtx->end.key != INT64_MIN) {
|
if (pCtx->end.key != INT64_MIN) {
|
||||||
pInfo->dOutput += twa_get_area(pInfo->p, pCtx->end);
|
pInfo->dOutput += twa_get_area(pInfo->p, pCtx->end);
|
||||||
pInfo->p = pCtx->end;
|
pInfo->p = pCtx->end;
|
||||||
|
numOfElems += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->win.ekey = pInfo->p.key;
|
pInfo->win.ekey = pInfo->p.key;
|
||||||
|
|
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
typedef int32_t (*tRBTreeCmprFn)(void *, void *);
|
||||||
|
|
||||||
|
typedef struct SRBTree SRBTree;
|
||||||
|
typedef struct SRBTreeNode SRBTreeNode;
|
||||||
|
typedef struct SRBTreeIter SRBTreeIter;
|
||||||
|
|
||||||
|
struct SRBTreeNode {
|
||||||
|
enum { RED, BLACK } color;
|
||||||
|
SRBTreeNode *parent;
|
||||||
|
SRBTreeNode *left;
|
||||||
|
SRBTreeNode *right;
|
||||||
|
uint8_t payload[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SRBTree {
|
||||||
|
tRBTreeCmprFn cmprFn;
|
||||||
|
SRBTreeNode *root;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SRBTreeIter {
|
||||||
|
SRBTree *pTree;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
|
||||||
|
|
||||||
|
// APIs ================================================
|
||||||
|
static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
|
SRBTreeNode *right = pNode->right;
|
||||||
|
|
||||||
|
pNode->right = right->left;
|
||||||
|
if (pNode->right) {
|
||||||
|
pNode->right->parent = pNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
right->parent = pNode->parent;
|
||||||
|
if (pNode->parent == NULL) {
|
||||||
|
pTree->root = right;
|
||||||
|
} else if (pNode == pNode->parent->left) {
|
||||||
|
pNode->parent->left = right;
|
||||||
|
} else {
|
||||||
|
pNode->parent->right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
right->left = pNode;
|
||||||
|
pNode->parent = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
|
SRBTreeNode *left = pNode->left;
|
||||||
|
|
||||||
|
pNode->left = left->right;
|
||||||
|
if (pNode->left) {
|
||||||
|
pNode->left->parent = pNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
left->parent = pNode->parent;
|
||||||
|
if (pNode->parent == NULL) {
|
||||||
|
pTree->root = left;
|
||||||
|
} else if (pNode == pNode->parent->left) {
|
||||||
|
pNode->parent->left = left;
|
||||||
|
} else {
|
||||||
|
pNode->parent->right = left;
|
||||||
|
}
|
||||||
|
|
||||||
|
left->right = pNode;
|
||||||
|
pNode->parent = left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define tRBTreeCreate(compare) \
|
||||||
|
(SRBTree) { .cmprFn = (compare), .root = NULL }
|
||||||
|
|
||||||
|
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
|
||||||
|
pNew->left = NULL;
|
||||||
|
pNew->right = NULL;
|
||||||
|
pNew->color = RED;
|
||||||
|
|
||||||
|
// insert
|
||||||
|
if (pTree->root == NULL) {
|
||||||
|
pNew->parent = NULL;
|
||||||
|
pTree->root = pNew;
|
||||||
|
} else {
|
||||||
|
SRBTreeNode *pNode = pTree->root;
|
||||||
|
while (true) {
|
||||||
|
ASSERT(pNode);
|
||||||
|
|
||||||
|
int32_t c = pTree->cmprFn(pNew->payload, pNode->payload);
|
||||||
|
if (c < 0) {
|
||||||
|
if (pNode->left) {
|
||||||
|
pNode = pNode->left;
|
||||||
|
} else {
|
||||||
|
pNew->parent = pNode;
|
||||||
|
pNode->left = pNew;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (c > 0) {
|
||||||
|
if (pNode->right) {
|
||||||
|
pNode = pNode->right;
|
||||||
|
} else {
|
||||||
|
pNew->parent = pNode;
|
||||||
|
pNode->right = pNew;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fix
|
||||||
|
SRBTreeNode *pNode = pNew;
|
||||||
|
while (pNode->parent && pNode->parent->color == RED) {
|
||||||
|
SRBTreeNode *p = pNode->parent;
|
||||||
|
SRBTreeNode *g = p->parent;
|
||||||
|
|
||||||
|
if (p == g->left) {
|
||||||
|
SRBTreeNode *u = g->right;
|
||||||
|
|
||||||
|
if (RBTREE_NODE_COLOR(u) == RED) {
|
||||||
|
p->color = BLACK;
|
||||||
|
u->color = BLACK;
|
||||||
|
g->color = RED;
|
||||||
|
pNode = g;
|
||||||
|
} else {
|
||||||
|
if (pNode == p->right) {
|
||||||
|
pNode = p;
|
||||||
|
tRBTreeRotateLeft(pTree, pNode);
|
||||||
|
}
|
||||||
|
pNode->parent->color = BLACK;
|
||||||
|
pNode->parent->parent->color = RED;
|
||||||
|
tRBTreeRotateRight(pTree, pNode->parent->parent);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SRBTreeNode *u = g->left;
|
||||||
|
|
||||||
|
if (RBTREE_NODE_COLOR(u) == RED) {
|
||||||
|
p->color = BLACK;
|
||||||
|
u->color = BLACK;
|
||||||
|
g->color = RED;
|
||||||
|
} else {
|
||||||
|
if (pNode == p->left) {
|
||||||
|
pNode = p;
|
||||||
|
tRBTreeRotateRight(pTree, pNode);
|
||||||
|
}
|
||||||
|
pNode->parent->color = BLACK;
|
||||||
|
pNode->parent->parent->color = RED;
|
||||||
|
tRBTreeRotateLeft(pTree, pNode->parent->parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pTree->root->color = BLACK;
|
||||||
|
return pNew;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
|
||||||
|
SRBTreeNode *pNode = pTree->root;
|
||||||
|
|
||||||
|
while (pNode) {
|
||||||
|
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
||||||
|
|
||||||
|
if (c < 0) {
|
||||||
|
pNode = pNode->left;
|
||||||
|
} else if (c > 0) {
|
||||||
|
pNode = pNode->right;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNode) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
return pNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) {
|
||||||
|
SRBTreeNode *pNode = pTree->root;
|
||||||
|
|
||||||
|
while (pNode) {
|
||||||
|
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
||||||
|
|
||||||
|
if (c < 0) {
|
||||||
|
pNode = pNode->left;
|
||||||
|
} else if (c > 0) {
|
||||||
|
pNode = pNode->right;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pNode;
|
||||||
|
}
|
|
@ -70,6 +70,7 @@ if $data00 != @15-08-18 00:00:00.000@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 2.068333156 then
|
if $data01 != 2.068333156 then
|
||||||
|
print expect 2.068333156, actual: $data01
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 2.063999891 then
|
if $data02 != 2.063999891 then
|
||||||
|
@ -128,6 +129,7 @@ if $data03 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 2.077099980 then
|
if $data11 != 2.077099980 then
|
||||||
|
print expect 2.077099980, actual: $data11
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data12 != 2.077000022 then
|
if $data12 != 2.077000022 then
|
||||||
|
|
Loading…
Reference in New Issue