tsdbMain.h 16.3 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;

H
Hongze Cheng 已提交
32 33 34
#define tsdbError(...)                                      \
  if (tsdbDebugFlag & DEBUG_ERROR) {                        \
    taosPrintLog("ERROR TDB ", tsdbDebugFlag, __VA_ARGS__); \
H
hzcheng 已提交
35
  }
H
Hongze Cheng 已提交
36 37 38
#define tsdbWarn(...)                                      \
  if (tsdbDebugFlag & DEBUG_WARN) {                        \
    taosPrintLog("WARN TDB ", tsdbDebugFlag, __VA_ARGS__); \
H
hzcheng 已提交
39
  }
H
Hongze Cheng 已提交
40 41 42
#define tsdbTrace(...)                                \
  if (tsdbDebugFlag & DEBUG_TRACE) {                  \
    taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); \
H
hzcheng 已提交
43 44
  }
#define tsdbPrint(...) \
H
Hongze Cheng 已提交
45
  { taosPrintLog("TDB ", 255, __VA_ARGS__); }
H
hzcheng 已提交
46

H
TD-34  
hzcheng 已提交
47
// ------------------------------ TSDB META FILE INTERFACES ------------------------------
H
Hongze Cheng 已提交
48
#define TSDB_META_FILE_NAME "meta"
H
TD-34  
hzcheng 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#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);
66 67 68
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 已提交
69 70 71 72 73 74 75 76
void       tsdbCloseMetaFile(SMetaFile *mfh);

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

typedef struct {
  TSKEY   keyFirst;
  TSKEY   keyLast;
H
Haojun Liao 已提交
77
  int32_t numOfRows;
H
TD-34  
hzcheng 已提交
78 79 80 81 82 83 84
  void *  pData;
} SMemTable;

// ---------- TSDB TABLE DEFINITION
typedef struct STable {
  int8_t         type;
  STableId       tableId;
85
  uint64_t       superUid;  // Super table UID
H
TD-34  
hzcheng 已提交
86 87 88 89 90 91 92 93 94
  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 已提交
95
  TSKEY          lastKey;        // lastkey inserted in this table, initialized as 0, TODO: make a structure
H
TD-34  
hzcheng 已提交
96
  struct STable *next;           // TODO: remove the next
H
hzcheng 已提交
97
  struct STable *prev;
H
hjxilinx 已提交
98
  tstr *         name;           // NOTE: there a flexible string here
H
TD-34  
hzcheng 已提交
99 100
} STable;

H
hjxilinx 已提交
101
#define TSDB_GET_TABLE_LAST_KEY(tb) ((tb)->lastKey)
H
hzcheng 已提交
102

H
TD-34  
hzcheng 已提交
103 104
void *  tsdbEncodeTable(STable *pTable, int *contLen);
STable *tsdbDecodeTable(void *cont, int contLen);
H
hzcheng 已提交
105
void    tsdbFreeEncode(void *cont);
H
TD-34  
hzcheng 已提交
106 107 108 109 110 111 112 113 114 115 116

// ---------- 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 已提交
117
  void *map;  // table map of (uid ===> table)
H
TD-34  
hzcheng 已提交
118

H
hzcheng 已提交
119
  SMetaFile *mfh;  // meta file handle
H
TD-34  
hzcheng 已提交
120 121 122 123
  int        maxRowBytes;
  int        maxCols;
} STsdbMeta;

H
hjxilinx 已提交
124 125 126 127 128 129
// element put in skiplist for each table
typedef struct STableIndexElem {
  STsdbMeta* pMeta;
  STable*    pTable;
} STableIndexElem;

H
hzcheng 已提交
130
STsdbMeta *tsdbInitMeta(char *rootDir, int32_t maxTables);
H
TD-34  
hzcheng 已提交
131 132
int32_t    tsdbFreeMeta(STsdbMeta *pMeta);
STSchema * tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable);
133
STSchema * tsdbGetTableTagSchema(STsdbMeta *pMeta, STable *pTable);
H
TD-34  
hzcheng 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

// ---- 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 已提交
152
STsdbMeta *tsdbGetMeta(TsdbRepoT *pRepo);
H
TD-34  
hzcheng 已提交
153 154 155

STable *tsdbIsValidTableToInsert(STsdbMeta *pMeta, STableId tableId);
// int32_t tsdbInsertRowToTableImpl(SSkipListNode *pNode, STable *pTable);
156
STable *tsdbGetTableByUid(STsdbMeta *pMeta, uint64_t uid);
H
hjxilinx 已提交
157
char *getTSTupleKey(const void * data);
H
TD-34  
hzcheng 已提交
158 159 160 161 162 163 164 165 166 167 168

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

typedef struct {
  int64_t index;
169
  int     numOfCacheBlocks;
H
TD-34  
hzcheng 已提交
170 171 172 173 174 175
  SList * memPool;
} STsdbCachePool;

typedef struct {
  TSKEY   keyFirst;
  TSKEY   keyLast;
H
Haojun Liao 已提交
176
  int64_t numOfRows;
H
TD-34  
hzcheng 已提交
177 178 179 180 181 182 183 184 185 186
  SList * list;
} SCacheMem;

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

H
TD-183  
hzcheng 已提交
190
STsdbCache *tsdbInitCache(int cacheBlockSize, int totalBlocks, TsdbRepoT *pRepo);
H
TD-34  
hzcheng 已提交
191 192 193 194
void        tsdbFreeCache(STsdbCache *pCache);
void *      tsdbAllocFromCache(STsdbCache *pCache, int bytes, TSKEY key);

// ------------------------------ TSDB FILE INTERFACES ------------------------------
H
TD-34  
hzcheng 已提交
195
#define TSDB_FILE_HEAD_SIZE 512
H
TD-34  
hzcheng 已提交
196
#define TSDB_FILE_DELIMITER 0xF00AFA0F
H
TD-34  
hzcheng 已提交
197

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

H
Hongze Cheng 已提交
201
typedef enum {
H
TD-34  
hzcheng 已提交
202 203 204 205
  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 已提交
206 207
} TSDB_FILE_TYPE;

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

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

H
more  
Hongze Cheng 已提交
212
typedef struct {
H
TD-185  
Hongze Cheng 已提交
213 214 215 216 217 218
  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;
219
} STsdbFileInfo;
H
TD-34  
hzcheng 已提交
220

H
Hongze Cheng 已提交
221 222
void *tsdbEncodeSFileInfo(void *buf, const STsdbFileInfo *pInfo);
void *tsdbDecodeSFileInfo(void *buf, STsdbFileInfo *pInfo);
H
TD-185  
Hongze Cheng 已提交
223

H
TD-34  
hzcheng 已提交
224
typedef struct {
H
hzcheng 已提交
225 226
  int       fd;
  char      fname[128];
227
  STsdbFileInfo info;
H
hzcheng 已提交
228
} SFile;
H
more  
Hongze Cheng 已提交
229

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

H
hzcheng 已提交
232 233
typedef struct {
  int32_t fileId;
H
TD-34  
hzcheng 已提交
234
  SFile   files[TSDB_FILE_TYPE_MAX];
H
hzcheng 已提交
235 236 237 238
} SFileGroup;

// TSDB file handle
typedef struct {
H
TD-34  
hzcheng 已提交
239 240 241
  int maxFGroups;
  int numOfFGroups;

H
hzcheng 已提交
242
  SFileGroup *fGroup;
H
hzcheng 已提交
243
} STsdbFileH;
H
more  
Hongze Cheng 已提交
244

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

H
hzcheng 已提交
248
STsdbFileH *tsdbInitFileH(char *dataDir, STsdbCfg *pCfg);
H
TD-34  
hzcheng 已提交
249
void        tsdbCloseFileH(STsdbFileH *pFileH);
H
TD-185  
Hongze Cheng 已提交
250
int         tsdbCreateFile(char *dataDir, int fileId, const char *suffix, SFile *pFile);
H
hzcheng 已提交
251
SFileGroup *tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables);
H
TD-34  
hzcheng 已提交
252
int         tsdbOpenFile(SFile *pFile, int oflag);
H
hzcheng 已提交
253 254
int         tsdbCloseFile(SFile *pFile);
SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid);
H
TD-34  
hzcheng 已提交
255
int         tsdbRemoveFileGroup(STsdbFileH *pFile, int fid);
H
hzcheng 已提交
256
int         tsdbGetFileName(char *dataDir, int fileId, const char *suffix, char *fname);
H
TD-34  
hzcheng 已提交
257

H
hzcheng 已提交
258
#define TSDB_FGROUP_ITER_FORWARD TSDB_ORDER_ASC
259 260
#define TSDB_FGROUP_ITER_BACKWARD TSDB_ORDER_DESC

H
TD-34  
hzcheng 已提交
261 262 263 264 265 266 267 268 269 270 271
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 已提交
272
typedef struct {
H
TD-185  
Hongze Cheng 已提交
273 274 275 276 277
  uint32_t len;
  uint32_t offset;
  uint32_t padding;  // For padding purpose
  uint32_t hasLast : 2;
  uint32_t numOfBlocks : 30;
278 279
  uint64_t uid;
  TSKEY    maxKey;
H
hzcheng 已提交
280
} SCompIdx; /* sizeof(SCompIdx) = 28 */
H
TD-34  
hzcheng 已提交
281

H
TD-185  
Hongze Cheng 已提交
282 283 284
void *tsdbEncodeSCompIdx(void *buf, SCompIdx *pIdx);
void *tsdbDecodeSCompIdx(void *buf, SCompIdx *pIdx);

285
/**
H
TD-34  
hzcheng 已提交
286 287 288 289 290 291
 * 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
292 293 294 295 296
 */
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 已提交
297
  int32_t numOfRows : 24;    // Number of total points
298 299 300 301 302 303 304 305
  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 已提交
306 307
// Maximum number of sub-blocks a super-block can have
#define TSDB_MAX_SUBBLOCKS 8
H
TD-34  
hzcheng 已提交
308 309 310
#define IS_SUPER_BLOCK(pBlock) ((pBlock)->numOfSubBlocks >= 1)
#define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)

H
TD-34  
hzcheng 已提交
311 312 313
typedef struct {
  int32_t    delimiter;  // For recovery usage
  int32_t    checksum;   // TODO: decide if checksum logic in this file or make it one API
314
  uint64_t   uid;
H
TD-34  
hzcheng 已提交
315 316
  SCompBlock blocks[];
} SCompInfo;
H
hzcheng 已提交
317

H
TD-34  
hzcheng 已提交
318
#define TSDB_COMPBLOCK_AT(pCompInfo, idx) ((pCompInfo)->blocks + (idx))
H
hzcheng 已提交
319 320 321 322 323 324 325 326 327
#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 已提交
328

H
TD-34  
hzcheng 已提交
329 330 331
// TODO: take pre-calculation into account
typedef struct {
  int16_t colId;  // Column ID
H
TD-166  
hzcheng 已提交
332
  int16_t len;    // Column length // TODO: int16_t is not enough
H
TD-34  
hzcheng 已提交
333 334
  int32_t type : 8;
  int32_t offset : 24;
H
TD-321  
Hongze Cheng 已提交
335 336 337 338 339 340 341
  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 已提交
342 343 344 345 346 347
} SCompCol;

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

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

H
hzcheng 已提交
354 355
int         tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast,
                                    SDataCols *pCols);
H
TD-34  
hzcheng 已提交
356
SFileGroup *tsdbSearchFGroup(STsdbFileH *pFileH, int fid);
H
TD-34  
hzcheng 已提交
357
void tsdbGetKeyRangeOfFileId(int32_t daysPerFile, int8_t precision, int32_t fileId, TSKEY *minKey, TSKEY *maxKey);
H
TD-34  
hzcheng 已提交
358 359

// TSDB repository definition
360
typedef struct STsdbRepo {
H
TD-34  
hzcheng 已提交
361 362 363 364
  char *rootDir;
  // TSDB configuration
  STsdbCfg config;

H
hzcheng 已提交
365 366
  STsdbAppH appH;

H
TD-34  
hzcheng 已提交
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
  // 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 已提交
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
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 已提交
412 413 414
int32_t tsdbTriggerCommit(TsdbRepoT *repo);
int32_t tsdbLockRepo(TsdbRepoT *repo);
int32_t tsdbUnLockRepo(TsdbRepoT *repo);
H
TD-34  
hzcheng 已提交
415

H
hzcheng 已提交
416 417 418 419
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 已提交
420 421 422 423 424 425 426 427

  int    maxTables;
  int    maxRowSize;
  int    maxRows;
  int    maxCols;
  int    minRowsPerFileBlock;
  int    maxRowsPerFileBlock;
  int8_t compress;
H
hzcheng 已提交
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
} 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 {
444 445 446
  uint64_t uid;
  int32_t  tid;
  int32_t  sversion;
H
hzcheng 已提交
447 448 449 450 451 452
} SHelperTable;

typedef struct {
  // Global configuration
  SHelperCfg config;

H
TD-100  
hzcheng 已提交
453 454 455
  int8_t state;

  // For file set usage
H
hzcheng 已提交
456
  SHelperFile files;
H
TD-100  
hzcheng 已提交
457
  SCompIdx *  pCompIdx;
H
hzcheng 已提交
458

H
TD-100  
hzcheng 已提交
459
  // For table set usage
H
hzcheng 已提交
460
  SHelperTable tableInfo;
H
TD-100  
hzcheng 已提交
461 462
  SCompInfo *  pCompInfo;
  bool         hasOldLastBlock;
H
hzcheng 已提交
463

H
TD-100  
hzcheng 已提交
464
  // For block set usage
H
hzcheng 已提交
465 466 467
  SCompData *pCompData;
  SDataCols *pDataCols[2];

H
Hongze Cheng 已提交
468
  void *pBuffer;  // Buffer to hold the whole data block
H
TD-166  
hzcheng 已提交
469
  void *compBuffer;   // Buffer for temperary compress/decompress purpose
H
hzcheng 已提交
470 471 472
} SRWHelper;

// --------- Helper state
H
TD-100  
hzcheng 已提交
473 474 475 476 477 478
#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 已提交
479 480 481 482 483 484

#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 已提交
485
#define blockAtIdx(h, idx) ((h)->pCompInfo->blocks + idx)
H
hzcheng 已提交
486

H
TD-100  
hzcheng 已提交
487 488
int  tsdbInitReadHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
int  tsdbInitWriteHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
H
hzcheng 已提交
489
void tsdbDestroyHelper(SRWHelper *pHelper);
H
TD-100  
hzcheng 已提交
490
void tsdbResetHelper(SRWHelper *pHelper);
H
hzcheng 已提交
491 492

// --------- For set operations
H
TD-100  
hzcheng 已提交
493 494
int tsdbSetAndOpenHelperFile(SRWHelper *pHelper, SFileGroup *pGroup);
void tsdbSetHelperTable(SRWHelper *pHelper, STable *pTable, STsdbRepo *pRepo);
H
hzcheng 已提交
495 496 497
int  tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError);

// --------- For read operations
H
Hongze Cheng 已提交
498 499 500 501 502 503
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 已提交
504 505 506 507 508 509

// --------- 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 已提交
510

H
hzcheng 已提交
511
// --------- Other functions need to further organize
512 513 514 515
void    tsdbFitRetention(STsdbRepo *pRepo);
int     tsdbAlterCacheTotalBlocks(STsdbRepo *pRepo, int totalBlocks);
void    tsdbAdjustCacheBlocks(STsdbCache *pCache);
int32_t tsdbGetMetaFileName(char *rootDir, char *fname);
H
Hongze Cheng 已提交
516
int     tsdbUpdateFileHeader(SFile *pFile, uint32_t version);
H
hzcheng 已提交
517

H
more  
hzcheng 已提交
518 519 520 521
#ifdef __cplusplus
}
#endif

H
TD-34  
hzcheng 已提交
522
#endif