tsdb.h 12.5 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
hzcheng 已提交
15
#ifndef _TD_TSDB_H_
H
Hongze Cheng 已提交
16 17 18 19 20 21
#define _TD_TSDB_H_

#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>

H
hzcheng 已提交
22
#include "taosdef.h"
H
hzcheng 已提交
23
#include "taosmsg.h"
H
hjxilinx 已提交
24
#include "tarray.h"
H
Hongze Cheng 已提交
25 26
#include "tdataformat.h"
#include "tname.h"
H
Haojun Liao 已提交
27
#include "hash.h"
28 29
#include "tlockfree.h"
#include "tlist.h"
H
Hongze Cheng 已提交
30

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

H
Hongze Cheng 已提交
35 36 37
#define TSDB_VERSION_MAJOR 1
#define TSDB_VERSION_MINOR 0

H
hzcheng 已提交
38 39
#define TSDB_INVALID_SUPER_TABLE_ID -1

40
#define TSDB_STATUS_COMMIT_START 1
H
Hongze Cheng 已提交
41
#define TSDB_STATUS_COMMIT_OVER 2
42

H
TD-1027  
Hongze Cheng 已提交
43 44
// TSDB STATE DEFINITION
#define TSDB_STATE_OK 0x0
H
Hongze Cheng 已提交
45 46
#define TSDB_STATE_BAD_META 0x1
#define TSDB_STATE_BAD_DATA 0x2
H
TD-1027  
Hongze Cheng 已提交
47

H
hzcheng 已提交
48 49 50
// --------- TSDB APPLICATION HANDLE DEFINITION
typedef struct {
  void *appH;
J
jtao1735 已提交
51
  void *cqH;
52
  int (*notifyStatus)(void *, int status, int eno);
H
hzcheng 已提交
53
  int (*eventCallBack)(void *);
R
fix bug  
root 已提交
54
  void *(*cqCreateFunc)(void *handle, uint64_t uid, int32_t sid, const char *dstTable, char *sqlStr, STSchema *pSchema, int start);
H
TD-354  
Hongze Cheng 已提交
55
  void (*cqDropFunc)(void *handle);
H
hzcheng 已提交
56 57
} STsdbAppH;

H
hzcheng 已提交
58 59 60
// --------- TSDB REPOSITORY CONFIGURATION DEFINITION
typedef struct {
  int32_t tsdbId;
S
slguan 已提交
61 62
  int32_t cacheBlockSize;
  int32_t totalBlocks;
H
Hongze Cheng 已提交
63 64
  int32_t daysPerFile;  // day per file sharding policy
  int32_t keep;         // day of data to keep
S
slguan 已提交
65 66
  int32_t keep1;
  int32_t keep2;
H
hzcheng 已提交
67 68
  int32_t minRowsPerFileBlock;  // minimum rows per file block
  int32_t maxRowsPerFileBlock;  // maximum rows per file block
S
slguan 已提交
69 70
  int8_t  precision;
  int8_t  compression;
H
TD-1438  
Hongze Cheng 已提交
71
  int8_t  update;
L
lichuang 已提交
72
  int8_t  cacheLastRow;    // 0:no cache, 1: cache last row, 2: cache last NULL column 3: 1&2
H
hzcheng 已提交
73 74
} STsdbCfg;

L
lichuang 已提交
75
#define CACHE_NO_LAST(c)          ((c)->cacheLastRow == 0)
76 77
#define CACHE_LAST_ROW(c)         (((c)->cacheLastRow & 1) > 0)
#define CACHE_LAST_NULL_COLUMN(c) (((c)->cacheLastRow & 2) > 0)
L
lichuang 已提交
78

T
Tao Liu 已提交
79 80
// --------- TSDB REPOSITORY USAGE STATISTICS
typedef struct {
81 82 83 84
  int64_t totalStorage;  // total bytes occupie
  int64_t compStorage;
  int64_t pointsWritten;  // total data points written
} STsdbStat;
T
Tao Liu 已提交
85

H
Hongze Cheng 已提交
86
typedef struct STsdbRepo STsdbRepo;
87

H
Hongze Cheng 已提交
88
STsdbCfg *tsdbGetCfg(const STsdbRepo *repo);
H
hzcheng 已提交
89 90

