tsdbMain.h 16.1 KB
Newer Older
H
more  
hzcheng 已提交
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
TD-34  
hzcheng 已提交
15 16
#ifndef _TD_TSDB_MAIN_H_
#define _TD_TSDB_MAIN_H_
H
more  
Hongze Cheng 已提交
17

S
slguan 已提交
18
#include "tglobal.h"
H
hzcheng 已提交
19 20
#include "tlist.h"
#include "tsdb.h"
H
TD-34  
hzcheng 已提交
21 22
#include "tskiplist.h"
#include "tutil.h"
H
hzcheng 已提交
23
#include "tlog.h"
H
hzcheng 已提交
24
#include "tcoding.h"
H
more  
Hongze Cheng 已提交
25

H
more  
hzcheng 已提交
26 27 28 29
#ifdef __cplusplus
extern "C" {
#endif

H
hzcheng 已提交
30 31
extern int tsdbDebugFlag;

S
Shengliang Guan 已提交
32 33 34 35
#define tsdbError(...) { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR TDB ", tsdbDebugFlag, __VA_ARGS__); }}
#define tsdbWarn(...)  { if (tsdbDebugFlag & DEBUG_WARN)  { taosPrintLog("WARN TDB ", tsdbDebugFlag, __VA_ARGS__); }}
#define tsdbTrace(...) { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
#define tsdbPrint(...) { taosPrintLog("TDB ", 255, __VA_ARGS__); }
H
hzcheng 已提交
36

H
TD-34  
hzcheng 已提交
37
// ------------------------------ TSDB META FILE INTERFACES ------------------------------
H
Hongze Cheng 已提交
38
#define TSDB_META_FILE_NAME "meta"
H
TD-34  
hzcheng 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#define TSDB_META_HASH_FRACTION 1.1

typedef int (*iterFunc)(void *, void *cont, int contLen);
typedef void (*afterFunc)(void *);

typedef struct {
  int       fd;        // File descriptor
  int       nDel;      // number of deletions
  int       tombSize;  // deleted size
  int64_t   size;      // Total file size
  void *    map;       // Map from uid ==> position
  iterFunc  iFunc;
  afterFunc aFunc;
  void *    appH;
} SMetaFile;

SMetaFile *tsdbInitMetaFile(char *rootDir, int32_t maxTables, iterFunc iFunc, afterFunc aFunc, void *appH);
56 57 58
int32_t    tsdbInsertMetaRecord(SMetaFile *mfh, uint64_t uid, void *cont, int32_t contLen);
int32_t    tsdbDeleteMetaRecord(SMetaFile *mfh, uint64_t uid);
int32_t    tsdbUpdateMetaRecord(SMetaFile *mfh, uint64_t uid, void *cont, int32_t contLen);
H
TD-34  
hzcheng 已提交
59 60 61 62 63 64 65 66
void       tsdbCloseMetaFile(SMetaFile *mfh);

// ------------------------------ TSDB META INTERFACES ------------------------------
#define IS_CREATE_STABLE(pCfg) ((pCfg)->tagValues != NULL)

typedef struct {
  TSKEY   keyFirst;
  TSKEY   keyLast;
H
Haojun Liao 已提交
67
  int32_t numOfRows;
H
TD-34  
hzcheng 已提交
68 69 70 71 72 73 74
  void *  pData;
} SMemTable;

// ---------- TSDB TABLE DEFINITION
typedef struct STable {
  int8_t         type;
  STableId       tableId;
75
  uint64_t       superUid;  // Super table UID
H
TD-34  
hzcheng 已提交
76 77 78 79 80 81 82 83 84
  int32_t        sversion;
  STSchema *     schema;
  STSchema *     tagSchema;
  SDataRow       tagVal;
  SMemTable *    mem;
  SMemTable *    imem;
  void *         pIndex;         // For TSDB_SUPER_TABLE, it is the skiplist index
  void *         eventHandler;   // TODO
  void *         streamHandler;  // TODO
H
hzcheng 已提交
85
  TSKEY          lastKey;        // lastkey inserted in this table, initialized as 0, TODO: make a structure
H
TD-34  
hzcheng 已提交
86
  struct STable *next;           // TODO: remove the next
H
hzcheng 已提交
87
  struct STable *prev;
H
hjxilinx 已提交
88
  tstr *         name;           // NOTE: there a flexible string here
H
TD-34  
hzcheng 已提交
89 90
} STable;

H
hjxilinx 已提交
91
#define TSDB_GET_TABLE_LAST_KEY(tb) ((tb)->lastKey)
H
hzcheng 已提交
92

H
TD-34  
hzcheng 已提交
93 94
void *  tsdbEncodeTable(STable *pTable, int *contLen);
STable *tsdbDecodeTable(void *cont, int contLen);
H
hzcheng 已提交
95
void    tsdbFreeEncode(void *cont);
H
TD-34  
hzcheng 已提交
96 97 98 99 100 101 102 103 104 105 106

// ---------- TSDB META HANDLE DEFINITION
typedef struct {
  int32_t maxTables;  // Max number of tables

  int32_t nTables;  // Tables created

  STable **tables;  // table array

  STable *superList;  // super table list TODO: change  it to list container

H
hzcheng 已提交
107
  void *map;  // table map of (uid ===> table)
H
TD-34  
hzcheng 已提交
108

H
hzcheng 已提交
109
  SMetaFile *mfh;  // meta file handle
H
TD-34  
hzcheng 已提交
110 111 112 113
  int        maxRowBytes;
  int        maxCols;
} STsdbMeta;

H
hjxilinx 已提交
114 115 116 117 118 119
// element put in skiplist for each table
typedef struct STableIndexElem {
  STsdbMeta* pMeta;
  STable*    pTable;
} STableIndexElem;

H
hzcheng 已提交
120
STsdbMeta *tsdbInitMeta(char *rootDir, int32_t maxTables);
H
TD-34  
hzcheng 已提交
121 122
int32_t    tsdbFreeMeta(STsdbMeta *pMeta);
STSchema * tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable);
123
STSchema * tsdbGetTableTagSchema(STsdbMeta *pMeta, STable *pTable);
H
TD-34  
hzcheng 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

