vnodeRead.h 10.0 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"
H
hzcheng 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37

#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;

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

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

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

S
slguan 已提交
59
typedef struct SQueryCostSummary {
H
hzcheng 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  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 已提交
84 85 86 87 88 89 90 91 92
  int64_t tmpBufferInDisk;  // size of buffer for intermediate result
} SQueryCostSummary;

typedef struct SOutputRes {
  uint16_t     numOfRows;
  int32_t      nAlloc;
  tFilePage**  result;
  SResultInfo* resultInfo;
} SOutputRes;
H
hzcheng 已提交
93

94 95 96 97 98 99 100 101 102
/*
 * 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;
103 104 105 106 107
  
  int32_t          headerFd;         // header file fd
  int64_t          headerFileSize;
  int32_t          dataFd;
  int32_t          lastFd;
H
hjxilinx 已提交
108 109 110 111 112

  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];
113 114
} SQueryFilesInfo;

H
hjxilinx 已提交
115 116 117 118 119 120 121 122 123 124
typedef struct STimeWindow {
  TSKEY skey;
  TSKEY ekey;
} STimeWindow;

typedef struct SWindowStatus {
  STimeWindow window;
  bool closed;
} SWindowStatus;

H
hjxilinx 已提交
125
typedef struct SSlidingWindowInfo {
H
hjxilinx 已提交
126 127 128 129 130 131 132 133 134 135 136
  SOutputRes*         pResult;    // reference to SQuerySupporter->pResult
  SWindowStatus*      pStatus;    // current query window closed or not?
  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.
H
hjxilinx 已提交
137
} SSlidingWindowInfo;
H
hjxilinx 已提交
138 139

typedef struct SQueryRuntimeEnv {
H
hjxilinx 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152
  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;
153 154 155 156 157 158 159 160
  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 已提交
161
  
H
hjxilinx 已提交
162
  SSlidingWindowInfo   swindowResInfo;
H
hjxilinx 已提交
163
  
164 165 166 167
  STSBuf*             pTSBuf;
  STSCursor           cur;
  SQueryCostSummary   summary;
  
H
hjxilinx 已提交
168
  STimeWindow         intervalWindow;  // the complete time window, not affected by the actual data distribution
H
hjxilinx 已提交
169
  
170 171 172 173 174 175 176
  /*
   * 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
hzcheng 已提交
177 178 179 180
} SQueryRuntimeEnv;

/* intermediate result during multimeter query involves interval */
typedef struct SMeterQueryInfo {
S
slguan 已提交
181 182 183 184 185 186 187 188 189 190 191 192 193 194
  int64_t      lastKey;
  int64_t      skey;
  int64_t      ekey;
  int32_t      numOfRes;
  uint32_t     numOfPages;
  uint32_t     numOfAlloc;
  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;
  SResultInfo* resultInfo;
  uint32_t*    pageList;
H
hzcheng 已提交
195 196 197 198 199 200
} SMeterQueryInfo;

typedef struct SMeterDataInfo {
  uint64_t     offsetInHeaderFile;
  int32_t      numOfBlocks;
  int32_t      start;  // start block index
201
  SCompBlock*  pBlock;
H
hzcheng 已提交
202 203
  int32_t      meterOrderIdx;
  SMeterObj*   pMeterObj;
204
  int32_t      groupIdx;    // group id in meter list
H
hzcheng 已提交
205 206 207 208
  SMeterQueryInfo* pMeterQInfo;
} SMeterDataInfo;

typedef struct SMeterQuerySupportObj {
209
  void* pMetersHashTable;   // meter table hash list
H
hzcheng 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222

  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.
   */
  SOutputRes*      pResult;
  SQueryRuntimeEnv runtimeEnv;
S
slguan 已提交
223 224 225 226
  int64_t          rawSKey;
  int64_t          rawEKey;
  int32_t          subgroupIdx;
  int32_t          offset; /* offset in group result set of subgroup */
H
hzcheng 已提交
227 228 229 230 231 232 233 234 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 meterOutputFd;
  int32_t lastPageId;
  int32_t numOfPages;
  int32_t numOfGroupResultPages;
  int32_t groupResultSize;

  char*   meterOutputMMapBuf;
  int64_t bufSize;
  char    extBufFile[256];  // external file name

  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;

S
slguan 已提交
281 282
int32_t vnodeQuerySingleMeterPrepare(SQInfo* pQInfo, SMeterObj* pMeterObj, SMeterQuerySupportObj* pSMultiMeterObj,
                                     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