tsdb.h 19.8 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
Hongze Cheng 已提交
19 20
#include "vnodeInt.h"

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

H
Hongze Cheng 已提交
25 26
// tsdbDebug ================
// clang-format off
H
Hongze Cheng 已提交
27 28 29 30 31 32
#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 已提交
33
// clang-format on
H
Hongze Cheng 已提交
34

H
Hongze Cheng 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
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 SBlock        SBlock;
typedef struct SColData      SColData;
typedef struct SBlockDataHdr SBlockDataHdr;
typedef struct SBlockData    SBlockData;
typedef struct SDelFile      SDelFile;
typedef struct SHeadFile     SHeadFile;
typedef struct SDataFile     SDataFile;
typedef struct SLastFile     SLastFile;
typedef struct SSmaFile      SSmaFile;
typedef struct SDFileSet     SDFileSet;
typedef struct SDataFWriter  SDataFWriter;
typedef struct SDataFReader  SDataFReader;
typedef struct SDelFWriter   SDelFWriter;
typedef struct SDelFReader   SDelFReader;
typedef struct SRowIter      SRowIter;
typedef struct STsdbFS       STsdbFS;
typedef struct SRowMerger    SRowMerger;
H
Hongze Cheng 已提交
62
typedef struct STsdbReadSnap STsdbReadSnap;
H
Hongze Cheng 已提交
63

H
Hongze Cheng 已提交
64
#define TSDB_MAX_SUBBLOCKS 8
H
Hongze Cheng 已提交
65
#define TSDB_FHDR_SIZE     512
H
refact  
Hongze Cheng 已提交
66

H
Hongze Cheng 已提交
67 68 69
#define HAS_NONE  ((int8_t)0x1)
#define HAS_NULL  ((int8_t)0x2)
#define HAS_VALUE ((int8_t)0x4)
H
Hongze Cheng 已提交
70

H
Hongze Cheng 已提交
71 72 73
#define VERSION_MIN 0
#define VERSION_MAX INT64_MAX

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

