tsdb.h 32.9 KB
Newer Older
L
Liu Jicong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * 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/>.
 */
H
Hongze Cheng 已提交
15 16 17 18

#ifndef _TD_VNODE_TSDB_H_
#define _TD_VNODE_TSDB_H_

H
Haojun Liao 已提交
19
#include "tsimplehash.h"
H
Hongze Cheng 已提交
20 21
#include "vnodeInt.h"

H
Hongze Cheng 已提交
22 23 24 25
#ifdef __cplusplus
extern "C" {
#endif

H
Hongze Cheng 已提交
26 27
// tsdbDebug ================
// clang-format off
H
Hongze Cheng 已提交
28 29 30 31 32 33
#define tsdbFatal(...) do { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TSD FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}     while(0)
#define tsdbError(...) do { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TSD ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}     while(0)
#define tsdbWarn(...)  do { if (tsdbDebugFlag & DEBUG_WARN)  { taosPrintLog("TSD WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}       while(0)
#define tsdbInfo(...)  do { if (tsdbDebugFlag & DEBUG_INFO)  { taosPrintLog("TSD ", DEBUG_INFO, 255, __VA_ARGS__); }}            while(0)
#define tsdbDebug(...) do { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TSD ", DEBUG_DEBUG, tsdbDebugFlag, __VA_ARGS__); }} while(0)
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSD ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
H
Hongze Cheng 已提交
34
// clang-format on
H
Hongze Cheng 已提交
35

H
Hongze Cheng 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
typedef struct TSDBROW          TSDBROW;
typedef struct TABLEID          TABLEID;
typedef struct TSDBKEY          TSDBKEY;
typedef struct SDelData         SDelData;
typedef struct SDelIdx          SDelIdx;
typedef struct STbData          STbData;
typedef struct SMemTable        SMemTable;
typedef struct STbDataIter      STbDataIter;
typedef struct SMapData         SMapData;
typedef struct SBlockIdx        SBlockIdx;
typedef struct SDataBlk         SDataBlk;
typedef struct SSttBlk          SSttBlk;
typedef struct SDiskDataHdr     SDiskDataHdr;
typedef struct SBlockData       SBlockData;
typedef struct SDelFile         SDelFile;
typedef struct SHeadFile        SHeadFile;
typedef struct SDataFile        SDataFile;
typedef struct SSttFile         SSttFile;
typedef struct SSmaFile         SSmaFile;
typedef struct SDFileSet        SDFileSet;
typedef struct SDataFWriter     SDataFWriter;
typedef struct SDataFReader     SDataFReader;
typedef struct SDelFWriter      SDelFWriter;
typedef struct SDelFReader      SDelFReader;
60
typedef struct STSDBRowIter     STSDBRowIter;
H
Hongze Cheng 已提交
61 62 63 64 65 66 67 68 69 70 71
typedef struct STsdbFS          STsdbFS;
typedef struct SRowMerger       SRowMerger;
typedef struct STsdbReadSnap    STsdbReadSnap;
typedef struct SBlockInfo       SBlockInfo;
typedef struct SSmaInfo         SSmaInfo;
typedef struct SBlockCol        SBlockCol;
typedef struct SVersionRange    SVersionRange;
typedef struct SLDataIter       SLDataIter;
typedef struct SDiskCol         SDiskCol;
typedef struct SDiskData        SDiskData;
typedef struct SDiskDataBuilder SDiskDataBuilder;
H
Hongze Cheng 已提交
72
typedef struct SBlkInfo         SBlkInfo;
H
Hongze Cheng 已提交
73 74
typedef struct STsdbDataIter2   STsdbDataIter2;
typedef struct STsdbFilterInfo  STsdbFilterInfo;
H
Hongze Cheng 已提交
75

H
Hongze Cheng 已提交
76 77 78
#define TSDBROW_ROW_FMT ((int8_t)0x0)
#define TSDBROW_COL_FMT ((int8_t)0x1)

H
Hongze Cheng 已提交
79 80 81
#define TSDB_FILE_DLMT     ((uint32_t)0xF00AFA0F)
#define TSDB_MAX_SUBBLOCKS 8
#define TSDB_FHDR_SIZE     512
H
refact  
Hongze Cheng 已提交
82

H
Hongze Cheng 已提交
83 84 85
#define VERSION_MIN 0
#define VERSION_MAX INT64_MAX

H
Hongze Cheng 已提交
86 87 88
#define TSDBKEY_MIN ((TSDBKEY){.ts = TSKEY_MIN, .version = VERSION_MIN})
#define TSDBKEY_MAX ((TSDBKEY){.ts = TSKEY_MAX, .version = VERSION_MAX})

H
Hongze Cheng 已提交
89 90
#define TABLE_SAME_SCHEMA(SUID1, UID1, SUID2, UID2) ((SUID1) ? (SUID1) == (SUID2) : (UID1) == (UID2))

H
Hongze Cheng 已提交
91 92 93 94 95 96
#define PAGE_CONTENT_SIZE(PAGE) ((PAGE) - sizeof(TSCKSUM))
#define LOGIC_TO_FILE_OFFSET(LOFFSET, PAGE) \
  ((LOFFSET) / PAGE_CONTENT_SIZE(PAGE) * (PAGE) + (LOFFSET) % PAGE_CONTENT_SIZE(PAGE))
#define FILE_TO_LOGIC_OFFSET(OFFSET, PAGE) ((OFFSET) / (PAGE)*PAGE_CONTENT_SIZE(PAGE) + (OFFSET) % (PAGE))
#define PAGE_OFFSET(PGNO, PAGE)            (((PGNO)-1) * (PAGE))
#define OFFSET_PGNO(OFFSET, PAGE)          ((OFFSET) / (PAGE) + 1)
H
Hongze Cheng 已提交
97 98 99 100 101

static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) {
  int64_t fOffSet = LOGIC_TO_FILE_OFFSET(lSize, szPage);
  int64_t pgno = OFFSET_PGNO(fOffSet, szPage);

H
Hongze Cheng 已提交
102
  if (fOffSet % szPage == 0) {
H
Hongze Cheng 已提交
103 104 105 106 107
    pgno--;
  }

  return pgno * szPage;
}
H
Hongze Cheng 已提交
108