// ---- Operation on STable
#define TSDB_TABLE_ID(pTable) ((pTable)->tableId)
#define TSDB_TABLE_UID(pTable) ((pTable)->uid)
#define TSDB_TABLE_NAME(pTable) ((pTable)->tableName)
#define TSDB_TABLE_TYPE(pTable) ((pTable)->type)
#define TSDB_TABLE_SUPER_TABLE_UID(pTable) ((pTable)->stableUid)
#define TSDB_TABLE_IS_SUPER_TABLE(pTable) (TSDB_TABLE_TYPE(pTable) == TSDB_SUPER_TABLE)
#define TSDB_TABLE_TAG_VALUE(pTable) ((pTable)->pTagVal)
#define TSDB_TABLE_CACHE_DATA(pTable) ((pTable)->content.pData)
#define TSDB_SUPER_TABLE_INDEX(pTable) ((pTable)->content.pIndex)

// ---- Operation on SMetaHandle
#define TSDB_NUM_OF_TABLES(pHandle) ((pHandle)->numOfTables)
#define TSDB_NUM_OF_SUPER_TABLES(pHandle) ((pHandle)->numOfSuperTables)
#define TSDB_TABLE_OF_ID(pHandle, id) ((pHandle)->pTables)[id]
#define TSDB_GET_TABLE_OF_NAME(pHandle, name) /* TODO */

H
hzcheng 已提交
142
STsdbMeta *tsdbGetMeta(TsdbRepoT *pRepo);
H
TD-34  
hzcheng 已提交
143 144 145

STable *tsdbIsValidTableToInsert(STsdbMeta *pMeta, STableId tableId);
// int32_t tsdbInsertRowToTableImpl(SSkipListNode *pNode, STable *pTable);
146
STable *tsdbGetTableByUid(STsdbMeta *pMeta, uint64_t uid);
H
hjxilinx 已提交
147
char *getTSTupleKey(const void * data);
H
TD-34  
hzcheng 已提交
148 149 150 151 152 153 154 155 156 157 158

typedef struct {
  int  blockId;
  int  offset;
  int  remain;
  int  padding;
  char data[];
} STsdbCacheBlock;

typedef struct {
  int64_t index;
159
  int     numOfCacheBlocks;
H
TD-34  
hzcheng 已提交
160 161 162 163 164 165
  SList * memPool;
} STsdbCachePool;

typedef struct {
  TSKEY   keyFirst;
  TSKEY   keyLast;
H
Haojun Liao 已提交
166
  int64_t numOfRows;
H
TD-34  
hzcheng 已提交
167 168 169 170 171 172 173 174 175 176
  SList * list;
} SCacheMem;

typedef struct {
  int              cacheBlockSize;
  int              totalCacheBlocks;
  STsdbCachePool   pool;
  STsdbCacheBlock *curBlock;
  SCacheMem *      mem;
  SCacheMem *      imem;
H
TD-183  
hzcheng 已提交
177
  TsdbRepoT *      pRepo;
H
TD-34  
hzcheng 已提交
178 179
} STsdbCache;

H
TD-183  
hzcheng 已提交
180
STsdbCache *tsdbInitCache(int cacheBlockSize, int totalBlocks, TsdbRepoT *pRepo);
H
TD-34  
hzcheng 已提交
181 182 183 184
void        tsdbFreeCache(STsdbCache *pCache);
void *      tsdbAllocFromCache(STsdbCache *pCache, int bytes, TSKEY key);

// ------------------------------ TSDB FILE INTERFACES ------------------------------
H
TD-34  
hzcheng 已提交
185
#define TSDB_FILE_HEAD_SIZE 512
H
TD-34  
hzcheng 已提交
186
#define TSDB_FILE_DELIMITER 0xF00AFA0F
H
TD-34  
hzcheng 已提交
187

H
TD-34  
hzcheng 已提交
188 189 190
#define tsdbGetKeyFileId(key, daysPerFile, precision) ((key) / tsMsPerDay[(precision)] / (daysPerFile))
#define tsdbGetMaxNumOfFiles(keep, daysPerFile) ((keep) / (daysPerFile) + 3)

H
Hongze Cheng 已提交
191
typedef enum {
H
TD-34  
hzcheng 已提交
192 193 194 195
  TSDB_FILE_TYPE_HEAD = 0,  // .head file type
  TSDB_FILE_TYPE_DATA,      // .data file type
  TSDB_FILE_TYPE_LAST,      // .last file type
  TSDB_FILE_TYPE_MAX
H
more  
Hongze Cheng 已提交
196 197
} TSDB_FILE_TYPE;

H
TD-34  
hzcheng 已提交
198 199
#define IS_VALID_TSDB_FILE_TYPE(type) ((type) >= TSDB_FILE_TYPE_HEAD && (type) < TSDB_FILE_TYPE_MAX)

H
more  
hzcheng 已提交
200
extern const char *tsdbFileSuffix[];
H
Hongze Cheng 已提交
201

H
more  
Hongze Cheng 已提交
202
typedef struct {
H
TD-185  
Hongze Cheng 已提交
203 204 205 206 207 208
  uint32_t offset;
  uint32_t len;
  uint64_t size;      // total size of the file
  uint64_t tombSize;  // unused file size
  uint32_t totalBlocks;
  uint32_t totalSubBlocks;
209
} STsdbFileInfo;
H
TD-34  
hzcheng 已提交
210

H
Hongze Cheng 已提交
211 212
void *tsdbEncodeSFileInfo(void *buf, const STsdbFileInfo *pInfo);
void *tsdbDecodeSFileInfo(void *buf, STsdbFileInfo *pInfo);
H
TD-185  
Hongze Cheng 已提交
213

H
TD-34  
hzcheng 已提交
214
typedef struct {
H
hzcheng 已提交
215 216
  int       fd;
  char      fname[128];
217
  STsdbFileInfo info;
H
hzcheng 已提交
218
} SFile;
H
more  
Hongze Cheng 已提交
219

H
TD-34  
hzcheng 已提交
220 221
#define TSDB_IS_FILE_OPENED(f) ((f)->fd != -1)

H
hzcheng 已提交
222 223
typedef struct {
  int32_t fileId;
H
TD-34  
hzcheng 已提交
224
  SFile   files[TSDB_FILE_TYPE_MAX];
H
hzcheng 已提交
225 226 227 228
} SFileGroup;

// TSDB file handle
typedef struct {
H
TD-34  
hzcheng 已提交
229 230 231
  int maxFGroups;
  int numOfFGroups;

H
hzcheng 已提交
232
  SFileGroup *fGroup;
H
hzcheng 已提交
233
} STsdbFileH;
H
more  
Hongze Cheng 已提交
234

H
TD-34  
hzcheng 已提交
235 236 237
#define TSDB_MIN_FILE_ID(fh) (fh)->fGroup[0].fileId
#define TSDB_MAX_FILE_ID(fh) (fh)->fGroup[(fh)->numOfFGroups - 1].fileId

H
hzcheng 已提交
238
STsdbFileH *tsdbInitFileH(char *dataDir, STsdbCfg *pCfg);
H
TD-34  
hzcheng 已提交
239
void        tsdbCloseFileH(STsdbFileH *pFileH);
H
TD-185  
Hongze Cheng 已提交
240
int         tsdbCreateFile(char *dataDir, int fileId, const char *suffix, SFile *pFile);
H
hzcheng 已提交
241
SFileGroup *tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables);
H
TD-34  
hzcheng 已提交
242
int         tsdbOpenFile(SFile *pFile, int oflag);
H
hzcheng 已提交
243 244
int         tsdbCloseFile(SFile *pFile);
SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid);
H
TD-34  
hzcheng 已提交
245
int         tsdbRemoveFileGroup(STsdbFileH *pFile, int fid);
H
hzcheng 已提交
246
int         tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname);
H
TD-34  
hzcheng 已提交
247

H
hzcheng 已提交
248
#define TSDB_FGROUP_ITER_FORWARD TSDB_ORDER_ASC
249 250
#define TSDB_FGROUP_ITER_BACKWARD TSDB_ORDER_DESC

H
TD-34  
hzcheng 已提交
251 252 253 254 255 256 257 258 259 260 261
typedef struct {
  int         numOfFGroups;
  SFileGroup *base;
  SFileGroup *pFileGroup;
  int         direction;
} SFileGroupIter;

void        tsdbInitFileGroupIter(STsdbFileH *pFileH, SFileGroupIter *pIter, int direction);
void        tsdbSeekFileGroupIter(SFileGroupIter *pIter, int fid);
SFileGroup *tsdbGetFileGroupNext(SFileGroupIter *pIter);

H
TD-34  
hzcheng 已提交
262
typedef struct {
H
TD-185  
Hongze Cheng 已提交
263 264 265 266 267
  uint32_t len;
  uint32_t offset;
  uint32_t padding;  // For padding purpose
  uint32_t hasLast : 2;
  uint32_t numOfBlocks : 30;
268 269
  uint64_t uid;
  TSKEY    maxKey;
H
hzcheng 已提交
270
} SCompIdx; /* sizeof(SCompIdx) = 28 */
H
TD-34  
hzcheng 已提交
271

H
TD-185  
Hongze Cheng 已提交
272 273 274
void *tsdbEncodeSCompIdx(void *buf, SCompIdx *pIdx);
void *tsdbDecodeSCompIdx(void *buf, SCompIdx *pIdx);

275
/**
H
TD-34  
hzcheng 已提交
276 277 278 279 280 281
 * if numOfSubBlocks == 0, then the SCompBlock is a sub-block
 * if numOfSubBlocks >= 1, then the SCompBlock is a super-block
 *    - if numOfSubBlocks == 1, then the SCompBlock refers to the data block, and offset/len refer to
 *      the data block offset and length
 *    - if numOfSubBlocks > 1, then the offset/len refer to the offset of the first sub-block in the
 *      binary
282 283 284 285 286
 */