H
Hongze Cheng 已提交
77
// tsdbUtil.c ==============================================================================================
H
Hongze Cheng 已提交
78
// TSDBROW
H
Hongze Cheng 已提交
79 80
#define TSDBROW_TS(ROW)                       (((ROW)->type == 0) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow])
#define TSDBROW_VERSION(ROW)                  (((ROW)->type == 0) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow])
H
Hongze Cheng 已提交
81
#define TSDBROW_SVERSION(ROW)                 TD_ROW_SVER((ROW)->pTSRow)
H
Hongze Cheng 已提交
82
#define TSDBROW_KEY(ROW)                      ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)})
H
Hongze Cheng 已提交
83 84
#define tsdbRowFromTSRow(VERSION, TSROW)      ((TSDBROW){.type = 0, .version = (VERSION), .pTSRow = (TSROW)})
#define tsdbRowFromBlockData(BLOCKDATA, IROW) ((TSDBROW){.type = 1, .pBlockData = (BLOCKDATA), .iRow = (IROW)})
H
Hongze Cheng 已提交
85 86 87
void    tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow);
H
Hongze Cheng 已提交
88
int32_t tsdbRowCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
89
// SRowIter
H
Hongze Cheng 已提交
90
void     tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema);
H
Hongze Cheng 已提交
91
SColVal *tRowIterNext(SRowIter *pIter);
H
Hongze Cheng 已提交
92 93 94 95 96
// SRowMerger
int32_t tRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
void    tRowMergerClear(SRowMerger *pMerger);
int32_t tRowMerge(SRowMerger *pMerger, TSDBROW *pRow);
int32_t tRowMergerGetRow(SRowMerger *pMerger, STSRow **ppRow);
H
Hongze Cheng 已提交
97
// TABLEID
H
Hongze Cheng 已提交
98
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
99
// TSDBKEY
H
Hongze Cheng 已提交
100
int32_t tsdbKeyCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
101 102
#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 已提交
103 104 105
// SBlockCol
int32_t tPutBlockCol(uint8_t *p, void *ph);
int32_t tGetBlockCol(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
106
int32_t tBlockColCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
107
// SBlock
H
Hongze Cheng 已提交
108
void    tBlockReset(SBlock *pBlock);
H
Hongze Cheng 已提交
109 110
int32_t tPutBlock(uint8_t *p, void *ph);
int32_t tGetBlock(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
111
int32_t tBlockCmprFn(const void *p1, const void *p2);
H
Hongze Cheng 已提交
112
bool    tBlockHasSma(SBlock *pBlock);
H
Hongze Cheng 已提交
113 114 115
// SBlockIdx
int32_t tPutBlockIdx(uint8_t *p, void *ph);
int32_t tGetBlockIdx(uint8_t *p, void *ph);
116
int32_t tCmprBlockIdx(void const *lhs, void const *rhs);
H
Hongze Cheng 已提交
117
// SColdata
H
Hongze Cheng 已提交
118 119
void    tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t smaOn);
void    tColDataReset(SColData *pColData);
H
Hongze Cheng 已提交
120
void    tColDataClear(void *ph);
H
Hongze Cheng 已提交
121
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal);
H
Hongze Cheng 已提交
122
int32_t tColDataGetValue(SColData *pColData, int32_t iRow, SColVal *pColVal);
H
Hongze Cheng 已提交
123
int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest);
H
Hongze Cheng 已提交
124 125
int32_t tPutColData(uint8_t *p, SColData *pColData);
int32_t tGetColData(uint8_t *p, SColData *pColData);
H
Hongze Cheng 已提交
126
// SBlockData
H
Hongze Cheng 已提交
127 128
#define tBlockDataFirstRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, 0)
#define tBlockDataLastRow(PBLOCKDATA)  tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1)
H
Hongze Cheng 已提交
129 130
#define tBlockDataFirstKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA))
#define tBlockDataLastKey(PBLOCKDATA)  TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA))
H
Hongze Cheng 已提交
131 132 133
int32_t   tBlockDataInit(SBlockData *pBlockData);
void      tBlockDataReset(SBlockData *pBlockData);
int32_t   tBlockDataSetSchema(SBlockData *pBlockData, STSchema *pTSchema);
H
Hongze Cheng 已提交
134
int32_t   tBlockDataCorrectSchema(SBlockData *pBlockData, SBlockData *pBlockDataFrom);
H
Hongze Cheng 已提交
135
void      tBlockDataClearData(SBlockData *pBlockData);
H
Hongze Cheng 已提交
136
void      tBlockDataClear(SBlockData *pBlockData, int8_t deepClear);
H
Hongze Cheng 已提交
137 138 139 140 141 142
int32_t   tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData);
int32_t   tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema);
int32_t   tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
int32_t   tBlockDataCopy(SBlockData *pBlockDataSrc, SBlockData *pBlockDataDest);
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
void      tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
H
Hongze Cheng 已提交
143 144
int32_t   tPutBlockData(uint8_t *p, SBlockData *pBlockData);
int32_t   tGetBlockData(uint8_t *p, SBlockData *pBlockData);
H
Hongze Cheng 已提交
145
// SDelIdx
H
Hongze Cheng 已提交
146 147
int32_t tPutDelIdx(uint8_t *p, void *ph);
int32_t tGetDelIdx(uint8_t *p, void *ph);
148
int32_t tCmprDelIdx(void const *lhs, void const *rhs);
H
Hongze Cheng 已提交
149
// SDelData
H
Hongze Cheng 已提交
150 151
int32_t tPutDelData(uint8_t *p, void *ph);
int32_t tGetDelData(uint8_t *p, void *ph);
H
Hongze Cheng 已提交
152
// SMapData
H
Hongze Cheng 已提交
153
#define tMapDataInit() ((SMapData){0})
H
Hongze Cheng 已提交
154 155 156
void    tMapDataReset(SMapData *pMapData);
void    tMapDataClear(SMapData *pMapData);
int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(uint8_t *, void *));
H
Hongze Cheng 已提交
157
void    tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t (*tGetItemFn)(uint8_t *, void *));
H
Hongze Cheng 已提交
158 159
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 已提交
160 161 162 163 164
int32_t tPutMapData(uint8_t *p, SMapData *pMapData);
int32_t tGetMapData(uint8_t *p, SMapData *pMapData);
// 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 已提交
165
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
H
Hongze Cheng 已提交
166
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
H
Hongze Cheng 已提交
167
void    tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg);
H
Hongze Cheng 已提交
168 169 170 171 172
// tsdbMemTable ==============================================================================================
// SMemTable
int32_t tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable);
void    tsdbMemTableDestroy(SMemTable *pMemTable);
void    tsdbGetTbDataFromMemTable(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData);
H
Hongze Cheng 已提交
173 174
void    tsdbRefMemTable(SMemTable *pMemTable);
void    tsdbUnrefMemTable(SMemTable *pMemTable);
H
Hongze Cheng 已提交
175 176 177 178 179 180
// STbDataIter
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);
TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter);
bool     tsdbTbDataIterNext(STbDataIter *pIter);
H
Hongze Cheng 已提交
181 182
// STbData
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
H
Hongze Cheng 已提交
183
// tsdbFile.c ==============================================================================================
H
Hongze Cheng 已提交
184
typedef enum { TSDB_HEAD_FILE = 0, TSDB_DATA_FILE, TSDB_LAST_FILE, TSDB_SMA_FILE } EDataFileT;
H
Hongze Cheng 已提交
185