H
Hongze Cheng 已提交
109
// tsdbUtil.c ==============================================================================================
H
Hongze Cheng 已提交
110
// TSDBROW
H
Hongze Cheng 已提交
111 112 113
#define TSDBROW_TS(ROW) (((ROW)->type == TSDBROW_ROW_FMT) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow])
#define TSDBROW_VERSION(ROW) \
  (((ROW)->type == TSDBROW_ROW_FMT) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow])
H
Hongze Cheng 已提交
114
#define TSDBROW_SVERSION(ROW)            ((ROW)->type == TSDBROW_ROW_FMT ? (ROW)->pTSRow->sver : -1)
H
Hongze Cheng 已提交
115 116 117 118
#define TSDBROW_KEY(ROW)                 ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)})
#define tsdbRowFromTSRow(VERSION, TSROW) ((TSDBROW){.type = TSDBROW_ROW_FMT, .version = (VERSION), .pTSRow = (TSROW)})
#define tsdbRowFromBlockData(BLOCKDATA, IROW) \
  ((TSDBROW){.type = TSDBROW_COL_FMT, .pBlockData = (BLOCKDATA), .iRow = (IROW)})
H
Hongze Cheng 已提交
119 120

void    tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
H
Hongze Cheng 已提交
121
int32_t tsdbRowCmprFn(const void *p1, const void *p2);
122
// STSDBRowIter
H
Hongze Cheng 已提交
123 124
int32_t  tsdbRowIterOpen(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema);
void     tsdbRowClose(STSDBRowIter *pIter);
125
SColVal *tsdbRowIterNext(STSDBRowIter *pIter);
126

H
Hongze Cheng 已提交
127
// SRowMerger
128
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pSchema);
H
Hongze Cheng 已提交
129 130
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow);
131 132
void    tsdbRowMergerClear(SRowMerger *pMerger);
void    tsdbRowMergerCleanup(SRowMerger *pMerger);
H
Haojun Liao 已提交
133

H
Hongze Cheng 已提交
134
// TABLEID
H
Hongze Cheng 已提交
135
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
136
// TSDBKEY
H
Hongze Cheng 已提交
137 138
#define MIN_TSDBKEY(KEY1, KEY2) ((tsdbKeyCmprFn(&(KEY1), &(KEY2)) < 0) ? (KEY1) : (KEY2))
#define MAX_TSDBKEY(KEY1, KEY2) ((tsdbKeyCmprFn(&(KEY1), &(KEY2)) > 0) ? (KEY1) : (KEY2))
H
Hongze Cheng 已提交
139 140 141
// SBlockCol
int32_t tPutBlockCol(uint8_t *p, void *ph);
int32_t tGetBlockCol(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
142
int32_t tBlockColCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
143
// SDataBlk
H
Hongze Cheng 已提交
144
void    tDataBlkReset(SDataBlk *pBlock);
H
Hongze Cheng 已提交
145 146
int32_t tPutDataBlk(uint8_t *p, void *ph);
int32_t tGetDataBlk(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
147 148
int32_t tDataBlkCmprFn(const void *p1, const void *p2);
bool    tDataBlkHasSma(SDataBlk *pDataBlk);
H
Hongze Cheng 已提交
149 150 151
// SSttBlk
int32_t tPutSttBlk(uint8_t *p, void *ph);
int32_t tGetSttBlk(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
152 153 154
// SBlockIdx
int32_t tPutBlockIdx(uint8_t *p, void *ph);
int32_t tGetBlockIdx(uint8_t *p, void *ph);
155
int32_t tCmprBlockIdx(void const *lhs, void const *rhs);
156
int32_t tCmprBlockL(void const *lhs, void const *rhs);
H
Hongze Cheng 已提交
157
// SBlockData
H
Hongze Cheng 已提交
158 159 160 161 162 163 164 165 166 167 168
#define tBlockDataFirstRow(PBLOCKDATA)             tsdbRowFromBlockData(PBLOCKDATA, 0)
#define tBlockDataLastRow(PBLOCKDATA)              tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1)
#define tBlockDataFirstKey(PBLOCKDATA)             TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA))
#define tBlockDataLastKey(PBLOCKDATA)              TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA))
#define tBlockDataGetColDataByIdx(PBLOCKDATA, IDX) (&(PBLOCKDATA)->aColData[IDX])

int32_t tBlockDataCreate(SBlockData *pBlockData);
void    tBlockDataDestroy(SBlockData *pBlockData);
int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid);
void    tBlockDataReset(SBlockData *pBlockData);
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
H
Hongze Cheng 已提交
169
int32_t tBlockDataTryUpsertRow(SBlockData *pBlockData, TSDBROW *pRow, int64_t uid);
H
Hongze Cheng 已提交
170
int32_t tBlockDataUpsertRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
H
Hongze Cheng 已提交
171 172 173 174 175
void    tBlockDataClear(SBlockData *pBlockData);
void    tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, 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[]);
H
Hongze Cheng 已提交
176
// SDiskDataHdr
H
Hongze Cheng 已提交
177
int32_t tPutDiskDataHdr(uint8_t *p, const SDiskDataHdr *pHdr);
H
Hongze Cheng 已提交
178
int32_t tGetDiskDataHdr(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
179
// SDelIdx
H
Hongze Cheng 已提交
180 181
int32_t tPutDelIdx(uint8_t *p, void *ph);
int32_t tGetDelIdx(uint8_t *p, void *ph);
182
int32_t tCmprDelIdx(void const *lhs, void const *rhs);
H
Hongze Cheng 已提交
183
// SDelData
H
Hongze Cheng 已提交
184 185
int32_t tPutDelData(uint8_t *p, void *ph);
int32_t tGetDelData(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
186
// SMapData
H
Hongze Cheng 已提交
187
#define tMapDataInit() ((SMapData){0})
H
Hongze Cheng 已提交
188 189 190
void    tMapDataReset(SMapData *pMapData);
void    tMapDataClear(SMapData *pMapData);
int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(uint8_t *, void *));
H
Hongze Cheng 已提交
191
int32_t tMapDataCopy(SMapData *pFrom, SMapData *pTo);
H
Hongze Cheng 已提交
192
void    tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t (*tGetItemFn)(uint8_t *, void *));
H
Hongze Cheng 已提交
193 194
int32_t tMapDataSearch(SMapData *pMapData, void *pSearchItem, int32_t (*tGetItemFn)(uint8_t *, void *),
                       int32_t (*tItemCmprFn)(const void *, const void *), void *pItem);
H
Hongze Cheng 已提交
195 196
int32_t tPutMapData(uint8_t *p, SMapData *pMapData);
int32_t tGetMapData(uint8_t *p, SMapData *pMapData);
H
Hongze Cheng 已提交
197 198
int32_t tMapDataToArray(SMapData *pMapData, int32_t itemSize, int32_t (*tGetItemFn)(uint8_t *, void *),
                        SArray **ppArray);
H
Hongze Cheng 已提交
199 200 201
// other
int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision);
void    tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey);
H
Hongze Cheng 已提交
202
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
H
Hongze Cheng 已提交
203
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
H
Hongze Cheng 已提交
204 205
int32_t tPutColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
H
Hongze Cheng 已提交
206 207
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);
H
Hongze Cheng 已提交
208 209
int32_t tsdbDecmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t szOut,
                       uint8_t **ppBuf);
