TDengine/source/dnode/vnode/src/tsdb/dev/tsdbIter.c

708 lines
21 KiB
C
Raw Normal View History

2023-05-30 02:43:44 +00:00
/*
* 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 "inc/tsdbIter.h"
// STsdbIter ================
struct STsdbIter {
2023-06-12 05:27:02 +00:00
EIterType type;
2023-05-30 02:43:44 +00:00
struct {
bool noMoreData;
} ctx[1];
2023-06-05 10:29:05 +00:00
union {
SRowInfo row[1];
STombRecord record[1];
};
2023-05-30 02:43:44 +00:00
SRBTreeNode node[1];
2023-05-30 06:20:15 +00:00
union {
struct {
SSttSegReader *reader;
const TSttBlkArray *sttBlkArray;
int32_t sttBlkArrayIdx;
2023-06-12 05:27:02 +00:00
SBlockData blockData[1];
int32_t blockDataIdx;
} sttData[1];
2023-05-30 06:20:15 +00:00
struct {
2023-06-09 08:43:09 +00:00
SDataFileReader *reader;
const TBrinBlkArray *brinBlkArray;
int32_t brinBlkArrayIdx;
SBrinBlock brinBlock[1];
int32_t brinBlockIdx;
2023-06-12 05:27:02 +00:00
SBlockData blockData[1];
int32_t blockDataIdx;
} dataData[1];
2023-05-30 06:20:15 +00:00
struct {
2023-05-30 07:31:11 +00:00
SMemTable *memt;
TSDBKEY from[1];
SRBTreeIter iter[1];
STbData *tbData;
STbDataIter tbIter[1];
2023-06-12 05:27:02 +00:00
} memtData[1];
2023-06-05 10:29:05 +00:00
struct {
SSttSegReader *reader;
const TTombBlkArray *tombBlkArray;
int32_t tombBlkArrayIdx;
2023-06-12 05:27:02 +00:00
STombBlock tombBlock[1];
int32_t tombBlockIdx;
2023-06-05 10:29:05 +00:00
} sttTomb[1];
struct {
SDataFileReader *reader;
const TTombBlkArray *tombBlkArray;
int32_t tombBlkArrayIdx;
2023-06-12 05:27:02 +00:00
STombBlock tombBlock[1];
int32_t tombBlockIdx;
2023-06-05 10:29:05 +00:00
} dataTomb[1];
2023-06-12 08:55:20 +00:00
struct {
SMemTable *memt;
SRBTreeIter rbtIter[1];
STbData *tbData;
SDelData *delData;
} memtTomb[1];
2023-05-30 06:20:15 +00:00
};
2023-05-30 02:43:44 +00:00
};
2023-05-30 06:20:15 +00:00
static int32_t tsdbSttIterNext(STsdbIter *iter, const TABLEID *tbid) {
while (!iter->ctx->noMoreData) {
2023-06-12 05:27:02 +00:00
for (; iter->sttData->blockDataIdx < iter->sttData->blockData->nRow; iter->sttData->blockDataIdx++) {
iter->row->suid = iter->sttData->blockData->suid;
iter->row->uid = iter->sttData->blockData->uid ? iter->sttData->blockData->uid
: iter->sttData->blockData->aUid[iter->sttData->blockDataIdx];
2023-05-30 06:20:15 +00:00
if (tbid && iter->row->suid == tbid->suid && iter->row->uid == tbid->uid) {
continue;
}
2023-06-12 05:27:02 +00:00
iter->row->row = tsdbRowFromBlockData(iter->sttData->blockData, iter->sttData->blockDataIdx);
iter->sttData->blockDataIdx++;
2023-05-30 06:20:15 +00:00
goto _exit;
}
2023-06-12 05:27:02 +00:00
if (iter->sttData->sttBlkArrayIdx >= TARRAY2_SIZE(iter->sttData->sttBlkArray)) {
2023-05-30 06:20:15 +00:00
iter->ctx->noMoreData = true;
break;
}
2023-06-12 05:27:02 +00:00
for (; iter->sttData->sttBlkArrayIdx < TARRAY2_SIZE(iter->sttData->sttBlkArray); iter->sttData->sttBlkArrayIdx++) {
const SSttBlk *sttBlk = TARRAY2_GET_PTR(iter->sttData->sttBlkArray, iter->sttData->sttBlkArrayIdx);
2023-05-30 06:20:15 +00:00
if (tbid && tbid->suid == sttBlk->suid && tbid->uid == sttBlk->minUid && tbid->uid == sttBlk->maxUid) {
continue;
}
2023-06-12 05:27:02 +00:00
int32_t code = tsdbSttFileReadBlockData(iter->sttData->reader, sttBlk, iter->sttData->blockData);
2023-05-30 06:20:15 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
iter->sttData->blockDataIdx = 0;
iter->sttData->sttBlkArrayIdx++;
2023-05-30 06:20:15 +00:00
break;
}
}
_exit:
return 0;
}
static int32_t tsdbDataIterNext(STsdbIter *iter, const TABLEID *tbid) {
int32_t code;
while (!iter->ctx->noMoreData) {
for (;;) {
2023-06-09 08:43:09 +00:00
// SBlockData
2023-06-12 05:27:02 +00:00
for (; iter->dataData->blockDataIdx < iter->dataData->blockData->nRow; iter->dataData->blockDataIdx++) {
if (tbid && tbid->suid == iter->dataData->blockData->suid && tbid->uid == iter->dataData->blockData->uid) {
iter->dataData->blockDataIdx = iter->dataData->blockData->nRow;
2023-05-30 06:20:15 +00:00
break;
}
2023-06-12 05:27:02 +00:00
iter->row->row = tsdbRowFromBlockData(iter->dataData->blockData, iter->dataData->blockDataIdx);
iter->dataData->blockDataIdx++;
2023-05-30 06:20:15 +00:00
goto _exit;
}
2023-06-09 08:43:09 +00:00
// SBrinBlock
2023-06-12 05:27:02 +00:00
if (iter->dataData->brinBlockIdx >= BRIN_BLOCK_SIZE(iter->dataData->brinBlock)) {
2023-05-30 06:20:15 +00:00
break;
}
2023-06-12 05:27:02 +00:00
for (; iter->dataData->brinBlockIdx < BRIN_BLOCK_SIZE(iter->dataData->brinBlock);
iter->dataData->brinBlockIdx++) {
2023-06-09 08:43:09 +00:00
SBrinRecord record[1];
2023-06-12 05:27:02 +00:00
tBrinBlockGet(iter->dataData->brinBlock, iter->dataData->brinBlockIdx, record);
2023-05-30 06:20:15 +00:00
2023-06-09 08:43:09 +00:00
if (tbid && tbid->suid == record->suid && tbid->uid == record->uid) {
continue;
2023-05-30 06:20:15 +00:00
}
2023-06-09 08:43:09 +00:00
iter->row->suid = record->suid;
iter->row->uid = record->uid;
2023-06-12 05:27:02 +00:00
code = tsdbDataFileReadBlockData(iter->dataData->reader, record, iter->dataData->blockData);
2023-05-30 06:20:15 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
iter->dataData->blockDataIdx = 0;
iter->dataData->brinBlockIdx++;
2023-05-30 06:20:15 +00:00
break;
}
}
2023-06-12 05:27:02 +00:00
if (iter->dataData->brinBlkArrayIdx >= TARRAY2_SIZE(iter->dataData->brinBlkArray)) {
2023-05-30 06:20:15 +00:00
iter->ctx->noMoreData = true;
break;
}
2023-06-12 05:27:02 +00:00
for (; iter->dataData->brinBlkArrayIdx < TARRAY2_SIZE(iter->dataData->brinBlkArray);
iter->dataData->brinBlkArrayIdx++) {
const SBrinBlk *brinBlk = TARRAY2_GET_PTR(iter->dataData->brinBlkArray, iter->dataData->brinBlkArrayIdx);
2023-05-30 06:20:15 +00:00
2023-06-09 08:43:09 +00:00
if (tbid && tbid->uid == brinBlk->minTbid.uid && tbid->uid == brinBlk->maxTbid.uid) {
2023-05-30 06:20:15 +00:00
continue;
}
2023-06-12 05:27:02 +00:00
code = tsdbDataFileReadBrinBlock(iter->dataData->reader, brinBlk, iter->dataData->brinBlock);
2023-05-30 06:20:15 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
iter->dataData->brinBlockIdx = 0;
iter->dataData->brinBlkArrayIdx++;
2023-05-30 06:20:15 +00:00
break;
}
}
_exit:
return 0;
}
static int32_t tsdbMemTableIterNext(STsdbIter *iter, const TABLEID *tbid) {
2023-05-30 07:31:11 +00:00
SRBTreeNode *node;
while (!iter->ctx->noMoreData) {
2023-06-12 05:27:02 +00:00
for (TSDBROW *row; iter->memtData->tbData && (row = tsdbTbDataIterGet(iter->memtData->tbIter));) {
if (tbid && tbid->suid == iter->memtData->tbData->suid && tbid->uid == iter->memtData->tbData->uid) {
iter->memtData->tbData = NULL;
2023-05-30 07:31:11 +00:00
break;
}
2023-05-31 08:34:50 +00:00
iter->row->row = row[0];
2023-06-12 05:27:02 +00:00
tsdbTbDataIterNext(iter->memtData->tbIter);
2023-05-30 07:31:11 +00:00
goto _exit;
}
for (;;) {
2023-06-12 05:27:02 +00:00
node = tRBTreeIterNext(iter->memtData->iter);
2023-05-30 07:31:11 +00:00
if (!node) {
iter->ctx->noMoreData = true;
2023-06-12 05:27:02 +00:00
goto _exit;
2023-05-30 07:31:11 +00:00
}
2023-06-12 05:27:02 +00:00
iter->memtData->tbData = TCONTAINER_OF(node, STbData, rbtn);
if (tbid && tbid->suid == iter->memtData->tbData->suid && tbid->uid == iter->memtData->tbData->uid) {
2023-05-30 07:31:11 +00:00
continue;
} else {
2023-06-12 05:27:02 +00:00
iter->row->suid = iter->memtData->tbData->suid;
iter->row->uid = iter->memtData->tbData->uid;
tsdbTbDataIterOpen(iter->memtData->tbData, iter->memtData->from, 0, iter->memtData->tbIter);
2023-05-30 07:31:11 +00:00
break;
}
}
}
_exit:
2023-05-30 02:43:44 +00:00
return 0;
}
2023-06-05 10:29:05 +00:00
static int32_t tsdbDataTombIterNext(STsdbIter *iter, const TABLEID *tbid) {
while (!iter->ctx->noMoreData) {
2023-06-12 05:27:02 +00:00
for (; iter->dataTomb->tombBlockIdx < TOMB_BLOCK_SIZE(iter->dataTomb->tombBlock); iter->dataTomb->tombBlockIdx++) {
iter->record->suid = TARRAY2_GET(iter->dataTomb->tombBlock->suid, iter->dataTomb->tombBlockIdx);
iter->record->uid = TARRAY2_GET(iter->dataTomb->tombBlock->uid, iter->dataTomb->tombBlockIdx);
2023-06-05 10:29:05 +00:00
if (tbid && iter->record->suid == tbid->suid && iter->record->uid == tbid->uid) {
continue;
}
2023-06-12 05:27:02 +00:00
iter->record->version = TARRAY2_GET(iter->dataTomb->tombBlock->version, iter->dataTomb->tombBlockIdx);
iter->record->skey = TARRAY2_GET(iter->dataTomb->tombBlock->skey, iter->dataTomb->tombBlockIdx);
iter->record->ekey = TARRAY2_GET(iter->dataTomb->tombBlock->ekey, iter->dataTomb->tombBlockIdx);
iter->dataTomb->tombBlockIdx++;
2023-06-05 10:29:05 +00:00
goto _exit;
}
if (iter->dataTomb->tombBlkArrayIdx >= TARRAY2_SIZE(iter->dataTomb->tombBlkArray)) {
iter->ctx->noMoreData = true;
2023-06-12 05:27:02 +00:00
goto _exit;
2023-06-05 10:29:05 +00:00
}
for (; iter->dataTomb->tombBlkArrayIdx < TARRAY2_SIZE(iter->dataTomb->tombBlkArray);
iter->dataTomb->tombBlkArrayIdx++) {
const STombBlk *tombBlk = TARRAY2_GET_PTR(iter->dataTomb->tombBlkArray, iter->dataTomb->tombBlkArrayIdx);
2023-06-08 02:31:19 +00:00
if (tbid && tbid->suid == tombBlk->minTbid.suid && tbid->uid == tombBlk->minTbid.uid &&
tbid->suid == tombBlk->maxTbid.suid && tbid->uid == tombBlk->maxTbid.uid) {
2023-06-05 10:29:05 +00:00
continue;
}
2023-06-12 05:27:02 +00:00
int32_t code = tsdbDataFileReadTombBlock(iter->dataTomb->reader, tombBlk, iter->dataTomb->tombBlock);
2023-06-05 10:29:05 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
iter->dataTomb->tombBlockIdx = 0;
2023-06-05 10:29:05 +00:00
iter->dataTomb->tombBlkArrayIdx++;
break;
}
}
_exit:
return 0;
}
2023-06-12 08:55:20 +00:00
static int32_t tsdbMemTombIterNext(STsdbIter *iter, const TABLEID *tbid) {
while (!iter->ctx->noMoreData) {
for (; iter->memtTomb->delData;) {
if (tbid && tbid->uid == iter->memtTomb->tbData->uid) {
iter->memtTomb->delData = NULL;
break;
}
iter->record->suid = iter->memtTomb->tbData->suid;
iter->record->uid = iter->memtTomb->tbData->uid;
iter->record->version = iter->memtTomb->delData->version;
iter->record->skey = iter->memtTomb->delData->sKey;
iter->record->ekey = iter->memtTomb->delData->eKey;
iter->memtTomb->delData = iter->memtTomb->delData->pNext;
goto _exit;
}
for (;;) {
SRBTreeNode *node = tRBTreeIterNext(iter->memtTomb->rbtIter);
if (node == NULL) {
iter->ctx->noMoreData = true;
goto _exit;
}
iter->memtTomb->tbData = TCONTAINER_OF(node, STbData, rbtn);
if (tbid && tbid->uid == iter->memtTomb->tbData->uid) {
continue;
} else {
iter->memtTomb->delData = iter->memtTomb->tbData->pHead;
break;
}
}
}
_exit:
return 0;
}
2023-05-30 06:20:15 +00:00
static int32_t tsdbSttIterOpen(STsdbIter *iter) {
int32_t code;
2023-06-12 05:27:02 +00:00
code = tsdbSttFileReadSttBlk(iter->sttData->reader, &iter->sttData->sttBlkArray);
2023-05-30 06:20:15 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
if (TARRAY2_SIZE(iter->sttData->sttBlkArray) == 0) {
2023-05-30 06:20:15 +00:00
iter->ctx->noMoreData = true;
return 0;
}
2023-06-12 05:27:02 +00:00
iter->sttData->sttBlkArrayIdx = 0;
tBlockDataCreate(iter->sttData->blockData);
iter->sttData->blockDataIdx = 0;
2023-05-30 06:20:15 +00:00
return tsdbSttIterNext(iter, NULL);
}
static int32_t tsdbDataIterOpen(STsdbIter *iter) {
int32_t code;
2023-06-09 08:43:09 +00:00
// SBrinBlk
2023-06-12 05:27:02 +00:00
code = tsdbDataFileReadBrinBlk(iter->dataData->reader, &iter->dataData->brinBlkArray);
2023-05-30 06:20:15 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
if (TARRAY2_SIZE(iter->dataData->brinBlkArray) == 0) {
2023-05-30 06:20:15 +00:00
iter->ctx->noMoreData = true;
return 0;
}
2023-06-12 05:27:02 +00:00
iter->dataData->brinBlkArrayIdx = 0;
2023-06-09 08:43:09 +00:00
// SBrinBlock
2023-06-12 05:27:02 +00:00
tBrinBlockInit(iter->dataData->brinBlock);
iter->dataData->brinBlockIdx = 0;
2023-05-30 06:20:15 +00:00
// SBlockData
2023-06-12 05:27:02 +00:00
tBlockDataCreate(iter->dataData->blockData);
iter->dataData->blockDataIdx = 0;
2023-05-30 06:20:15 +00:00
return tsdbDataIterNext(iter, NULL);
}
static int32_t tsdbMemTableIterOpen(STsdbIter *iter) {
2023-06-12 05:27:02 +00:00
iter->memtData->iter[0] = tRBTreeIterCreate(iter->memtData->memt->tbDataTree, 1);
2023-05-30 07:31:11 +00:00
return tsdbMemTableIterNext(iter, NULL);
2023-05-30 06:20:15 +00:00
}
static int32_t tsdbSttIterClose(STsdbIter *iter) {
2023-06-12 05:27:02 +00:00
tBlockDataDestroy(iter->sttData->blockData);
2023-05-30 06:20:15 +00:00
return 0;
}
2023-06-05 10:29:05 +00:00
static int32_t tsdbDataTombIterOpen(STsdbIter *iter) {
int32_t code;
code = tsdbDataFileReadTombBlk(iter->dataTomb->reader, &iter->dataTomb->tombBlkArray);
if (code) return code;
if (TARRAY2_SIZE(iter->dataTomb->tombBlkArray) == 0) {
iter->ctx->noMoreData = true;
return 0;
}
2023-06-09 08:43:09 +00:00
iter->dataTomb->tombBlkArrayIdx = 0;
2023-06-05 10:29:05 +00:00
2023-06-12 05:27:02 +00:00
tTombBlockInit(iter->dataTomb->tombBlock);
iter->dataTomb->tombBlockIdx = 0;
2023-06-05 10:29:05 +00:00
return tsdbDataTombIterNext(iter, NULL);
}
2023-06-12 08:55:20 +00:00
static int32_t tsdbMemTombIterOpen(STsdbIter *iter) {
int32_t code;
iter->memtTomb->rbtIter[0] = tRBTreeIterCreate(iter->memtTomb->memt->tbDataTree, 1);
return tsdbMemTombIterNext(iter, NULL);
}
2023-05-30 06:20:15 +00:00
static int32_t tsdbDataIterClose(STsdbIter *iter) {
2023-06-12 05:27:02 +00:00
tBrinBlockDestroy(iter->dataData->brinBlock);
tBlockDataDestroy(iter->dataData->blockData);
2023-05-30 06:20:15 +00:00
return 0;
}
2023-05-30 07:31:11 +00:00
static int32_t tsdbMemTableIterClose(STsdbIter *iter) { return 0; }
2023-05-30 06:20:15 +00:00
2023-06-05 10:29:05 +00:00
static int32_t tsdbSttTombIterNext(STsdbIter *iter, const TABLEID *tbid) {
while (!iter->ctx->noMoreData) {
2023-06-12 05:27:02 +00:00
for (; iter->sttTomb->tombBlockIdx < TOMB_BLOCK_SIZE(iter->sttTomb->tombBlock); iter->sttTomb->tombBlockIdx++) {
iter->record->suid = TARRAY2_GET(iter->sttTomb->tombBlock->suid, iter->sttTomb->tombBlockIdx);
iter->record->uid = TARRAY2_GET(iter->sttTomb->tombBlock->uid, iter->sttTomb->tombBlockIdx);
2023-06-05 10:29:05 +00:00
if (tbid && iter->record->suid == tbid->suid && iter->record->uid == tbid->uid) {
continue;
}
2023-06-12 05:27:02 +00:00
iter->record->version = TARRAY2_GET(iter->sttTomb->tombBlock->version, iter->sttTomb->tombBlockIdx);
iter->record->skey = TARRAY2_GET(iter->sttTomb->tombBlock->skey, iter->sttTomb->tombBlockIdx);
iter->record->ekey = TARRAY2_GET(iter->sttTomb->tombBlock->ekey, iter->sttTomb->tombBlockIdx);
iter->sttTomb->tombBlockIdx++;
2023-06-05 10:29:05 +00:00
goto _exit;
}
if (iter->sttTomb->tombBlkArrayIdx >= TARRAY2_SIZE(iter->sttTomb->tombBlkArray)) {
iter->ctx->noMoreData = true;
2023-06-12 05:27:02 +00:00
goto _exit;
2023-06-05 10:29:05 +00:00
}
for (; iter->sttTomb->tombBlkArrayIdx < TARRAY2_SIZE(iter->sttTomb->tombBlkArray);
iter->sttTomb->tombBlkArrayIdx++) {
const STombBlk *tombBlk = TARRAY2_GET_PTR(iter->sttTomb->tombBlkArray, iter->sttTomb->tombBlkArrayIdx);
2023-06-08 02:31:19 +00:00
if (tbid && tbid->suid == tombBlk->minTbid.suid && tbid->uid == tombBlk->minTbid.uid &&
tbid->suid == tombBlk->maxTbid.suid && tbid->uid == tombBlk->maxTbid.uid) {
2023-06-05 10:29:05 +00:00
continue;
}
2023-06-12 05:27:02 +00:00
int32_t code = tsdbSttFileReadTombBlock(iter->sttTomb->reader, tombBlk, iter->sttTomb->tombBlock);
2023-06-05 10:29:05 +00:00
if (code) return code;
2023-06-12 05:27:02 +00:00
iter->sttTomb->tombBlockIdx = 0;
2023-06-05 10:29:05 +00:00
iter->sttTomb->tombBlkArrayIdx++;
break;
}
}
_exit:
return 0;
}
static int32_t tsdbSttTombIterOpen(STsdbIter *iter) {
int32_t code;
code = tsdbSttFileReadTombBlk(iter->sttTomb->reader, &iter->sttTomb->tombBlkArray);
if (code) return code;
if (TARRAY2_SIZE(iter->sttTomb->tombBlkArray) == 0) {
iter->ctx->noMoreData = true;
return 0;
}
iter->sttTomb->tombBlkArrayIdx = 0;
2023-06-12 05:27:02 +00:00
tTombBlockInit(iter->sttTomb->tombBlock);
iter->sttTomb->tombBlockIdx = 0;
2023-06-05 10:29:05 +00:00
return tsdbSttTombIterNext(iter, NULL);
}
2023-05-30 06:20:15 +00:00
int32_t tsdbIterOpen(const STsdbIterConfig *config, STsdbIter **iter) {
int32_t code;
iter[0] = taosMemoryCalloc(1, sizeof(*iter[0]));
2023-06-12 05:27:02 +00:00
if (iter[0] == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
}
2023-05-30 06:20:15 +00:00
iter[0]->type = config->type;
iter[0]->ctx->noMoreData = false;
switch (config->type) {
case TSDB_ITER_TYPE_STT:
2023-06-12 05:27:02 +00:00
iter[0]->sttData->reader = config->sttReader;
2023-05-30 06:20:15 +00:00
code = tsdbSttIterOpen(iter[0]);
break;
case TSDB_ITER_TYPE_DATA:
2023-06-12 05:27:02 +00:00
iter[0]->dataData->reader = config->dataReader;
2023-05-30 06:20:15 +00:00
code = tsdbDataIterOpen(iter[0]);
break;
case TSDB_ITER_TYPE_MEMT:
2023-06-12 05:27:02 +00:00
iter[0]->memtData->memt = config->memt;
iter[0]->memtData->from[0] = config->from[0];
2023-05-30 06:20:15 +00:00
code = tsdbMemTableIterOpen(iter[0]);
break;
2023-06-05 10:29:05 +00:00
case TSDB_ITER_TYPE_STT_TOMB:
iter[0]->sttTomb->reader = config->sttReader;
code = tsdbSttTombIterOpen(iter[0]);
break;
case TSDB_ITER_TYPE_DATA_TOMB:
iter[0]->dataTomb->reader = config->dataReader;
code = tsdbDataTombIterOpen(iter[0]);
break;
2023-06-12 08:55:20 +00:00
case TSDB_ITER_TYPE_MEMT_TOMB:
iter[0]->memtTomb->memt = config->memt;
code = tsdbMemTombIterOpen(iter[0]);
break;
2023-05-30 06:20:15 +00:00
default:
2023-06-12 05:27:02 +00:00
code = TSDB_CODE_INVALID_PARA;
2023-06-05 10:29:05 +00:00
ASSERTS(false, "Not implemented");
2023-05-30 06:20:15 +00:00
}
if (code) {
taosMemoryFree(iter[0]);
iter[0] = NULL;
}
return code;
}
2023-06-05 10:29:05 +00:00
static int32_t tsdbSttTombIterClose(STsdbIter *iter) {
2023-06-12 05:27:02 +00:00
tTombBlockDestroy(iter->sttTomb->tombBlock);
2023-06-05 10:29:05 +00:00
return 0;
}
static int32_t tsdbDataTombIterClose(STsdbIter *iter) {
2023-06-12 05:27:02 +00:00
tTombBlockDestroy(iter->dataTomb->tombBlock);
2023-06-05 10:29:05 +00:00
return 0;
}
2023-05-30 06:20:15 +00:00
int32_t tsdbIterClose(STsdbIter **iter) {
switch (iter[0]->type) {
case TSDB_ITER_TYPE_STT:
tsdbSttIterClose(iter[0]);
break;
case TSDB_ITER_TYPE_DATA:
tsdbDataIterClose(iter[0]);
break;
case TSDB_ITER_TYPE_MEMT:
tsdbMemTableIterClose(iter[0]);
break;
2023-06-05 10:29:05 +00:00
case TSDB_ITER_TYPE_STT_TOMB:
tsdbSttTombIterClose(iter[0]);
break;
case TSDB_ITER_TYPE_DATA_TOMB:
tsdbDataTombIterClose(iter[0]);
break;
2023-06-12 08:55:20 +00:00
case TSDB_ITER_TYPE_MEMT_TOMB:
break;
2023-05-30 06:20:15 +00:00
default:
ASSERT(false);
}
taosMemoryFree(iter[0]);
iter[0] = NULL;
return 0;
}
int32_t tsdbIterNext(STsdbIter *iter) {
switch (iter->type) {
case TSDB_ITER_TYPE_STT:
return tsdbSttIterNext(iter, NULL);
case TSDB_ITER_TYPE_DATA:
return tsdbDataIterNext(iter, NULL);
case TSDB_ITER_TYPE_MEMT:
return tsdbMemTableIterNext(iter, NULL);
2023-06-05 10:29:05 +00:00
case TSDB_ITER_TYPE_STT_TOMB:
return tsdbSttTombIterNext(iter, NULL);
case TSDB_ITER_TYPE_DATA_TOMB:
return tsdbDataTombIterNext(iter, NULL);
2023-05-30 06:20:15 +00:00
default:
ASSERT(false);
}
return 0;
}
static int32_t tsdbIterSkipTableData(STsdbIter *iter, const TABLEID *tbid) {
switch (iter->type) {
case TSDB_ITER_TYPE_STT:
return tsdbSttIterNext(iter, tbid);
case TSDB_ITER_TYPE_DATA:
return tsdbDataIterNext(iter, tbid);
case TSDB_ITER_TYPE_MEMT:
return tsdbMemTableIterNext(iter, tbid);
default:
ASSERT(false);
}
2023-05-30 02:43:44 +00:00
return 0;
}
static int32_t tsdbIterCmprFn(const SRBTreeNode *n1, const SRBTreeNode *n2) {
STsdbIter *iter1 = TCONTAINER_OF(n1, STsdbIter, node);
STsdbIter *iter2 = TCONTAINER_OF(n2, STsdbIter, node);
return tRowInfoCmprFn(&iter1->row, &iter2->row);
}
2023-06-05 10:29:05 +00:00
static int32_t tsdbTombIterCmprFn(const SRBTreeNode *n1, const SRBTreeNode *n2) {
STsdbIter *iter1 = TCONTAINER_OF(n1, STsdbIter, node);
STsdbIter *iter2 = TCONTAINER_OF(n2, STsdbIter, node);
if (iter1->record->suid < iter2->record->suid) {
return -1;
} else if (iter1->record->suid > iter2->record->suid) {
return 1;
}
if (iter1->record->uid < iter2->record->uid) {
return -1;
} else if (iter1->record->uid > iter2->record->uid) {
return 1;
}
if (iter1->record->version < iter2->record->version) {
return -1;
} else if (iter1->record->version > iter2->record->version) {
return 1;
}
return 0;
}
2023-05-30 02:43:44 +00:00
// SIterMerger ================
struct SIterMerger {
2023-06-12 05:39:25 +00:00
bool isTomb;
2023-05-30 02:43:44 +00:00
STsdbIter *iter;
SRBTree iterTree[1];
};
2023-06-05 10:29:05 +00:00
int32_t tsdbIterMergerOpen(const TTsdbIterArray *iterArray, SIterMerger **merger, bool isTomb) {
2023-05-30 06:20:15 +00:00
STsdbIter *iter;
SRBTreeNode *node;
2023-05-30 02:43:44 +00:00
merger[0] = taosMemoryCalloc(1, sizeof(*merger[0]));
2023-06-12 05:39:25 +00:00
if (merger[0] == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
}
2023-05-30 02:43:44 +00:00
2023-06-12 05:39:25 +00:00
merger[0]->isTomb = isTomb;
2023-06-05 10:29:05 +00:00
if (isTomb) {
tRBTreeCreate(merger[0]->iterTree, tsdbTombIterCmprFn);
} else {
tRBTreeCreate(merger[0]->iterTree, tsdbIterCmprFn);
}
2023-05-30 02:43:44 +00:00
TARRAY2_FOREACH(iterArray, iter) {
if (iter->ctx->noMoreData) continue;
2023-05-30 06:20:15 +00:00
node = tRBTreePut(merger[0]->iterTree, iter->node);
2023-05-30 02:43:44 +00:00
ASSERT(node);
}
return tsdbIterMergerNext(merger[0]);
}
2023-06-01 07:08:45 +00:00
int32_t tsdbIterMergerClose(SIterMerger **merger) {
2023-05-31 07:19:28 +00:00
if (merger[0]) {
taosMemoryFree(merger[0]);
merger[0] = NULL;
}
2023-05-30 02:43:44 +00:00
return 0;
}
int32_t tsdbIterMergerNext(SIterMerger *merger) {
int32_t code;
int32_t c;
SRBTreeNode *node;
if (merger->iter) {
code = tsdbIterNext(merger->iter);
if (code) return code;
if (merger->iter->ctx->noMoreData) {
merger->iter = NULL;
} else if ((node = tRBTreeMin(merger->iterTree))) {
2023-06-05 10:29:05 +00:00
c = merger->iterTree->cmprFn(merger->iter->node, node);
2023-05-30 02:43:44 +00:00
ASSERT(c);
if (c > 0) {
node = tRBTreePut(merger->iterTree, merger->iter->node);
ASSERT(node);
2023-05-30 06:20:15 +00:00
merger->iter = NULL;
2023-05-30 02:43:44 +00:00
}
}
}
2023-06-12 05:39:25 +00:00
if (merger->iter == NULL && (node = tRBTreeDropMin(merger->iterTree))) {
2023-05-30 02:43:44 +00:00
merger->iter = TCONTAINER_OF(node, STsdbIter, node);
}
return 0;
}
2023-06-12 05:39:25 +00:00
SRowInfo *tsdbIterMergerGetData(SIterMerger *merger) {
ASSERT(!merger->isTomb);
return merger->iter ? merger->iter->row : NULL;
}
STombRecord *tsdbIterMergerGetTombRecord(SIterMerger *merger) {
ASSERT(merger->isTomb);
return merger->iter ? merger->iter->record : NULL;
}
2023-05-30 02:43:44 +00:00
int32_t tsdbIterMergerSkipTableData(SIterMerger *merger, const TABLEID *tbid) {
int32_t code;
int32_t c;
SRBTreeNode *node;
while (merger->iter && tbid->suid == merger->iter->row->suid && tbid->uid == merger->iter->row->uid) {
2023-05-30 06:20:15 +00:00
int32_t code = tsdbIterSkipTableData(merger->iter, tbid);
2023-05-30 02:43:44 +00:00
if (code) return code;
if (merger->iter->ctx->noMoreData) {
merger->iter = NULL;
2023-05-30 06:20:15 +00:00
} else if ((node = tRBTreeMin(merger->iterTree))) {
2023-06-05 10:29:05 +00:00
c = merger->iterTree->cmprFn(merger->iter->node, node);
2023-05-30 02:43:44 +00:00
ASSERT(c);
if (c > 0) {
node = tRBTreePut(merger->iterTree, merger->iter->node);
ASSERT(node);
2023-05-30 06:20:15 +00:00
merger->iter = NULL;
2023-05-30 02:43:44 +00:00
}
}
if (!merger->iter && (node = tRBTreeDropMin(merger->iterTree))) {
merger->iter = TCONTAINER_OF(node, STsdbIter, node);
}
}
2023-05-30 06:20:15 +00:00
2023-05-30 02:43:44 +00:00
return 0;
}