Merge pull request #21070 from taosdata/fix/liaohj_main
enh(query): opt last row read performance. TD-23313
This commit is contained in:
commit
8d0a4772a5
|
@ -1664,11 +1664,7 @@ static int32_t doTmqPollImpl(tmq_t* pTmq, SMqClientTopic* pTopic, SMqClientVg* p
|
||||||
return handleErrorBeforePoll(pVg, pTmq);
|
return handleErrorBeforePoll(pVg, pTmq);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInfo->msgInfo = (SDataBuf){
|
sendInfo->msgInfo = (SDataBuf){ .pData = msg, .len = msgSize, .handle = NULL };
|
||||||
.pData = msg,
|
|
||||||
.len = msgSize,
|
|
||||||
.handle = NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
sendInfo->requestId = req.reqId;
|
sendInfo->requestId = req.reqId;
|
||||||
sendInfo->requestObjRefId = 0;
|
sendInfo->requestObjRefId = 0;
|
||||||
|
|
|
@ -124,11 +124,7 @@ static void mndCalMqRebalance(SMnode *pMnode) {
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildTimerMsg(&contLen);
|
void *pReq = mndBuildTimerMsg(&contLen);
|
||||||
if (pReq != NULL) {
|
if (pReq != NULL) {
|
||||||
SRpcMsg rpcMsg = {
|
SRpcMsg rpcMsg = { .msgType = TDMT_MND_TMQ_TIMER, .pCont = pReq, .contLen = contLen };
|
||||||
.msgType = TDMT_MND_TMQ_TIMER,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
};
|
|
||||||
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,6 @@ int32_t metaTbCursorPrev(SMTbCursor *pTbCur, ETableType jumpTableType);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// tsdb
|
// tsdb
|
||||||
// typedef struct STsdb STsdb;
|
|
||||||
typedef struct STsdbReader STsdbReader;
|
typedef struct STsdbReader STsdbReader;
|
||||||
|
|
||||||
#define TSDB_DEFAULT_STT_FILE 8
|
#define TSDB_DEFAULT_STT_FILE 8
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#ifndef _TD_VNODE_TSDB_H_
|
#ifndef _TD_VNODE_TSDB_H_
|
||||||
#define _TD_VNODE_TSDB_H_
|
#define _TD_VNODE_TSDB_H_
|
||||||
|
|
||||||
|
#include "tsimplehash.h"
|
||||||
#include "vnodeInt.h"
|
#include "vnodeInt.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -125,11 +126,13 @@ SColVal *tsdbRowIterNext(STSDBRowIter *pIter);
|
||||||
// SRowMerger
|
// SRowMerger
|
||||||
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema);
|
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema);
|
||||||
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
||||||
|
|
||||||
// int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
|
||||||
void tsdbRowMergerClear(SRowMerger *pMerger);
|
void tsdbRowMergerClear(SRowMerger *pMerger);
|
||||||
// int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow);
|
|
||||||
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow);
|
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow);
|
||||||
|
|
||||||
|
int32_t tsdbRowMergerInit_rv(SRowMerger* pMerger, STSchema *pSchema);
|
||||||
|
void tsdbRowMergerClear_rv(SRowMerger* pMerger);
|
||||||
|
void tsdbRowMergerCleanup_rv(SRowMerger* pMerger);
|
||||||
|
|
||||||
// TABLEID
|
// TABLEID
|
||||||
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
|
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
|
||||||
// TSDBKEY
|
// TSDBKEY
|
||||||
|
@ -224,7 +227,7 @@ int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward,
|
||||||
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
||||||
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
||||||
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
||||||
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj *pTableMap, int64_t *rowsNum);
|
void tsdbMemTableCountRows(SMemTable *pMemTable, SSHashObj *pTableMap, int64_t *rowsNum);
|
||||||
|
|
||||||
// STbData
|
// STbData
|
||||||
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
||||||
|
@ -706,7 +709,6 @@ typedef struct SSttBlockLoadInfo {
|
||||||
typedef struct SMergeTree {
|
typedef struct SMergeTree {
|
||||||
int8_t backward;
|
int8_t backward;
|
||||||
SRBTree rbt;
|
SRBTree rbt;
|
||||||
SArray *pIterList;
|
|
||||||
SLDataIter *pIter;
|
SLDataIter *pIter;
|
||||||
bool destroyLoadInfo;
|
bool destroyLoadInfo;
|
||||||
SSttBlockLoadInfo *pLoadInfo;
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
|
@ -752,13 +754,29 @@ struct SDiskDataBuilder {
|
||||||
SBlkInfo bi;
|
SBlkInfo bi;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct SLDataIter {
|
||||||
|
SRBTreeNode node;
|
||||||
|
SSttBlk *pSttBlk;
|
||||||
|
SDataFReader *pReader;
|
||||||
|
int32_t iStt;
|
||||||
|
int8_t backward;
|
||||||
|
int32_t iSttBlk;
|
||||||
|
int32_t iRow;
|
||||||
|
SRowInfo rInfo;
|
||||||
|
uint64_t uid;
|
||||||
|
STimeWindow timeWindow;
|
||||||
|
SVersionRange verRange;
|
||||||
|
SSttBlockLoadInfo *pBlockLoadInfo;
|
||||||
|
bool ignoreEarlierTs;
|
||||||
|
} SLDataIter;
|
||||||
|
|
||||||
|
#define tMergeTreeGetRow(_t) (&((_t)->pIter->rInfo.row))
|
||||||
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
||||||
STimeWindow *pTimeWindow, SVersionRange *pVerRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
STimeWindow *pTimeWindow, SVersionRange *pVerRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
||||||
bool destroyLoadInfo, const char *idStr, bool strictTimeRange);
|
bool destroyLoadInfo, const char *idStr, bool strictTimeRange, SLDataIter* pLDataIter);
|
||||||
void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter);
|
void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter);
|
||||||
bool tMergeTreeNext(SMergeTree *pMTree);
|
bool tMergeTreeNext(SMergeTree *pMTree);
|
||||||
bool tMergeTreeIgnoreEarlierTs(SMergeTree *pMTree);
|
bool tMergeTreeIgnoreEarlierTs(SMergeTree *pMTree);
|
||||||
TSDBROW tMergeTreeGetRow(SMergeTree *pMTree);
|
|
||||||
void tMergeTreeClose(SMergeTree *pMTree);
|
void tMergeTreeClose(SMergeTree *pMTree);
|
||||||
|
|
||||||
SSttBlockLoadInfo *tCreateLastBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols, int32_t numOfStt);
|
SSttBlockLoadInfo *tCreateLastBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols, int32_t numOfStt);
|
||||||
|
@ -783,6 +801,7 @@ typedef struct SCacheRowsReader {
|
||||||
STableKeyInfo *pTableList; // table id list
|
STableKeyInfo *pTableList; // table id list
|
||||||
int32_t numOfTables;
|
int32_t numOfTables;
|
||||||
SSttBlockLoadInfo *pLoadInfo;
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
|
SLDataIter *pDataIter;
|
||||||
STsdbReadSnap *pReadSnap;
|
STsdbReadSnap *pReadSnap;
|
||||||
SDataFReader *pDataFReader;
|
SDataFReader *pDataFReader;
|
||||||
SDataFReader *pDataFReaderLast;
|
SDataFReader *pDataFReaderLast;
|
||||||
|
|
|
@ -598,6 +598,7 @@ typedef struct {
|
||||||
SMergeTree mergeTree;
|
SMergeTree mergeTree;
|
||||||
SMergeTree *pMergeTree;
|
SMergeTree *pMergeTree;
|
||||||
SSttBlockLoadInfo *pLoadInfo;
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
|
SLDataIter* pDataIter;
|
||||||
int64_t lastTs;
|
int64_t lastTs;
|
||||||
} SFSLastNextRowIter;
|
} SFSLastNextRowIter;
|
||||||
|
|
||||||
|
@ -645,7 +646,7 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow, bool *pIgnoreEa
|
||||||
}
|
}
|
||||||
tMergeTreeOpen(&state->mergeTree, 1, *state->pDataFReader, state->suid, state->uid,
|
tMergeTreeOpen(&state->mergeTree, 1, *state->pDataFReader, state->suid, state->uid,
|
||||||
&(STimeWindow){.skey = state->lastTs, .ekey = TSKEY_MAX},
|
&(STimeWindow){.skey = state->lastTs, .ekey = TSKEY_MAX},
|
||||||
&(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, state->pLoadInfo, false, NULL, true);
|
&(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, state->pLoadInfo, false, NULL, true, state->pDataIter);
|
||||||
state->pMergeTree = &state->mergeTree;
|
state->pMergeTree = &state->mergeTree;
|
||||||
state->state = SFSLASTNEXTROW_BLOCKROW;
|
state->state = SFSLASTNEXTROW_BLOCKROW;
|
||||||
}
|
}
|
||||||
|
@ -667,7 +668,7 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow, bool *pIgnoreEa
|
||||||
state->state = SFSLASTNEXTROW_FILESET;
|
state->state = SFSLASTNEXTROW_FILESET;
|
||||||
goto _next_fileset;
|
goto _next_fileset;
|
||||||
}
|
}
|
||||||
state->row = tMergeTreeGetRow(&state->mergeTree);
|
state->row = *tMergeTreeGetRow(&state->mergeTree);
|
||||||
*ppRow = &state->row;
|
*ppRow = &state->row;
|
||||||
|
|
||||||
if (TSDBROW_TS(&state->row) <= state->lastTs) {
|
if (TSDBROW_TS(&state->row) <= state->lastTs) {
|
||||||
|
@ -1211,7 +1212,7 @@ typedef struct {
|
||||||
} CacheNextRowIter;
|
} CacheNextRowIter;
|
||||||
|
|
||||||
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid,
|
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid,
|
||||||
SSttBlockLoadInfo *pLoadInfo, STsdbReadSnap *pReadSnap, SDataFReader **pDataFReader,
|
SSttBlockLoadInfo *pLoadInfo, SLDataIter* pLDataIter, STsdbReadSnap *pReadSnap, SDataFReader **pDataFReader,
|
||||||
SDataFReader **pDataFReaderLast, int64_t lastTs) {
|
SDataFReader **pDataFReaderLast, int64_t lastTs) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
|
@ -1274,6 +1275,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
pIter->fsLastState.pLoadInfo = pLoadInfo;
|
pIter->fsLastState.pLoadInfo = pLoadInfo;
|
||||||
pIter->fsLastState.pDataFReader = pDataFReaderLast;
|
pIter->fsLastState.pDataFReader = pDataFReaderLast;
|
||||||
pIter->fsLastState.lastTs = lastTs;
|
pIter->fsLastState.lastTs = lastTs;
|
||||||
|
pIter->fsLastState.pDataIter = pLDataIter;
|
||||||
|
|
||||||
pIter->fsState.state = SFSNEXTROW_FS;
|
pIter->fsState.state = SFSNEXTROW_FS;
|
||||||
pIter->fsState.pTsdb = pTsdb;
|
pIter->fsState.pTsdb = pTsdb;
|
||||||
|
@ -1465,7 +1467,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, SArray **ppCo
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pReadSnap, &pr->pDataFReader,
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pDataIter, pr->pReadSnap, &pr->pDataFReader,
|
||||||
&pr->pDataFReaderLast, pr->lastTs);
|
&pr->pDataFReaderLast, pr->lastTs);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -1622,7 +1624,7 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCach
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pReadSnap, &pr->pDataFReader,
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pDataIter, pr->pReadSnap, &pr->pDataFReader,
|
||||||
&pr->pDataFReaderLast, pr->lastTs);
|
&pr->pDataFReaderLast, pr->lastTs);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -187,13 +187,21 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, void* pTableIdList,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfStt = ((SVnode*)pVnode)->config.sttTrigger;
|
SVnodeCfg* pCfg = &((SVnode*)pVnode)->config;
|
||||||
|
|
||||||
|
int32_t numOfStt = pCfg->sttTrigger;
|
||||||
p->pLoadInfo = tCreateLastBlockLoadInfo(p->pSchema, NULL, 0, numOfStt);
|
p->pLoadInfo = tCreateLastBlockLoadInfo(p->pSchema, NULL, 0, numOfStt);
|
||||||
if (p->pLoadInfo == NULL) {
|
if (p->pLoadInfo == NULL) {
|
||||||
tsdbCacherowsReaderClose(p);
|
tsdbCacherowsReaderClose(p);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->pDataIter = taosMemoryCalloc(pCfg->sttTrigger, sizeof(SLDataIter));
|
||||||
|
if (p->pDataIter == NULL) {
|
||||||
|
tsdbCacherowsReaderClose(p);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
p->idstr = taosStrdup(idstr);
|
p->idstr = taosStrdup(idstr);
|
||||||
taosThreadMutexInit(&p->readerMutex, NULL);
|
taosThreadMutexInit(&p->readerMutex, NULL);
|
||||||
|
|
||||||
|
@ -215,6 +223,7 @@ void* tsdbCacherowsReaderClose(void* pReader) {
|
||||||
taosMemoryFree(p->pSchema);
|
taosMemoryFree(p->pSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(p->pDataIter);
|
||||||
taosMemoryFree(p->pCurrSchema);
|
taosMemoryFree(p->pCurrSchema);
|
||||||
|
|
||||||
destroyLastBlockLoadInfo(p->pLoadInfo);
|
destroyLastBlockLoadInfo(p->pLoadInfo);
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <util/tsimplehash.h>
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
#define MEM_MIN_HASH 1024
|
#define MEM_MIN_HASH 1024
|
||||||
|
@ -298,12 +299,12 @@ int64_t tsdbCountTbDataRows(STbData *pTbData) {
|
||||||
return rowsNum;
|
return rowsNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj* pTableMap, int64_t *rowsNum) {
|
void tsdbMemTableCountRows(SMemTable *pMemTable, SSHashObj* pTableMap, int64_t *rowsNum) {
|
||||||
taosRLockLatch(&pMemTable->latch);
|
taosRLockLatch(&pMemTable->latch);
|
||||||
for (int32_t i = 0; i < pMemTable->nBucket; ++i) {
|
for (int32_t i = 0; i < pMemTable->nBucket; ++i) {
|
||||||
STbData *pTbData = pMemTable->aBucket[i];
|
STbData *pTbData = pMemTable->aBucket[i];
|
||||||
while (pTbData) {
|
while (pTbData) {
|
||||||
void* p = taosHashGet(pTableMap, &pTbData->uid, sizeof(pTbData->uid));
|
void* p = tSimpleHashGet(pTableMap, &pTbData->uid, sizeof(pTbData->uid));
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
pTbData = pTbData->next;
|
pTbData = pTbData->next;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -16,22 +16,6 @@
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
// SLDataIter =================================================
|
// SLDataIter =================================================
|
||||||
struct SLDataIter {
|
|
||||||
SRBTreeNode node;
|
|
||||||
SSttBlk *pSttBlk;
|
|
||||||
SDataFReader *pReader;
|
|
||||||
int32_t iStt;
|
|
||||||
int8_t backward;
|
|
||||||
int32_t iSttBlk;
|
|
||||||
int32_t iRow;
|
|
||||||
SRowInfo rInfo;
|
|
||||||
uint64_t uid;
|
|
||||||
STimeWindow timeWindow;
|
|
||||||
SVersionRange verRange;
|
|
||||||
SSttBlockLoadInfo *pBlockLoadInfo;
|
|
||||||
bool ignoreEarlierTs;
|
|
||||||
};
|
|
||||||
|
|
||||||
SSttBlockLoadInfo *tCreateLastBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols,
|
SSttBlockLoadInfo *tCreateLastBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols,
|
||||||
int32_t numOfSttTrigger) {
|
int32_t numOfSttTrigger) {
|
||||||
SSttBlockLoadInfo *pLoadInfo = taosMemoryCalloc(numOfSttTrigger, sizeof(SSttBlockLoadInfo));
|
SSttBlockLoadInfo *pLoadInfo = taosMemoryCalloc(numOfSttTrigger, sizeof(SSttBlockLoadInfo));
|
||||||
|
@ -268,25 +252,21 @@ static int32_t binarySearchForStartRowIndex(uint64_t *uidList, int32_t num, uint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t iStt, int8_t backward, uint64_t suid,
|
int32_t tLDataIterOpen(struct SLDataIter *pIter, SDataFReader *pReader, int32_t iStt, int8_t backward, uint64_t suid,
|
||||||
uint64_t uid, STimeWindow *pTimeWindow, SVersionRange *pRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
uint64_t uid, STimeWindow *pTimeWindow, SVersionRange *pRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
||||||
const char *idStr, bool strictTimeRange) {
|
const char *idStr, bool strictTimeRange) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
*pIter = taosMemoryCalloc(1, sizeof(SLDataIter));
|
pIter->uid = uid;
|
||||||
if (*pIter == NULL) {
|
pIter->pReader = pReader;
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
pIter->iStt = iStt;
|
||||||
goto _exit;
|
pIter->backward = backward;
|
||||||
}
|
pIter->verRange.minVer = pRange->minVer;
|
||||||
|
pIter->verRange.maxVer = pRange->maxVer;
|
||||||
|
pIter->timeWindow.skey = pTimeWindow->skey;
|
||||||
|
pIter->timeWindow.ekey = pTimeWindow->ekey;
|
||||||
|
|
||||||
(*pIter)->uid = uid;
|
pIter->pBlockLoadInfo = pBlockLoadInfo;
|
||||||
(*pIter)->pReader = pReader;
|
|
||||||
(*pIter)->iStt = iStt;
|
|
||||||
(*pIter)->backward = backward;
|
|
||||||
(*pIter)->verRange = *pRange;
|
|
||||||
(*pIter)->timeWindow = *pTimeWindow;
|
|
||||||
|
|
||||||
(*pIter)->pBlockLoadInfo = pBlockLoadInfo;
|
|
||||||
|
|
||||||
if (!pBlockLoadInfo->sttBlockLoaded) {
|
if (!pBlockLoadInfo->sttBlockLoaded) {
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
@ -294,7 +274,7 @@ int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t
|
||||||
|
|
||||||
code = tsdbReadSttBlk(pReader, iStt, pBlockLoadInfo->aSttBlk);
|
code = tsdbReadSttBlk(pReader, iStt, pBlockLoadInfo->aSttBlk);
|
||||||
if (code) {
|
if (code) {
|
||||||
goto _exit;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// only apply to the child tables, ordinary tables will not incur this filter procedure.
|
// only apply to the child tables, ordinary tables will not incur this filter procedure.
|
||||||
|
@ -310,7 +290,7 @@ int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t
|
||||||
// no qualified stt block existed
|
// no qualified stt block existed
|
||||||
taosArrayClear(pBlockLoadInfo->aSttBlk);
|
taosArrayClear(pBlockLoadInfo->aSttBlk);
|
||||||
|
|
||||||
(*pIter)->iSttBlk = -1;
|
pIter->iSttBlk = -1;
|
||||||
double el = (taosGetTimestampUs() - st) / 1000.0;
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
tsdbDebug("load the last file info completed, elapsed time:%.2fms, %s", el, idStr);
|
tsdbDebug("load the last file info completed, elapsed time:%.2fms, %s", el, idStr);
|
||||||
return code;
|
return code;
|
||||||
|
@ -343,31 +323,27 @@ int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t
|
||||||
size_t size = taosArrayGetSize(pBlockLoadInfo->aSttBlk);
|
size_t size = taosArrayGetSize(pBlockLoadInfo->aSttBlk);
|
||||||
|
|
||||||
// find the start block
|
// find the start block
|
||||||
(*pIter)->iSttBlk = binarySearchForStartBlock(pBlockLoadInfo->aSttBlk->pData, size, uid, backward);
|
pIter->iSttBlk = binarySearchForStartBlock(pBlockLoadInfo->aSttBlk->pData, size, uid, backward);
|
||||||
if ((*pIter)->iSttBlk != -1) {
|
if (pIter->iSttBlk != -1) {
|
||||||
(*pIter)->pSttBlk = taosArrayGet(pBlockLoadInfo->aSttBlk, (*pIter)->iSttBlk);
|
pIter->pSttBlk = taosArrayGet(pBlockLoadInfo->aSttBlk, pIter->iSttBlk);
|
||||||
(*pIter)->iRow = ((*pIter)->backward) ? (*pIter)->pSttBlk->nRow : -1;
|
pIter->iRow = (pIter->backward) ? pIter->pSttBlk->nRow : -1;
|
||||||
|
|
||||||
if ((!backward) && ((strictTimeRange && (*pIter)->pSttBlk->minKey >= (*pIter)->timeWindow.ekey) ||
|
if ((!backward) && ((strictTimeRange && pIter->pSttBlk->minKey >= pIter->timeWindow.ekey) ||
|
||||||
(!strictTimeRange && (*pIter)->pSttBlk->minKey > (*pIter)->timeWindow.ekey))) {
|
(!strictTimeRange && pIter->pSttBlk->minKey > pIter->timeWindow.ekey))) {
|
||||||
(*pIter)->pSttBlk = NULL;
|
pIter->pSttBlk = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (backward && ((strictTimeRange && (*pIter)->pSttBlk->maxKey <= (*pIter)->timeWindow.skey) ||
|
if (backward && ((strictTimeRange && pIter->pSttBlk->maxKey <= pIter->timeWindow.skey) ||
|
||||||
(!strictTimeRange && (*pIter)->pSttBlk->maxKey < (*pIter)->timeWindow.skey))) {
|
(!strictTimeRange && pIter->pSttBlk->maxKey < pIter->timeWindow.skey))) {
|
||||||
(*pIter)->pSttBlk = NULL;
|
pIter->pSttBlk = NULL;
|
||||||
(*pIter)->ignoreEarlierTs = true;
|
pIter->ignoreEarlierTs = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_exit:
|
|
||||||
taosMemoryFree(*pIter);
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tLDataIterClose(SLDataIter *pIter) { taosMemoryFree(pIter); }
|
void tLDataIterClose(SLDataIter *pIter) { /*taosMemoryFree(pIter); */}
|
||||||
|
|
||||||
void tLDataIterNextBlock(SLDataIter *pIter, const char *idStr) {
|
void tLDataIterNextBlock(SLDataIter *pIter, const char *idStr) {
|
||||||
int32_t step = pIter->backward ? -1 : 1;
|
int32_t step = pIter->backward ? -1 : 1;
|
||||||
|
@ -594,43 +570,38 @@ static FORCE_INLINE int32_t tLDataIterDescCmprFn(const SRBTreeNode *p1, const SR
|
||||||
|
|
||||||
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
||||||
STimeWindow *pTimeWindow, SVersionRange *pVerRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
STimeWindow *pTimeWindow, SVersionRange *pVerRange, SSttBlockLoadInfo *pBlockLoadInfo,
|
||||||
bool destroyLoadInfo, const char *idStr, bool strictTimeRange) {
|
bool destroyLoadInfo, const char *idStr, bool strictTimeRange, SLDataIter* pLDataIter) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
pMTree->backward = backward;
|
pMTree->backward = backward;
|
||||||
pMTree->pIter = NULL;
|
pMTree->pIter = NULL;
|
||||||
pMTree->pIterList = taosArrayInit(4, POINTER_BYTES);
|
|
||||||
if (pMTree->pIterList == NULL) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pMTree->idStr = idStr;
|
pMTree->idStr = idStr;
|
||||||
|
|
||||||
if (!pMTree->backward) { // asc
|
if (!pMTree->backward) { // asc
|
||||||
tRBTreeCreate(&pMTree->rbt, tLDataIterCmprFn);
|
tRBTreeCreate(&pMTree->rbt, tLDataIterCmprFn);
|
||||||
} else { // desc
|
} else { // desc
|
||||||
tRBTreeCreate(&pMTree->rbt, tLDataIterDescCmprFn);
|
tRBTreeCreate(&pMTree->rbt, tLDataIterDescCmprFn);
|
||||||
}
|
}
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
|
||||||
|
|
||||||
pMTree->pLoadInfo = pBlockLoadInfo;
|
pMTree->pLoadInfo = pBlockLoadInfo;
|
||||||
pMTree->destroyLoadInfo = destroyLoadInfo;
|
pMTree->destroyLoadInfo = destroyLoadInfo;
|
||||||
pMTree->ignoreEarlierTs = false;
|
pMTree->ignoreEarlierTs = false;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pFReader->pSet->nSttF; ++i) { // open all last file
|
for (int32_t i = 0; i < pFReader->pSet->nSttF; ++i) { // open all last file
|
||||||
struct SLDataIter *pIter = NULL;
|
memset(&pLDataIter[i], 0, sizeof(SLDataIter));
|
||||||
code = tLDataIterOpen(&pIter, pFReader, i, pMTree->backward, suid, uid, pTimeWindow, pVerRange,
|
code = tLDataIterOpen(&pLDataIter[i], pFReader, i, pMTree->backward, suid, uid, pTimeWindow, pVerRange,
|
||||||
&pMTree->pLoadInfo[i], pMTree->idStr, strictTimeRange);
|
&pMTree->pLoadInfo[i], pMTree->idStr, strictTimeRange);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasVal = tLDataIterNextRow(pIter, pMTree->idStr);
|
bool hasVal = tLDataIterNextRow(&pLDataIter[i], pMTree->idStr);
|
||||||
if (hasVal) {
|
if (hasVal) {
|
||||||
taosArrayPush(pMTree->pIterList, &pIter);
|
tMergeTreeAddIter(pMTree, &pLDataIter[i]);
|
||||||
tMergeTreeAddIter(pMTree, pIter);
|
|
||||||
} else {
|
} else {
|
||||||
if (!pMTree->ignoreEarlierTs) {
|
if (!pMTree->ignoreEarlierTs) {
|
||||||
pMTree->ignoreEarlierTs = pIter->ignoreEarlierTs;
|
pMTree->ignoreEarlierTs = pLDataIter[i].ignoreEarlierTs;
|
||||||
}
|
}
|
||||||
tLDataIterClose(pIter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -678,18 +649,8 @@ bool tMergeTreeNext(SMergeTree *pMTree) {
|
||||||
return pMTree->pIter != NULL;
|
return pMTree->pIter != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSDBROW tMergeTreeGetRow(SMergeTree *pMTree) { return pMTree->pIter->rInfo.row; }
|
|
||||||
|
|
||||||
void tMergeTreeClose(SMergeTree *pMTree) {
|
void tMergeTreeClose(SMergeTree *pMTree) {
|
||||||
size_t size = taosArrayGetSize(pMTree->pIterList);
|
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
|
||||||
SLDataIter *pIter = taosArrayGetP(pMTree->pIterList, i);
|
|
||||||
tLDataIterClose(pIter);
|
|
||||||
}
|
|
||||||
|
|
||||||
pMTree->pIterList = taosArrayDestroy(pMTree->pIterList);
|
|
||||||
pMTree->pIter = NULL;
|
pMTree->pIter = NULL;
|
||||||
|
|
||||||
if (pMTree->destroyLoadInfo) {
|
if (pMTree->destroyLoadInfo) {
|
||||||
pMTree->pLoadInfo = destroyLastBlockLoadInfo(pMTree->pLoadInfo);
|
pMTree->pLoadInfo = destroyLastBlockLoadInfo(pMTree->pLoadInfo);
|
||||||
pMTree->destroyLoadInfo = false;
|
pMTree->destroyLoadInfo = false;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -712,124 +712,163 @@ _exit:
|
||||||
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
TSDBKEY key = TSDBROW_KEY(pRow);
|
||||||
SColVal *pColVal = &(SColVal){0};
|
SColVal * pColVal = &(SColVal){0};
|
||||||
STColumn *pTColumn;
|
STColumn *pTColumn;
|
||||||
int32_t iCol, jCol = 1;
|
int32_t iCol, jCol = 1;
|
||||||
|
|
||||||
if (NULL == pTSchema) {
|
if (NULL == pTSchema) {
|
||||||
pTSchema = pMerger->pTSchema;
|
pTSchema = pMerger->pTSchema;
|
||||||
}
|
}
|
||||||
ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts);
|
|
||||||
|
|
||||||
for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
|
if (taosArrayGetSize(pMerger->pArray) == 0) {
|
||||||
pTColumn = &pMerger->pTSchema->columns[iCol];
|
// ts
|
||||||
if (pTSchema->columns[jCol].colId < pTColumn->colId) {
|
jCol = 0;
|
||||||
++jCol;
|
pTColumn = &pTSchema->columns[jCol++];
|
||||||
--iCol;
|
|
||||||
continue;
|
|
||||||
} else if (pTSchema->columns[jCol].colId > pTColumn->colId) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
|
||||||
if (key.version > pMerger->version) {
|
|
||||||
if (!COL_VAL_IS_NONE(pColVal)) {
|
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
|
||||||
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
|
||||||
if (!COL_VAL_IS_NULL(pColVal)) {
|
|
||||||
code = tRealloc(&pTColVal->value.pData, pColVal->value.nData);
|
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pTColVal->value.nData = pColVal->value.nData;
|
|
||||||
if (pTColVal->value.nData) {
|
|
||||||
memcpy(pTColVal->value.pData, pColVal->value.pData, pTColVal->value.nData);
|
|
||||||
}
|
|
||||||
pTColVal->flag = 0;
|
|
||||||
} else {
|
|
||||||
tFree(pTColVal->value.pData);
|
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (key.version < pMerger->version) {
|
|
||||||
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
|
||||||
if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
|
|
||||||
if ((!COL_VAL_IS_NULL(pColVal)) && IS_VAR_DATA_TYPE(pColVal->type)) {
|
|
||||||
code = tRealloc(&tColVal->value.pData, pColVal->value.nData);
|
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
tColVal->value.nData = pColVal->value.nData;
|
|
||||||
if (pColVal->value.nData) {
|
|
||||||
memcpy(tColVal->value.pData, pColVal->value.pData, pColVal->value.nData);
|
|
||||||
}
|
|
||||||
tColVal->flag = 0;
|
|
||||||
} else {
|
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ASSERT(0 && "dup versions not allowed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pMerger->version = key.version;
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
|
||||||
int32_t code = 0;
|
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
|
||||||
SColVal *pColVal = &(SColVal){0};
|
|
||||||
STColumn *pTColumn;
|
|
||||||
|
|
||||||
pMerger->pTSchema = pTSchema;
|
|
||||||
pMerger->version = key.version;
|
|
||||||
|
|
||||||
pMerger->pArray = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
|
|
||||||
if (pMerger->pArray == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ts
|
|
||||||
pTColumn = &pTSchema->columns[0];
|
|
||||||
|
|
||||||
ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
|
|
||||||
|
|
||||||
*pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = key.ts});
|
|
||||||
if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// other
|
|
||||||
for (int16_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) {
|
|
||||||
tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal);
|
|
||||||
if ((!COL_VAL_IS_NONE(pColVal)) && (!COL_VAL_IS_NULL(pColVal)) && IS_VAR_DATA_TYPE(pColVal->type)) {
|
|
||||||
uint8_t *pVal = pColVal->value.pData;
|
|
||||||
|
|
||||||
pColVal->value.pData = NULL;
|
|
||||||
code = tRealloc(&pColVal->value.pData, pColVal->value.nData);
|
|
||||||
if (code) goto _exit;
|
|
||||||
|
|
||||||
if (pColVal->value.nData) {
|
|
||||||
memcpy(pColVal->value.pData, pVal, pColVal->value.nData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
*pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = key.ts});
|
||||||
if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
|
if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
return code;
|
||||||
|
// goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// other
|
||||||
|
for (iCol = 1; jCol < pTSchema->numOfCols && iCol < pMerger->pTSchema->numOfCols; ++iCol) {
|
||||||
|
pTColumn = &pMerger->pTSchema->columns[iCol];
|
||||||
|
if (pTSchema->columns[jCol].colId < pTColumn->colId) {
|
||||||
|
++jCol;
|
||||||
|
--iCol;
|
||||||
|
continue;
|
||||||
|
} else if (pTSchema->columns[jCol].colId > pTColumn->colId) {
|
||||||
|
taosArrayPush(pMerger->pArray, &COL_VAL_NONE(pTColumn->colId, pTColumn->type));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
||||||
|
if ((!COL_VAL_IS_NONE(pColVal)) && (!COL_VAL_IS_NULL(pColVal)) && IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
|
uint8_t *pVal = pColVal->value.pData;
|
||||||
|
|
||||||
|
pColVal->value.pData = NULL;
|
||||||
|
code = tRealloc(&pColVal->value.pData, pColVal->value.nData);
|
||||||
|
if (code) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pColVal->value.nData) {
|
||||||
|
memcpy(pColVal->value.pData, pVal, pColVal->value.nData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; iCol < pMerger->pTSchema->numOfCols; ++iCol) {
|
||||||
|
pTColumn = &pMerger->pTSchema->columns[iCol];
|
||||||
|
taosArrayPush(pMerger->pArray, &COL_VAL_NONE(pTColumn->colId, pTColumn->type));
|
||||||
|
}
|
||||||
|
|
||||||
|
pMerger->version = key.version;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts);
|
||||||
|
|
||||||
|
for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
|
||||||
|
pTColumn = &pMerger->pTSchema->columns[iCol];
|
||||||
|
if (pTSchema->columns[jCol].colId < pTColumn->colId) {
|
||||||
|
++jCol;
|
||||||
|
--iCol;
|
||||||
|
continue;
|
||||||
|
} else if (pTSchema->columns[jCol].colId > pTColumn->colId) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
||||||
|
|
||||||
|
if (key.version > pMerger->version) {
|
||||||
|
if (!COL_VAL_IS_NONE(pColVal)) {
|
||||||
|
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
if (!COL_VAL_IS_NULL(pColVal)) {
|
||||||
|
code = tRealloc(&pTColVal->value.pData, pColVal->value.nData);
|
||||||
|
if (code) return code;
|
||||||
|
|
||||||
|
pTColVal->value.nData = pColVal->value.nData;
|
||||||
|
if (pTColVal->value.nData) {
|
||||||
|
memcpy(pTColVal->value.pData, pColVal->value.pData, pTColVal->value.nData);
|
||||||
|
}
|
||||||
|
pTColVal->flag = 0;
|
||||||
|
} else {
|
||||||
|
tFree(pTColVal->value.pData);
|
||||||
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (key.version < pMerger->version) {
|
||||||
|
SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
|
||||||
|
if ((!COL_VAL_IS_NULL(pColVal)) && IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
|
code = tRealloc(&tColVal->value.pData, pColVal->value.nData);
|
||||||
|
if (code) return code;
|
||||||
|
|
||||||
|
tColVal->value.nData = pColVal->value.nData;
|
||||||
|
if (pColVal->value.nData) {
|
||||||
|
memcpy(tColVal->value.pData, pColVal->value.pData, pColVal->value.nData);
|
||||||
|
}
|
||||||
|
tColVal->flag = 0;
|
||||||
|
} else {
|
||||||
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ASSERT(0 && "dup versions not allowed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pMerger->version = key.version;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbRowMergerInit_rv(SRowMerger* pMerger, STSchema *pSchema) {
|
||||||
|
pMerger->pTSchema = pSchema;
|
||||||
|
pMerger->pArray = taosArrayInit(pSchema->numOfCols, sizeof(SColVal));
|
||||||
|
if (pMerger->pArray == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsdbRowMergerClear_rv(SRowMerger* pMerger) {
|
||||||
|
for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
|
||||||
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
if (IS_VAR_DATA_TYPE(pTColVal->type)) {
|
||||||
|
tFree(pTColVal->value.pData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_exit:
|
taosArrayClear(pMerger->pArray);
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
void tsdbRowMergerCleanup_rv(SRowMerger* pMerger) {
|
||||||
|
int32_t numOfCols = taosArrayGetSize(pMerger->pArray);
|
||||||
|
for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
|
||||||
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
if (IS_VAR_DATA_TYPE(pTColVal->type)) {
|
||||||
|
tFree(pTColVal->value.pData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pMerger->pArray);
|
||||||
|
}
|
||||||
|
|
||||||
void tsdbRowMergerClear(SRowMerger *pMerger) {
|
void tsdbRowMergerClear(SRowMerger *pMerger) {
|
||||||
for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
|
for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
|
||||||
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
|
|
@ -361,10 +361,6 @@ int32_t tSimpleHashIterateRemove(SSHashObj *pHashObj, const void *key, size_t ke
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyItems(void* pItem) {
|
|
||||||
taosMemoryFree(*(void**)pItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tSimpleHashClear(SSHashObj *pHashObj) {
|
void tSimpleHashClear(SSHashObj *pHashObj) {
|
||||||
if (!pHashObj || taosHashTableEmpty(pHashObj)) {
|
if (!pHashObj || taosHashTableEmpty(pHashObj)) {
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue