tsdbMain.h 10.9 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

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

H
more  
hzcheng 已提交
29 30 31 32
#ifdef __cplusplus
extern "C" {
#endif

H
hzcheng 已提交
33 34
extern int tsdbDebugFlag;

S
Shengliang Guan 已提交
35 36 37 38
#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 已提交
39

H
TD-90  
Hongze Cheng 已提交
40
#define TSDB_MAX_TABLE_SCHEMAS 16
H
TD-353  
Hongze Cheng 已提交
41 42 43 44 45 46
#define TSDB_FILE_HEAD_SIZE 512
#define TSDB_FILE_DELIMITER 0xF00AFA0F
#define 

// Definitions
// ------------------ tsdbMeta.c
H
TD-34  
hzcheng 已提交
47
typedef struct STable {
H
TD-353  
Hongze Cheng 已提交
48 49 50
  ETableType type;
  tstr*      name;  // NOTE: there a flexible string here
  STableId   tableId;
H
TD-353  
Hongze Cheng 已提交
51
  uint64_t   suid;
H
TD-353  
Hongze Cheng 已提交
52 53 54 55 56 57 58 59 60 61 62
  STable*    pSuper;  // super table pointer
  uint8_t    numOfSchemas;
  STSchema   schema[TSDB_MAX_TABLE_SCHEMAS];
  STSchema*  tagSchema;
  SKVRow     tagVal;
  void*      pIndex;         // For TSDB_SUPER_TABLE, it is the skiplist index
  void*      eventHandler;   // TODO
  void*      streamHandler;  // TODO
  TSKEY      lastKey;        // lastkey inserted in this table, initialized as 0, TODO: make a structure
  char*      sql;
  void*      cqhandle;
H
TD-353  
Hongze Cheng 已提交
63
  T_REF_DECLARE();
H
TD-34  
hzcheng 已提交
64 65 66
} STable;

typedef struct {
H
TD-353  
Hongze Cheng 已提交
67 68 69 70 71 72 73
  pthread_rwlock_t rwLock;

  int32_t   nTables;
  STable**  tables;
  SList*    superList;
  SHashObj* uidMap;
  SKVStore* pStore;
H
TD-34  
hzcheng 已提交
74 75
} STsdbMeta;

H
TD-353  
Hongze Cheng 已提交
76
// ------------------ tsdbBuffer.c
H
TD-34  
hzcheng 已提交
77
typedef struct {
H
TD-353  
Hongze Cheng 已提交
78 79 80 81 82
  int64_t blockId;
  int     offset;
  int     remain;
  char    data[];
} STsdbBufBlock;
H
TD-34  
hzcheng 已提交
83 84

typedef struct {
H
TD-353  
Hongze Cheng 已提交
85 86 87 88 89 90 91 92 93
  pthread_cond_t poolNotEmpty;
  int            bufBlockSize;
  int            tBufBlocks;
  int            nBufBlocks;
  int64_t        index;
  SList*         bufBlockList;
} STsdbBufPool;

// ------------------ tsdbMemTable.c
H
TD-34  
hzcheng 已提交
94
typedef struct {
H
TD-353  
Hongze Cheng 已提交
95 96 97 98 99 100
  uint64_t   uid;
  TSKEY      keyFirst;
  TSKEY      keyLast;
  int64_t    numOfRows;
  SSkipList* pData;
} STableData;
H
TD-34  
hzcheng 已提交
101 102

typedef struct {
H
TD-353  
Hongze Cheng 已提交
103 104 105 106 107 108 109
  T_REF_DECLARE();
  TSKEY        keyFirst;
  TSKEY        keyLast;
  int64_t      numOfRows;
  STableData** tData;
  SList*       actList;
  SList*       bufBlockList;
H
TD-353  
Hongze Cheng 已提交
110 111
  int          maxCols;
  int          maxRowBytes;
H
TD-353  
Hongze Cheng 已提交
112
} SMemTable;
H
TD-34  
hzcheng 已提交
113

H
TD-353  
Hongze Cheng 已提交
114 115
// ------------------ tsdbFile.c
typedef enum { TSDB_FILE_TYPE_HEAD = 0, TSDB_FILE_TYPE_DATA, TSDB_FILE_TYPE_LAST, TSDB_FILE_TYPE_MAX } TSDB_FILE_TYPE;
H
Hongze Cheng 已提交
116

H
more  
Hongze Cheng 已提交
117
typedef struct {
118
} STsdbFileInfo;
H
TD-34  
hzcheng 已提交
119 120

typedef struct {
H
TD-353  
Hongze Cheng 已提交
121 122 123 124 125 126
  char*    fname;
  int      fd;
  uint64_t size;
  uint64_t tombSize;
  uint64_t totalBlocks;
  uint64_t totalSubBlocks;
H
hzcheng 已提交
127
} SFile;
H
more  
Hongze Cheng 已提交
128

H
hzcheng 已提交
129
typedef struct {
H
TD-353  
Hongze Cheng 已提交
130 131 132 133
  int fileId;
  SFile headF;
  SFile dataF;
  SFile lastF;
H
hzcheng 已提交
134 135 136
} SFileGroup;

typedef struct {
H
TD-353  
Hongze Cheng 已提交
137 138 139
  int         maxFGroups;
  int         nFGroups;
  SFileGroup* pFGroup;
H
hzcheng 已提交
140
} STsdbFileH;
H
more  
Hongze Cheng 已提交
141

H
TD-34  
hzcheng 已提交
142 143 144 145 146 147 148
typedef struct {
  int         numOfFGroups;
  SFileGroup *base;
  SFileGroup *pFileGroup;
  int         direction;
} SFileGroupIter;

H
TD-353  
Hongze Cheng 已提交
149
// ------------------ tsdbRWHelper.c
H
TD-34  
hzcheng 已提交
150
typedef struct {
H
TD-185  
Hongze Cheng 已提交
151 152
  uint32_t len;
  uint32_t offset;
H
TD-353  
Hongze Cheng 已提交
153
  uint32_t padding;
H
TD-185  
Hongze Cheng 已提交
154 155
  uint32_t hasLast : 2;
  uint32_t numOfBlocks : 30;
156 157
  uint64_t uid;
  TSKEY    maxKey;
H
TD-353  
Hongze Cheng 已提交
158 159
} SCompIdx;

160
typedef struct {
H
TD-353  
Hongze Cheng 已提交
161 162 163 164 165 166 167
  int64_t last : 1;
  int64_t offset : 63;
  int32_t algorithm : 8;
  int32_t numOfRows : 24;
  int32_t sversion;
  int32_t len;
  int16_t numOfSubBlocks;
168 169 170 171 172
  int16_t numOfCols;
  TSKEY   keyFirst;
  TSKEY   keyLast;
} SCompBlock;

H
TD-34  
hzcheng 已提交
173 174 175
typedef struct {
  int32_t    delimiter;  // For recovery usage
  int32_t    checksum;   // TODO: decide if checksum logic in this file or make it one API
176
  uint64_t   uid;
H
TD-34  
hzcheng 已提交
177 178
  SCompBlock blocks[];
} SCompInfo;
H
hzcheng 已提交
179

H
TD-34  
hzcheng 已提交
180
typedef struct {
H
TD-353  
Hongze Cheng 已提交
181 182
  int16_t colId;
  int16_t len;
H
TD-34  
hzcheng 已提交
183 184
  int32_t type : 8;
  int32_t offset : 24;
H
TD-321  
Hongze Cheng 已提交
185 186 187 188 189 190 191
  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 已提交
192 193 194 195 196
} SCompCol;

typedef struct {
  int32_t  delimiter;  // For recovery usage
  int32_t  numOfCols;  // For recovery usage
197
  uint64_t uid;        // For recovery usage
H
TD-34  
hzcheng 已提交
198 199
  SCompCol cols[];
} SCompData;
H
TD-34  
hzcheng 已提交
200

H
hzcheng 已提交
201 202 203 204
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 已提交
205 206 207 208 209 210 211 212

  int    maxTables;
  int    maxRowSize;
  int    maxRows;
  int    maxCols;
  int    minRowsPerFileBlock;
  int    maxRowsPerFileBlock;
  int8_t compress;
H
hzcheng 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
} 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 {
229 230 231
  uint64_t uid;
  int32_t  tid;
  int32_t  sversion;
H
hzcheng 已提交
232 233 234 235 236 237
} SHelperTable;

