tsdbMain.h 10.7 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 51 52 53 54 55 56 57 58 59 60 61
  ETableType type;
  tstr*      name;  // NOTE: there a flexible string here
  STableId   tableId;
  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-34  
hzcheng 已提交
62 63 64
} STable;

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

  int32_t   nTables;
  STable**  tables;
  SList*    superList;
  SHashObj* uidMap;
  SKVStore* pStore;
  int       maxRowBytes;
  int       maxCols;
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 110
  T_REF_DECLARE();
  TSKEY        keyFirst;
  TSKEY        keyLast;
  int64_t      numOfRows;
  STableData** tData;
  SList*       actList;
  SList*       bufBlockList;
} SMemTable;
H
TD-34  
hzcheng 已提交
111

H
TD-353  
Hongze Cheng 已提交
112 113
// ------------------ 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 已提交
114

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

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

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

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

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

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

158
typedef struct {
H
TD-353  
Hongze Cheng 已提交
159 160 161 162 163 164 165
  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;
166 167 168 169 170
  int16_t numOfCols;
  TSKEY   keyFirst;
  TSKEY   keyLast;
} SCompBlock;

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

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

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

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

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

typedef struct {
  // Global configuration
  SHelperCfg config;

H
TD-100  
hzcheng 已提交
236 237 238
  int8_t state;

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

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

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

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

H
TD-353  
Hongze Cheng 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
// ------------------ tsdbMain.c
typedef struct {
  int8_t          state;

  char*           rootDir;
  STsdbCfg        config;
  STsdbAppH       appH;
  STsdbStat       stat;
  STsdbMeta*      tsdbMeta;
  STsdbBufPool*   pPool;
  SMemTable*      mem;
  SMemTable*      imem;
  STsdbFileH*     tsdbFileH;
  pthread_mutex_t mutex;
  int             commit;
  pthread_t       commitThread;
} 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
#define TABLE_SUID(t) (t)->superUid
#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

// ------------------ 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

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 已提交
336
// --------- Helper state
H
TD-100  
hzcheng 已提交
337 338 339 340 341 342
#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 已提交
343 344 345 346 347 348

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

H
TD-100  
hzcheng 已提交
351 352
int  tsdbInitReadHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
int  tsdbInitWriteHelper(SRWHelper *pHelper, STsdbRepo *pRepo);
H
hzcheng 已提交
353
void tsdbDestroyHelper(SRWHelper *pHelper);
H
TD-100  
hzcheng 已提交
354
void tsdbResetHelper(SRWHelper *pHelper);
H
hzcheng 已提交
355 356

// --------- For set operations
H
TD-100  
hzcheng 已提交
357 358
int tsdbSetAndOpenHelperFile(SRWHelper *pHelper, SFileGroup *pGroup);
void tsdbSetHelperTable(SRWHelper *pHelper, STable *pTable, STsdbRepo *pRepo);
H
hzcheng 已提交
359 360 361
int  tsdbCloseHelperFile(SRWHelper *pHelper, bool hasError);

// --------- For read operations
H
Hongze Cheng 已提交
362 363 364 365 366 367
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 已提交
368 369 370 371 372 373

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

H
hzcheng 已提交
375
// --------- Other functions need to further organize
H
TD-90  
Hongze Cheng 已提交
376 377 378 379 380 381 382 383 384 385
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 已提交
386 387

#define DEFAULT_TAG_INDEX_COLUMN 0  // skip list built based on the first column of tags
H
hzcheng 已提交
388

H
Hongze Cheng 已提交
389
int compFGroupKey(const void *key, const void *fgroup);
H
TD-353  
Hongze Cheng 已提交
390
#endif
H
Hongze Cheng 已提交
391

H
more  
hzcheng 已提交
392 393 394 395
#ifdef __cplusplus
}
#endif

H
TD-34  
hzcheng 已提交
396
#endif