// --------- TSDB REPOSITORY DEFINITION
H
Hongze Cheng 已提交
91 92 93 94 95 96
int32_t    tsdbCreateRepo(int repoid);
int32_t    tsdbDropRepo(int repoid);
STsdbRepo *tsdbOpenRepo(STsdbCfg *pCfg, STsdbAppH *pAppH);
int        tsdbCloseRepo(STsdbRepo *repo, int toCommit);
int32_t    tsdbConfigRepo(STsdbRepo *repo, STsdbCfg *pCfg);
int        tsdbGetState(STsdbRepo *repo);
97
int8_t     tsdbGetCompactState(STsdbRepo *repo);
H
hzcheng 已提交
98
// --------- TSDB TABLE DEFINITION
H
more  
hzcheng 已提交
99
typedef struct {
100 101
  uint64_t uid;  // the unique table ID
  int32_t  tid;  // the table ID in the repository.
H
more  
hzcheng 已提交
102 103
} STableId;

H
hzcheng 已提交
104 105
// --------- TSDB TABLE configuration
typedef struct {
H
hzcheng 已提交
106 107 108 109 110
  ETableType type;
  char *     name;
  STableId   tableId;
  int32_t    sversion;
  char *     sname;  // super table name
111
  uint64_t   superUid;
H
hzcheng 已提交
112 113
  STSchema * schema;
  STSchema * tagSchema;
114
  SKVRow     tagValues;
H
TD-354  
Hongze Cheng 已提交
115
  char *     sql;
H
hzcheng 已提交
116 117 118 119
} STableCfg;

void tsdbClearTableCfg(STableCfg *config);

H
Hongze Cheng 已提交
120 121
void *tsdbGetTableTagVal(const void *pTable, int32_t colId, int16_t type, int16_t bytes);
char *tsdbGetTableName(void *pTable);
H
Haojun Liao 已提交
122 123

#define TSDB_TABLEID(_table) ((STableId*) (_table))
124 125
#define TSDB_PREV_ROW  0x1
#define TSDB_NEXT_ROW  0x2
H
Haojun Liao 已提交
126

H
Hongze Cheng 已提交
127
STableCfg *tsdbCreateTableCfgFromMsg(SMDCreateTableMsg *pMsg);
128

H
Hongze Cheng 已提交
129 130 131
int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg);
int tsdbDropTable(STsdbRepo *pRepo, STableId tableId);
int tsdbUpdateTableTagValue(STsdbRepo *repo, SUpdateTableTagValMsg *pMsg);
H
hzcheng 已提交
132

H
Hongze Cheng 已提交
133
uint32_t tsdbGetFileInfo(STsdbRepo *repo, char *name, uint32_t *index, uint32_t eindex, int64_t *size);
134

H
Hongze Cheng 已提交
135
// the TSDB repository info
H
more  
hzcheng 已提交
136
typedef struct STsdbRepoInfo {
H
more  
hzcheng 已提交
137
  STsdbCfg tsdbCfg;
S
TD-1919  
Shengliang Guan 已提交
138
  uint64_t version;            // version of the repository
H
Hongze Cheng 已提交
139 140 141
  int64_t  tsdbTotalDataSize;  // the original inserted data size
  int64_t  tsdbTotalDiskSize;  // the total disk size taken by this TSDB repository
  // TODO: Other informations to add
H
more  
hzcheng 已提交
142
} STsdbRepoInfo;
H
Hongze Cheng 已提交
143
STsdbRepoInfo *tsdbGetStatus(STsdbRepo *pRepo);
H
hzcheng 已提交
144

H
Hongze Cheng 已提交
145 146 147
// the meter information report structure
typedef struct {
  STableCfg tableCfg;
S
TD-1919  
Shengliang Guan 已提交
148
  uint64_t  version;
H
more  
hzcheng 已提交
149 150
  int64_t   tableTotalDataSize;  // In bytes
  int64_t   tableTotalDiskSize;  // In bytes
H
Hongze Cheng 已提交
151 152 153 154 155 156 157 158 159 160
} STableInfo;

// -- FOR INSERT DATA
/**
 * Insert data to a table in a repository
 * @param pRepo the TSDB repository handle
 * @param pData the data to insert (will give a more specific description)
 *
 * @return the number of points inserted, -1 for failure and the error number is set
 */
H
Hongze Cheng 已提交
161
int32_t tsdbInsertData(STsdbRepo *repo, SSubmitMsg *pMsg, SShellSubmitRspMsg *pRsp);
H
Hongze Cheng 已提交
162 163 164

// -- FOR QUERY TIME SERIES DATA

H
hzcheng 已提交
165
typedef void *TsdbQueryHandleT;  // Use void to hide implementation details
H
Hongze Cheng 已提交
166

H
Haojun Liao 已提交
167 168 169 170 171
#define BLOCK_LOAD_OFFSET_SEQ_ORDER   1
#define BLOCK_LOAD_TABLE_SEQ_ORDER    2
#define BLOCK_LOAD_TABLE_RR_ORDER     3

// query condition to build multi-table data block iterator
H
hjxilinx 已提交
172
typedef struct STsdbQueryCond {
H
Hongze Cheng 已提交
173
  STimeWindow  twindow;
174
  int32_t      order;             // desc|asc order to iterate the data block
H
Hongze Cheng 已提交
175 176
  int32_t      numOfCols;
  SColumnInfo *colList;
177
  bool         loadExternalRows;  // load external rows or not
H
Haojun Liao 已提交
178
  int32_t      type;              // data block load type:
H
hjxilinx 已提交
179
} STsdbQueryCond;
H
Hongze Cheng 已提交
180

181 182 183 184 185 186 187 188 189 190 191 192 193 194
typedef struct STableData STableData;
typedef struct {
  T_REF_DECLARE()
  SRWLatch     latch;
  TSKEY        keyFirst;
  TSKEY        keyLast;
  int64_t      numOfRows;
  int32_t      maxTables;
  STableData **tData;
  SList *      actList;
  SList *      extraBuffList;
  SList *      bufBlockList;
  int64_t      pointsAdd;   // TODO
  int64_t      storageAdd;  // TODO
A
AlexDuan 已提交
195
  int64_t      commitedMs;  // commited ms time , zero is no commit.
196 197 198 199 200 201 202 203 204
} SMemTable;

typedef struct {
  SMemTable* mem;
  SMemTable* imem;
  SMemTable  mtable;
  SMemTable* omem;
} SMemSnapshot;

H
Haojun Liao 已提交
205
typedef struct SMemRef {
206 207
  int32_t      ref;
  SMemSnapshot snapshot;
H
Haojun Liao 已提交
208 209
} SMemRef;

H
hjxilinx 已提交
210 211
typedef struct SDataBlockInfo {
  STimeWindow window;
212
  int32_t     rows;
H
hjxilinx 已提交
213 214
  int32_t     numOfCols;
  int64_t     uid;
H
hjxilinx 已提交
215
  int32_t     tid;
H
hjxilinx 已提交
216
} SDataBlockInfo;
H
Hongze Cheng 已提交
217

H
Haojun Liao 已提交
218
typedef struct SFileBlockInfo {
219
  int32_t numBlocksOfStep;
H
Haojun Liao 已提交
220 221
} SFileBlockInfo;

222
typedef struct {
H
Hongze Cheng 已提交
223 224
  void *pTable;
  TSKEY lastKey;
H
Haojun Liao 已提交
225 226 227
} STableKeyInfo;

typedef struct {
H
Haojun Liao 已提交
228
  uint32_t  numOfTables;
229
  SArray   *pGroupList;
H
Hongze Cheng 已提交
230
  SHashObj *map;  // speedup acquire the tableQueryInfo by table uid
231 232
} STableGroupInfo;

233
#define TSDB_BLOCK_DIST_STEP_ROWS 16
H
Haojun Liao 已提交
234 235 236 237 238
typedef struct {
  uint16_t  rowSize;
  uint16_t  numOfFiles;
  uint32_t  numOfTables;
  uint64_t  totalSize;
239 240 241
  uint64_t  totalRows;
  int32_t   maxRows;
  int32_t   minRows;
H
Haojun Liao 已提交
242 243
  int32_t   firstSeekTimeUs;
  uint32_t  numOfRowsInMemTable;
244
  uint32_t  numOfSmallBlocks;
H
Haojun Liao 已提交
245 246 247
  SArray   *dataBlockInfos;
} STableBlockDist;

H
Hongze Cheng 已提交
248 249
/**
 * Get the data block iterator, starting from position according to the query condition
H
hjxilinx 已提交
250 251 252
 *
 * @param tsdb       tsdb handle
 * @param pCond      query condition, including time window, result set order, and basic required columns for each block
H
Haojun Liao 已提交
253 254
 * @param tableInfoGroup  table object list in the form of set, grouped into different sets according to the
 *                        group by condition
H
Haojun Liao 已提交
255
 * @param qinfo      query info handle from query processor
H
Hongze Cheng 已提交
256 257
 * @return
 */