H
Hongze Cheng 已提交
210
int32_t tsdbCmprColData(SColData *pColData, int8_t cmprAlg, SBlockCol *pBlockCol, uint8_t **ppOut, int32_t nOut,
H
Hongze Cheng 已提交
211
                        uint8_t **ppBuf);
H
Hongze Cheng 已提交
212 213
int32_t tsdbDecmprColData(uint8_t *pIn, SBlockCol *pBlockCol, int8_t cmprAlg, int32_t nVal, SColData *pColData,
                          uint8_t **ppBuf);
H
Hongze Cheng 已提交
214
int32_t tRowInfoCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
215 216
// tsdbMemTable ==============================================================================================
// SMemTable
H
Hongze Cheng 已提交
217
int32_t  tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable);
H
Hongze Cheng 已提交
218
void     tsdbMemTableDestroy(SMemTable *pMemTable, bool proactive);
H
Hongze Cheng 已提交
219
STbData *tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid);
H
Hongze Cheng 已提交
220
int32_t  tsdbRefMemTable(SMemTable *pMemTable, SQueryNode *pQNode);
H
Hongze Cheng 已提交
221
int32_t  tsdbUnrefMemTable(SMemTable *pMemTable, SQueryNode *pNode, bool proactive);
H
Hongze Cheng 已提交
222
SArray  *tsdbMemTableGetTbDataArray(SMemTable *pMemTable);
H
Hongze Cheng 已提交
223
// STbDataIter
H
Hongze Cheng 已提交
224 225 226 227
int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter **ppIter);
void   *tsdbTbDataIterDestroy(STbDataIter *pIter);
void    tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
bool    tsdbTbDataIterNext(STbDataIter *pIter);
H
Haojun Liao 已提交
228
void    tsdbMemTableCountRows(SMemTable *pMemTable, SSHashObj *pTableMap, int64_t *rowsNum);
D
dapan1121 已提交
229

H
Hongze Cheng 已提交
230 231
// STbData
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
H
Hongze Cheng 已提交
232
// tsdbFile.c ==============================================================================================
H
Hongze Cheng 已提交
233
typedef enum { TSDB_HEAD_FILE = 0, TSDB_DATA_FILE, TSDB_LAST_FILE, TSDB_SMA_FILE } EDataFileT;
H
Hongze Cheng 已提交
234

H
Hongze Cheng 已提交
235
bool    tsdbDelFileIsSame(SDelFile *pDelFile1, SDelFile *pDelFile2);
H
Hongze Cheng 已提交
236
int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype);
H
Hongze Cheng 已提交
237 238
int32_t tPutHeadFile(uint8_t *p, SHeadFile *pHeadFile);
int32_t tPutDataFile(uint8_t *p, SDataFile *pDataFile);
H
Hongze Cheng 已提交
239
int32_t tPutSttFile(uint8_t *p, SSttFile *pSttFile);
H
Hongze Cheng 已提交
240
int32_t tPutSmaFile(uint8_t *p, SSmaFile *pSmaFile);
H
Hongze Cheng 已提交
241 242 243 244
int32_t tPutDelFile(uint8_t *p, SDelFile *pDelFile);
int32_t tGetDelFile(uint8_t *p, SDelFile *pDelFile);
int32_t tPutDFileSet(uint8_t *p, SDFileSet *pSet);
int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet);
H
Hongze Cheng 已提交
245 246 247

void tsdbHeadFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SHeadFile *pHeadF, char fname[]);
void tsdbDataFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SDataFile *pDataF, char fname[]);
H
Hongze Cheng 已提交
248
void tsdbSttFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSttFile *pSttF, char fname[]);
H
Hongze Cheng 已提交
249
void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, char fname[]);
250

H
Hongze Cheng 已提交
251
// SDelFile
H
Hongze Cheng 已提交
252
void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]);
H
Hongze Cheng 已提交
253
// tsdbFS.c ==============================================================================================
H
Hongze Cheng 已提交
254
int32_t tsdbFSOpen(STsdb *pTsdb, int8_t rollback);
H
Hongze Cheng 已提交
255 256 257 258
int32_t tsdbFSClose(STsdb *pTsdb);
int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS);
void    tsdbFSDestroy(STsdbFS *pFS);
int32_t tDFileSetCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
259 260 261
int32_t tsdbFSCommit(STsdb *pTsdb);
int32_t tsdbFSRollback(STsdb *pTsdb);
int32_t tsdbFSPrepareCommit(STsdb *pTsdb, STsdbFS *pFS);
H
Hongze Cheng 已提交
262 263 264 265 266
int32_t tsdbFSRef(STsdb *pTsdb, STsdbFS *pFS);
void    tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS);

int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet);
int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile);
H
Hongze Cheng 已提交
267 268 269
// tsdbReaderWriter.c ==============================================================================================
// SDataFWriter
int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pSet);
H
Hongze Cheng 已提交
270
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
H
Hongze Cheng 已提交
271
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
H
Hongze Cheng 已提交
272
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx);
H
Hongze Cheng 已提交
273
int32_t tsdbWriteDataBlk(SDataFWriter *pWriter, SMapData *mDataBlk, SBlockIdx *pBlockIdx);
H
Hongze Cheng 已提交
274
int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk);
H
Hongze Cheng 已提交
275
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo,
H
Hongze Cheng 已提交
276
                           int8_t cmprAlg, int8_t toLast);
H
Hongze Cheng 已提交
277
int32_t tsdbWriteDiskData(SDataFWriter *pWriter, const SDiskData *pDiskData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo);
H
Hongze Cheng 已提交
278 279

int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo);
H
Hongze Cheng 已提交
280 281
// SDataFReader
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
H
Hongze Cheng 已提交
282
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
H
Hongze Cheng 已提交
283
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx);
H
Hongze Cheng 已提交
284
int32_t tsdbReadDataBlk(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *mDataBlk);
H
Hongze Cheng 已提交
285
int32_t tsdbReadSttBlk(SDataFReader *pReader, int32_t iStt, SArray *aSttBlk);
H
Hongze Cheng 已提交
286 287
int32_t tsdbReadBlockSma(SDataFReader *pReader, SDataBlk *pBlock, SArray *aColumnDataAgg);
int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pBlock, SBlockData *pBlockData);
H
Hongze Cheng 已提交
288
int32_t tsdbReadDataBlockEx(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData *pBlockData);
H
Hongze Cheng 已提交
289
int32_t tsdbReadSttBlock(SDataFReader *pReader, int32_t iStt, SSttBlk *pSttBlk, SBlockData *pBlockData);
H
Hongze Cheng 已提交
290
int32_t tsdbReadSttBlockEx(SDataFReader *pReader, int32_t iStt, SSttBlk *pSttBlk, SBlockData *pBlockData);
H
Hongze Cheng 已提交
291 292
// SDelFWriter
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb);
H
Hongze Cheng 已提交
293
int32_t tsdbDelFWriterClose(SDelFWriter **ppWriter, int8_t sync);
H
Hongze Cheng 已提交
294 295
int32_t tsdbWriteDelData(SDelFWriter *pWriter, SArray *aDelData, SDelIdx *pDelIdx);
int32_t tsdbWriteDelIdx(SDelFWriter *pWriter, SArray *aDelIdx);
H
Hongze Cheng 已提交
296
int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter);
H
Hongze Cheng 已提交
297
// SDelFReader
H
Hongze Cheng 已提交
298
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb);
H
Hongze Cheng 已提交
299
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
H
Haojun Liao 已提交
300 301
int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer);
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData);
H
Hongze Cheng 已提交
302
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx);
H
Hongze Cheng 已提交
303
// tsdbRead.c ==============================================================================================
H
Hongze Cheng 已提交
304
int32_t tsdbTakeReadSnap(STsdbReader *pReader, _query_reseek_func_t reseek, STsdbReadSnap **ppSnap);
305
void    tsdbUntakeReadSnap(STsdbReader *pReader, STsdbReadSnap *pSnap, bool proactive);
H
Hongze Cheng 已提交
306 307
// tsdbMerge.c ==============================================================================================
int32_t tsdbMerge(STsdb *pTsdb);
H
Hongze Cheng 已提交
308

H
Hongze Cheng 已提交
309 310 311 312 313
// tsdbDiskData ==============================================================================================
int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder);
void   *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder);
int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg,
                             uint8_t calcSma);
H
Hongze Cheng 已提交
314 315
int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder);
int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId);
H
Hongze Cheng 已提交
316
int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo **ppBlkInfo);
H
Hongze Cheng 已提交
317 318 319 320 321 322
// tsdbDataIter.c ==============================================================================================
#define TSDB_MEM_TABLE_DATA_ITER 0
#define TSDB_DATA_FILE_DATA_ITER 1
#define TSDB_STT_FILE_DATA_ITER  2
#define TSDB_TOMB_FILE_DATA_ITER 3

H
Hongze Cheng 已提交
323 324 325
#define TSDB_FILTER_FLAG_BY_VERSION           0x1
#define TSDB_FILTER_FLAG_BY_TABLEID           0x2
#define TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE 0x4
H
Hongze Cheng 已提交
326 327 328 329 330 331 332 333 334 335 336 337

#define TSDB_RBTN_TO_DATA_ITER(pNode) ((STsdbDataIter2 *)(((char *)pNode) - offsetof(STsdbDataIter2, rbtn)))
/* open */
int32_t tsdbOpenDataFileDataIter(SDataFReader *pReader, STsdbDataIter2 **ppIter);
int32_t tsdbOpenSttFileDataIter(SDataFReader *pReader, int32_t iStt, STsdbDataIter2 **ppIter);
int32_t tsdbOpenTombFileDataIter(SDelFReader *pReader, STsdbDataIter2 **ppIter);
/* close */
void tsdbCloseDataIter2(STsdbDataIter2 *pIter);
/* cmpr */
int32_t tsdbDataIterCmprFn(const SRBTreeNode *pNode1, const SRBTreeNode *pNode2);
/* next */
int32_t tsdbDataIterNext2(STsdbDataIter2 *pIter, STsdbFilterInfo *pFilterInfo);
H
Hongze Cheng 已提交
338

H
Hongze Cheng 已提交
339
// structs =======================
H
Hongze Cheng 已提交
340 341 342 343 344
struct STsdbFS {
  SDelFile *pDelFile;
  SArray   *aDFileSet;  // SArray<SDFileSet>
};

345
typedef struct {
346 347 348 349 350 351 352 353 354
  rocksdb_t                           *db;
  rocksdb_comparator_t                *my_comparator;
  rocksdb_cache_t                     *blockcache;
  rocksdb_block_based_table_options_t *tableoptions;
  rocksdb_options_t                   *options;
  rocksdb_flushoptions_t              *flushoptions;
  rocksdb_writeoptions_t              *writeoptions;
  rocksdb_readoptions_t               *readoptions;
  rocksdb_writebatch_t                *writebatch;
355
  rocksdb_writebatch_t                *rwritebatch;
356 357
  TdThreadMutex                        rMutex;
  STSchema                            *pTSchema;
358 359
} SRocksCache;

H
Hongze Cheng 已提交
360
struct STsdb {
H
Hongze Cheng 已提交
361 362 363
  char          *path;
  SVnode        *pVnode;
  STsdbKeepCfg   keepCfg;
H
more  
Hongze Cheng 已提交
364
  TdThreadRwlock rwLock;
H
Hongze Cheng 已提交
365 366
  SMemTable     *mem;
  SMemTable     *imem;
H
Hongze Cheng 已提交
367
  STsdbFS        fs;
H
Hongze Cheng 已提交
368
  SLRUCache     *lruCache;
369
  TdThreadMutex  lruMutex;
370 371
  SLRUCache     *biCache;
  TdThreadMutex  biMutex;
372
  SRocksCache    rCache;
H
Hongze Cheng 已提交
373 374
};

H
refact  
Hongze Cheng 已提交
375 376 377 378 379
struct TSDBKEY {
  int64_t version;
  TSKEY   ts;
};

380 381 382 383 384
struct SVersionRange {
  uint64_t minVer;
  uint64_t maxVer;
};

H
Hongze Cheng 已提交
385 386 387
typedef struct SMemSkipListNode SMemSkipListNode;
struct SMemSkipListNode {
  int8_t            level;
H
Hongze Cheng 已提交
388 389
  int8_t            flag;  // TSDBROW_ROW_FMT for row format, TSDBROW_COL_FMT for col format
  int32_t           iRow;
H
Hongze Cheng 已提交
390
  int64_t           version;
H
Hongze Cheng 已提交
391
  void             *pData;
H
Hongze Cheng 已提交
392 393
  SMemSkipListNode *forwards[0];
};
H
Hongze Cheng 已提交
394

H
Hongze Cheng 已提交
395 396
typedef struct SMemSkipList {
  int64_t           size;
H
Hongze Cheng 已提交
397
  uint32_t          seed;
H
Hongze Cheng 已提交
398 399 400 401 402 403
  int8_t            maxLevel;
  int8_t            level;
  SMemSkipListNode *pHead;
  SMemSkipListNode *pTail;
} SMemSkipList;

H
Hongze Cheng 已提交
404
struct STbData {
H
Hongze Cheng 已提交
405 406
  tb_uid_t     suid;
  tb_uid_t     uid;
H
Hongze Cheng 已提交
407 408
  TSKEY        minKey;
  TSKEY        maxKey;
H
Hongze Cheng 已提交
409 410
  SDelData    *pHead;
  SDelData    *pTail;
H
Hongze Cheng 已提交
411
  SMemSkipList sl;
H
Hongze Cheng 已提交
412
  STbData     *next;
H
Hongze Cheng 已提交
413
};
H
Hongze Cheng 已提交
414

H
refact  
Hongze Cheng 已提交
415
struct SMemTable {
H
Hongze Cheng 已提交
416 417 418 419
  SRWLatch         latch;
  STsdb           *pTsdb;
  SVBufPool       *pPool;
  volatile int32_t nRef;
H
Hongze Cheng 已提交
420 421
  int64_t          minVer;
  int64_t          maxVer;
H
Hongze Cheng 已提交
422 423 424 425
  TSKEY            minKey;
  TSKEY            maxKey;
  int64_t          nRow;
  int64_t          nDel;
H
Hongze Cheng 已提交
426 427 428 429 430
  struct {
    int32_t   nTbData;
    int32_t   nBucket;
    STbData **aBucket;
  };
H
Hongze Cheng 已提交
431
};
H
Hongze Cheng 已提交
432

H
Hongze Cheng 已提交
433
struct TSDBROW {
H
Hongze Cheng 已提交
434
  int8_t type;  // TSDBROW_ROW_FMT for row from tsRow, TSDBROW_COL_FMT for row from block data
H
Hongze Cheng 已提交
435 436 437
  union {
    struct {
      int64_t version;
H
Hongze Cheng 已提交
438
      SRow   *pTSRow;
H
Hongze Cheng 已提交
439 440
    };
    struct {
H
Hongze Cheng 已提交
441 442
      SBlockData *pBlockData;
      int32_t     iRow;
H
Hongze Cheng 已提交
443 444
    };
  };
H
Hongze Cheng 已提交
445 446
};

H
Hongze Cheng 已提交
447
struct SBlockIdx {
H
Hongze Cheng 已提交
448 449
  int64_t suid;
  int64_t uid;
H
Hongze Cheng 已提交
450 451 452 453
  int64_t offset;
  int64_t size;
};

H
Hongze Cheng 已提交
454 455
struct SMapData {
  int32_t  nItem;
H
Hongze Cheng 已提交
456
  int32_t  nData;
457
  int32_t *aOffset;
H
Hongze Cheng 已提交
458 459 460
  uint8_t *pData;
};

H
Hongze Cheng 已提交
461
struct SBlockCol {
H
Hongze Cheng 已提交
462 463 464 465 466 467 468 469 470
  int16_t cid;
  int8_t  type;
  int8_t  smaOn;
  int8_t  flag;      // HAS_NONE|HAS_NULL|HAS_VALUE
  int32_t szOrigin;  // original column value size (only save for variant data type)
  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;
H
Hongze Cheng 已提交
471
};
H
Hongze Cheng 已提交
472

H
Hongze Cheng 已提交
473
struct SBlockInfo {
H
Hongze Cheng 已提交
474 475 476
  int64_t offset;  // block data offset
  int32_t szBlock;
  int32_t szKey;
H
Hongze Cheng 已提交
477
};
H
Hongze Cheng 已提交
478

H
Hongze Cheng 已提交
479
struct SSmaInfo {
H
Hongze Cheng 已提交
480 481
  int64_t offset;
  int32_t size;
H
Hongze Cheng 已提交
482
};
H
Hongze Cheng 已提交
483

H
Hongze Cheng 已提交
484
struct SBlkInfo {
H
Hongze Cheng 已提交
485 486
  int64_t minUid;
  int64_t maxUid;
H
Hongze Cheng 已提交
487 488
  TSKEY   minKey;
  TSKEY   maxKey;
H
Hongze Cheng 已提交
489 490
  int64_t minVer;
  int64_t maxVer;
H
Hongze Cheng 已提交
491 492 493
  TSDBKEY minTKey;
  TSDBKEY maxTKey;
};
H
Hongze Cheng 已提交
494

H
Hongze Cheng 已提交
495
struct SDataBlk {
H
Hongze Cheng 已提交
496 497 498 499 500 501 502 503 504
  TSDBKEY    minKey;
  TSDBKEY    maxKey;
  int64_t    minVer;
  int64_t    maxVer;
  int32_t    nRow;
  int8_t     hasDup;
  int8_t     nSubBlock;
  SBlockInfo aSubBlock[TSDB_MAX_SUBBLOCKS];
  SSmaInfo   smaInfo;
H
refact  
Hongze Cheng 已提交
505
};
H
Hongze Cheng 已提交
506

H
Hongze Cheng 已提交
507
struct SSttBlk {
H
Hongze Cheng 已提交
508 509 510
  int64_t    suid;
  int64_t    minUid;
  int64_t    maxUid;
H
Hongze Cheng 已提交
511 512
  TSKEY      minKey;
  TSKEY      maxKey;
H
Hongze Cheng 已提交
513 514 515 516
  int64_t    minVer;
  int64_t    maxVer;
  int32_t    nRow;
  SBlockInfo bInfo;
H
Hongze Cheng 已提交
517 518
};

H
Hongze Cheng 已提交
519 520 521 522
// (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
H
Hongze Cheng 已提交
523
struct SBlockData {
H
Hongze Cheng 已提交
524 525 526 527 528 529 530 531
  int64_t   suid;      // 0 means normal table block data, otherwise child table block data
  int64_t   uid;       // 0 means block data in .last file, otherwise in .data file
  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
  int32_t   nColData;
  SColData *aColData;
H
Hongze Cheng 已提交
532
};
H
Hongze Cheng 已提交
533

H
Hongze Cheng 已提交
534 535 536 537 538
struct TABLEID {
  tb_uid_t suid;
  tb_uid_t uid;
};

H
Hongze Cheng 已提交
539 540 541 542
struct STbDataIter {
  STbData          *pTbData;
  int8_t            backward;
  SMemSkipListNode *pNode;
H
Hongze Cheng 已提交
543 544
  TSDBROW          *pRow;
  TSDBROW           row;
H
Hongze Cheng 已提交
545 546
};

H
Hongze Cheng 已提交
547
struct SDelData {
H
Hongze Cheng 已提交
548 549 550 551
  int64_t   version;
  TSKEY     sKey;
  TSKEY     eKey;
  SDelData *pNext;
H
Hongze Cheng 已提交
552
};
H
Hongze Cheng 已提交
553

H
Hongze Cheng 已提交
554
struct SDelIdx {
H
Hongze Cheng 已提交
555 556 557 558
  tb_uid_t suid;
  tb_uid_t uid;
  int64_t  offset;
  int64_t  size;
H
Hongze Cheng 已提交
559
};
H
Hongze Cheng 已提交
560

H
Hongze Cheng 已提交
561
struct SDiskDataHdr {
H
more  
Hongze Cheng 已提交
562
  uint32_t delimiter;
H
Hongze Cheng 已提交
563
  uint32_t fmtVer;
H
more  
Hongze Cheng 已提交
564 565
  int64_t  suid;
  int64_t  uid;
H
Hongze Cheng 已提交
566 567 568 569
  int32_t  szUid;
  int32_t  szVer;
  int32_t  szKey;
  int32_t  szBlkCol;
H
Hongze Cheng 已提交
570
  int32_t  nRow;
H
Hongze Cheng 已提交
571
  int8_t   cmprAlg;
H
Hongze Cheng 已提交
572 573
};

H
Hongze Cheng 已提交
574 575 576 577 578 579 580 581
struct SDelFile {
  volatile int32_t nRef;

  int64_t commitID;
  int64_t size;
  int64_t offset;
};

H
Hongze Cheng 已提交
582
struct SHeadFile {
H
Hongze Cheng 已提交
583 584
  volatile int32_t nRef;

H
Hongze Cheng 已提交
585
  int64_t commitID;
H
Hongze Cheng 已提交
586 587 588 589 590
  int64_t size;
  int64_t offset;
};

struct SDataFile {
H
Hongze Cheng 已提交
591 592
  volatile int32_t nRef;

H
Hongze Cheng 已提交
593
  int64_t commitID;
H
Hongze Cheng 已提交
594 595 596
  int64_t size;
};

H
Hongze Cheng 已提交
597
struct SSttFile {
H
Hongze Cheng 已提交
598 599
  volatile int32_t nRef;

H
Hongze Cheng 已提交
600
  int64_t commitID;
H
Hongze Cheng 已提交
601
  int64_t size;
H
Hongze Cheng 已提交
602
  int64_t offset;
H
Hongze Cheng 已提交
603 604 605
};

struct SSmaFile {
H
Hongze Cheng 已提交
606 607
  volatile int32_t nRef;

H
Hongze Cheng 已提交
608
  int64_t commitID;
H
Hongze Cheng 已提交
609 610 611 612
  int64_t size;
};

struct SDFileSet {
H
Hongze Cheng 已提交
613 614 615 616 617
  SDiskID    diskId;
  int32_t    fid;
  SHeadFile *pHeadF;
  SDataFile *pDataF;
  SSmaFile  *pSmaF;
H
Hongze Cheng 已提交
618
  uint8_t    nSttF;
H
Hongze Cheng 已提交
619
  SSttFile  *aSttF[TSDB_MAX_STT_TRIGGER];
H
Hongze Cheng 已提交
620 621
};

622
struct STSDBRowIter {
H
Hongze Cheng 已提交
623 624 625 626 627 628 629 630
  TSDBROW *pRow;
  union {
    SRowIter *pIter;
    struct {
      int32_t iColData;
      SColVal cv;
    };
  };
H
Hongze Cheng 已提交
631
};
H
Hongze Cheng 已提交
632 633 634 635 636
struct SRowMerger {
  STSchema *pTSchema;
  int64_t   version;
  SArray   *pArray;  // SArray<SColVal>
};
H
Hongze Cheng 已提交
637

H
more  
Hongze Cheng 已提交
638
typedef struct {
H
Hongze Cheng 已提交
639
  char     *path;
H
more  
Hongze Cheng 已提交
640
  int32_t   szPage;
H
Hongze Cheng 已提交
641 642 643
  int32_t   flag;
  TdFilePtr pFD;
  int64_t   pgno;
H
more  
Hongze Cheng 已提交
644
  uint8_t  *pBuf;
H
Hongze Cheng 已提交
645
  int64_t   szFile;
H
more  
Hongze Cheng 已提交
646
} STsdbFD;
H
Hongze Cheng 已提交
647