typedef struct {
  int64_t last : 1;          // If the block in data file or last file
  int64_t offset : 63;       // Offset of data block or sub-block index depending on numOfSubBlocks
  int32_t algorithm : 8;     // Compression algorithm
H
Haojun Liao 已提交
287
  int32_t numOfRows : 24;    // Number of total points
288 289 290 291 292 293 294 295
  int32_t sversion;          // Schema version
  int32_t len;               // Data block length or nothing
  int16_t numOfSubBlocks;    // Number of sub-blocks;
  int16_t numOfCols;
  TSKEY   keyFirst;
  TSKEY   keyLast;
} SCompBlock;

H
hzcheng 已提交
296 297
// Maximum number of sub-blocks a super-block can have
#define TSDB_MAX_SUBBLOCKS 8
H
TD-34  
hzcheng 已提交
298 299 300
#define IS_SUPER_BLOCK(pBlock) ((pBlock)->numOfSubBlocks >= 1)
#define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)

H
TD-34  
hzcheng 已提交
301 302 303
typedef struct {
  int32_t    delimiter;  // For recovery usage
  int32_t    checksum;   // TODO: decide if checksum logic in this file or make it one API
304
  uint64_t   uid;
H
TD-34  
hzcheng 已提交
305 306
  SCompBlock blocks[];
} SCompInfo;
H
hzcheng 已提交
307

H
TD-34  
hzcheng 已提交
308
#define TSDB_COMPBLOCK_AT(pCompInfo, idx) ((pCompInfo)->blocks + (idx))
H
hzcheng 已提交
309 310 311 312 313 314 315 316 317
#define TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pCompBlock, size) \
  do {                                                                 \
    if (pCompBlock->numOfSubBlocks > 1) {                              \
      pCompBlock = pCompInfo->blocks + pCompBlock->offset;             \
      size = pCompBlock->numOfSubBlocks;                               \
    } else {                                                           \
      size = 1;                                                        \
    }                                                                  \
  } while (0)
H
TD-34  
hzcheng 已提交
318

H
TD-34  
hzcheng 已提交
319 320 321
// TODO: take pre-calculation into account
typedef struct {
  int16_t colId;  // Column ID
H
TD-166  
hzcheng 已提交
322
  int16_t len;    // Column length // TODO: int16_t is not enough
H
TD-34  
hzcheng 已提交
323 324
  int32_t type : 8;
  int32_t offset : 24;
H
TD-321  
Hongze Cheng 已提交
325 326 327 328 329 330 331
  int64_t sum;
  int64_t max;
  int64_t min;
  int16_t maxIndex;
  int16_t minIndex;
  int16_t numOfNull;
  char    padding[2];
H
TD-34  
hzcheng 已提交
332 333 334 335 336 337
} SCompCol;

// TODO: Take recover into account
typedef struct {
  int32_t  delimiter;  // For recovery usage
  int32_t  numOfCols;  // For recovery usage
338
  uint64_t uid;        // For recovery usage
H
TD-34  
hzcheng 已提交
339 340
  SCompCol cols[];
} SCompData;
H
TD-34  
hzcheng 已提交
341

H
hzcheng 已提交
342
STsdbFileH *tsdbGetFile(TsdbRepoT *pRepo);
H
TD-34  
hzcheng 已提交
343

H
hzcheng 已提交
344 345
int         tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast,
                                    SDataCols *pCols);
H
TD-34  
hzcheng 已提交
346
SFileGroup *tsdbSearchFGroup(STsdbFileH *pFileH, int fid);
H
TD-34  
hzcheng 已提交
347
void tsdbGetKeyRangeOfFileId(int32_t daysPerFile, int8_t precision, int32_t fileId, TSKEY *minKey, TSKEY *maxKey);
H
TD-34  
hzcheng 已提交
348 349