H
Haojun Liao 已提交
258
TsdbQueryHandleT *tsdbQueryTables(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *tableInfoGroup, uint64_t qId,
H
Hongze Cheng 已提交
259
                                  SMemRef *pRef);
H
Hongze Cheng 已提交
260 261

/**
H
hjxilinx 已提交
262 263 264 265
 * Get the last row of the given query time window for all the tables in STableGroupInfo object.
 * Note that only one data block with only row will be returned while invoking retrieve data block function for
 * all tables in this group.
 *
H
Haojun Liao 已提交
266 267 268
 * @param tsdb   tsdb handle
 * @param pCond  query condition, including time window, result set order, and basic required columns for each block
 * @param tableInfo  table list.
H
hjxilinx 已提交
269 270
 * @return
 */
H
Haojun Liao 已提交
271
TsdbQueryHandleT tsdbQueryLastRow(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *tableInfo, uint64_t qId,
H
Hongze Cheng 已提交
272
                                  SMemRef *pRef);
H
hjxilinx 已提交
273

D
fix bug  
dapan1121 已提交
274 275 276

TsdbQueryHandleT tsdbQueryCacheLast(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, uint64_t qId, SMemRef* pMemRef);

D
fix bug  
dapan1121 已提交
277 278
bool isTsdbCacheLastRow(TsdbQueryHandleT* pQueryHandle);

D
fix bug  
dapan1121 已提交
279

280 281 282 283 284
/**
 * get the queried table object list
 * @param pHandle
 * @return
 */
H
Hongze Cheng 已提交
285
SArray *tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle);
286

287 288 289 290 291 292 293 294
/**
 * get the group list according to table id from client
 * @param tsdb
 * @param pCond
 * @param groupList
 * @param qinfo
 * @return
 */
H
Hongze Cheng 已提交
295
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList,
H
Haojun Liao 已提交
296
                                               uint64_t qId, SMemRef *pRef);
297

Y
yihaoDeng 已提交
298 299 300 301 302 303 304 305 306 307

/**
 * get num of rows in mem table 
 *
 * @param pHandle
 * @return row size
 */

int64_t tsdbGetNumOfRowsInMemTable(TsdbQueryHandleT* pHandle);

H
hjxilinx 已提交
308
/**
Y
yihaoDeng 已提交
309
 * move to next block if exists 
H
hjxilinx 已提交
310
 *
H
hjxilinx 已提交
311
 * @param pQueryHandle
H
Hongze Cheng 已提交
312 313
 * @return
 */
H
Haojun Liao 已提交
314
bool tsdbNextDataBlock(TsdbQueryHandleT pQueryHandle);
H
Hongze Cheng 已提交
315 316

/**
H
hjxilinx 已提交
317
 * Get current data block information
H
Hongze Cheng 已提交
318 319
 *
 * @param pQueryHandle
H
Haojun Liao 已提交
320
 * @param pBlockInfo
H
Hongze Cheng 已提交
321 322
 * @return
 */
H
Hongze Cheng 已提交
323
void tsdbRetrieveDataBlockInfo(TsdbQueryHandleT *pQueryHandle, SDataBlockInfo *pBlockInfo);
H
Hongze Cheng 已提交
324 325

/**
H
hjxilinx 已提交
326 327 328 329 330 331 332
 *
 * Get the pre-calculated information w.r.t. current data block.
 *
 * In case of data block in cache, the pBlockStatis will always be NULL.
 * If a block is not completed loaded from disk, the pBlockStatis will be NULL.

 * @pBlockStatis the pre-calculated value for current data blocks. if the block is a cache block, always return 0
H
Hongze Cheng 已提交
333 334
 * @return
 */
H
hzcheng 已提交
335
int32_t tsdbRetrieveDataBlockStatisInfo(TsdbQueryHandleT *pQueryHandle, SDataStatis **pBlockStatis);
H
Hongze Cheng 已提交
336 337

/**
H
hjxilinx 已提交
338
 *
H
hjxilinx 已提交
339 340 341
 * The query condition with primary timestamp is passed to iterator during its constructor function,
 * the returned data block must be satisfied with the time window condition in any cases,
 * which means the SData data block is not actually the completed disk data blocks.
H
Hongze Cheng 已提交
342
 *
H
hjxilinx 已提交
343 344
 * @param pQueryHandle      query handle
 * @param pColumnIdList     required data columns id list
H
Hongze Cheng 已提交
345 346
 * @return
 */
H
hjxilinx 已提交
347
SArray *tsdbRetrieveDataBlock(TsdbQueryHandleT *pQueryHandle, SArray *pColumnIdList);
H
Hongze Cheng 已提交
348 349

/**
350
 * Get the qualified table id for a super table according to the tag query expression.
H
Hongze Cheng 已提交
351 352 353
 * @param stableid. super table sid
 * @param pTagCond. tag query condition
 */
H
Hongze Cheng 已提交
354
int32_t tsdbQuerySTableByTagCond(STsdbRepo *tsdb, uint64_t uid, TSKEY key, const char *pTagCond, size_t len,
H
Hongze Cheng 已提交
355 356
                                 int16_t tagNameRelType, const char *tbnameCond, STableGroupInfo *pGroupList,
                                 SColIndex *pColIndex, int32_t numOfCols);
H
hjxilinx 已提交
357

358
/**
H
Haojun Liao 已提交
359
 * destroy the created table group list, which is generated by tag query
360 361
 * @param pGroupList
 */
H
Haojun Liao 已提交
362
void tsdbDestroyTableGroup(STableGroupInfo *pGroupList);
363

H
hjxilinx 已提交
364 365 366 367 368 369 370 371
/**
 * create the table group result including only one table, used to handle the normal table query
 *
 * @param tsdb        tsdbHandle
 * @param uid         table uid
 * @param pGroupInfo  the generated result
 * @return
 */
H
Hongze Cheng 已提交
372
int32_t tsdbGetOneTableGroup(STsdbRepo *tsdb, uint64_t uid, TSKEY startKey, STableGroupInfo *pGroupInfo);
H
Hongze Cheng 已提交
373

374 375 376 377 378 379 380
/**
 *
 * @param tsdb
 * @param pTableIdList
 * @param pGroupInfo
 * @return
 */
H
Hongze Cheng 已提交
381
int32_t tsdbGetTableGroupFromIdList(STsdbRepo *tsdb, SArray *pTableIdList, STableGroupInfo *pGroupInfo);
382

383 384 385 386
/**
 * clean up the query handle
 * @param queryHandle
 */
H
hzcheng 已提交
387
void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle);
388

H
Haojun Liao 已提交
389 390
void tsdbResetQueryHandle(TsdbQueryHandleT queryHandle, STsdbQueryCond *pCond);

H
Haojun Liao 已提交
391 392
void tsdbResetQueryHandleForNewTable(TsdbQueryHandleT queryHandle, STsdbQueryCond *pCond, STableGroupInfo* groupList);

H
Haojun Liao 已提交
393
int32_t tsdbGetFileBlocksDistInfo(TsdbQueryHandleT* queryHandle, STableBlockDist* pTableBlockInfo);
H
Haojun Liao 已提交
394

T
Tao Liu 已提交
395 396 397 398 399 400 401 402 403
/**
 * get the statistics of repo usage
 * @param repo. point to the tsdbrepo
 * @param totalPoints. total data point written
 * @param totalStorage. total bytes took by the tsdb
 * @param compStorage. total bytes took by the tsdb after compressed
 */
void tsdbReportStat(void *repo, int64_t *totalPoints, int64_t *totalStorage, int64_t *compStorage);

404
int  tsdbInitCommitQueue();
H
Hongze Cheng 已提交
405
void tsdbDestroyCommitQueue();
H
Hongze Cheng 已提交
406
int  tsdbSyncCommit(STsdbRepo *repo);
S
TD-2072  
Shengliang Guan 已提交
407
void tsdbIncCommitRef(int vgId);
S
TD-2072  
Shengliang Guan 已提交
408
void tsdbDecCommitRef(int vgId);
H
Hongze Cheng 已提交
409

H
Hongze Cheng 已提交
410
// For TSDB file sync
S
TD-1207  
Shengliang Guan 已提交
411 412
int tsdbSyncSend(void *pRepo, SOCKET socketFd);
int tsdbSyncRecv(void *pRepo, SOCKET socketFd);
H
Hongze Cheng 已提交
413

H
Hongze Cheng 已提交
414 415 416
// For TSDB Compact
int tsdbCompact(STsdbRepo *pRepo);

H
more  
hzcheng 已提交
417 418 419 420
#ifdef __cplusplus
}
#endif

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
421
#endif  // _TD_TSDB_H_