typedef struct {
  // Global configuration
  SHelperCfg config;

H
TD-100  
hzcheng 已提交
238 239 240
  int8_t state;

  // For file set usage
H
hzcheng 已提交
241
  SHelperFile files;
H
TD-100  
hzcheng 已提交
242
  SCompIdx *  pCompIdx;
H
hzcheng 已提交
243

H
TD-100  
hzcheng 已提交
244
  // For table set usage
H
hzcheng 已提交
245
  SHelperTable tableInfo;
H
TD-100  
hzcheng 已提交
246 247
  SCompInfo *  pCompInfo;
  bool         hasOldLastBlock;
H
hzcheng 已提交
248

H
TD-100  
hzcheng 已提交
249
  // For block set usage
H
hzcheng 已提交
250 251 252
  SCompData *pCompData;
  SDataCols *pDataCols[2];

H
Hongze Cheng 已提交
253
  void *pBuffer;  // Buffer to hold the whole data block
H
TD-166  
hzcheng 已提交
254
  void *compBuffer;   // Buffer for temperary compress/decompress purpose
H
hzcheng 已提交
255 256
} SRWHelper;

H
TD-353  
Hongze Cheng 已提交
257 258
// ------------------ tsdbMain.c
typedef struct {
H
TD-353  
Hongze Cheng 已提交
259
  int8_t state;
H
TD-353  
Hongze Cheng 已提交
260 261 262 263 264 265 266 267 268 269 270 271

  char*           rootDir;
  STsdbCfg        config;
  STsdbAppH       appH;
  STsdbStat       stat;
  STsdbMeta*      tsdbMeta;
  STsdbBufPool*   pPool;
  SMemTable*      mem;
  SMemTable*      imem;
  STsdbFileH*     tsdbFileH;
  int             commit;
  pthread_t       commitThread;
H
TD-353  
Hongze Cheng 已提交
272 273
  pthread_mutex_t mutex;
  bool            repoLocked;
H
TD-353  
Hongze Cheng 已提交
274 275 276 277 278 279 280 281 282
} STsdbRepo;