H
Hongze Cheng 已提交
648 649 650 651
struct SDelFWriter {
  STsdb   *pTsdb;
  SDelFile fDel;
  STsdbFD *pWriteH;
H
Hongze Cheng 已提交
652
  uint8_t *aBuf[1];
H
Hongze Cheng 已提交
653 654
};

H
Hongze Cheng 已提交
655
struct STsdbReadSnap {
H
Hongze Cheng 已提交
656 657 658 659 660
  SMemTable  *pMem;
  SQueryNode *pNode;
  SMemTable  *pIMem;
  SQueryNode *pINode;
  STsdbFS     fs;
H
Hongze Cheng 已提交
661 662
};

H
Hongze Cheng 已提交
663 664 665 666
struct SDataFWriter {
  STsdb    *pTsdb;
  SDFileSet wSet;

H
Hongze Cheng 已提交
667 668 669
  STsdbFD *pHeadFD;
  STsdbFD *pDataFD;
  STsdbFD *pSmaFD;
H
Hongze Cheng 已提交
670
  STsdbFD *pSttFD;
H
Hongze Cheng 已提交
671 672 673 674

  SHeadFile fHead;
  SDataFile fData;
  SSmaFile  fSma;
H
Hongze Cheng 已提交
675
  SSttFile  fStt[TSDB_MAX_STT_TRIGGER];
H
Hongze Cheng 已提交
676

H
Hongze Cheng 已提交
677
  uint8_t *aBuf[4];
H
Hongze Cheng 已提交
678 679
};

H
Hongze Cheng 已提交
680 681 682
struct SDataFReader {
  STsdb     *pTsdb;
  SDFileSet *pSet;
H
Hongze Cheng 已提交
683 684 685
  STsdbFD   *pHeadFD;
  STsdbFD   *pDataFD;
  STsdbFD   *pSmaFD;
H
Hongze Cheng 已提交
686
  STsdbFD   *aSttFD[TSDB_MAX_STT_TRIGGER];
H
Hongze Cheng 已提交
687
  uint8_t   *aBuf[3];
H
Hongze Cheng 已提交
688 689
};

H
Hongze Cheng 已提交
690
// NOTE: do NOT change the order of the fields
H
Hongze Cheng 已提交
691 692 693 694 695 696
typedef struct {
  int64_t suid;
  int64_t uid;
  TSDBROW row;
} SRowInfo;

697
typedef struct SSttBlockLoadInfo {
H
Hongze Cheng 已提交
698 699 700 701 702 703
  SBlockData blockData[2];
  SArray    *aSttBlk;
  int32_t    blockIndex[2];  // to denote the loaded block in the corresponding position.
  int32_t    currentLoadBlockIndex;
  int32_t    loadBlocks;
  double     elapsedTime;
704 705 706
  STSchema  *pSchema;
  int16_t   *colIds;
  int32_t    numOfCols;
707 708
  bool       checkRemainingRow;
  bool       isLast;
709
  bool       sttBlockLoaded;
710
  int32_t    numOfStt;
H
Haojun Liao 已提交
711 712 713 714 715 716 717

  // keep the last access position, this position may be used to reduce the binary times for
  // starting last block data for a new table
  struct {
    int32_t blockIndex;
    int32_t rowIndex;
  } prevEndPos;
718 719
} SSttBlockLoadInfo;

720
typedef struct SMergeTree {
H
Hongze Cheng 已提交
721 722 723 724 725 726
  int8_t             backward;
  SRBTree            rbt;
  SLDataIter        *pIter;
  bool               destroyLoadInfo;
  SSttBlockLoadInfo *pLoadInfo;
  const char        *idStr;
727
  bool               ignoreEarlierTs;
728 729
} SMergeTree;

H
Hongze Cheng 已提交
730 731 732 733 734 735
typedef struct {
  int64_t   suid;
  int64_t   uid;
  STSchema *pTSchema;
} SSkmInfo;

H
Hongze Cheng 已提交
736 737 738 739 740
struct SDiskCol {
  SBlockCol      bCol;
  const uint8_t *pBit;
  const uint8_t *pOff;
  const uint8_t *pVal;
H
Hongze Cheng 已提交
741
  SColumnDataAgg agg;
H
Hongze Cheng 已提交
742 743 744 745 746 747 748 749 750 751
};

struct SDiskData {
  SDiskDataHdr   hdr;
  const uint8_t *pUid;
  const uint8_t *pVer;
  const uint8_t *pKey;
  SArray        *aDiskCol;  // SArray<SDiskCol>
};

H
Hongze Cheng 已提交
752 753 754 755 756 757 758 759 760 761 762 763
struct SDiskDataBuilder {
  int64_t      suid;
  int64_t      uid;
  int32_t      nRow;
  uint8_t      cmprAlg;
  uint8_t      calcSma;
  SCompressor *pUidC;
  SCompressor *pVerC;
  SCompressor *pKeyC;
  int32_t      nBuilder;
  SArray      *aBuilder;  // SArray<SDiskColBuilder>
  uint8_t     *aBuf[2];
H
Hongze Cheng 已提交
764
  SDiskData    dd;
H
Hongze Cheng 已提交
765
  SBlkInfo     bi;
H
Hongze Cheng 已提交
766 767
};

768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
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;

784
#define tMergeTreeGetRow(_t) (&((_t)->pIter->rInfo.row))
H
Haojun Liao 已提交
785
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
786
                       STimeWindow *pTimeWindow, SVersionRange *pVerRange, SSttBlockLoadInfo *pBlockLoadInfo,
787
                       bool destroyLoadInfo, const char *idStr, bool strictTimeRange, SLDataIter *pLDataIter);
H
Hongze Cheng 已提交
788
void    tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter);
H
Hongze Cheng 已提交
789
bool    tMergeTreeNext(SMergeTree *pMTree);
790
bool    tMergeTreeIgnoreEarlierTs(SMergeTree *pMTree);
H
refact  
Hongze Cheng 已提交
791
void    tMergeTreeClose(SMergeTree *pMTree);
792