// TSDB repository definition
350
typedef struct STsdbRepo {
H
TD-34  
hzcheng 已提交
351 352 353 354
  char *rootDir;
  // TSDB configuration
  STsdbCfg config;

H
hzcheng 已提交
355 356
  STsdbAppH appH;

H
TD-34  
hzcheng 已提交
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
  // The meter meta handle of this TSDB repository
  STsdbMeta *tsdbMeta;

  // The cache Handle
  STsdbCache *tsdbCache;

  // The TSDB file handle
  STsdbFileH *tsdbFileH;

  // Disk tier handle for multi-tier storage
  void *diskTier;

  pthread_mutex_t mutex;

  int       commit;
  pthread_t commitThread;

  // A limiter to monitor the resources used by tsdb
  void *limiter;

  int8_t state;

} STsdbRepo;

H
hzcheng 已提交
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
typedef struct {
  int32_t  totalLen;
  int32_t  len;
  SDataRow row;
} SSubmitBlkIter;

int      tsdbInitSubmitBlkIter(SSubmitBlk *pBlock, SSubmitBlkIter *pIter);
SDataRow tsdbGetSubmitBlkNext(SSubmitBlkIter *pIter);

#define TSDB_SUBMIT_MSG_HEAD_SIZE sizeof(SSubmitMsg)

// SSubmitMsg Iterator
typedef struct {
  int32_t     totalLen;
  int32_t     len;
  SSubmitBlk *pBlock;
} SSubmitMsgIter;

int         tsdbInitSubmitMsgIter(SSubmitMsg *pMsg, SSubmitMsgIter *pIter);
SSubmitBlk *tsdbGetSubmitMsgNext(SSubmitMsgIter *pIter);

H
hzcheng 已提交
402 403 404
int32_t tsdbTriggerCommit(TsdbRepoT *repo);
int32_t tsdbLockRepo(TsdbRepoT *repo);
int32_t tsdbUnLockRepo(TsdbRepoT *repo);
H
TD-34  
hzcheng 已提交
405

H
hzcheng 已提交
406 407 408 409
typedef enum { TSDB_WRITE_HELPER, TSDB_READ_HELPER } tsdb_rw_helper_t;

typedef struct {
  tsdb_rw_helper_t type;  // helper type
H
TD-100  
hzcheng 已提交
410 411 412 413 414 415 416 417

  int    maxTables;
  int    maxRowSize;
  int    maxRows;
  int    maxCols;
  int    minRowsPerFileBlock;
  int    maxRowsPerFileBlock;
  int8_t compress;
H
hzcheng 已提交
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
} SHelperCfg;

typedef struct {
  int fid;
  TSKEY minKey;
  TSKEY maxKey;
  // For read/write purpose
  SFile headF;
  SFile dataF;
  SFile lastF;
  // For write purpose only
  SFile nHeadF;
  SFile nLastF;
} SHelperFile;

typedef struct {
434 435 436
  uint64_t uid;
  int32_t  tid;
  int32_t  sversion;
H
hzcheng 已提交
437 438 439 440 441 442
} SHelperTable;

typedef struct {
  // Global configuration
  SHelperCfg config;

H
TD-100  
hzcheng 已提交
443 444 445
  int8_t state;

  // For file set usage
H
hzcheng 已提交
446
  SHelperFile files;
H
TD-100  
hzcheng 已提交
447
  SCompIdx *  pCompIdx;
H
hzcheng 已提交
448

H
TD-100  
hzcheng 已提交
449
  // For table set usage
H
hzcheng 已提交
450
  SHelperTable tableInfo;
H
TD-100  
hzcheng 已提交
451 452
  SCompInfo *  pCompInfo;
  bool         hasOldLastBlock;
H
hzcheng 已提交
453

H
TD-100  
hzcheng 已提交
454
  // For block set usage
H
hzcheng 已提交
455 456 457
  SCompData *pCompData;
  SDataCols *pDataCols[2];

H
Hongze Cheng 已提交
458
  void *pBuffer;  // Buffer to hold the whole data block
H
TD-166  
hzcheng 已提交
459
  void *compBuffer;   // Buffer for temperary compress/decompress purpose
H
hzcheng 已提交
460 461 462
} SRWHelper;

