vnodeRead.h 10.2 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * 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/>.
 */

#ifndef TDENGINE_VNODEREAD_H
#define TDENGINE_VNODEREAD_H

#ifdef __cplusplus
extern "C" {
#endif

23
#include "os.h"
24
#include "tresultBuf.h"
H
hzcheng 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38

#include "tinterpolation.h"
#include "vnodeTagMgmt.h"

/*
 * use to keep the first point position, consisting of position in blk and block
 * id, file id
 */
typedef struct {
  int32_t pos;
  int32_t slot;
  int32_t fileId;
} SPositionInfo;

39
typedef struct SLoadDataBlockInfo {
H
hzcheng 已提交
40 41 42 43
  int32_t fileListIndex; /* index of this file in files list of this vnode */
  int32_t fileId;
  int32_t slotIdx;
  int32_t sid;
H
hjxilinx 已提交
44
  bool    tsLoaded;      // if timestamp column of current block is loaded or not
45
} SLoadDataBlockInfo;
H
hzcheng 已提交
46

47
typedef struct SLoadCompBlockInfo {
H
hzcheng 已提交
48 49 50
  int32_t sid; /* meter sid */
  int32_t fileId;
  int32_t fileListIndex;
51
} SLoadCompBlockInfo;
52

H
hzcheng 已提交
53 54 55
/*
 * the header file info for one vnode
 */
56
typedef struct SHeaderFileInfo {
H
hjxilinx 已提交
57
  int32_t fileID;  // file id
58
} SHeaderFileInfo;
H
hzcheng 已提交
59

S
slguan 已提交
60
typedef struct SQueryCostSummary {
H
hzcheng 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  double cacheTimeUs;
  double fileTimeUs;

  int64_t numOfFiles;   // opened files during query
  int64_t numOfTables;  // num of queries tables
  int64_t numOfSeek;    // number of seek operation

  int64_t readDiskBlocks;     // accessed disk block
  int64_t skippedFileBlocks;  // skipped blocks
  int64_t blocksInCache;      // accessed cache blocks

  int64_t readField;       // field size
  int64_t totalFieldSize;  // total read fields size
  double  loadFieldUs;     // total elapsed time to read fields info

  int64_t totalBlockSize;  // read data blocks
  double  loadBlocksUs;    // total elapsed time to read data blocks

  int64_t totalGenData;  // in-memory generated data

  int64_t readCompInfo;       // read compblock info
  int64_t totalCompInfoSize;  // total comp block size
  double  loadCompInfoUs;     // total elapsed time to read comp block info

S
slguan 已提交
85 86 87
  int64_t tmpBufferInDisk;  // size of buffer for intermediate result
} SQueryCostSummary;

H
hjxilinx 已提交
88
typedef struct SPosInfo {
89 90
  int16_t pageId;
  int16_t rowId;
H
hjxilinx 已提交
91 92
} SPosInfo;

93 94 95 96 97 98 99 100 101 102
typedef struct STimeWindow {
  TSKEY skey;
  TSKEY ekey;
} STimeWindow;

typedef struct SWindowStatus {
  bool closed;
} SWindowStatus;

typedef struct SWindowResult {
S
slguan 已提交
103
  uint16_t     numOfRows;
104 105 106 107 108 109
  int16_t      nAlloc;
  SPosInfo     pos;         // Position of current result in disk-based output buffer
  SResultInfo* resultInfo;  // For each result column, there is a resultInfo
  STimeWindow  window;      // The time window that current result covers.
  SWindowStatus status;
} SWindowResult;
H
hzcheng 已提交
110

111 112 113 114 115 116 117 118 119
/*
 * header files info, avoid to iterate the directory, the data is acquired
 * during in query preparation function
 */
typedef struct SQueryFilesInfo {
  SHeaderFileInfo* pFileInfo;
  uint32_t         numOfFiles;  // the total available number of files for this virtual node during query execution
  int32_t          current;     // the memory mapped header file, NOTE: only one header file can be mmap.
  int32_t          vnodeId;
120 121 122 123 124
  
  int32_t          headerFd;         // header file fd
  int64_t          headerFileSize;
  int32_t          dataFd;
  int32_t          lastFd;
H
hjxilinx 已提交
125 126 127 128 129

  char headerFilePath[PATH_MAX];  // current opened header file name
  char dataFilePath[PATH_MAX];    // current opened data file name
  char lastFilePath[PATH_MAX];    // current opened last file path
  char dbFilePathPrefix[PATH_MAX];
130 131
} SQueryFilesInfo;

132 133
typedef struct SWindowResInfo {
  SWindowResult*      pResult;    // reference to SQuerySupporter->pResult
H
hjxilinx 已提交
134 135 136 137 138 139 140 141 142
  void*               hashList;   // hash list for quick access
  int16_t             type;       // data type for hash key
  int32_t             capacity;   // max capacity
  int32_t             curIndex;   // current start active index
  int32_t             size;
  
  int64_t             startTime;  // start time of the first time window for sliding query
  int64_t             prevSKey;   // previous (not completed) sliding window start key
  int64_t             threshold;  // threshold for return completed results.
143
} SWindowResInfo;
H
hjxilinx 已提交
144 145

typedef struct SQueryRuntimeEnv {
H
hjxilinx 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158
  SPositionInfo       startPos; /* the start position, used for secondary/third iteration */
  SPositionInfo       endPos;   /* the last access position in query, served as the start pos of reversed order query */
  SPositionInfo       nextPos;  /* start position of the next scan */
  SData*              colDataBuffer[TSDB_MAX_COLUMNS];
  SResultInfo*        resultInfo;
  uint8_t             blockStatus;  // Indicate if data block is loaded, the block is first/last/internal block
  int32_t             unzipBufSize;
  SData*              primaryColBuffer;
  char*               unzipBuffer;
  char*               secondaryUnzipBuffer;
  SQuery*             pQuery;
  SMeterObj*          pMeterObj;
  SQLFunctionCtx*     pCtx;
159 160 161 162 163 164 165 166
  SLoadDataBlockInfo  loadBlockInfo;         /* record current block load information */
  SLoadCompBlockInfo  loadCompBlockInfo; /* record current compblock information in SQuery */
  SQueryFilesInfo     vnodeFileInfo;
  int16_t             numOfRowsPerPage;
  int16_t             offset[TSDB_MAX_COLUMNS];
  int16_t             scanFlag;  // denotes reversed scan of data or not
  SInterpolationInfo  interpoInfo;
  SData**             pInterpoBuf;
H
hjxilinx 已提交
167
  
168
  SWindowResInfo      windowResInfo;
H
hjxilinx 已提交
169
  
170 171 172 173
  STSBuf*             pTSBuf;
  STSCursor           cur;
  SQueryCostSummary   summary;
  
H
hjxilinx 已提交
174
  STimeWindow         intervalWindow;  // the complete time window, not affected by the actual data distribution
H
hjxilinx 已提交
175
  
176 177 178 179 180 181 182
  /*
   * Temporarily hold the in-memory cache block info during scan cache blocks
   * Here we do not use the cacheblock info from pMeterObj, simple because it may change anytime
   * during the query by the subumit/insert handling threads.
   * So we keep a copy of the support structure as well as the cache block data itself.
   */
  SCacheBlock         cacheBlock;
H
hjxilinx 已提交
183
  
184
  SQueryDiskbasedResultBuf*    pResultBuf;   // query result buffer based on blocked-wised disk file
H
hjxilinx 已提交
185
  bool                stableQuery;  // is super table query or not
H
hzcheng 已提交
186 187
} SQueryRuntimeEnv;

H
hjxilinx 已提交
188
/* intermediate pos during multimeter query involves interval */
H
hzcheng 已提交
189
typedef struct SMeterQueryInfo {
S
slguan 已提交
190 191 192 193 194 195 196 197 198 199
  int64_t      lastKey;
  int64_t      skey;
  int64_t      ekey;
  int32_t      numOfRes;
  int32_t      reverseIndex;    // reversed output indicator, start from (numOfRes-1)
  int16_t      reverseFillRes;  // denote if reverse fill the results in supplementary scan required or not
  int16_t      queryRangeSet;   // denote if the query range is set, only available for interval query
  int16_t      lastResRows;
  int64_t      tag;
  STSCursor    cur;
200
  int32_t      sid; // for retrieve the page id list
201 202
  
  SWindowResInfo windowResInfo;
H
hzcheng 已提交
203 204 205 206 207 208
} SMeterQueryInfo;

typedef struct SMeterDataInfo {
  uint64_t     offsetInHeaderFile;
  int32_t      numOfBlocks;
  int32_t      start;  // start block index
209
  SCompBlock*  pBlock;
H
hzcheng 已提交
210 211
  int32_t      meterOrderIdx;
  SMeterObj*   pMeterObj;
212
  int32_t      groupIdx;    // group id in meter list
H
hzcheng 已提交
213 214 215 216
  SMeterQueryInfo* pMeterQInfo;
} SMeterDataInfo;

typedef struct SMeterQuerySupportObj {
217
  void* pMetersHashTable;   // meter table hash list
H
hzcheng 已提交
218 219 220 221 222 223 224 225 226 227 228

  SMeterSidExtInfo** pMeterSidExtInfo;
  int32_t            numOfMeters;

  /*
   * multimeter query resultset.
   * In multimeter queries, the result is temporarily stored on this structure, instead of
   * directly put result into output buffer, since we have no idea how many number of
   * rows may be generated by a specific subgroup. When query on all subgroups is executed,
   * the result is copy to output buffer. This attribution is not used during single meter query processing.
   */
229
//  SWindowResult*   pResult;
H
hzcheng 已提交
230
  SQueryRuntimeEnv runtimeEnv;
S
slguan 已提交
231 232 233 234
  int64_t          rawSKey;
  int64_t          rawEKey;
  int32_t          subgroupIdx;
  int32_t          offset; /* offset in group result set of subgroup */
H
hzcheng 已提交
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

  tSidSet* pSidSet;

  /*
   * the query is executed position on which meter of the whole list.
   * when the index reaches the last one of the list, it means the query is completed.
   * We later may refactor to remove this attribution by using another flag to denote
   * whether a multimeter query is completed or not.
   */
  int32_t meterIdx;

  int32_t numOfGroupResultPages;
  int32_t groupResultSize;
  SMeterDataInfo* pMeterDataInfo;

H
hjxilinx 已提交
250
  TSKEY* tsList;
H
hzcheng 已提交
251 252 253
} SMeterQuerySupportObj;

typedef struct _qinfo {
H
hjxilinx 已提交
254 255
  uint64_t       signature;
  int32_t        refCount;  // QInfo reference count, when the value is 0, it can be released safely
H
hzcheng 已提交
256 257 258 259 260 261 262 263 264
  char           user[TSDB_METER_ID_LEN + 1];
  char           sql[TSDB_SHOW_SQL_LEN];
  uint8_t        stream;
  uint16_t       port;
  uint32_t       ip;
  uint64_t       startTime;
  int64_t        useconds;
  int            killed;
  struct _qinfo *prev, *next;
H
hjxilinx 已提交
265 266 267 268 269 270 271 272 273 274 275
  SQuery         query;
  int            totalPoints;
  int            pointsRead;
  int            pointsReturned;
  int            pointsInterpo;
  int            code;
  char           bufIndex;
  char           changed;
  char           over;
  SMeterObj*     pObj;
  sem_t          dataReady;
H
hzcheng 已提交
276 277

  SMeterQuerySupportObj* pMeterQuerySupporter;
H
hjxilinx 已提交
278
  int (*fp)(SMeterObj*, SQuery*);
H
hzcheng 已提交
279 280
} SQInfo;

281
int32_t vnodeQuerySingleTablePrepare(SQInfo* pQInfo, SMeterObj* pMeterObj, SMeterQuerySupportObj* pSMultiMeterObj,
S
slguan 已提交
282
                                     void* param);
H
hzcheng 已提交
283 284 285 286 287

void vnodeQueryFreeQInfoEx(SQInfo* pQInfo);

bool vnodeParametersSafetyCheck(SQuery* pQuery);

S
slguan 已提交
288
int32_t vnodeMultiMeterQueryPrepare(SQInfo* pQInfo, SQuery* pQuery, void* param);
H
hzcheng 已提交
289 290 291 292 293 294 295 296 297

/**
 * decrease the numofQuery of each table that is queried, enable the
 * remove/close operation can be executed
 * @param pQInfo
 */
void vnodeDecMeterRefcnt(SQInfo* pQInfo);

/* sql query handle in dnode */
H
hjxilinx 已提交
298
void vnodeSingleTableQuery(SSchedMsg* pMsg);
H
hzcheng 已提交
299 300 301 302 303 304 305 306 307 308 309

/*
 * handle multi-meter query process
 */
void vnodeMultiMeterQuery(SSchedMsg* pMsg);

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_VNODEREAD_H