793
SSttBlockLoadInfo *tCreateLastBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols, int32_t numOfStt);
H
Hongze Cheng 已提交
794 795 796
void               resetLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
void               getLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo, int64_t *blocks, double *el);
void              *destroyLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
797

798 799
// tsdbCache ==============================================================================================
typedef struct SCacheRowsReader {
800 801 802
  STsdb             *pTsdb;
  SVersionRange      verRange;
  TdThreadMutex      readerMutex;
H
Haojun Liao 已提交
803 804
  SVnode            *pVnode;
  STSchema          *pSchema;
805
  STSchema          *pCurrSchema;
H
Haojun Liao 已提交
806 807 808 809
  uint64_t           uid;
  uint64_t           suid;
  char             **transferBuf;  // todo remove it soon
  int32_t            numOfCols;
810
  SArray            *pCidList;
M
Minglei Jin 已提交
811
  int32_t           *pSlotIds;
H
Haojun Liao 已提交
812 813
  int32_t            type;
  int32_t            tableIndex;  // currently returned result tables
814 815
  STableKeyInfo     *pTableList;  // table id list
  int32_t            numOfTables;
816
  SSttBlockLoadInfo *pLoadInfo;
817
  SLDataIter        *pDataIter;
818 819
  STsdbReadSnap     *pReadSnap;
  SDataFReader      *pDataFReader;
820
  SDataFReader      *pDataFReaderLast;
H
Haojun Liao 已提交
821
  const char        *idstr;
822
  int64_t            lastTs;
823 824 825 826
} SCacheRowsReader;

typedef struct {
  TSKEY   ts;
827
  int8_t  dirty;
828 829 830 831 832
  SColVal colVal;
} SLastCol;

int32_t tsdbOpenCache(STsdb *pTsdb);
void    tsdbCloseCache(STsdb *pTsdb);
833
int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *row);
834 835
int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCacheRowsReader *pr, int8_t ltype);
int32_t tsdbCacheGet(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCacheRowsReader *pr, int8_t ltype);
836 837
int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey);

H
Hongze Cheng 已提交
838 839
int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, TSDBROW *row, STsdb *pTsdb);
int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, TSDBROW *row, bool dup);
840 841 842 843
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h);
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h);
int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h);

844 845 846
int32_t tsdbCacheGetBlockIdx(SLRUCache *pCache, SDataFReader *pFileReader, LRUHandle **handle);
int32_t tsdbBICacheRelease(SLRUCache *pCache, LRUHandle *h);

847 848 849 850
int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);

H
Hongze Cheng 已提交
851
// int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);
852

853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
// ========== inline functions ==========
static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) {
  TSDBKEY *pKey1 = (TSDBKEY *)p1;
  TSDBKEY *pKey2 = (TSDBKEY *)p2;

  if (pKey1->ts < pKey2->ts) {
    return -1;
  } else if (pKey1->ts > pKey2->ts) {
    return 1;
  }

  if (pKey1->version < pKey2->version) {
    return -1;
  } else if (pKey1->version > pKey2->version) {
    return 1;
  }

  return 0;
}

H
Hongze Cheng 已提交
873 874
// #define SL_NODE_FORWARD(n, l)  ((n)->forwards[l])
// #define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
H
Hongze Cheng 已提交
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893

static FORCE_INLINE TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) {
  if (pIter == NULL) return NULL;

  if (pIter->pRow) {
    return pIter->pRow;
  }

  if (pIter->backward) {
    if (pIter->pNode == pIter->pTbData->sl.pHead) {
      return NULL;
    }
  } else {
    if (pIter->pNode == pIter->pTbData->sl.pTail) {
      return NULL;
    }
  }

  pIter->pRow = &pIter->row;
H
Hongze Cheng 已提交
894 895 896 897 898 899 900
  if (pIter->pNode->flag == TSDBROW_ROW_FMT) {
    pIter->row = tsdbRowFromTSRow(pIter->pNode->version, pIter->pNode->pData);
  } else if (pIter->pNode->flag == TSDBROW_COL_FMT) {
    pIter->row = tsdbRowFromBlockData(pIter->pNode->pData, pIter->pNode->iRow);
  } else {
    ASSERT(0);
  }
H
Hongze Cheng 已提交
901 902 903 904

  return pIter->pRow;
}

H
Hongze Cheng 已提交
905 906
int32_t tRowInfoCmprFn(const void *p1, const void *p2);

H
Hongze Cheng 已提交
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960
typedef struct {
  int64_t  suid;
  int64_t  uid;
  SDelData delData;
} SDelInfo;

struct STsdbDataIter2 {
  STsdbDataIter2 *next;
  SRBTreeNode     rbtn;

  int32_t  type;
  SRowInfo rowInfo;
  SDelInfo delInfo;
  union {
    // TSDB_MEM_TABLE_DATA_ITER
    struct {
      SMemTable *pMemTable;
    } mIter;

    // TSDB_DATA_FILE_DATA_ITER
    struct {
      SDataFReader *pReader;
      SArray       *aBlockIdx;  // SArray<SBlockIdx>
      SMapData      mDataBlk;
      SBlockData    bData;
      int32_t       iBlockIdx;
      int32_t       iDataBlk;
      int32_t       iRow;
    } dIter;

    // TSDB_STT_FILE_DATA_ITER
    struct {
      SDataFReader *pReader;
      int32_t       iStt;
      SArray       *aSttBlk;
      SBlockData    bData;
      int32_t       iSttBlk;
      int32_t       iRow;
    } sIter;
    // TSDB_TOMB_FILE_DATA_ITER
    struct {
      SDelFReader *pReader;
      SArray      *aDelIdx;
      SArray      *aDelData;
      int32_t      iDelIdx;
      int32_t      iDelData;
    } tIter;
  };
};

struct STsdbFilterInfo {
  int32_t flag;
  int64_t sver;
  int64_t ever;
H
Hongze Cheng 已提交
961
  TABLEID tbid;
H
Hongze Cheng 已提交
962 963
};

H
Hongze Cheng 已提交
964 965 966 967
#ifdef __cplusplus
}
#endif

968
#endif /*_TD_VNODE_TSDB_H_*/