H
Hongze Cheng 已提交
186
bool    tsdbDelFileIsSame(SDelFile *pDelFile1, SDelFile *pDelFile2);
H
Hongze Cheng 已提交
187
int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype);
H
Hongze Cheng 已提交
188 189 190 191
int32_t tPutHeadFile(uint8_t *p, SHeadFile *pHeadFile);
int32_t tPutDataFile(uint8_t *p, SDataFile *pDataFile);
int32_t tPutLastFile(uint8_t *p, SLastFile *pLastFile);
int32_t tPutSmaFile(uint8_t *p, SSmaFile *pSmaFile);
H
Hongze Cheng 已提交
192 193 194 195
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 已提交
196 197 198 199 200

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[]);
void tsdbLastFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SLastFile *pLastF, char fname[]);
void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, char fname[]);
H
Hongze Cheng 已提交
201
// SDelFile
H
Hongze Cheng 已提交
202
void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]);
H
Hongze Cheng 已提交
203
// tsdbFS.c ==============================================================================================
H
Hongze Cheng 已提交
204 205 206 207 208 209 210 211 212 213
int32_t tsdbFSOpen(STsdb *pTsdb);
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);
int32_t tsdbFSCommit1(STsdb *pTsdb, STsdbFS *pFS);
int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFS);
int32_t tsdbFSRef(STsdb *pTsdb, STsdbFS *pFS);
void    tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS);

H
Hongze Cheng 已提交
214
int32_t tsdbFSRollback(STsdbFS *pFS);
H
Hongze Cheng 已提交
215

H
Hongze Cheng 已提交
216 217
int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet);
int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile);
H
Hongze Cheng 已提交
218 219 220
// tsdbReaderWriter.c ==============================================================================================
// SDataFWriter
int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pSet);
H
Hongze Cheng 已提交
221
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
H
Hongze Cheng 已提交
222
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
H
Hongze Cheng 已提交
223
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx, uint8_t **ppBuf);
H
Hongze Cheng 已提交
224 225
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *pMapData, uint8_t **ppBuf, SBlockIdx *pBlockIdx);
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2,
H
Hongze Cheng 已提交
226
                           SBlockIdx *pBlockIdx, SBlock *pBlock, int8_t cmprAlg);
H
Hongze Cheng 已提交
227

H
Hongze Cheng 已提交
228
int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo);
H
Hongze Cheng 已提交
229 230
// SDataFReader
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
H
Hongze Cheng 已提交
231
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
H
Hongze Cheng 已提交
232
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx, uint8_t **ppBuf);
H
Hongze Cheng 已提交
233
int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *pMapData, uint8_t **ppBuf);
H
Hongze Cheng 已提交
234
int32_t tsdbReadColData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, int16_t *aColId, int32_t nCol,
H
Hongze Cheng 已提交
235
                        SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2);
H
Hongze Cheng 已提交
236
int32_t tsdbReadBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, SBlockData *pBlockData,
H
Hongze Cheng 已提交
237
                          uint8_t **ppBuf1, uint8_t **ppBuf2);
H
Hongze Cheng 已提交
238
int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg, uint8_t **ppBuf);
H
Hongze Cheng 已提交
239 240
// SDelFWriter
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb);
H
Hongze Cheng 已提交
241
int32_t tsdbDelFWriterClose(SDelFWriter **ppWriter, int8_t sync);
H
Hongze Cheng 已提交
242 243 244
int32_t tsdbWriteDelData(SDelFWriter *pWriter, SArray *aDelData, uint8_t **ppBuf, SDelIdx *pDelIdx);
int32_t tsdbWriteDelIdx(SDelFWriter *pWriter, SArray *aDelIdx, uint8_t **ppBuf);
int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter);
H
Hongze Cheng 已提交
245 246
// SDelFReader
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb, uint8_t **ppBuf);
H
Hongze Cheng 已提交
247
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
H
Hongze Cheng 已提交
248 249
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, uint8_t **ppBuf);
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx, uint8_t **ppBuf);
H
Hongze Cheng 已提交
250 251 252
// tsdbRead.c ==============================================================================================
int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap);
void    tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap);
H
Hongze Cheng 已提交
253