// Operations
// ------------------ tsdbMeta.c
#define TABLE_TYPE(t) (t)->type
#define TABLE_NAME(t) (t)->name
#define TABLE_CHAR_NAME(t) TABLE_NAME(t)->data
#define TALBE_UID(t) (t)->tableId.uid
#define TABLE_TID(t) (t)->tableId.tid
H
TD-353  
Hongze Cheng 已提交
283
#define TABLE_SUID(t) (t)->suid
H
TD-353  
Hongze Cheng 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296
#define TABLE_LASTKEY(t) (t)->lastKey

STsdbMeta* tsdbNewMeta(STsdbCfg* pCfg);
void       tsdbFreeMeta(STsdbMeta* pMeta);

// ------------------ tsdbBuffer.c
STsdbBufPool* tsdbNewBufPool();
void          tsdbFreeBufPool(STsdbBufPool* pBufPool);
int           tsdbOpenBufPool(STsdbRepo* pRepo);
int           tsdbOpenBufPool(STsdbRepo* pRepo);
SListNode*    tsdbAllocBufBlockFromPool(STsdbRepo* pRepo);

// ------------------ tsdbMemTable.c
H
TD-353  
Hongze Cheng 已提交
297 298 299
int tsdbInsertRowToMem(STsdbRepo* pRepo, SDataRow row, STable* pTable);
int tsdbRefMemTable(STsdbRepo* pRepo, SMemTable* pMemTable);
int tsdbUnRefMemTable(STsdbRepo* pRepo, SMemTable* pMemTable);
H
TD-353  
Hongze Cheng 已提交
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317

// ------------------ tsdbFile.c
#define TSDB_KEY_FILEID(key, daysPerFile, precision) ((key) / tsMsPerDay[(precision)] / (daysPerFile))
#define TSDB_MAX_FILE(keep, daysPerFile) ((keep) / (daysPerFile) + 3)
#define TSDB_MIN_FILE_ID(fh) (fh)->pFGroup[0].fileId
#define TSDB_MAX_FILE_ID(fh) (fh)->pFGroup[(fh)->nFGroups - 1].fileId
#define TSDB_FGROUP_ITER_FORWARD TSDB_ORDER_ASC
#define TSDB_FGROUP_ITER_BACKWARD TSDB_ORDER_DESC

STsdbFileH*   tsdbNewFileH(STsdbCfg* pCfg);
void          tsdbFreeFileH(STsdbFileH* pFileH);

// ------------------ tsdbRWHelper.c
#define TSDB_MAX_SUBBLOCKS 8
#define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)

// ------------------ tsdbMain.c
#define REPO_ID(r) (r)->config.tsdbId
H
TD-353  
Hongze Cheng 已提交
318
#define IS_REPO_LOCKED(r) (r)->repoLocked
H
TD-353  
Hongze Cheng 已提交
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342

char* tsdbGetMetaFileName(char* rootDir);
int   tsdbLockRepo(STsdbRepo* pRepo);
int   tsdbUnlockRepo(STsdbRepo* pRepo);
void* tsdbCommitData(void* arg);

#if 0


// TSDB repository definition

typedef struct {
  int32_t  totalLen;
  int32_t  len;
  SDataRow row;
} SSubmitBlkIter;

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

H
hzcheng 已提交
343
// --------- Helper state
H
TD-100  
hzcheng 已提交
344 345 346 347 348 349
#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 已提交
350 351 352 353 354 355

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

H
TD-100  
hzcheng 已提交
358 359
int  tsdbInitReadHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
int  tsdbInitWriteHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
H
hzcheng 已提交
360
void tsdbDestroyHelper(SRWHelper *pHelper);
H
TD-100  
hzcheng 已提交
361
void tsdbResetHelper(SRWHelper *pHelper);
H
hzcheng 已提交
362 363

// --------- For set operations
H
TD-100  
hzcheng 已提交
364 365
int tsdbSetAndOpenHelperFile(SRWHelper *pHelper, SFileGroup *pGroup);
void tsdbSetHelperTable(SRWHelper *pHelper, STable *pTable, STsdbRepo *pRepo);
H
hzcheng 已提交
366 367 368
int  tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError);

// --------- For read operations
H
Hongze Cheng 已提交
369 370 371 372 373 374
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 已提交
375 376 377 378 379 380

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

H
hzcheng 已提交
382
// --------- Other functions need to further organize
H
TD-90  
Hongze Cheng 已提交
383 384 385 386 387 388 389 390 391 392
void      tsdbFitRetention(STsdbRepo *pRepo);
int       tsdbAlterCacheTotalBlocks(STsdbRepo *pRepo, int totalBlocks);
void      tsdbAdjustCacheBlocks(STsdbCache *pCache);
int32_t   tsdbGetMetaFileName(char *rootDir, char *fname);
int       tsdbUpdateFileHeader(SFile *pFile, uint32_t version);
int       tsdbUpdateTable(STsdbMeta *pMeta, STable *pTable, STableCfg *pCfg);
int       tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable);
int       tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable);
STSchema *tsdbGetTableSchemaByVersion(STsdbMeta *pMeta, STable *pTable, int16_t version);
STSchema *tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable);
H
TD-90  
Hongze Cheng 已提交
393

H
hzcheng 已提交
394

H
Hongze Cheng 已提交
395
int compFGroupKey(const void *key, const void *fgroup);
H
TD-353  
Hongze Cheng 已提交
396
#endif
H
Hongze Cheng 已提交
397

H
more  
hzcheng 已提交
398 399 400 401
#ifdef __cplusplus
}
#endif

H
TD-34  
hzcheng 已提交
402
#endif