// --------- Helper state
H
TD-100  
hzcheng 已提交
463 464 465 466 467 468
#define TSDB_HELPER_CLEAR_STATE 0x0        // Clear state
#define TSDB_HELPER_FILE_SET_AND_OPEN 0x1  // File is set
#define TSDB_HELPER_IDX_LOAD 0x2           // SCompIdx part is loaded
#define TSDB_HELPER_TABLE_SET 0x4          // Table is set
#define TSDB_HELPER_INFO_LOAD 0x8          // SCompInfo part is loaded
#define TSDB_HELPER_FILE_DATA_LOAD 0x10    // SCompData part is loaded
H
hzcheng 已提交
469 470 471 472 473 474

#define TSDB_HELPER_TYPE(h) ((h)->config.type)

#define helperSetState(h, s) (((h)->state) |= (s))
#define helperClearState(h, s) ((h)->state &= (~(s)))
#define helperHasState(h, s) ((((h)->state) & (s)) == (s))
H
TD-100  
hzcheng 已提交
475
#define blockAtIdx(h, idx) ((h)->pCompInfo->blocks + idx)
H
hzcheng 已提交
476

H
TD-100  
hzcheng 已提交
477 478
int  tsdbInitReadHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
int  tsdbInitWriteHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
H
hzcheng 已提交
479
void tsdbDestroyHelper(SRWHelper *pHelper);
H
TD-100  
hzcheng 已提交
480
void tsdbResetHelper(SRWHelper *pHelper);
H
hzcheng 已提交
481 482

// --------- For set operations
H
TD-100  
hzcheng 已提交
483 484
int tsdbSetAndOpenHelperFile(SRWHelper *pHelper, SFileGroup *pGroup);
void tsdbSetHelperTable(SRWHelper *pHelper, STable *pTable, STsdbRepo *pRepo);
H
hzcheng 已提交
485 486 487
int  tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError);

// --------- For read operations
H
Hongze Cheng 已提交
488 489 490 491 492 493
int  tsdbLoadCompIdx(SRWHelper *pHelper, void *target);
int  tsdbLoadCompInfo(SRWHelper *pHelper, void *target);
int  tsdbLoadCompData(SRWHelper *pHelper, SCompBlock *pCompBlock, void *target);
int  tsdbLoadBlockDataCols(SRWHelper *pHelper, SDataCols *pDataCols, int blkIdx, int16_t *colIds, int numOfColIds);
int  tsdbLoadBlockData(SRWHelper *pHelper, SCompBlock *pCompBlock, SDataCols *target);
void tsdbGetDataStatis(SRWHelper *pHelper, SDataStatis *pStatis, int numOfCols);
H
hzcheng 已提交
494 495 496 497 498 499

// --------- For write operations
int tsdbWriteDataBlock(SRWHelper *pHelper, SDataCols *pDataCols);
int tsdbMoveLastBlockIfNeccessary(SRWHelper *pHelper);
int tsdbWriteCompInfo(SRWHelper *pHelper);
int tsdbWriteCompIdx(SRWHelper *pHelper);
H
TD-34  
hzcheng 已提交
500

H
hzcheng 已提交
501
// --------- Other functions need to further organize
502 503 504 505
void    tsdbFitRetention(STsdbRepo *pRepo);
int     tsdbAlterCacheTotalBlocks(STsdbRepo *pRepo, int totalBlocks);
void    tsdbAdjustCacheBlocks(STsdbCache *pCache);
int32_t tsdbGetMetaFileName(char *rootDir, char *fname);
H
Hongze Cheng 已提交
506
int     tsdbUpdateFileHeader(SFile *pFile, uint32_t version);
H
hzcheng 已提交
507

H
more  
hzcheng 已提交
508 509 510 511
#ifdef __cplusplus
}
#endif

H
TD-34  
hzcheng 已提交
512
#endif