254 255 256 257
#define TSDB_CACHE_NO(c)       ((c).cacheLast == 0)
#define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0)
#define TSDB_CACHE_LAST(c)     (((c).cacheLast & 2) > 0)

258 259
// tsdbCache
int32_t tsdbOpenCache(STsdb *pTsdb);
H
Hongze Cheng 已提交
260
void    tsdbCloseCache(SLRUCache *pCache);
261
int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb);
262
int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, STSRow *row, bool dup);
263 264
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h);
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h);
M
Minglei Jin 已提交
265
int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h);
266

267 268
int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
269
int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
270

271 272 273
void   tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity);
size_t tsdbCacheGetCapacity(SVnode *pVnode);

274 275
int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);

H
Hongze Cheng 已提交
276
// structs =======================
H
Hongze Cheng 已提交
277 278 279 280 281 282 283
typedef struct {
  int   minFid;
  int   midFid;
  int   maxFid;
  TSKEY minKey;
} SRtn;

H
Hongze Cheng 已提交
284 285 286 287 288
struct STsdbFS {
  SDelFile *pDelFile;
  SArray   *aDFileSet;  // SArray<SDFileSet>
};

H
Hongze Cheng 已提交
289
struct STsdb {
H
Hongze Cheng 已提交
290 291 292
  char          *path;
  SVnode        *pVnode;
  STsdbKeepCfg   keepCfg;
H
more  
Hongze Cheng 已提交
293
  TdThreadRwlock rwLock;
H
Hongze Cheng 已提交
294 295
  SMemTable     *mem;
  SMemTable     *imem;
H
Hongze Cheng 已提交
296
  STsdbFS        fs;
H
Hongze Cheng 已提交
297
  SLRUCache     *lruCache;
H
Hongze Cheng 已提交
298 299
};

H
refact  
Hongze Cheng 已提交
300 301 302 303 304
struct TSDBKEY {
  int64_t version;
  TSKEY   ts;
};

H
Hongze Cheng 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318
typedef struct SMemSkipListNode SMemSkipListNode;
struct SMemSkipListNode {
  int8_t            level;
  SMemSkipListNode *forwards[0];
};
typedef struct SMemSkipList {
  uint32_t          seed;
  int64_t           size;
  int8_t            maxLevel;
  int8_t            level;
  SMemSkipListNode *pHead;
  SMemSkipListNode *pTail;
} SMemSkipList;

H
Hongze Cheng 已提交
319 320 321 322 323
struct SDelDataInfo {
  tb_uid_t suid;
  tb_uid_t uid;
};

H
Hongze Cheng 已提交
324
struct STbData {
H
Hongze Cheng 已提交
325 326
  tb_uid_t     suid;
  tb_uid_t     uid;
H
Hongze Cheng 已提交
327 328 329 330
  TSKEY        minKey;
  TSKEY        maxKey;
  int64_t      minVersion;
  int64_t      maxVersion;
H
Hongze Cheng 已提交
331
  int32_t      maxSkmVer;
H
Hongze Cheng 已提交
332 333
  SDelData    *pHead;
  SDelData    *pTail;
H
Hongze Cheng 已提交
334
  SMemSkipList sl;
H
Hongze Cheng 已提交
335
};
H
Hongze Cheng 已提交
336

H
refact  
Hongze Cheng 已提交
337
struct SMemTable {
H
Hongze Cheng 已提交
338 339 340 341 342 343 344 345 346 347 348
  SRWLatch         latch;
  STsdb           *pTsdb;
  SVBufPool       *pPool;
  volatile int32_t nRef;
  TSKEY            minKey;
  TSKEY            maxKey;
  int64_t          minVersion;
  int64_t          maxVersion;
  int64_t          nRow;
  int64_t          nDel;
  SArray          *aTbData;  // SArray<STbData*>
H
Hongze Cheng 已提交
349
};
H
Hongze Cheng 已提交
350

H
Hongze Cheng 已提交
351
struct TSDBROW {
H
Hongze Cheng 已提交
352
  int8_t type;  // 0 for row from tsRow, 1 for row from block data
H
Hongze Cheng 已提交
353 354 355 356 357 358
  union {
    struct {
      int64_t version;
      STSRow *pTSRow;
    };
    struct {
H
Hongze Cheng 已提交
359 360
      SBlockData *pBlockData;
      int32_t     iRow;
H
Hongze Cheng 已提交
361 362
    };
  };
H
Hongze Cheng 已提交
363 364
};

H
Hongze Cheng 已提交
365
struct SBlockIdx {
H
Hongze Cheng 已提交
366 367
  int64_t suid;
  int64_t uid;
H
Hongze Cheng 已提交
368 369 370 371
  int64_t offset;
  int64_t size;
};

H
Hongze Cheng 已提交
372 373
struct SMapData {
  int32_t  nItem;
H
Hongze Cheng 已提交
374
  int32_t  nData;
375
  int32_t *aOffset;
H
Hongze Cheng 已提交
376 377 378
  uint8_t *pData;
};

H
Hongze Cheng 已提交
379
typedef struct {
H
Hongze Cheng 已提交
380 381
  int16_t cid;
  int8_t  type;
H
Hongze Cheng 已提交
382
  int8_t  smaOn;
H
Hongze Cheng 已提交
383
  int8_t  flag;  // HAS_NONE|HAS_NULL|HAS_VALUE
H
Hongze Cheng 已提交
384 385 386 387 388
  int32_t offset;
  int32_t szBitmap;  // bitmap size
  int32_t szOffset;  // size of offset, only for variant-length data type
  int32_t szValue;   // compressed column value size
  int32_t szOrigin;  // original column value size (only save for variant data type)
H
Hongze Cheng 已提交
389 390 391
} SBlockCol;

typedef struct {
H
Hongze Cheng 已提交
392 393 394 395 396 397 398 399 400
  int32_t nRow;
  int8_t  cmprAlg;
  int64_t offset;      // block data offset
  int32_t szBlockCol;  // SBlockCol size
  int32_t szVersion;   // VERSION size
  int32_t szTSKEY;     // TSKEY size
  int32_t szBlock;     // total block size
  int64_t sOffset;     // sma offset
  int32_t nSma;        // sma size
H
Hongze Cheng 已提交
401 402
} SSubBlock;

H
Hongze Cheng 已提交
403
struct SBlock {
H
Hongze Cheng 已提交
404 405 406 407
  TSDBKEY   minKey;
  TSDBKEY   maxKey;
  int64_t   minVersion;
  int64_t   maxVersion;
H
Hongze Cheng 已提交
408
  int32_t   nRow;
H
Hongze Cheng 已提交
409 410 411
  int8_t    last;
  int8_t    hasDup;
  int8_t    nSubBlock;
H
Hongze Cheng 已提交
412
  SSubBlock aSubBlock[TSDB_MAX_SUBBLOCKS];
H
refact  
Hongze Cheng 已提交
413
};
H
Hongze Cheng 已提交
414

H
Hongze Cheng 已提交
415 416 417
struct SColData {
  int16_t  cid;
  int8_t   type;
H
Hongze Cheng 已提交
418
  int8_t   smaOn;
H
Hongze Cheng 已提交
419 420
  int32_t  nVal;
  uint8_t  flag;
H
Hongze Cheng 已提交
421
  uint8_t *pBitMap;
H
Hongze Cheng 已提交
422 423
  int32_t *aOffset;
  int32_t  nData;
H
Hongze Cheng 已提交
424
  uint8_t *pData;
H
refact  
Hongze Cheng 已提交
425
};
H
Hongze Cheng 已提交
426

H
Hongze Cheng 已提交
427
struct SBlockData {
H
Hongze Cheng 已提交
428 429 430
  int32_t  nRow;
  int64_t *aVersion;
  TSKEY   *aTSKEY;
H
Hongze Cheng 已提交
431 432
  SArray  *aIdx;      // SArray<int32_t>
  SArray  *aColData;  // SArray<SColData>
H
Hongze Cheng 已提交
433
};
H
Hongze Cheng 已提交
434 435 436 437

// ================== TSDB global config
extern bool tsdbForceKeepFile;

H
Hongze Cheng 已提交
438
#define TSDB_FS_ITER_FORWARD  TSDB_ORDER_ASC
H
Hongze Cheng 已提交
439 440
#define TSDB_FS_ITER_BACKWARD TSDB_ORDER_DESC

H
Hongze Cheng 已提交
441 442 443 444 445
struct TABLEID {
  tb_uid_t suid;
  tb_uid_t uid;
};

H
Hongze Cheng 已提交
446 447 448 449
struct STbDataIter {
  STbData          *pTbData;
  int8_t            backward;
  SMemSkipListNode *pNode;
H
Hongze Cheng 已提交
450 451
  TSDBROW          *pRow;
  TSDBROW           row;
H
Hongze Cheng 已提交
452 453
};

H
Hongze Cheng 已提交
454
struct SDelData {
H
Hongze Cheng 已提交
455 456 457 458
  int64_t   version;
  TSKEY     sKey;
  TSKEY     eKey;
  SDelData *pNext;
H
Hongze Cheng 已提交
459
};
H
Hongze Cheng 已提交
460

H
Hongze Cheng 已提交
461
struct SDelIdx {
H
Hongze Cheng 已提交
462 463 464 465
  tb_uid_t suid;
  tb_uid_t uid;
  int64_t  offset;
  int64_t  size;
H
Hongze Cheng 已提交
466
};
H
Hongze Cheng 已提交
467

H
Hongze Cheng 已提交
468
#pragma pack(push, 1)
H
Hongze Cheng 已提交
469
struct SBlockDataHdr {
H
more  
Hongze Cheng 已提交
470 471 472
  uint32_t delimiter;
  int64_t  suid;
  int64_t  uid;
H
Hongze Cheng 已提交
473
};
H
Hongze Cheng 已提交
474
#pragma pack(pop)
H
Hongze Cheng 已提交
475

H
Hongze Cheng 已提交
476 477 478 479 480 481 482 483
struct SDelFile {
  volatile int32_t nRef;

  int64_t commitID;
  int64_t size;
  int64_t offset;
};

H
Hongze Cheng 已提交
484
struct SHeadFile {
H
Hongze Cheng 已提交
485 486
  volatile int32_t nRef;

H
Hongze Cheng 已提交
487
  int64_t commitID;
H
Hongze Cheng 已提交
488 489 490 491 492
  int64_t size;
  int64_t offset;
};

struct SDataFile {
H
Hongze Cheng 已提交
493 494
  volatile int32_t nRef;

H
Hongze Cheng 已提交
495
  int64_t commitID;
H
Hongze Cheng 已提交
496 497 498 499
  int64_t size;
};

struct SLastFile {
H
Hongze Cheng 已提交
500 501
  volatile int32_t nRef;

H
Hongze Cheng 已提交
502
  int64_t commitID;
H
Hongze Cheng 已提交
503 504 505 506
  int64_t size;
};

struct SSmaFile {
H
Hongze Cheng 已提交
507 508
  volatile int32_t nRef;

H
Hongze Cheng 已提交
509
  int64_t commitID;
H
Hongze Cheng 已提交
510 511 512 513
  int64_t size;
};

struct SDFileSet {
H
Hongze Cheng 已提交
514 515 516 517 518 519
  SDiskID    diskId;
  int32_t    fid;
  SHeadFile *pHeadF;
  SDataFile *pDataF;
  SLastFile *pLastF;
  SSmaFile  *pSmaF;
H
Hongze Cheng 已提交
520 521 522 523
};

struct SRowIter {
  TSDBROW  *pRow;
H
Hongze Cheng 已提交
524
  STSchema *pTSchema;
H
Hongze Cheng 已提交
525 526
  SColVal   colVal;
  int32_t   i;
H
Hongze Cheng 已提交
527
};
H
Hongze Cheng 已提交
528 529 530 531 532
struct SRowMerger {
  STSchema *pTSchema;
  int64_t   version;
  SArray   *pArray;  // SArray<SColVal>
};
H
Hongze Cheng 已提交
533

H
Hongze Cheng 已提交
534 535 536 537 538 539
struct SDelFWriter {
  STsdb    *pTsdb;
  SDelFile  fDel;
  TdFilePtr pWriteH;
};

H
Hongze Cheng 已提交
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
struct SDataFWriter {
  STsdb    *pTsdb;
  SDFileSet wSet;

  TdFilePtr pHeadFD;
  TdFilePtr pDataFD;
  TdFilePtr pLastFD;
  TdFilePtr pSmaFD;

  SHeadFile fHead;
  SDataFile fData;
  SLastFile fLast;
  SSmaFile  fSma;
};

struct STsdbReadSnap {
  SMemTable *pMem;
  SMemTable *pIMem;
  STsdbFS    fs;
};

H
Hongze Cheng 已提交
561 562 563 564
#ifdef __cplusplus
}
#endif

565
#endif /*_TD_VNODE_TSDB_H_*/