• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #5130

26 Oct 2026 11:45AM UTC coverage: 64.429% (-9.4%) from 73.872%
#5130

push

travis-ci

kailixu
fix: keep extconnector symbols when catalog is linked last

Static GNU ld scans each archive once, so catalog consumers fail on
extLoadDialectDefaults after the last libextconnector.a.

314472 of 488088 relevant lines covered (64.43%)

57181010.44 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.86
/source/dnode/vnode/src/vnd/vnodeQuery.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * SPDX-License-Identifier: AGPL-3.0-or-later
5
 *
6
 * This program is free software: you can use, redistribute, and/or modify
7
 * it under the terms of the GNU Affero General Public License, version 3
8
 * or later ("AGPL"), as published by the Free Software Foundation.
9
 *
10
 * This program is distributed in the hope that it will be useful, but WITHOUT
11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
 * FITNESS FOR A PARTICULAR PURPOSE.
13
 *
14
 * You should have received a copy of the GNU Affero General Public License
15
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
 */
17

18
#include "meta.h"
19
#include "tsdb.h"
20
#include "tutil.h"
21
#include "vnd.h"
22

23
#define VNODE_GET_LOAD_RESET_VALS(pVar, oVal, vType, tags)                                                    \
24
  do {                                                                                                        \
25
    int##vType##_t newVal = atomic_sub_fetch_##vType(&(pVar), (oVal));                                        \
26
    if (newVal < 0) {                                                                                         \
27
      vWarn("vgId:%d, %s, abnormal val:%" PRIi64 ", old val:%" PRIi64, TD_VID(pVnode), tags, newVal, (oVal)); \
28
    }                                                                                                         \
29
  } while (0)
30

31
int vnodeQueryOpen(SVnode *pVnode) {
1,405,914 ✔
32
  return qWorkerInit(NODE_TYPE_VNODE, TD_VID(pVnode), (void **)&pVnode->pQuery, &pVnode->msgCb);
1,405,914 ✔
33
}
34

35
void vnodeQueryPreClose(SVnode *pVnode) { qWorkerStopAllTasks((void *)pVnode->pQuery); }
1,405,734 ✔
36

37
void vnodeQueryClose(SVnode *pVnode) { qWorkerDestroy((void **)&pVnode->pQuery); }
1,416,822 ✔
38

39
int32_t fillTableColCmpr(SMetaReader *reader, SSchemaExt *pExt, int32_t numOfCol) {
51,119,376 ✔
40
  int8_t tblType = reader->me.type;
51,119,376 ✔
41
  if (withColCompress(tblType)) {
51,119,376 ✔
42
    SColCmprWrapper *p = &(reader->me.colCmpr);
39,100,671 ✔
43
    if (numOfCol != p->nCols) {
39,100,671 ✔
44
      vError("fillTableColCmpr table type:%d, col num:%d, col cmpr num:%d mismatch", tblType, numOfCol, p->nCols);
×
45
      return TSDB_CODE_APP_ERROR;
×
46
    }
47
    for (int i = 0; i < p->nCols; i++) {
371,663,240 ✔
48
      SColCmpr *pCmpr = &p->pColCmpr[i];
332,562,569 ✔
49
      pExt[i].colId = pCmpr->id;
332,562,569 ✔
50
      pExt[i].compress = pCmpr->alg;
332,562,569 ✔
51
    }
52
  }
53
  return 0;
51,091,465 ✔
54
}
55

56
void vnodeDebugTableMeta(STableMetaRsp *pMeta) {
23,279,674 ✔
57
  if (!(qDebugFlag & DEBUG_DEBUG)) {
23,279,674 ✔
58
    return;
16,518,812 ✔
59
  }
60

61
  qDebug("tbName:%s", pMeta->tbName);
6,760,862 ✔
62
  qDebug("stbName:%s", pMeta->stbName);
6,761,042 ✔
63
  qDebug("dbFName:%s", pMeta->dbFName);
6,761,042 ✔
64
  qDebug("dbId:%" PRId64, pMeta->dbId);
6,761,042 ✔
65
  qDebug("numOfTags:%d", pMeta->numOfTags);
6,761,042 ✔
66
  qDebug("numOfColumns:%d", pMeta->numOfColumns);
6,761,042 ✔
67
  qDebug("precision:%d", pMeta->precision);
6,761,042 ✔
68
  qDebug("tableType:%d", pMeta->tableType);
6,761,042 ✔
69
  qDebug("sversion:%d", pMeta->sversion);
6,760,986 ✔
70
  qDebug("tversion:%d", pMeta->tversion);
6,760,986 ✔
71
  qDebug("suid:%" PRIu64, pMeta->suid);
6,760,986 ✔
72
  qDebug("tuid:%" PRIu64, pMeta->tuid);
6,760,986 ✔
73
  qDebug("vgId:%d", pMeta->vgId);
6,760,986 ✔
74
  qDebug("sysInfo:%d", pMeta->sysInfo);
6,760,986 ✔
75
  if (pMeta->pSchemas) {
6,760,986 ✔
76
    for (int32_t i = 0; i < (pMeta->numOfColumns + pMeta->numOfTags); ++i) {
54,634,139 ✔
77
      SSchema *pSchema = pMeta->pSchemas + i;
47,872,925 ✔
78
      qDebug("%d col/tag: type:%d, flags:%d, colId:%d, bytes:%d, name:%s", i, pSchema->type, pSchema->flags,
47,872,925 ✔
79
             pSchema->colId, pSchema->bytes, pSchema->name);
80
    }
81
  }
82
}
83

84
int32_t fillTableColRef(SMetaReader *reader, SColRef *pRef, int32_t numOfCol) {
11,988,747 ✔
85
  int32_t code = TSDB_CODE_SUCCESS;
11,988,747 ✔
86
  int32_t line = 0;
11,988,747 ✔
87
  int8_t tblType = reader->me.type;
11,988,747 ✔
88
  if (hasColRef(tblType)) {
11,988,747 ✔
89
    SColRefWrapper *p = &(reader->me.colRef);
11,989,045 ✔
90
    if (numOfCol != p->nCols) {
11,989,045 ✔
91
      vError("fillTableColRef table type:%d, col num:%d, col cmpr num:%d mismatch", tblType, numOfCol, p->nCols);
×
92
      code = TSDB_CODE_APP_ERROR;
×
93
      goto _return;
×
94
    }
95
    for (int i = 0; i < p->nCols; i++) {
197,524,302 ✔
96
      SColRef *pColRef = &p->pColRef[i];
185,535,257 ✔
97
      pRef[i].hasRef = pColRef->hasRef;
185,535,257 ✔
98
      pRef[i].id = pColRef->id;
185,535,257 ✔
99
      if (pRef[i].hasRef) {
185,535,257 ✔
100
        pRef[i].refType = pColRef->refType;
152,083,880 ✔
101
        tstrncpy(pRef[i].refSourceName, pColRef->refSourceName, TSDB_EXT_SOURCE_NAME_LEN);
152,083,880 ✔
102
        tstrncpy(pRef[i].refSchemaName, pColRef->refSchemaName, TSDB_EXT_SOURCE_SCHEMA_LEN);
152,083,880 ✔
103
        tstrncpy(pRef[i].refDbName, pColRef->refDbName, TSDB_DB_NAME_LEN);
152,083,880 ✔
104
        tstrncpy(pRef[i].refTableName, pColRef->refTableName, TSDB_TABLE_NAME_LEN);
152,083,880 ✔
105
        tstrncpy(pRef[i].refColName, pColRef->refColName, TSDB_COL_NAME_LEN);
152,083,880 ✔
106
        if (pColRef->tagCondLen > 0 && pColRef->tagCondJson) {
152,083,880 ✔
107
          pRef[i].tagCondLen = pColRef->tagCondLen;
103,055 ✔
108
          pRef[i].tagCondJson = taosStrdup(pColRef->tagCondJson);
103,055 ✔
109
          QUERY_CHECK_NULL(pRef[i].tagCondJson, code, line, _return, terrno);
103,055 ✔
110
        } else {
111
          pRef[i].tagCondLen = 0;
151,980,825 ✔
112
          pRef[i].tagCondJson = NULL;
151,980,825 ✔
113
        }
114
        if (pColRef->filterCondLen > 0 && pColRef->filterCondJson) {
152,083,880 ✔
115
          pRef[i].filterCondLen = pColRef->filterCondLen;
×
116
          pRef[i].filterCondJson = taosStrdup(pColRef->filterCondJson);
×
117
          QUERY_CHECK_NULL(pRef[i].filterCondJson, code, line, _return, terrno);
×
118
        } else {
119
          pRef[i].filterCondLen = 0;
152,083,880 ✔
120
          pRef[i].filterCondJson = NULL;
152,083,880 ✔
121
        }
122
      }
123
    }
124
  }
125

126
_return:
11,989,045 ✔
127
  if (TSDB_CODE_SUCCESS != code) {
11,989,045 ✔
128
    qError("%s failed since %s", __func__, tstrerror(code));
×
129
  }
130
  return code;
11,988,886 ✔
131
}
132

133
int32_t fillTableTagRef(SMetaReader *reader, SColRef *pRef, int32_t numOfTagRefs) {
527,008 ✔
134
  int8_t tblType = reader->me.type;
527,008 ✔
135
  if (hasTagRef(tblType)) {
527,008 ✔
136
    SColRefWrapper *p = &(reader->me.colRef);
527,008 ✔
137
    if (numOfTagRefs != p->nTagRefs) {
527,008 ✔
138
      vError("fillTableTagRef table type:%d, tag ref num:%d, expected:%d mismatch", tblType, numOfTagRefs, p->nTagRefs);
×
139
      return TSDB_CODE_APP_ERROR;
×
140
    }
141
    for (int i = 0; i < p->nTagRefs; i++) {
1,729,337 ✔
142
      SColRef *pTagRef = &p->pTagRef[i];
1,202,329 ✔
143
      pRef[i].hasRef = pTagRef->hasRef;
1,202,329 ✔
144
      pRef[i].id = pTagRef->id;
1,202,329 ✔
145
      if (pRef[i].hasRef) {
1,202,329 ✔
146
        tstrncpy(pRef[i].refDbName, pTagRef->refDbName, TSDB_DB_NAME_LEN);
943,007 ✔
147
        tstrncpy(pRef[i].refTableName, pTagRef->refTableName, TSDB_TABLE_NAME_LEN);
943,007 ✔
148
        tstrncpy(pRef[i].refColName, pTagRef->refColName, TSDB_COL_NAME_LEN);
943,007 ✔
149
      }
150
    }
151
  }
152
  return 0;
527,008 ✔
153
}
154

155
int32_t vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, bool direct) {
27,749,118 ✔
156
  STableInfoReq  infoReq = {0};
27,749,118 ✔
157
  STableMetaRsp  metaRsp = {0};
27,749,339 ✔
158
  SMetaReader    mer1 = {0};
27,748,119 ✔
159
  SMetaReader    mer2 = {0};
27,747,784 ✔
160
  char           tableFName[TSDB_TABLE_FNAME_LEN];
27,747,521 ✔
161
  bool           reqTbUid = false;
27,747,789 ✔
162
  SRpcMsg        rpcMsg = {0};
27,747,789 ✔
163
  int32_t        code = 0;
27,747,867 ✔
164
  int32_t        rspLen = 0;
27,747,867 ✔
165
  void          *pRsp = NULL;
27,747,867 ✔
166
  SSchemaWrapper schema = {0};
27,747,867 ✔
167
  SSchemaWrapper schemaTag = {0};
27,748,284 ✔
168
  uint8_t        autoCreateCtb = 0;
27,748,024 ✔
169
  SSchema       *pMergedCols = NULL;  // vchild: vstb row schema + own (extension) columns
27,748,024 ✔
170
  SColRef       *pMergedRefs = NULL;  // vchild: persisted colRef + own column refs
27,747,407 ✔
171
  int32_t        nMergedCols = 0;
27,746,907 ✔
172
  SSchema       *pMergedTags = NULL;  // vchild: vstb tag schema + own (extension) tags
27,747,049 ✔
173
  int32_t        nMergedTags = 0;
27,747,199 ✔
174

175
  // decode req
176
  if (tDeserializeSTableInfoReq(pMsg->pCont, pMsg->contLen, &infoReq) != 0) {
27,747,363 ✔
177
    code = terrno;
×
178
    goto _exit4;
×
179
  }
180
  autoCreateCtb = infoReq.autoCreateCtb;
27,748,549 ✔
181

182
  if (infoReq.option == REQ_OPT_TBUID) reqTbUid = true;
27,748,549 ✔
183
  metaRsp.dbId = pVnode->config.dbId;
27,748,549 ✔
184
  tstrncpy(metaRsp.tbName, infoReq.tbName, TSDB_TABLE_NAME_LEN);
27,748,549 ✔
185
  (void)memcpy(metaRsp.dbFName, infoReq.dbFName, sizeof(metaRsp.dbFName));
27,748,549 ✔
186

187
  if (!reqTbUid) {
27,748,549 ✔
188
    (void)snprintf(tableFName, TSDB_TABLE_FNAME_LEN, "%s.%s", infoReq.dbFName, infoReq.tbName);
27,733,669 ✔
189
    if (pVnode->mounted) tTrimMountPrefix(tableFName);
27,733,669 ✔
190
    code = vnodeValidateTableHash(pVnode, tableFName);
27,733,669 ✔
191
    if (code) {
27,733,247 ✔
192
      goto _exit4;
×
193
    }
194
  }
195

196
  // query meta
197
  metaReaderDoInit(&mer1, pVnode->pMeta, META_READER_LOCK, infoReq.txnId);
27,748,127 ✔
198
  if (reqTbUid) {
27,748,936 ✔
199
    SET_ERRNO(0);
15,038 ✔
200
    uint64_t tbUid = taosStr2UInt64(infoReq.tbName, NULL, 10);
15,038 ✔
201
    if (ERRNO == ERANGE || tbUid == 0) {
15,038 ✔
202
      code = TSDB_CODE_TDB_TABLE_NOT_EXIST;
1,014 ✔
203
      goto _exit3;
1,014 ✔
204
    }
205
    SMetaReader mr3 = {0};
14,024 ✔
206
    metaReaderDoInit(&mr3, ((SVnode *)pVnode)->pMeta, META_READER_NOLOCK, infoReq.txnId);
14,024 ✔
207
    if ((code = metaReaderGetTableEntryByUid(&mr3, tbUid)) < 0) {
14,024 ✔
208
      metaReaderClear(&mr3);
2,703 ✔
209
      TAOS_CHECK_GOTO(code, NULL, _exit3);
2,703 ✔
210
    }
211
    tstrncpy(metaRsp.tbName, mr3.me.name, TSDB_TABLE_NAME_LEN);
11,321 ✔
212
    metaReaderClear(&mr3);
11,321 ✔
213
    TAOS_CHECK_GOTO(metaGetTableEntryByName(&mer1, metaRsp.tbName), NULL, _exit3);
11,321 ✔
214
  } else if (metaGetTableEntryByName(&mer1, infoReq.tbName) < 0) {
27,733,898 ✔
215
    code = terrno;
4,465,104 ✔
216
    goto _exit3;
4,465,104 ✔
217
  }
218

219
  metaRsp.tableType = mer1.me.type;
23,279,430 ✔
220
  metaRsp.vgId = TD_VID(pVnode);
23,279,430 ✔
221
  metaRsp.tuid = mer1.me.uid;
23,279,430 ✔
222
  metaRsp.isAudit = pVnode->config.isAudit ? 1 : 0;
23,279,430 ✔
223

224
  switch (mer1.me.type) {
23,279,430 ✔
225
    case TSDB_SUPER_TABLE: {
1,050,912 ✔
226
      tstrncpy(metaRsp.stbName, mer1.me.name, sizeof(metaRsp.stbName));
1,050,912 ✔
227
      schema = mer1.me.stbEntry.schemaRow;
1,050,912 ✔
228
      schemaTag = mer1.me.stbEntry.schemaTag;
1,050,912 ✔
229
      metaRsp.suid = mer1.me.uid;
1,050,912 ✔
230
      metaRsp.virtualStb = TABLE_IS_VIRTUAL(mer1.me.flags);
1,050,912 ✔
231
      metaRsp.ownerId = mer1.me.stbEntry.ownerId;
1,050,912 ✔
232
      metaRsp.secLvl = mer1.me.stbEntry.securityLevel;
1,050,912 ✔
233
      break;
1,050,912 ✔
234
    }
235
    case TSDB_CHILD_TABLE:
5,270,472 ✔
236
    case TSDB_VIRTUAL_CHILD_TABLE:{
237
      metaReaderDoInit(&mer2, pVnode->pMeta, META_READER_NOLOCK, infoReq.txnId);
5,270,472 ✔
238
      if (metaReaderGetTableEntryByUid(&mer2, mer1.me.ctbEntry.suid) < 0) goto _exit2;
5,270,583 ✔
239

240
      tstrncpy(metaRsp.stbName, mer2.me.name, sizeof(metaRsp.stbName));
5,270,583 ✔
241
      metaRsp.suid = mer2.me.uid;
5,270,583 ✔
242
      metaRsp.ownerId = mer2.me.stbEntry.ownerId;  // child table inherits ownerId from stb
5,270,583 ✔
243
      metaRsp.secLvl = mer2.me.stbEntry.securityLevel;  // child table inherits secLvl from stb
5,270,583 ✔
244
      schema = mer2.me.stbEntry.schemaRow;
5,270,583 ✔
245
      schemaTag = mer2.me.stbEntry.schemaTag;
5,270,583 ✔
246
      break;
5,270,583 ✔
247
    }
248
    case TSDB_NORMAL_TABLE:
4,969,312 ✔
249
      metaRsp.secLvl = pVnode->config.securityLevel;  // normal table inherits secLvl from vnode config
4,969,312 ✔
250
    case TSDB_VIRTUAL_NORMAL_TABLE: {
16,958,046 ✔
251
      schema = mer1.me.ntbEntry.schemaRow;
16,958,046 ✔
252
      schemaTag = mer1.me.ntbEntry.schemaTag;  // normal/virtual-normal tables may own tags
16,958,046 ✔
253
      metaRsp.ownerId = mer1.me.ntbEntry.ownerId;
16,958,046 ✔
254
      break;
16,958,046 ✔
255
    }
256
    default: {
×
257
      vError("vnodeGetTableMeta get invalid table type:%d", mer1.me.type);
×
258
      goto _exit3;
×
259
    }
260
  }
261

262
  // For a virtual child table, build the merged column view first: vstb row schema followed
263
  // by the vchild's own (extension) columns, persisted colRef followed by own column refs.
264
  nMergedCols = schema.nCols;
23,279,541 ✔
265
  if (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
23,279,541 ✔
266
    code = metaBuildMergedColView(&mer1.me, &schema, &pMergedCols, &pMergedRefs, &nMergedCols);
1,099,667 ✔
267
    if (code) {
1,099,667 ✔
268
      vError("vgId:%d, vnodeGetTableMeta build merged col view for %s failed since %s", TD_VID(pVnode),
×
269
             infoReq.tbName, tstrerror(code));
270
      goto _exit;
×
271
    }
272
    // merged tag view: vstb tag schema followed by the vchild's own (extension) tags
273
    nMergedTags = schemaTag.nCols;
1,099,667 ✔
274
    code = metaBuildMergedTagView(&mer1.me, &schemaTag, &pMergedTags, &nMergedTags);
1,099,667 ✔
275
    if (code) {
1,099,667 ✔
276
      vError("vgId:%d, vnodeGetTableMeta build merged tag view for %s failed since %s", TD_VID(pVnode),
×
277
             infoReq.tbName, tstrerror(code));
278
      goto _exit;
×
279
    }
280
  }
281

282
  metaRsp.numOfTags = (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) ? nMergedTags : schemaTag.nCols;
23,279,541 ✔
283
  metaRsp.numOfColumns = nMergedCols;
23,279,541 ✔
284
  metaRsp.precision = pVnode->config.tsdbCfg.precision;
23,279,541 ✔
285
  metaRsp.sversion = schema.version;
23,279,541 ✔
286
  metaRsp.tversion = schemaTag.version;
23,279,541 ✔
287
  metaRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (metaRsp.numOfColumns + metaRsp.numOfTags));
23,279,541 ✔
288
  metaRsp.pSchemaExt = (SSchemaExt *)taosMemoryCalloc(metaRsp.numOfColumns, sizeof(SSchemaExt));
23,278,488 ✔
289
  if (NULL == metaRsp.pSchemas || NULL == metaRsp.pSchemaExt) {
23,279,229 ✔
290
    code = terrno;
×
291
    goto _exit;
×
292
  }
293
  if (pMergedCols) {
23,279,721 ✔
294
    (void)memcpy(metaRsp.pSchemas, pMergedCols, sizeof(SSchema) * nMergedCols);
1,099,667 ✔
295
  } else {
296
    (void)memcpy(metaRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
22,180,054 ✔
297
  }
298
  if (pMergedTags) {
23,279,721 ✔
299
    (void)memcpy(metaRsp.pSchemas + metaRsp.numOfColumns, pMergedTags, sizeof(SSchema) * nMergedTags);
1,099,667 ✔
300
  } else if (schemaTag.nCols) {
22,180,054 ✔
301
    (void)memcpy(metaRsp.pSchemas + metaRsp.numOfColumns, schemaTag.pSchema, sizeof(SSchema) * schemaTag.nCols);
5,242,620 ✔
302
  }
303
  if (metaRsp.pSchemaExt) {
23,279,721 ✔
304
    SMetaReader *pReader =
23,281,497 ✔
305
        (mer1.me.type == TSDB_CHILD_TABLE || mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) ? &mer2 : &mer1;
23,279,882 ✔
306
    // col compress/ext schema of the vstb part only; own columns keep zeroed ext schema
307
    code = fillTableColCmpr(pReader, metaRsp.pSchemaExt, schema.nCols);
23,279,882 ✔
308
    if (code < 0) {
23,279,698 ✔
309
      goto _exit;
×
310
    }
311
    for (int32_t i = 0; i < metaRsp.numOfColumns; i++) {
322,499,762 ✔
312
      metaRsp.pSchemaExt[i].colId = metaRsp.pSchemas[i].colId;
299,220,064 ✔
313
      if (i < schema.nCols) {
299,220,064 ✔
314
        if (pReader->me.pExtSchemas) {
299,199,615 ✔
315
          metaRsp.pSchemaExt[i].typeMod = pReader->me.pExtSchemas[i].typeMod;
5,562,762 ✔
316
        }
317
      } else if (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE && mer1.me.own.pOwnColExtSchemas != NULL &&
20,449 ✔
318
                 mer1.me.own.nOwnCols == metaRsp.numOfColumns - schema.nCols) {
676 ✔
319
        // every producer path allocates the own ext area with nOwnCols entries, so a non-NULL
320
        // array covers the whole own range; the count check keeps that local instead of assumed
321
        metaRsp.pSchemaExt[i].typeMod = mer1.me.own.pOwnColExtSchemas[i - schema.nCols].typeMod;
676 ✔
322
      }
323
    }
324
  } else {
325
    code = TSDB_CODE_OUT_OF_MEMORY;
6 ✔
326
    goto _exit;
6 ✔
327
  }
328
  if (hasColRef(mer1.me.type)) {
23,279,698 ✔
329
    metaRsp.rversion = mer1.me.colRef.version;
13,088,117 ✔
330
    if (pMergedRefs) {
13,088,117 ✔
331
      // merged view already validated (persisted colRef aligned with the vstb schema) and
332
      // deep-copied by metaBuildMergedColView; transfer ownership to the response
333
      metaRsp.pColRefs = pMergedRefs;
1,099,667 ✔
334
      pMergedRefs = NULL;
1,099,667 ✔
335
    } else {
336
      metaRsp.pColRefs = (SColRef*)taosMemoryCalloc(metaRsp.numOfColumns, sizeof(SColRef));
11,988,450 ✔
337
      if (metaRsp.pColRefs) {
11,988,611 ✔
338
        code = fillTableColRef(&mer1, metaRsp.pColRefs, metaRsp.numOfColumns);
11,988,611 ✔
339
        if (code < 0) {
11,989,045 ✔
340
          goto _exit;
×
341
        }
342
      }
343
    }
344
    metaRsp.numOfColRefs = metaRsp.numOfColumns;
13,088,712 ✔
345

346
    // Fill tag references
347
    if (mer1.me.colRef.nTagRefs > 0) {
13,088,712 ✔
348
      metaRsp.pTagRefs = (SColRef*)taosMemoryCalloc(mer1.me.colRef.nTagRefs, sizeof(SColRef));
527,008 ✔
349
      if (metaRsp.pTagRefs) {
527,008 ✔
350
        code = fillTableTagRef(&mer1, metaRsp.pTagRefs, mer1.me.colRef.nTagRefs);
527,008 ✔
351
        if (code < 0) {
527,008 ✔
352
          taosMemoryFreeClear(metaRsp.pTagRefs);
×
353
          goto _exit;
×
354
        }
355
      } else {
356
        code = terrno;
×
357
        goto _exit;
×
358
      }
359
      metaRsp.numOfTagRefs = mer1.me.colRef.nTagRefs;
527,008 ✔
360
    } else {
361
      metaRsp.pTagRefs = NULL;
12,561,704 ✔
362
      metaRsp.numOfTagRefs = 0;
12,561,704 ✔
363
    }
364
  } else {
365
    metaRsp.pColRefs = NULL;
10,191,725 ✔
366
    metaRsp.numOfColRefs = 0;
10,191,725 ✔
367
    metaRsp.pTagRefs = NULL;
10,191,725 ✔
368
    metaRsp.numOfTagRefs = 0;
10,191,725 ✔
369
  }
370

371
  // Fill series
372
  if (mer1.me.series.nSeries > 0) {
23,280,437 ✔
373
    metaRsp.numOfSeries = mer1.me.series.nSeries;
16,908 ✔
374
    metaRsp.pSeries = taosMemoryCalloc(mer1.me.series.nSeries, sizeof(SSeriesEntry));
16,908 ✔
375
    if (metaRsp.pSeries) {
16,908 ✔
376
      for (int32_t i = 0; i < mer1.me.series.nSeries; i++) {
102,031 ✔
377
        SSeriesEntry *src = &mer1.me.series.pSeries[i];
85,123 ✔
378
        SSeriesEntry *dst = &metaRsp.pSeries[i];
85,123 ✔
379
        tstrncpy(dst->alias, src->alias, TSDB_COL_NAME_LEN);
85,123 ✔
380
        tstrncpy(dst->sourceName, src->sourceName, TSDB_EXT_SOURCE_NAME_LEN);
85,123 ✔
381
        tstrncpy(dst->dbName, src->dbName, TSDB_DB_NAME_LEN);
85,123 ✔
382
        tstrncpy(dst->measurementName, src->measurementName, TSDB_TABLE_NAME_LEN);
85,123 ✔
383
        dst->tagCondLen = src->tagCondLen;
85,123 ✔
384
        dst->tagCondJson = src->tagCondJson ? taosStrdup(src->tagCondJson) : NULL;
85,123 ✔
385
      }
386
    } else {
387
      code = terrno;
×
388
      goto _exit;
×
389
    }
390
  } else {
391
    metaRsp.numOfSeries = 0;
23,263,529 ✔
392
    metaRsp.pSeries = NULL;
23,263,529 ✔
393
  }
394

395
  vnodeDebugTableMeta(&metaRsp);
23,280,437 ✔
396

397
  // encode and send response
398
  rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
23,279,852 ✔
399
  if (rspLen < 0) {
23,278,589 ✔
400
    code = terrno;
×
401
    goto _exit;
×
402
  }
403

404
  if (direct) {
23,278,589 ✔
405
    pRsp = rpcMallocCont(rspLen);
16,994,014 ✔
406
  } else {
407
    pRsp = taosMemoryCalloc(1, rspLen);
6,284,575 ✔
408
  }
409

410
  if (pRsp == NULL) {
23,277,619 ✔
411
    code = terrno;
×
412
    goto _exit;
×
413
  }
414

415
  rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp);
23,277,619 ✔
416
  if (rspLen < 0) {
23,279,549 ✔
417
    code = terrno;
×
418
    goto _exit;
×
419
  }
420

421
_exit:
23,279,388 ✔
422
  taosMemoryFreeClear(pMergedCols);
23,279,048 ✔
423
  taosMemoryFreeClear(pMergedTags);
23,279,048 ✔
424
  if (pMergedRefs) {
23,279,048 ✔
425
    tFreeSColRefArray(pMergedRefs, nMergedCols);
×
426
    taosMemoryFreeClear(pMergedRefs);
×
427
  }
428
  tFreeSTableMetaRsp(&metaRsp);
23,279,048 ✔
429
_exit2:
23,278,889 ✔
430
  metaReaderClear(&mer2);
23,279,853 ✔
431
_exit3:
27,747,449 ✔
432
  metaReaderClear(&mer1);
27,749,089 ✔
433
_exit4:
27,747,941 ✔
434
  rpcMsg.info = pMsg->info;
27,749,217 ✔
435
  rpcMsg.pCont = pRsp;
27,749,217 ✔
436
  rpcMsg.contLen = rspLen;
27,749,217 ✔
437
  rpcMsg.code = code;
27,749,217 ✔
438
  rpcMsg.msgType = direct ? pMsg->msgType + 1 : pMsg->msgType;
27,749,217 ✔
439

440
  if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST && autoCreateCtb == 1) {
27,749,217 ✔
441
    code = TSDB_CODE_SUCCESS;
3,342,294 ✔
442
  }
443

444
  if (code) {
27,749,169 ✔
445
    qError("vgId:%d, get table %s meta with %" PRIu8 " failed cause of %s", pVnode->config.vgId, infoReq.tbName,
1,126,767 ✔
446
           infoReq.option, tstrerror(code));
447
  }
448

449
  if (direct) {
27,747,668 ✔
450
    tmsgSendRsp(&rpcMsg);
17,205,758 ✔
451
  } else {
452
    *pMsg = rpcMsg;
10,541,910 ✔
453
  }
454

455
  return code;
27,747,668 ✔
456
}
457

458
int32_t vnodeGetTableCfg(SVnode *pVnode, SRpcMsg *pMsg, bool direct) {
27,840,099 ✔
459
  STableCfgReq   cfgReq = {0};
27,840,099 ✔
460
  STableCfgRsp   cfgRsp = {0};
27,840,099 ✔
461
  SMetaReader    mer1 = {0};
27,840,099 ✔
462
  SMetaReader    mer2 = {0};
27,840,099 ✔
463
  char           tableFName[TSDB_TABLE_FNAME_LEN];
27,840,099 ✔
464
  SRpcMsg        rpcMsg = {0};
27,840,099 ✔
465
  int32_t        code = 0;
27,840,099 ✔
466
  int32_t        rspLen = 0;
27,840,099 ✔
467
  void          *pRsp = NULL;
27,840,099 ✔
468
  SSchemaWrapper schema = {0};
27,840,099 ✔
469
  SSchemaWrapper schemaTag = {0};
27,840,099 ✔
470
  SSchema       *pMergedCols = NULL;  // vchild: vstb row schema + own (extension) columns
27,840,099 ✔
471
  SColRef       *pMergedRefs = NULL;  // vchild: persisted colRef + own column refs
27,840,099 ✔
472
  int32_t        nMergedCols = 0;
27,840,099 ✔
473
  SSchema       *pMergedTags = NULL;  // vchild: vstb tag schema + own (extension) tags
27,840,099 ✔
474
  int32_t        nMergedTags = 0;
27,840,099 ✔
475

476
  // decode req
477
  if (tDeserializeSTableCfgReq(pMsg->pCont, pMsg->contLen, &cfgReq) != 0) {
27,840,099 ✔
478
    code = terrno;
×
479
    goto _exit;
×
480
  }
481

482
  tstrncpy(cfgRsp.tbName, cfgReq.tbName, TSDB_TABLE_NAME_LEN);
27,840,099 ✔
483
  (void)memcpy(cfgRsp.dbFName, cfgReq.dbFName, sizeof(cfgRsp.dbFName));
27,840,099 ✔
484

485
  (void)snprintf(tableFName, TSDB_TABLE_FNAME_LEN, "%s.%s", cfgReq.dbFName, cfgReq.tbName);
27,840,099 ✔
486
  if (pVnode->mounted) tTrimMountPrefix(tableFName);
27,840,099 ✔
487
  code = vnodeValidateTableHash(pVnode, tableFName);
27,840,099 ✔
488
  if (code) {
27,840,099 ✔
489
    goto _exit;
×
490
  }
491

492
  // query meta
493
  metaReaderDoInit(&mer1, pVnode->pMeta, META_READER_LOCK, cfgReq.txnId);
27,840,099 ✔
494

495
  if (metaGetTableEntryByName(&mer1, cfgReq.tbName) < 0) {
27,840,099 ✔
496
    code = terrno;
403 ✔
497
    goto _exit;
403 ✔
498
  }
499

500
  cfgRsp.tableType = mer1.me.type;
27,839,696 ✔
501
  cfgRsp.isAudit = pVnode->config.isAudit ? 1 : 0;
27,839,696 ✔
502
  cfgRsp.secureDelete = pVnode->config.secureDelete;
27,839,696 ✔
503

504
  if (mer1.me.type == TSDB_SUPER_TABLE) {
27,839,696 ✔
505
    code = TSDB_CODE_VND_HASH_MISMATCH;
×
506
    goto _exit;
×
507
  } else if (mer1.me.type == TSDB_CHILD_TABLE || mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
27,813,226 ✔
508
    metaReaderDoInit(&mer2, pVnode->pMeta, META_READER_NOLOCK, cfgReq.txnId);
27,806,050 ✔
509
    if (metaReaderGetTableEntryByUid(&mer2, mer1.me.ctbEntry.suid) < 0) goto _exit;
27,806,050 ✔
510

511
    tstrncpy(cfgRsp.stbName, mer2.me.name, TSDB_TABLE_NAME_LEN);
27,806,050 ✔
512
    schema = mer2.me.stbEntry.schemaRow;
27,806,050 ✔
513
    schemaTag = mer2.me.stbEntry.schemaTag;
27,806,050 ✔
514
    cfgRsp.ownerId = mer2.me.stbEntry.ownerId;        // child table inherits ownerId from stb
27,806,050 ✔
515
    cfgRsp.securityLevel = mer2.me.stbEntry.securityLevel;  // child table inherits secLvl from stb
27,806,050 ✔
516
    cfgRsp.ttl = mer1.me.ctbEntry.ttlDays;
27,806,050 ✔
517
    cfgRsp.commentLen = mer1.me.ctbEntry.commentLen;
27,806,050 ✔
518
    if (mer1.me.ctbEntry.commentLen > 0) {
27,806,050 ✔
519
      cfgRsp.pComment = taosStrdup(mer1.me.ctbEntry.comment);
×
520
      if (NULL == cfgRsp.pComment) {
×
521
        code = terrno;
×
522
        goto _exit;
×
523
      }
524
    }
525
    STag *pTag = (STag *)mer1.me.ctbEntry.pTags;
27,806,050 ✔
526
    cfgRsp.tagsLen = pTag->len;
27,806,050 ✔
527
    cfgRsp.pTags = taosMemoryMalloc(cfgRsp.tagsLen);
27,806,050 ✔
528
    if (NULL == cfgRsp.pTags) {
27,806,050 ✔
529
      code = terrno;
×
530
      goto _exit;
×
531
    }
532
    (void)memcpy(cfgRsp.pTags, pTag, cfgRsp.tagsLen);
27,806,050 ✔
533
  } else if (mer1.me.type == TSDB_NORMAL_TABLE || mer1.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
33,646 ✔
534
    schema = mer1.me.ntbEntry.schemaRow;
33,646 ✔
535
    schemaTag = mer1.me.ntbEntry.schemaTag;  // normal/virtual-normal tables may own tags
33,646 ✔
536
    cfgRsp.ttl = mer1.me.ntbEntry.ttlDays;
33,646 ✔
537
    cfgRsp.ownerId = mer1.me.ntbEntry.ownerId;
33,646 ✔
538
    cfgRsp.securityLevel = mer1.me.type == TSDB_NORMAL_TABLE ? pVnode->config.securityLevel : 0;
33,646 ✔
539
    cfgRsp.commentLen = mer1.me.ntbEntry.commentLen;
33,646 ✔
540
    if (mer1.me.ntbEntry.commentLen > 0) {
33,646 ✔
541
      cfgRsp.pComment = taosStrdup(mer1.me.ntbEntry.comment);
×
542
      if (NULL == cfgRsp.pComment) {
×
543
        code = terrno;
×
544
        goto _exit;
×
545
      }
546
    }
547
    // owned tag values: copy ntbEntry.pTags so the executor's local-tag reading path
548
    // (which reads cfgRsp.pTags) can project them. Mirrors the child-table branch above.
549
    if (mer1.me.ntbEntry.schemaTag.nCols > 0 && mer1.me.ntbEntry.pTags != NULL) {
33,646 ✔
550
      STag *pTag = (STag *)mer1.me.ntbEntry.pTags;
16,706 ✔
551
      cfgRsp.tagsLen = pTag->len;
16,706 ✔
552
      cfgRsp.pTags = taosMemoryMalloc(cfgRsp.tagsLen);
16,706 ✔
553
      if (NULL == cfgRsp.pTags) {
16,706 ✔
554
        code = terrno;
×
555
        goto _exit;
×
556
      }
557
      (void)memcpy(cfgRsp.pTags, pTag, cfgRsp.tagsLen);
16,706 ✔
558
    }
559
  } else {
560
    vError("vnodeGetTableCfg get invalid table type:%d", mer1.me.type);
×
561
    code = TSDB_CODE_APP_ERROR;
×
562
    goto _exit;
×
563
  }
564

565
  // For a virtual child table, build the merged column view first: vstb row schema followed
566
  // by the vchild's own (extension) columns, persisted colRef followed by own column refs.
567
  nMergedCols = schema.nCols;
27,839,696 ✔
568
  if (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
27,839,696 ✔
569
    code = metaBuildMergedColView(&mer1.me, &schema, &pMergedCols, &pMergedRefs, &nMergedCols);
18,423,432 ✔
570
    if (code) {
18,423,432 ✔
571
      vError("vgId:%d, vnodeGetTableCfg build merged col view for %s failed since %s", TD_VID(pVnode),
×
572
             cfgReq.tbName, tstrerror(code));
573
      goto _exit;
×
574
    }
575
    // merged tag view: vstb tag schema followed by the vchild's own (extension) tags
576
    nMergedTags = schemaTag.nCols;
18,423,432 ✔
577
    code = metaBuildMergedTagView(&mer1.me, &schemaTag, &pMergedTags, &nMergedTags);
18,423,432 ✔
578
    if (code) {
18,423,432 ✔
579
      vError("vgId:%d, vnodeGetTableCfg build merged tag view for %s failed since %s", TD_VID(pVnode),
×
580
             cfgReq.tbName, tstrerror(code));
581
      goto _exit;
×
582
    }
583
  }
584

585
  cfgRsp.numOfTags = (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) ? nMergedTags : schemaTag.nCols;
27,839,696 ✔
586
  cfgRsp.numOfColumns = nMergedCols;
27,839,696 ✔
587
  cfgRsp.virtualStb = false; // vnode don't have super table, so it's always false
27,839,696 ✔
588
  cfgRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (cfgRsp.numOfColumns + cfgRsp.numOfTags));
27,839,696 ✔
589
  cfgRsp.pSchemaExt = (SSchemaExt *)taosMemoryCalloc(cfgRsp.numOfColumns, sizeof(SSchemaExt));
27,839,696 ✔
590
  cfgRsp.pColRefs = (SColRef *)taosMemoryCalloc(cfgRsp.numOfColumns, sizeof(SColRef));
27,839,696 ✔
591
  cfgRsp.numOfTagRefs = 0;
27,839,696 ✔
592
  cfgRsp.pTagRefs = NULL;
27,839,696 ✔
593

594
  if (NULL == cfgRsp.pSchemas || NULL == cfgRsp.pSchemaExt || NULL == cfgRsp.pColRefs) {
27,839,696 ✔
595
    code = terrno;
×
596
    goto _exit;
×
597
  }
598
  if (pMergedCols) {
27,839,696 ✔
599
    (void)memcpy(cfgRsp.pSchemas, pMergedCols, sizeof(SSchema) * nMergedCols);
18,423,432 ✔
600
  } else {
601
    (void)memcpy(cfgRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
9,416,264 ✔
602
  }
603
  if (pMergedTags) {
27,839,696 ✔
604
    (void)memcpy(cfgRsp.pSchemas + cfgRsp.numOfColumns, pMergedTags, sizeof(SSchema) * nMergedTags);
18,423,432 ✔
605
  } else if (schemaTag.nCols) {
9,416,264 ✔
606
    (void)memcpy(cfgRsp.pSchemas + cfgRsp.numOfColumns, schemaTag.pSchema, sizeof(SSchema) * schemaTag.nCols);
9,399,324 ✔
607
  }
608

609
  SMetaReader    *pReader = (mer1.me.type == TSDB_CHILD_TABLE || mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE) ? &mer2 : &mer1;
27,839,696 ✔
610
  SColRefWrapper *pColRef = &mer1.me.colRef;
27,839,696 ✔
611

612
  if (withExtSchema(cfgRsp.tableType)) {
27,839,696 ✔
613
    // col compress/ext schema of the vstb part; own columns carry typeMod (e.g. decimal
614
    // precision/scale) from the vchild entry's own-col ext area when present.
615
    code = fillTableColCmpr(pReader, cfgRsp.pSchemaExt, schema.nCols);
27,839,696 ✔
616
    if (code < 0) {
27,839,696 ✔
617
      goto _exit;
×
618
    }
619

620
    for (int32_t i = 0; i < cfgRsp.numOfColumns; i++) {
246,844,717 ✔
621
      SSchemaExt *pSchExt = cfgRsp.pSchemaExt + i;
219,005,021 ✔
622
      pSchExt->colId = cfgRsp.pSchemas[i].colId;
219,005,021 ✔
623
      if (i < schema.nCols) {
219,005,021 ✔
624
        if (pReader->me.pExtSchemas) {
218,995,219 ✔
625
          pSchExt->typeMod = pReader->me.pExtSchemas[i].typeMod;
54,537 ✔
626
        }
627
      } else if (mer1.me.type == TSDB_VIRTUAL_CHILD_TABLE && mer1.me.own.pOwnColExtSchemas != NULL &&
9,802 ✔
628
                 mer1.me.own.nOwnCols == cfgRsp.numOfColumns - schema.nCols) {
676 ✔
629
        // see the same guard in vnodeGetTableMeta: a non-NULL own ext area is sized nOwnCols;
630
        // verify the count so the index below is provably in range
631
        pSchExt->typeMod = mer1.me.own.pOwnColExtSchemas[i - schema.nCols].typeMod;
676 ✔
632
      }
633
    }
634
  }
635

636
  cfgRsp.virtualStb = false;
27,839,696 ✔
637
  if (hasColRef(cfgRsp.tableType)) {
27,839,696 ✔
638
    if (pMergedRefs) {
18,453,415 ✔
639
      // merged view already validated and deep-copied by metaBuildMergedColView;
640
      // transfer ownership to the response
641
      taosMemoryFreeClear(cfgRsp.pColRefs);
18,423,432 ✔
642
      cfgRsp.pColRefs = pMergedRefs;
18,423,432 ✔
643
      pMergedRefs = NULL;
18,423,432 ✔
644
    } else {
645
      for (int32_t i = 0; i < cfgRsp.numOfColumns; i++) {
133,589 ✔
646
        SColRef *pRef = &pColRef->pColRef[i];
103,606 ✔
647
        cfgRsp.pColRefs[i].hasRef = pRef->hasRef;
103,606 ✔
648
        cfgRsp.pColRefs[i].id = pRef->id;
103,606 ✔
649
        if (cfgRsp.pColRefs[i].hasRef) {
103,606 ✔
650
          cfgRsp.pColRefs[i].refType = pRef->refType;
68,388 ✔
651
          tstrncpy(cfgRsp.pColRefs[i].refSourceName, pRef->refSourceName, TSDB_EXT_SOURCE_NAME_LEN);
68,388 ✔
652
          tstrncpy(cfgRsp.pColRefs[i].refSchemaName, pRef->refSchemaName, TSDB_EXT_SOURCE_SCHEMA_LEN);
68,388 ✔
653
          tstrncpy(cfgRsp.pColRefs[i].refDbName, pRef->refDbName, TSDB_DB_NAME_LEN);
68,388 ✔
654
          tstrncpy(cfgRsp.pColRefs[i].refTableName, pRef->refTableName, TSDB_TABLE_NAME_LEN);
68,388 ✔
655
          tstrncpy(cfgRsp.pColRefs[i].refColName, pRef->refColName, TSDB_COL_NAME_LEN);
68,388 ✔
656
          if (pRef->tagCondJson) {
68,388 ✔
657
            cfgRsp.pColRefs[i].tagCondLen = pRef->tagCondLen;
10,689 ✔
658
            cfgRsp.pColRefs[i].tagCondJson = taosStrdup(pRef->tagCondJson);
10,689 ✔
659
          } else {
660
            cfgRsp.pColRefs[i].tagCondLen = 0;
57,699 ✔
661
            cfgRsp.pColRefs[i].tagCondJson = NULL;
57,699 ✔
662
          }
663
        }
664
        if (pRef->filterCondLen > 0 && pRef->filterCondJson) {
103,606 ✔
665
          cfgRsp.pColRefs[i].filterCondLen = pRef->filterCondLen;
×
666
          cfgRsp.pColRefs[i].filterCondJson = taosStrdup(pRef->filterCondJson);
×
667
          if (NULL == cfgRsp.pColRefs[i].filterCondJson) {
×
668
            code = terrno;
×
669
            goto _exit;
×
670
          }
671
        }
672
      }
673
    }
674

675
    cfgRsp.numOfTagRefs = pColRef->nTagRefs;
18,453,415 ✔
676
    if (cfgRsp.numOfTagRefs > 0) {
18,453,415 ✔
677
      if (NULL == pColRef->pTagRef) {
10,784,411 ✔
678
        code = TSDB_CODE_APP_ERROR;
×
679
        goto _exit;
×
680
      }
681
      cfgRsp.pTagRefs = (SColRef *)taosMemoryCalloc(cfgRsp.numOfTagRefs, sizeof(SColRef));
10,784,411 ✔
682
      if (NULL == cfgRsp.pTagRefs) {
10,784,411 ✔
683
        code = terrno;
×
684
        goto _exit;
×
685
      }
686

687
      for (int32_t i = 0; i < cfgRsp.numOfTagRefs; i++) {
42,962,037 ✔
688
        SColRef *pRef = &pColRef->pTagRef[i];
32,177,626 ✔
689
        cfgRsp.pTagRefs[i].hasRef = pRef->hasRef;
32,177,626 ✔
690
        cfgRsp.pTagRefs[i].id = pRef->id;
32,177,626 ✔
691
        if (cfgRsp.pTagRefs[i].hasRef) {
32,177,626 ✔
692
          cfgRsp.pTagRefs[i].refType = pRef->refType;
21,383,542 ✔
693
          tstrncpy(cfgRsp.pTagRefs[i].refSourceName, pRef->refSourceName, TSDB_EXT_SOURCE_NAME_LEN);
21,383,542 ✔
694
          tstrncpy(cfgRsp.pTagRefs[i].refSchemaName, pRef->refSchemaName, TSDB_EXT_SOURCE_SCHEMA_LEN);
21,383,542 ✔
695
          tstrncpy(cfgRsp.pTagRefs[i].refDbName, pRef->refDbName, TSDB_DB_NAME_LEN);
21,383,542 ✔
696
          tstrncpy(cfgRsp.pTagRefs[i].refTableName, pRef->refTableName, TSDB_TABLE_NAME_LEN);
21,383,542 ✔
697
          tstrncpy(cfgRsp.pTagRefs[i].refColName, pRef->refColName, TSDB_COL_NAME_LEN);
21,383,542 ✔
698
          if (pRef->tagCondJson) {
21,383,542 ✔
699
            cfgRsp.pTagRefs[i].tagCondLen = pRef->tagCondLen;
×
700
            cfgRsp.pTagRefs[i].tagCondJson = taosStrdup(pRef->tagCondJson);
×
701
            if (NULL == cfgRsp.pTagRefs[i].tagCondJson) {
×
702
              code = terrno;
×
703
              goto _exit;
×
704
            }
705
          }
706
          if (pRef->filterCondLen > 0 && pRef->filterCondJson) {
21,383,542 ✔
707
            cfgRsp.pTagRefs[i].filterCondLen = pRef->filterCondLen;
×
708
            cfgRsp.pTagRefs[i].filterCondJson = taosStrdup(pRef->filterCondJson);
×
709
            if (NULL == cfgRsp.pTagRefs[i].filterCondJson) {
×
710
              code = terrno;
×
711
              goto _exit;
×
712
            }
713
          }
714
        }
715
      }
716
    }
717
  }
718

719
  // populate series
720
  if (mer1.me.series.nSeries > 0) {
27,839,696 ✔
721
    cfgRsp.numOfSeries = mer1.me.series.nSeries;
55,022 ✔
722
    cfgRsp.pSeries = taosMemoryCalloc(mer1.me.series.nSeries, sizeof(SSeriesEntry));
55,022 ✔
723
    if (cfgRsp.pSeries) {
55,022 ✔
724
      for (int32_t i = 0; i < mer1.me.series.nSeries; i++) {
370,020 ✔
725
        SSeriesEntry *src = &mer1.me.series.pSeries[i];
314,998 ✔
726
        SSeriesEntry *dst = &cfgRsp.pSeries[i];
314,998 ✔
727
        tstrncpy(dst->alias, src->alias, TSDB_COL_NAME_LEN);
314,998 ✔
728
        tstrncpy(dst->sourceName, src->sourceName, TSDB_EXT_SOURCE_NAME_LEN);
314,998 ✔
729
        tstrncpy(dst->dbName, src->dbName, TSDB_DB_NAME_LEN);
314,998 ✔
730
        tstrncpy(dst->measurementName, src->measurementName, TSDB_TABLE_NAME_LEN);
314,998 ✔
731
        if (src->tagCondLen > 0) {
314,998 ✔
732
          dst->tagCondJson = taosStrdup(src->tagCondJson);
314,998 ✔
733
          dst->tagCondLen = src->tagCondLen;
314,998 ✔
734
        } else {
735
          dst->tagCondJson = NULL;
×
736
          dst->tagCondLen = 0;
×
737
        }
738
      }
739
    }
740
  }
741

742
  // encode and send response
743
  rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
27,839,696 ✔
744
  if (rspLen < 0) {
27,839,696 ✔
745
    code = terrno;
×
746
    goto _exit;
×
747
  }
748

749
  if (direct) {
27,839,696 ✔
750
    pRsp = rpcMallocCont(rspLen);
27,812,289 ✔
751
  } else {
752
    pRsp = taosMemoryCalloc(1, rspLen);
27,407 ✔
753
  }
754

755
  if (pRsp == NULL) {
27,839,696 ✔
756
    code = terrno;
×
757
    goto _exit;
×
758
  }
759

760
  rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp);
27,839,696 ✔
761
  if (rspLen < 0) {
27,839,696 ✔
762
    code = terrno;
×
763
    goto _exit;
×
764
  }
765

766
_exit:
27,840,099 ✔
767
  rpcMsg.info = pMsg->info;
27,839,970 ✔
768
  rpcMsg.pCont = pRsp;
27,839,970 ✔
769
  rpcMsg.contLen = rspLen;
27,839,970 ✔
770
  rpcMsg.code = code;
27,839,970 ✔
771
  rpcMsg.msgType = pMsg->msgType;
27,839,970 ✔
772

773
  if (code) {
27,839,970 ✔
774
    qError("get table %s cfg failed cause of %s", cfgReq.tbName, tstrerror(code));
403 ✔
775
  }
776

777
  if (direct) {
27,839,970 ✔
778
    tmsgSendRsp(&rpcMsg);
27,812,563 ✔
779
  } else {
780
    *pMsg = rpcMsg;
27,407 ✔
781
  }
782

783
  tFreeSTableCfgRsp(&cfgRsp);
27,840,099 ✔
784
  taosMemoryFreeClear(pMergedCols);
27,840,099 ✔
785
  taosMemoryFreeClear(pMergedTags);
27,840,099 ✔
786
  if (pMergedRefs) {
27,840,099 ✔
787
    tFreeSColRefArray(pMergedRefs, nMergedCols);
×
788
    taosMemoryFreeClear(pMergedRefs);
×
789
  }
790
  metaReaderClear(&mer2);
27,840,099 ✔
791
  metaReaderClear(&mer1);
27,840,099 ✔
792
  return code;
27,840,099 ✔
793
}
794

795
static FORCE_INLINE void vnodeFreeSBatchRspMsg(void *p) {
796
  if (NULL == p) {
797
    return;
798
  }
799

800
  SBatchRspMsg *pRsp = (SBatchRspMsg *)p;
801
  rpcFreeCont(pRsp->msg);
802
}
803

804
int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
14,845,728 ✔
805
  int32_t      code = 0;
14,845,728 ✔
806
  int32_t      rspSize = 0;
14,845,728 ✔
807
  SBatchReq    batchReq = {0};
14,845,728 ✔
808
  SBatchMsg   *req = NULL;
14,846,207 ✔
809
  SBatchRspMsg rsp = {0};
14,846,207 ✔
810
  SBatchRsp    batchRsp = {0};
14,831,514 ✔
811
  SRpcMsg      reqMsg = *pMsg;
14,832,442 ✔
812
  SRpcMsg      rspMsg = {0};
14,833,537 ✔
813
  void        *pRsp = NULL;
14,838,185 ✔
814

815
  if (tDeserializeSBatchReq(pMsg->pCont, pMsg->contLen, &batchReq)) {
14,838,185 ✔
816
    code = terrno;
×
817
    qError("tDeserializeSBatchReq failed");
×
818
    goto _exit;
×
819
  }
820

821
  int32_t msgNum = taosArrayGetSize(batchReq.pMsgs);
14,833,327 ✔
822
  if (msgNum >= MAX_META_MSG_IN_BATCH) {
14,840,795 ✔
823
    code = TSDB_CODE_INVALID_MSG;
×
824
    qError("too many msgs %d in vnode batch meta req", msgNum);
×
825
    goto _exit;
×
826
  }
827

828
  batchRsp.pRsps = taosArrayInit(msgNum, sizeof(SBatchRspMsg));
14,840,795 ✔
829
  if (NULL == batchRsp.pRsps) {
14,839,227 ✔
830
    code = terrno;
1,359 ✔
831
    qError("taosArrayInit %d SBatchRspMsg failed", msgNum);
×
832
    goto _exit;
×
833
  }
834

835
  for (int32_t i = 0; i < msgNum; ++i) {
31,757,264 ✔
836
    req = taosArrayGet(batchReq.pMsgs, i);
16,911,940 ✔
837
    if (req == NULL) {
16,906,646 ✔
838
      code = terrno;
×
839
      goto _exit;
×
840
    }
841

842
    reqMsg.msgType = req->msgType;
16,911,792 ✔
843
    reqMsg.pCont = req->msg;
16,911,792 ✔
844
    reqMsg.contLen = req->msgLen;
16,911,792 ✔
845

846
    switch (req->msgType) {
16,911,792 ✔
847
      case TDMT_VND_TABLE_META:
10,527,462 ✔
848
        // error code has been set into reqMsg, no need to handle it here.
849
        if (TSDB_CODE_SUCCESS != vnodeGetTableMeta(pVnode, &reqMsg, false)) {
10,527,462 ✔
850
          qWarn("vnodeGetBatchMeta failed, msgType:%d", req->msgType);
911,306 ✔
851
        }
852
        break;
10,524,579 ✔
853
      case TDMT_VND_TABLE_NAME:
15,038 ✔
854
        // error code has been set into reqMsg, no need to handle it here.
855
        if (TSDB_CODE_SUCCESS != vnodeGetTableMeta(pVnode, &reqMsg, false)) {
15,038 ✔
856
          qWarn("vnodeGetBatchName failed, msgType:%d", req->msgType);
3,717 ✔
857
        }
858
        break;
15,038 ✔
859
      case TDMT_VND_TABLE_CFG:
27,407 ✔
860
        // error code has been set into reqMsg, no need to handle it here.
861
        if (TSDB_CODE_SUCCESS != vnodeGetTableCfg(pVnode, &reqMsg, false)) {
27,407 ✔
862
          qWarn("vnodeGetBatchMeta failed, msgType:%d", req->msgType);
×
863
        }
864
        break;
27,407 ✔
865
      case TDMT_VND_VSUBTABLES_META:
6,341,885 ✔
866
        // error code has been set into reqMsg, no need to handle it here.
867
        if (TSDB_CODE_SUCCESS != vnodeGetVSubtablesMeta(pVnode, &reqMsg)) {
6,341,885 ✔
868
          qWarn("vnodeGetVSubtablesMeta failed, msgType:%d", req->msgType);
×
869
        }
870
        break;
6,327,728 ✔
871
      case TDMT_VND_VSTB_REF_DBS:
×
872
        // error code has been set into reqMsg, no need to handle it here.
873
        if (TSDB_CODE_SUCCESS != vnodeGetVStbRefDbs(pVnode, &reqMsg)) {
×
874
          qWarn("vnodeGetVStbRefDbs failed, msgType:%d", req->msgType);
×
875
        }
876
        break;
×
877
      case TDMT_VND_VTB_TAG_COND:
×
878
        // error code has been set into reqMsg, no need to handle it here.
879
        if (TSDB_CODE_SUCCESS != vnodeGetVTbTagCond(pVnode, &reqMsg, false)) {
×
880
          qWarn("vnodeGetVTbTagCond failed, msgType:%d", req->msgType);
×
881
        }
882
        break;
×
883
      default:
×
884
        qError("invalid req msgType %d", req->msgType);
×
885
        reqMsg.code = TSDB_CODE_INVALID_MSG;
×
886
        reqMsg.pCont = NULL;
×
887
        reqMsg.contLen = 0;
×
888
        break;
×
889
    }
890

891
    rsp.msgIdx = req->msgIdx;
16,918,381 ✔
892
    rsp.reqType = reqMsg.msgType;
16,918,381 ✔
893
    rsp.msgLen = reqMsg.contLen;
16,918,381 ✔
894
    rsp.rspCode = reqMsg.code;
16,918,381 ✔
895
    rsp.msg = reqMsg.pCont;
16,918,381 ✔
896

897
    if (NULL == taosArrayPush(batchRsp.pRsps, &rsp)) {
33,814,148 ✔
898
      qError("taosArrayPush failed");
×
899
      code = terrno;
×
900
      goto _exit;
×
901
    }
902
  }
903

904
  rspSize = tSerializeSBatchRsp(NULL, 0, &batchRsp);
14,845,324 ✔
905
  if (rspSize < 0) {
14,846,474 ✔
906
    qError("tSerializeSBatchRsp failed");
×
907
    code = terrno;
×
908
    goto _exit;
×
909
  }
910
  pRsp = rpcMallocCont(rspSize);
14,846,474 ✔
911
  if (pRsp == NULL) {
14,846,991 ✔
912
    qError("rpcMallocCont %d failed", rspSize);
×
913
    code = terrno;
×
914
    goto _exit;
×
915
  }
916
  if (tSerializeSBatchRsp(pRsp, rspSize, &batchRsp) < 0) {
14,846,991 ✔
917
    qError("tSerializeSBatchRsp %d failed", rspSize);
×
918
    code = terrno;
×
919
    goto _exit;
×
920
  }
921

922
_exit:
14,848,079 ✔
923

924
  rspMsg.info = pMsg->info;
14,848,855 ✔
925
  rspMsg.pCont = pRsp;
14,848,855 ✔
926
  rspMsg.contLen = rspSize;
14,848,855 ✔
927
  rspMsg.code = code;
14,848,855 ✔
928
  rspMsg.msgType = pMsg->msgType;
14,848,855 ✔
929

930
  if (code) {
14,848,855 ✔
931
    qError("vnd get batch meta failed cause of %s", tstrerror(code));
×
932
  }
933

934
  taosArrayDestroyEx(batchReq.pMsgs, tFreeSBatchReqMsg);
14,848,855 ✔
935
  taosArrayDestroyEx(batchRsp.pRsps, tFreeSBatchRspMsg);
14,847,740 ✔
936

937
  tmsgSendRsp(&rspMsg);
14,846,494 ✔
938

939
  return code;
14,849,311 ✔
940
}
941

942
#define VNODE_DO_META_QUERY(pVnode, cmd)                 \
943
  do {                                                   \
944
    (void)taosThreadRwlockRdlock(&(pVnode)->metaRWLock); \
945
    cmd;                                                 \
946
    (void)taosThreadRwlockUnlock(&(pVnode)->metaRWLock); \
947
  } while (0)
948

949
int32_t vnodeReadVSubtables(SReadHandle* pHandle, int64_t suid, SArray** ppRes) {
6,339,338 ✔
950
  int32_t                    code = TSDB_CODE_SUCCESS;
6,339,338 ✔
951
  int32_t                    line = 0;
6,340,073 ✔
952
  SMetaReader                mr = {0};
6,340,073 ✔
953
  bool                       readerInit = false;
6,339,803 ✔
954
  SVCTableRefCols*           pTb = NULL;
6,339,803 ✔
955
  int32_t                    refColsNum = 0;
6,323,994 ✔
956
  char                       tbFName[TSDB_TABLE_FNAME_LEN];
6,323,994 ✔
957
  SSHashObj*                 pSrcTbls = NULL;
6,322,722 ✔
958

959
  SArray *pList = taosArrayInit(10, sizeof(uint64_t));
6,322,722 ✔
960
  QUERY_CHECK_NULL(pList, code, line, _return, terrno);
6,335,828 ✔
961

962
  QUERY_CHECK_CODE(pHandle->api.metaFn.getChildTableList(pHandle->vnode, suid, pList), line, _return);
6,335,828 ✔
963

964
  size_t num = taosArrayGetSize(pList);
6,341,715 ✔
965
  *ppRes = taosArrayInit(num, POINTER_BYTES);
6,342,420 ✔
966
  QUERY_CHECK_NULL(*ppRes, code, line, _return, terrno);
6,343,871 ✔
967
  pSrcTbls = tSimpleHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY));
6,343,871 ✔
968
  QUERY_CHECK_NULL(pSrcTbls, code, line, _return, terrno);
6,336,696 ✔
969

970
  for (int32_t i = 0; i < num; ++i) {
43,141,105 ✔
971
    uint64_t* id = taosArrayGet(pList, i);
36,760,941 ✔
972
    QUERY_CHECK_NULL(id, code, line, _return, terrno);
36,761,687 ✔
973
    pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn, pHandle->txnId);
36,761,687 ✔
974
    QUERY_CHECK_CODE(pHandle->api.metaReaderFn.getTableEntryByUid(&mr, *id), line, _return);
36,775,777 ✔
975
    readerInit = true;
38,147,761 ✔
976

977
    refColsNum = 0;
36,666,923 ✔
978
    for (int32_t j = 0; j < mr.me.colRef.nCols; j++) {
413,555,613 ✔
979
      if (mr.me.colRef.pColRef[j].hasRef) {
376,799,472 ✔
980
        refColsNum++;
212,857,023 ✔
981
      }
982
    }
983

984
    int32_t tagRefColsNum = 0;
36,666,923 ✔
985
    for (int32_t j = 0; j < mr.me.colRef.nTagRefs; j++) {
68,474,141 ✔
986
      if (mr.me.colRef.pTagRef[j].hasRef) {
31,718,000 ✔
987
        tagRefColsNum++;
21,168,570 ✔
988
      }
989
    }
990

991
    if (refColsNum <= 0 && tagRefColsNum <= 0) {
36,756,141 ✔
992
      pHandle->api.metaReaderFn.clearReader(&mr);
6,068,020 ✔
993
      readerInit = false;
6,068,020 ✔
994
      continue;
6,068,020 ✔
995
    }
996

997
    pTb = taosMemoryCalloc(1, (refColsNum + tagRefColsNum) * sizeof(SRefColInfo) + sizeof(*pTb));
30,688,121 ✔
998
    QUERY_CHECK_NULL(pTb, code, line, _return, terrno);
30,677,242 ✔
999

1000
    pTb->uid = mr.me.uid;
30,677,242 ✔
1001
    pTb->numOfColRefs = refColsNum;
30,677,242 ✔
1002
    pTb->refCols = (SRefColInfo*)(pTb + 1);
30,677,242 ✔
1003
    pTb->numOfTagRefs = tagRefColsNum;
30,677,242 ✔
1004
    pTb->tagRefCols = pTb->refCols + refColsNum;
30,677,242 ✔
1005

1006
    refColsNum = 0;
30,677,242 ✔
1007
    tSimpleHashClear(pSrcTbls);
30,677,242 ✔
1008
    for (int32_t j = 0; j < mr.me.colRef.nCols; j++) {
311,081,620 ✔
1009
      if (!mr.me.colRef.pColRef[j].hasRef) {
280,334,260 ✔
1010
        continue;
67,164,338 ✔
1011
      }
1012

1013
      pTb->refCols[refColsNum].colId = mr.me.colRef.pColRef[j].id;
213,169,922 ✔
1014
      pTb->refCols[refColsNum].hasFilterCond = mr.me.colRef.pColRef[j].filterCondLen > 0;
213,169,922 ✔
1015
      tstrncpy(pTb->refCols[refColsNum].refColName, mr.me.colRef.pColRef[j].refColName, TSDB_COL_NAME_LEN);
213,169,922 ✔
1016
      tstrncpy(pTb->refCols[refColsNum].refTableName, mr.me.colRef.pColRef[j].refTableName, TSDB_TABLE_NAME_LEN);
213,169,922 ✔
1017
      tstrncpy(pTb->refCols[refColsNum].refDbName, mr.me.colRef.pColRef[j].refDbName, TSDB_DB_NAME_LEN);
213,169,922 ✔
1018
      tstrncpy(pTb->refCols[refColsNum].refSourceName, mr.me.colRef.pColRef[j].refSourceName, TSDB_EXT_SOURCE_NAME_LEN);
213,169,922 ✔
1019

1020
      snprintf(tbFName, sizeof(tbFName), "%s.%s", pTb->refCols[refColsNum].refDbName, pTb->refCols[refColsNum].refTableName);
213,169,922 ✔
1021

1022
      if (NULL == tSimpleHashGet(pSrcTbls, tbFName, strlen(tbFName))) {
213,169,922 ✔
1023
        QUERY_CHECK_CODE(tSimpleHashPut(pSrcTbls, tbFName, strlen(tbFName), &code, sizeof(code)), line, _return);
41,497,268 ✔
1024
      }
1025

1026
      refColsNum++;
213,174,322 ✔
1027
    }
1028

1029
    // Fill tag refs
1030
    tagRefColsNum = 0;
30,687,038 ✔
1031
    for (int32_t j = 0; j < mr.me.colRef.nTagRefs; j++) {
62,495,797 ✔
1032
      if (!mr.me.colRef.pTagRef[j].hasRef) {
31,743,896 ✔
1033
        continue;
10,563,296 ✔
1034
      }
1035

1036
      pTb->tagRefCols[tagRefColsNum].colId = mr.me.colRef.pTagRef[j].id;
21,180,600 ✔
1037
      tstrncpy(pTb->tagRefCols[tagRefColsNum].refColName, mr.me.colRef.pTagRef[j].refColName, TSDB_COL_NAME_LEN);
21,180,600 ✔
1038
      tstrncpy(pTb->tagRefCols[tagRefColsNum].refTableName, mr.me.colRef.pTagRef[j].refTableName, TSDB_TABLE_NAME_LEN);
21,180,600 ✔
1039
      tstrncpy(pTb->tagRefCols[tagRefColsNum].refDbName, mr.me.colRef.pTagRef[j].refDbName, TSDB_DB_NAME_LEN);
21,180,600 ✔
1040
      tstrncpy(pTb->tagRefCols[tagRefColsNum].refSourceName, mr.me.colRef.pTagRef[j].refSourceName, TSDB_EXT_SOURCE_NAME_LEN);
21,180,600 ✔
1041

1042
      snprintf(tbFName, sizeof(tbFName), "%s.%s", pTb->tagRefCols[tagRefColsNum].refDbName, pTb->tagRefCols[tagRefColsNum].refTableName);
21,180,600 ✔
1043

1044
      if (NULL == tSimpleHashGet(pSrcTbls, tbFName, strlen(tbFName))) {
21,180,600 ✔
1045
        QUERY_CHECK_CODE(tSimpleHashPut(pSrcTbls, tbFName, strlen(tbFName), &code, sizeof(code)), line, _return);
515,139 ✔
1046
      }
1047

1048
      tagRefColsNum++;
21,185,141 ✔
1049
    }
1050

1051
    pTb->numOfSrcTbls = tSimpleHashGetSize(pSrcTbls);
30,751,901 ✔
1052
    QUERY_CHECK_NULL(taosArrayPush(*ppRes, &pTb), code, line, _return, terrno);
61,428,328 ✔
1053
    pTb = NULL;
30,742,728 ✔
1054

1055
    pHandle->api.metaReaderFn.clearReader(&mr);
30,742,728 ✔
1056
    readerInit = false;
30,736,389 ✔
1057
  }
1058

1059
_return:
6,380,164 ✔
1060

1061
  if (readerInit) {
6,327,971 ✔
1062
    pHandle->api.metaReaderFn.clearReader(&mr);
×
1063
  }
1064

1065
  taosArrayDestroy(pList);
6,349,765 ✔
1066
  taosMemoryFree(pTb);
6,349,182 ✔
1067
  tSimpleHashCleanup(pSrcTbls);
6,349,331 ✔
1068

1069
  if (code) {
6,349,513 ✔
1070
    qError("%s failed since %s", __func__, tstrerror(code));
×
1071
  }
1072
  return code;
6,349,513 ✔
1073
}
1074

1075
int32_t vnodeReadVStbRefDbs(SReadHandle* pHandle, int64_t suid, SArray** ppDbs, SArray** ppExtSources) {
×
1076
  int32_t                    code = TSDB_CODE_SUCCESS;
×
1077
  int32_t                    line = 0;
×
1078
  SMetaReader                mr = {0};
×
1079
  bool                       readerInit = false;
×
1080
  SSHashObj*                 pDbNameHash = NULL;
×
1081
  SSHashObj*                 pExtSourceHash = NULL;
×
1082
  SArray*                    pList = NULL;
×
1083

1084
  pList = taosArrayInit(10, sizeof(uint64_t));
×
1085
  QUERY_CHECK_NULL(pList, code, line, _return, terrno);
×
1086

1087
  *ppDbs = taosArrayInit(10, POINTER_BYTES);
×
1088
  QUERY_CHECK_NULL(*ppDbs, code, line, _return, terrno)
×
1089

1090
  *ppExtSources = taosArrayInit(4, POINTER_BYTES);
×
1091
  QUERY_CHECK_NULL(*ppExtSources, code, line, _return, terrno)
×
1092
  
1093
  // lookup in cache
1094
  code = pHandle->api.metaFn.metaGetCachedRefDbs(pHandle->vnode, suid, *ppDbs);
×
1095
  QUERY_CHECK_CODE(code, line, _return);
×
1096

1097
  if (taosArrayGetSize(*ppDbs) > 0) {
×
1098
    // found in cache, also get ext sources from cache
1099
    code = pHandle->api.metaFn.metaGetCachedExtSources(pHandle->vnode, suid, *ppExtSources);
×
1100
    QUERY_CHECK_CODE(code, line, _return);
×
1101
    goto _return;
×
1102
  } else {
1103
    code = pHandle->api.metaFn.getChildTableList(pHandle->vnode, suid, pList);
×
1104
    QUERY_CHECK_CODE(code, line, _return);
×
1105

1106
    size_t num = taosArrayGetSize(pList);
×
1107
    pDbNameHash = tSimpleHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY));
×
1108
    QUERY_CHECK_NULL(pDbNameHash, code, line, _return, terrno);
×
1109

1110
    pExtSourceHash = tSimpleHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY));
×
1111
    QUERY_CHECK_NULL(pExtSourceHash, code, line, _return, terrno);
×
1112

1113
    for (int32_t i = 0; i < num; ++i) {
×
1114
      uint64_t* id = taosArrayGet(pList, i);
×
1115
      QUERY_CHECK_NULL(id, code, line, _return, terrno);
×
1116

1117
      pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn, pHandle->txnId);
×
1118
      readerInit = true;
×
1119

1120
      code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, *id);
×
1121
      QUERY_CHECK_CODE(code, line, _return);
×
1122

1123
      for (int32_t j = 0; j < mr.me.colRef.nCols; j++) {
×
1124
        if (mr.me.colRef.pColRef[j].hasRef) {
×
1125
          if (mr.me.colRef.pColRef[j].refSourceName[0] != '\0') {
×
1126
            const char* srcName = mr.me.colRef.pColRef[j].refSourceName;
×
1127
            if (NULL == tSimpleHashGet(pExtSourceHash, srcName, strlen(srcName))) {
×
1128
              char *dup = taosStrdup(srcName);
×
1129
              QUERY_CHECK_NULL(dup, code, line, _return, terrno);
×
1130
              QUERY_CHECK_NULL(taosArrayPush(*ppExtSources, &dup), code, line, _return, terrno);
×
1131
              code = tSimpleHashPut(pExtSourceHash, srcName, strlen(srcName), NULL, 0);
×
1132
              QUERY_CHECK_CODE(code, line, _return);
×
1133
            }
1134
          } else {
1135
            if (NULL == tSimpleHashGet(pDbNameHash, mr.me.colRef.pColRef[j].refDbName, strlen(mr.me.colRef.pColRef[j].refDbName))) {
×
1136
              char *refDbName = taosStrdup(mr.me.colRef.pColRef[j].refDbName);
×
1137
              QUERY_CHECK_NULL(refDbName, code, line, _return, terrno);
×
1138
              QUERY_CHECK_NULL(taosArrayPush(*ppDbs, &refDbName), code, line, _return, terrno);
×
1139
              code = tSimpleHashPut(pDbNameHash, refDbName, strlen(refDbName), NULL, 0);
×
1140
              QUERY_CHECK_CODE(code, line, _return);
×
1141
            }
1142
          }
1143
        }
1144
      }
1145

1146
      pHandle->api.metaReaderFn.clearReader(&mr);
×
1147
      readerInit = false;
×
1148
    }
1149

1150
    code = pHandle->api.metaFn.metaPutRefDbsToCache(pHandle->vnode, suid, *ppDbs);
×
1151
    QUERY_CHECK_CODE(code, line, _return);
×
1152

1153
    code = pHandle->api.metaFn.metaPutExtSourcesToCache(pHandle->vnode, suid, *ppExtSources);
×
1154
    QUERY_CHECK_CODE(code, line, _return);
×
1155
  }
1156

1157
_return:
×
1158

1159
  if (readerInit) {
×
1160
    pHandle->api.metaReaderFn.clearReader(&mr);
×
1161
  }
1162

1163
  taosArrayDestroy(pList);
×
1164
  tSimpleHashCleanup(pDbNameHash);
×
1165
  tSimpleHashCleanup(pExtSourceHash);
×
1166

1167
  if (code) {
×
1168
    qError("%s failed since %s", __func__, tstrerror(code));
×
1169
  }
1170
  return code;
×
1171
}
1172

1173
int32_t vnodeGetVSubtablesMeta(SVnode *pVnode, SRpcMsg *pMsg) {
6,335,597 ✔
1174
  int32_t        code = 0;
6,335,597 ✔
1175
  int32_t        rspSize = 0;
6,335,597 ✔
1176
  SVSubTablesReq req = {0};
6,335,597 ✔
1177
  SVSubTablesRsp rsp = {0};
6,336,684 ✔
1178
  SRpcMsg      rspMsg = {0};
6,319,589 ✔
1179
  void        *pRsp = NULL;
6,319,589 ✔
1180
  int32_t      line = 0;
6,319,589 ✔
1181

1182
  if (tDeserializeSVSubTablesReq(pMsg->pCont, pMsg->contLen, &req)) {
6,319,589 ✔
1183
    code = terrno;
×
1184
    qError("tDeserializeSVSubTablesReq failed");
×
1185
    goto _return;
×
1186
  }
1187

1188
  SReadHandle handle = {0};
6,341,638 ✔
1189
  handle.vnode = pVnode;
6,342,126 ✔
1190
  initStorageAPI(&handle.api);
6,342,126 ✔
1191

1192
  QUERY_CHECK_CODE(vnodeReadVSubtables(&handle, req.suid, &rsp.pTables), line, _return);
6,326,508 ✔
1193
  rsp.vgId = TD_VID(pVnode);
6,349,813 ✔
1194

1195
  rspSize = tSerializeSVSubTablesRsp(NULL, 0, &rsp);
6,349,813 ✔
1196
  if (rspSize < 0) {
6,349,247 ✔
1197
    code = rspSize;
×
1198
    qError("tSerializeSVSubTablesRsp failed, error:%d", rspSize);
×
1199
    goto _return;
×
1200
  }
1201
  pRsp = taosMemoryCalloc(1, rspSize);
6,349,247 ✔
1202
  if (pRsp == NULL) {
6,348,282 ✔
1203
    code = terrno;
×
1204
    qError("rpcMallocCont %d failed, error:%d", rspSize, terrno);
×
1205
    goto _return;
×
1206
  }
1207
  rspSize = tSerializeSVSubTablesRsp(pRsp, rspSize, &rsp);
6,348,282 ✔
1208
  if (rspSize < 0) {
6,349,519 ✔
1209
    code = rspSize;
×
1210
    qError("tSerializeSVSubTablesRsp failed, error:%d", rspSize);
×
1211
    goto _return;
×
1212
  }
1213

1214
_return:
6,349,519 ✔
1215

1216
  rspMsg.info = pMsg->info;
6,349,680 ✔
1217
  rspMsg.pCont = pRsp;
6,349,680 ✔
1218
  rspMsg.contLen = rspSize;
6,349,680 ✔
1219
  rspMsg.code = code;
6,349,680 ✔
1220
  rspMsg.msgType = pMsg->msgType;
6,349,680 ✔
1221

1222
  if (code) {
6,349,680 ✔
1223
    qError("vnd get virtual subtables failed cause of %s", tstrerror(code));
×
1224
  }
1225

1226
  *pMsg = rspMsg;
6,349,680 ✔
1227
  
1228
  tDestroySVSubTablesRsp(&rsp);
6,349,680 ✔
1229

1230
  //tmsgSendRsp(&rspMsg);
1231

1232
  return code;
6,349,683 ✔
1233
}
1234

1235
int32_t vnodeProcessCheckHasCtbReq(SVnode *pVnode, SRpcMsg *pMsg) {
41,592 ✔
1236
  SVCheckHasCtbReq req = {0};
41,592 ✔
1237
  int32_t          code = 0;
41,592 ✔
1238
  void            *pBuf = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
41,592 ✔
1239
  int32_t          bufLen = pMsg->contLen - sizeof(SMsgHead);
41,592 ✔
1240

1241
  code = tDeserializeSVCheckHasCtbReq(pBuf, bufLen, &req);
41,592 ✔
1242
  if (code != 0) {
41,592 ✔
1243
    vError("vgId:%d, failed to deserialize check-has-ctb req", TD_VID(pVnode));
×
1244
    goto _exit;
×
1245
  }
1246

1247
  SMCtbCursor *pCur = metaOpenCtbCursor(pVnode, req.suid, 0, 0);
41,592 ✔
1248
  if (pCur == NULL) {
41,592 ✔
1249
    code = (terrno != 0) ? terrno : TSDB_CODE_OUT_OF_MEMORY;
×
1250
    vError("vgId:%d, failed to open ctb cursor for suid:%" PRId64 ", code:0x%x", TD_VID(pVnode), req.suid, code);
×
1251
  } else {
1252
    tb_uid_t id = metaCtbCursorNext(pCur);
41,592 ✔
1253
    metaCloseCtbCursor(pCur);
41,592 ✔
1254
    if (id != 0) {
41,592 ✔
1255
      code = TSDB_CODE_MND_VST_PARENT_HAS_VCT;
650 ✔
1256
    }
1257
  }
1258

1259
_exit:;
41,592 ✔
1260
  SRpcMsg rspMsg = {.info = pMsg->info, .code = code};
41,592 ✔
1261
  tmsgSendRsp(&rspMsg);
41,592 ✔
1262
  return 0;  // return 0 so fetch worker doesn't double-send response
41,592 ✔
1263
}
1264

1265
// Pre-check for a virtual stb alter that introduces new column/tag names: fail with
1266
// TSDB_CODE_VND_COL_ALREADY_EXISTS if any vchild table of the stb already owns one of the
1267
// names as an own (extension) column/tag. Same check as the backstop in metaEntry2.c, run
1268
// ahead of the real alter so the mnode-side trans can fail cleanly.
1269
int32_t vnodeProcessCheckStbAlterNameReq(SVnode *pVnode, SRpcMsg *pMsg) {
55,668 ✔
1270
  SVCheckStbAlterNameReq req = {0};
55,668 ✔
1271
  int32_t                code = 0;
55,668 ✔
1272
  void                  *pBuf = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
55,668 ✔
1273
  int32_t                bufLen = pMsg->contLen - sizeof(SMsgHead);
55,668 ✔
1274

1275
  code = tDeserializeSVCheckStbAlterNameReq(pBuf, bufLen, &req);
55,668 ✔
1276
  if (code != 0) {
55,668 ✔
1277
    vError("vgId:%d, failed to deserialize check-stb-alter-name req", TD_VID(pVnode));
×
1278
    goto _exit;
×
1279
  }
1280

1281
  for (int32_t i = 0; i < taosArrayGetSize(req.pNames); ++i) {
116,946 ✔
1282
    code = metaCheckOwnNameConflictOfChildTables(pVnode->pMeta, req.suid, (const char *)taosArrayGet(req.pNames, i));
63,644 ✔
1283
    if (code != 0) {
63,644 ✔
1284
      vError("vgId:%d, check-stb-alter-name failed for suid:%" PRId64 ", code:0x%x", TD_VID(pVnode), req.suid, code);
2,366 ✔
1285
      goto _exit;
2,366 ✔
1286
    }
1287
  }
1288

1289
_exit:;
55,668 ✔
1290
  tFreeSVCheckStbAlterNameReq(&req);
55,668 ✔
1291
  SRpcMsg rspMsg = {.info = pMsg->info, .code = code};
55,668 ✔
1292
  tmsgSendRsp(&rspMsg);
55,668 ✔
1293
  return 0;  // return 0 so fetch worker doesn't double-send response
55,668 ✔
1294
}
1295

1296
int32_t vnodeGetVStbRefDbs(SVnode *pVnode, SRpcMsg *pMsg) {
×
1297
  int32_t        code = 0;
×
1298
  int32_t        rspSize = 0;
×
1299
  SVStbRefDbsReq req = {0};
×
1300
  SVStbRefDbsRsp rsp = {0};
×
1301
  SRpcMsg        rspMsg = {0};
×
1302
  void          *pRsp = NULL;
×
1303
  int32_t        line = 0;
×
1304

1305
  if (tDeserializeSVStbRefDbsReq(pMsg->pCont, pMsg->contLen, &req)) {
×
1306
    code = terrno;
×
1307
    qError("tDeserializeSVSubTablesReq failed");
×
1308
    goto _return;
×
1309
  }
1310

1311
  SReadHandle handle = {0};
×
1312
  handle.vnode = pVnode;
×
1313
  initStorageAPI(&handle.api);
×
1314

1315
  code = vnodeReadVStbRefDbs(&handle, req.suid, &rsp.pDbs, &rsp.pExtSources);
×
1316
  QUERY_CHECK_CODE(code, line, _return);
×
1317
  rsp.vgId = TD_VID(pVnode);
×
1318

1319
  rspSize = tSerializeSVStbRefDbsRsp(NULL, 0, &rsp);
×
1320
  if (rspSize < 0) {
×
1321
    code = rspSize;
×
1322
    qError("tSerializeSVStbRefDbsRsp failed, error:%d", rspSize);
×
1323
    goto _return;
×
1324
  }
1325
  pRsp = taosMemoryCalloc(1, rspSize);
×
1326
  if (pRsp == NULL) {
×
1327
    code = terrno;
×
1328
    qError("rpcMallocCont %d failed, error:%d", rspSize, terrno);
×
1329
    goto _return;
×
1330
  }
1331
  rspSize = tSerializeSVStbRefDbsRsp(pRsp, rspSize, &rsp);
×
1332
  if (rspSize < 0) {
×
1333
    code = rspSize;
×
1334
    qError("tSerializeSVStbRefDbsRsp failed, error:%d", rspSize);
×
1335
    goto _return;
×
1336
  }
1337

1338
_return:
×
1339

1340
  rspMsg.info = pMsg->info;
×
1341
  rspMsg.pCont = pRsp;
×
1342
  rspMsg.contLen = rspSize;
×
1343
  rspMsg.code = code;
×
1344
  rspMsg.msgType = pMsg->msgType;
×
1345

1346
  if (code) {
×
1347
    qError("vnd get virtual stb ref db failed cause of %s", tstrerror(code));
×
1348
  }
1349

1350
  *pMsg = rspMsg;
×
1351

1352
  tDestroySVStbRefDbsRsp(&rsp);
×
1353

1354
  return code;
×
1355
}
1356

1357
int32_t vnodeGetVTbTagCond(SVnode *pVnode, SRpcMsg *pMsg, bool direct) {
48,441 ✔
1358
  int32_t      code = TSDB_CODE_SUCCESS;
48,441 ✔
1359
  int32_t      line = 0;
48,441 ✔
1360
  int32_t      rspSize = 0;
48,441 ✔
1361
  SVTagCondReq req = {0};
48,441 ✔
1362
  SVTagCondRsp rsp = {0};
48,441 ✔
1363
  SRpcMsg      rspMsg = {0};
48,441 ✔
1364
  void        *pRsp = NULL;
48,441 ✔
1365
  SMetaReader  mer = {0};
48,441 ✔
1366

1367
  if (tDeserializeSVTagCondReq(pMsg->pCont, pMsg->contLen, &req)) {
48,441 ✔
1368
    code = terrno;
×
1369
    qError("tDeserializeSVTagCondReq failed");
×
1370
    goto _return;
×
1371
  }
1372

1373
  metaReaderDoInit(&mer, pVnode->pMeta, META_READER_LOCK, 0);
48,441 ✔
1374
  code = metaReaderGetTableEntryByUid(&mer, req.uid);
48,441 ✔
1375
  QUERY_CHECK_CODE(code, line, _return);
48,441 ✔
1376

1377
  rsp.pEntries = taosArrayInit(8, sizeof(SVTagCondEntry));
48,441 ✔
1378
  QUERY_CHECK_NULL(rsp.pEntries, code, line, _return, terrno);
48,441 ✔
1379
  rsp.pFilterConds = taosArrayInit(8, sizeof(SVtbColFilterCond));
48,441 ✔
1380
  QUERY_CHECK_NULL(rsp.pFilterConds, code, line, _return, terrno);
48,441 ✔
1381

1382
  if (hasColRef(mer.me.type)) {
48,441 ✔
1383
    SColRefWrapper *p = &(mer.me.colRef);
48,441 ✔
1384
    int32_t nOwnCols = mer.me.type == TSDB_VIRTUAL_CHILD_TABLE ? mer.me.own.nOwnCols : 0;
48,441 ✔
1385
    for (int32_t i = 0; i < p->nCols + nOwnCols; ++i) {
820,572 ✔
1386
      SColRef *pColRef = i < p->nCols ? &p->pColRef[i] : &mer.me.own.pOwnColRefs[i - p->nCols];
772,131 ✔
1387
      if (pColRef->hasRef && pColRef->tagCondLen > 0 && pColRef->tagCondJson != NULL) {
772,131 ✔
1388
        SVTagCondEntry entry = {0};
450 ✔
1389
        entry.colId = pColRef->id;
450 ✔
1390
        entry.tagCondLen = pColRef->tagCondLen;
450 ✔
1391
        entry.tagCondJson = taosStrdup(pColRef->tagCondJson);
450 ✔
1392
        QUERY_CHECK_NULL(entry.tagCondJson, code, line, _return, terrno);
450 ✔
1393
        void *pResult = taosArrayPush(rsp.pEntries, &entry);
450 ✔
1394
        if (NULL == pResult) {
450 ✔
1395
          taosMemoryFreeClear(entry.tagCondJson);
×
1396
        }
1397
        QUERY_CHECK_NULL(pResult, code, line, _return, terrno);
450 ✔
1398
      }
1399

1400
      if (pColRef->hasRef && pColRef->filterCondLen > 0 && pColRef->filterCondJson != NULL) {
772,131 ✔
1401
        SVtbColFilterCond filterCond = {0};
×
1402
        filterCond.colId = pColRef->id;
×
1403
        filterCond.filterCondLen = pColRef->filterCondLen;
×
1404
        filterCond.filterCondJson = taosStrdup(pColRef->filterCondJson);
×
1405
        QUERY_CHECK_NULL(filterCond.filterCondJson, code, line, _return, terrno);
×
1406
        void *pResult = taosArrayPush(rsp.pFilterConds, &filterCond);
×
1407
        if (NULL == pResult) {
×
1408
          taosMemoryFreeClear(filterCond.filterCondJson);
×
1409
        }
1410
        QUERY_CHECK_NULL(pResult, code, line, _return, terrno);
×
1411
      }
1412
    }
1413
  }
1414
  rsp.numOfRefs = taosArrayGetSize(rsp.pEntries);
48,441 ✔
1415
  rsp.numOfFilterConds = taosArrayGetSize(rsp.pFilterConds);
48,441 ✔
1416

1417
  rspSize = tSerializeSVTagCondRsp(NULL, 0, &rsp);
48,441 ✔
1418
  if (rspSize < 0) {
48,441 ✔
1419
    code = rspSize;
×
1420
    qError("tSerializeSVTagCondRsp failed, error:%d", rspSize);
×
1421
    goto _return;
×
1422
  }
1423
  if (direct) {
48,441 ✔
1424
    pRsp = rpcMallocCont(rspSize);
48,441 ✔
1425
  } else {
1426
    pRsp = taosMemoryCalloc(1, rspSize);
×
1427
  }
1428
  QUERY_CHECK_NULL(pRsp, code, line, _return, terrno);
48,441 ✔
1429
  rspSize = tSerializeSVTagCondRsp(pRsp, rspSize, &rsp);
48,441 ✔
1430
  if (rspSize < 0) {
48,441 ✔
1431
    code = rspSize;
×
1432
    qError("tSerializeSVTagCondRsp failed, error:%d", rspSize);
×
1433
    goto _return;
×
1434
  }
1435

1436
_return:
48,441 ✔
1437
  metaReaderClear(&mer);
48,441 ✔
1438
  rspMsg.info = pMsg->info;
48,441 ✔
1439
  rspMsg.pCont = pRsp;
48,441 ✔
1440
  rspMsg.contLen = (code == 0) ? rspSize : 0;
48,441 ✔
1441
  rspMsg.code = code;
48,441 ✔
1442
  rspMsg.msgType = pMsg->msgType;
48,441 ✔
1443
  if (code) {
48,441 ✔
1444
    qError("%s failed at line %d since %s", __func__, line, tstrerror(code));
×
1445
  }
1446
  if (direct) {
48,441 ✔
1447
    tmsgSendRsp(&rspMsg);
48,441 ✔
1448
  } else {
1449
    *pMsg = rspMsg;
×
1450
  }
1451
  tDestroySVTagCondRsp(&rsp);
48,441 ✔
1452
  return code;
48,441 ✔
1453
}
1454

1455
static int32_t vnodeGetCompStorage(SVnode *pVnode, int64_t *output) {
49,092,481 ✔
1456
  int32_t code = 0;
49,092,481 ✔
1457
#ifdef TD_ENTERPRISE
1458
  int32_t now = taosGetTimestampSec();
49,092,481 ✔
1459
  if (llabs(now - pVnode->config.vndStats.storageLastUpd) >= 30) {
49,092,481 ✔
1460
    pVnode->config.vndStats.storageLastUpd = now;
2,564,216 ✔
1461

1462
    SDbSizeStatisInfo info = {0};
2,564,216 ✔
1463
    if (0 == (code = vnodeGetDBSize(pVnode, &info))) {
2,564,216 ✔
1464
      int64_t compSize =
2,564,216 ✔
1465
          info.l1Size + info.l2Size + info.l3Size + info.cacheSize + info.walSize + info.metaSize + +info.ssSize;
2,564,216 ✔
1466
      if (compSize >= 0) {
2,564,216 ✔
1467
        pVnode->config.vndStats.compStorage = compSize;
2,564,216 ✔
1468
      } else {
1469
        vError("vnode get comp storage failed since compSize is negative:%" PRIi64, compSize);
×
1470
        code = TSDB_CODE_APP_ERROR;
×
1471
      }
1472
    } else {
1473
      vWarn("vnode get comp storage failed since %s", tstrerror(code));
1,267 ✔
1474
    }
1475
  }
1476
  if (output) *output = pVnode->config.vndStats.compStorage;
49,092,481 ✔
1477
#endif
1478
  return code;
49,092,481 ✔
1479
}
1480

1481
static void vnodeGetBufferInfo(SVnode *pVnode, int64_t *bufferSegmentUsed, int64_t *bufferSegmentSize) {
49,092,481 ✔
1482
  *bufferSegmentUsed = 0;
49,092,481 ✔
1483
  *bufferSegmentSize = 0;
49,092,481 ✔
1484
  if (pVnode) {
49,092,481 ✔
1485
    (void)taosThreadMutexLock(&pVnode->mutex);
49,092,481 ✔
1486

1487
    if (pVnode->inUse) {
49,092,481 ✔
1488
      *bufferSegmentUsed = pVnode->inUse->size;
49,078,888 ✔
1489
    }
1490
    *bufferSegmentSize = pVnode->config.szBuf / VNODE_BUFPOOL_SEGMENTS;
49,092,481 ✔
1491

1492
    (void)taosThreadMutexUnlock(&pVnode->mutex);
49,092,481 ✔
1493
  }
1494
}
49,092,481 ✔
1495

1496
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
49,092,481 ✔
1497
  SSyncState state = syncGetState(pVnode->sync);
49,092,481 ✔
1498
  pLoad->syncAppliedIndex = pVnode->state.applied;
49,092,481 ✔
1499
  syncGetCommitIndex(pVnode->sync, &pLoad->syncCommitIndex);
49,092,481 ✔
1500

1501
  pLoad->vgId = TD_VID(pVnode);
49,092,481 ✔
1502
  pLoad->syncState = state.state;
49,092,481 ✔
1503
  pLoad->syncRestore = state.restored;
49,092,481 ✔
1504
  pLoad->syncTerm = state.term;
49,092,481 ✔
1505
  pLoad->roleTimeMs = state.roleTimeMs;
49,092,481 ✔
1506
  pLoad->startTimeMs = state.startTimeMs;
49,092,481 ✔
1507
  pLoad->syncCanRead = state.canRead;
49,092,481 ✔
1508
  pLoad->cacheUsage = tsdbCacheGetUsage(pVnode);
49,092,481 ✔
1509
  pLoad->numOfCachedTables = tsdbCacheGetElems(pVnode);
49,092,481 ✔
1510
  VNODE_DO_META_QUERY(pVnode, pLoad->numOfTables = metaGetTbNum(pVnode->pMeta));
49,092,481 ✔
1511
  VNODE_DO_META_QUERY(pVnode, pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta, 1));
49,092,481 ✔
1512
  pLoad->totalStorage = (int64_t)3 * 1073741824;  // TODO
49,092,481 ✔
1513
  (void)vnodeGetCompStorage(pVnode, &pLoad->compStorage);
49,092,481 ✔
1514
  pLoad->pointsWritten = 100;
49,092,481 ✔
1515
  pLoad->numOfSelectReqs = 1;
49,092,481 ✔
1516
  pLoad->numOfInsertReqs = atomic_load_64(&pVnode->statis.nInsert);
49,092,481 ✔
1517
  pLoad->numOfInsertSuccessReqs = atomic_load_64(&pVnode->statis.nInsertSuccess);
49,092,481 ✔
1518
  pLoad->numOfBatchInsertReqs = atomic_load_64(&pVnode->statis.nBatchInsert);
49,092,481 ✔
1519
  pLoad->numOfBatchInsertSuccessReqs = atomic_load_64(&pVnode->statis.nBatchInsertSuccess);
49,092,481 ✔
1520
  vnodeGetBufferInfo(pVnode, &pLoad->bufferSegmentUsed, &pLoad->bufferSegmentSize);
49,092,481 ✔
1521
  vDebug("vgId:%d, get vnode load, state:%s snapSeq:%d, learnerProgress:%d, totalIndex:%" PRId64, TD_VID(pVnode),
49,092,481 ✔
1522
         syncStr(state.state), state.snapSeq, state.progress, state.totalIndex);
1523
  pLoad->learnerProgress = state.progress;
49,092,481 ✔
1524
  pLoad->snapSeq = state.snapSeq;
49,092,481 ✔
1525
  pLoad->syncTotalIndex = state.totalIndex;
49,092,481 ✔
1526
  pLoad->snapshotSending = syncSnapshotSending(pVnode->sync) ? 1 : 0;
49,092,481 ✔
1527
  // Report per-target snapshot-send progress, so the mnode can display progress and compute the rate per target follower dnodeId.
1528
  // Fetch the byte summary grouped by destDnodeId from tsdb, and convert each entry into an SVnodeSnapProgress filled into pLoad->pSnapProgress.
1529
  pLoad->pSnapProgress = NULL;
49,092,481 ✔
1530
  SArray *pSnapGroups = taosArrayInit(4, sizeof(STsdbSnapSendGroup));
49,092,481 ✔
1531
  if (pSnapGroups != NULL) {
49,092,481 ✔
1532
    tsdbGetSnapSendSummary(pVnode->pTsdb, pSnapGroups);
49,092,481 ✔
1533
    int32_t numGroups = (int32_t)taosArrayGetSize(pSnapGroups);
49,092,481 ✔
1534
    if (numGroups > 0) {
49,092,481 ✔
1535
      pLoad->pSnapProgress = taosArrayInit(numGroups, sizeof(SVnodeSnapProgress));
165 ✔
1536
      if (pLoad->pSnapProgress != NULL) {
165 ✔
1537
        for (int32_t g = 0; g < numGroups; g++) {
330 ✔
1538
          STsdbSnapSendGroup *pGroup = (STsdbSnapSendGroup *)taosArrayGet(pSnapGroups, g);
165 ✔
1539
          if (pGroup == NULL) continue;
165 ✔
1540
          SVnodeSnapProgress prog = {.destDnodeId = pGroup->destDnodeId,
165 ✔
1541
                                     .snapTotalSize = pGroup->total,
165 ✔
1542
                                     .snapTransferredSize = pGroup->transferred};
165 ✔
1543
          if (taosArrayPush(pLoad->pSnapProgress, &prog) == NULL) {
330 ✔
1544
            vError("vgId:%d, failed to push snap progress for destDnodeId:%d", TD_VID(pVnode), pGroup->destDnodeId);
×
1545
          }
1546
        }
1547
        vDebug("vgId:%d, report snap send progress, numGroups:%d", TD_VID(pVnode), numGroups);
165 ✔
1548
      } else {
1549
        vError("vgId:%d, failed to alloc pSnapProgress array for vnode load", TD_VID(pVnode));
×
1550
      }
1551
    }
1552
    taosArrayDestroy(pSnapGroups);
49,092,481 ✔
1553
  } else {
1554
    vError("vgId:%d, failed to alloc snap send groups array for vnode load", TD_VID(pVnode));
×
1555
  }
1556
  return 0;
49,092,481 ✔
1557
}
1558

1559
int32_t vnodeGetLoadLite(SVnode *pVnode, SVnodeLoadLite *pLoad) {
×
1560
  SSyncState syncState = syncGetState(pVnode->sync);
×
1561
  if (syncState.state == TAOS_SYNC_STATE_LEADER || syncState.state == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
×
1562
    pLoad->vgId = TD_VID(pVnode);
×
1563
    pLoad->nTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta, 1);
×
1564
    return 0;
×
1565
  }
1566
  return -1;
×
1567
}
1568
/**
1569
 * @brief Reset the statistics value by monitor interval
1570
 *
1571
 * @param pVnode
1572
 * @param pLoad
1573
 */
1574
void vnodeResetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
×
1575
  VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nInsert, pLoad->numOfInsertReqs, 64, "nInsert");
×
1576
  VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nInsertSuccess, pLoad->numOfInsertSuccessReqs, 64, "nInsertSuccess");
×
1577
  VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nBatchInsert, pLoad->numOfBatchInsertReqs, 64, "nBatchInsert");
×
1578
  VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nBatchInsertSuccess, pLoad->numOfBatchInsertSuccessReqs, 64,
×
1579
                            "nBatchInsertSuccess");
1580
}
×
1581

1582
void vnodeGetInfo(void *pVnode, const char **dbname, int32_t *vgId, SVnodeTableNums *pNums) {
23,856,012 ✔
1583
  SVnode    *pVnodeObj = pVnode;
23,856,012 ✔
1584
  SVnodeCfg *pConf = &pVnodeObj->config;
23,856,012 ✔
1585

1586
  if (dbname) {
23,856,012 ✔
1587
    *dbname = pConf->dbname;
23,764,023 ✔
1588
  }
1589

1590
  if (vgId) {
23,856,012 ✔
1591
    *vgId = TD_VID(pVnodeObj);
23,212,176 ✔
1592
  }
1593

1594
  if (pNums) {
23,856,012 ✔
1595
    pNums->ntb = pConf->vndStats.numOfNTables;
3,178 ✔
1596
    pNums->ctb = pConf->vndStats.numOfCTables;
3,178 ✔
1597
    pNums->vtb = pConf->vndStats.numOfVTables;
3,178 ✔
1598
    pNums->vctb = pConf->vndStats.numOfVCTables;
3,178 ✔
1599
  }
1600
}
23,856,012 ✔
1601

1602
int8_t vnodeGetSecurityLevel(void *pVnode) {
359,881 ✔
1603
  SVnode *pVnodeObj = pVnode;
359,881 ✔
1604
  return pVnodeObj->config.securityLevel;
359,881 ✔
1605
}
1606

1607
int8_t vnodeGetTsdbPrecision(void *pVnode) {
8,797,684 ✔
1608
  SVnode *pVnodeObj = pVnode;
8,797,684 ✔
1609
  return pVnodeObj->config.tsdbCfg.precision;
8,797,684 ✔
1610
}
1611

1612
bool vnodeHasPendingTxnEntries(void *pVnode) {
×
1613
  SVnode *pVnodeObj = pVnode;
×
1614
  return metaHasPendingTxnEntries(pVnodeObj->pMeta);
×
1615
}
1616

1617
int32_t vnodeGetTableList(void *pVnode, int8_t type, SArray *pList) {
1,361 ✔
1618
  if (type == TSDB_SUPER_TABLE) {
1,361 ✔
1619
    return vnodeGetStbIdList(pVnode, 0, pList);
1,361 ✔
1620
  } else {
1621
    return TSDB_CODE_INVALID_PARA;
×
1622
  }
1623
}
1624

1625
int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list) {
×
1626
  int32_t      code = TSDB_CODE_SUCCESS;
×
1627
  SMCtbCursor *pCur = metaOpenCtbCursor(pVnode, uid, 1, 0);
×
1628
  if (NULL == pCur) {
×
1629
    qError("vnode get all table list failed");
×
1630
    return terrno;
×
1631
  }
1632

1633
  while (1) {
×
1634
    tb_uid_t id = metaCtbCursorNext(pCur);
×
1635
    if (id == 0) {
×
1636
      break;
×
1637
    }
1638

1639
    STableKeyInfo info = {uid = id};
×
1640
    if (NULL == taosArrayPush(list, &info)) {
×
1641
      qError("taosArrayPush failed");
×
1642
      code = terrno;
×
1643
      goto _exit;
×
1644
    }
1645
  }
1646
_exit:
×
1647
  metaCloseCtbCursor(pCur);
×
1648
  return code;
×
1649
}
1650

1651
int32_t vnodeGetCtbIdListByFilter(SVnode *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg), void *arg) {
×
1652
  return 0;
×
1653
}
1654

1655
int32_t vnodeGetCtbIdList(void *pVnode, int64_t suid, SArray *list) {
72,980,292 ✔
1656
  int32_t      code = TSDB_CODE_SUCCESS;
72,980,292 ✔
1657
  SVnode      *pVnodeObj = pVnode;
72,980,292 ✔
1658
  SMCtbCursor *pCur = metaOpenCtbCursor(pVnodeObj, suid, 1, 0);
72,980,292 ✔
1659
  if (NULL == pCur) {
72,924,573 ✔
1660
    qError("vnode get ctb id list failed, suid:%" PRId64, suid);
×
1661
    return terrno;
×
1662
  }
1663

1664
  while (1) {
226,681,601 ✔
1665
    tb_uid_t id = metaCtbCursorNext(pCur);
299,606,174 ✔
1666
    if (id == 0) {
299,395,422 ✔
1667
      break;
72,916,731 ✔
1668
    }
1669
    qTrace("vnodeGetCtbIdList: got ctb id %" PRId64 " for suid %" PRId64, id, suid);
226,395,359 ✔
1670
    if (NULL == taosArrayPush(list, &id)) {
226,713,469 ✔
1671
      qError("taosArrayPush failed");
×
1672
      code = terrno;
×
1673
      goto _exit;
×
1674
    }
1675
  }
1676

1677
_exit:
72,902,795 ✔
1678
  metaCloseCtbCursor(pCur);
72,902,795 ✔
1679
  return code;
72,945,800 ✔
1680
}
1681

1682
int32_t vnodeGetStbIdList(SVnode *pVnode, int64_t suid, SArray *list) {
36,487,643 ✔
1683
  int32_t      code = TSDB_CODE_SUCCESS;
36,487,643 ✔
1684
  SMStbCursor *pCur = metaOpenStbCursor(pVnode->pMeta, suid);
36,487,643 ✔
1685
  if (!pCur) {
36,488,920 ✔
1686
    return TSDB_CODE_OUT_OF_MEMORY;
×
1687
  }
1688

1689
  while (1) {
8,741,587 ✔
1690
    tb_uid_t id = metaStbCursorNext(pCur);
45,230,507 ✔
1691
    if (id == 0) {
45,232,225 ✔
1692
      break;
36,465,397 ✔
1693
    }
1694

1695
    if (NULL == taosArrayPush(list, &id)) {
8,742,482 ✔
1696
      qError("taosArrayPush failed");
×
1697
      code = terrno;
×
1698
      goto _exit;
×
1699
    }
1700
  }
1701

1702
_exit:
36,488,713 ✔
1703
  metaCloseStbCursor(pCur);
36,488,713 ✔
1704
  return code;
36,488,220 ✔
1705
}
1706

1707
int32_t vnodeGetStbIdListByFilter(SVnode *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg, void *arg1),
44 ✔
1708
                                  void *arg) {
1709
  int32_t      code = TSDB_CODE_SUCCESS;
44 ✔
1710
  SMStbCursor *pCur = metaOpenStbCursor(pVnode->pMeta, suid);
44 ✔
1711
  if (!pCur) {
44 ✔
1712
    return terrno;
×
1713
  }
1714

1715
  while (1) {
220 ✔
1716
    tb_uid_t id = metaStbCursorNext(pCur);
264 ✔
1717
    if (id == 0) {
264 ✔
1718
      break;
44 ✔
1719
    }
1720

1721
    if ((*filter) && (*filter)(arg, &id)) {
220 ✔
1722
      continue;
220 ✔
1723
    }
1724

1725
    if (NULL == taosArrayPush(list, &id)) {
×
1726
      qError("taosArrayPush failed");
×
1727
      code = terrno;
×
1728
      goto _exit;
×
1729
    }
1730
  }
1731

1732
_exit:
44 ✔
1733
  metaCloseStbCursor(pCur);
44 ✔
1734
  return code;
44 ✔
1735
}
1736

1737
int32_t vnodeGetCtbNum(SVnode *pVnode, int64_t suid, int64_t *num) {
1,119,226 ✔
1738
  SMCtbCursor *pCur = metaOpenCtbCursor(pVnode, suid, 0, 0);
1,119,226 ✔
1739
  if (!pCur) {
1,119,188 ✔
1740
    return terrno;
×
1741
  }
1742

1743
  *num = 0;
1,119,188 ✔
1744
  while (1) {
879,762 ✔
1745
    tb_uid_t id = metaCtbCursorNext(pCur);
1,998,037 ✔
1746
    if (id == 0) {
1,998,217 ✔
1747
      break;
1,118,980 ✔
1748
    }
1749

1750
    ++(*num);
878,849 ✔
1751
  }
1752

1753
  metaCloseCtbCursor(pCur);
1,119,368 ✔
1754
  return TSDB_CODE_SUCCESS;
1,119,368 ✔
1755
}
1756

1757
int32_t vnodeGetStbColumnNum(SVnode *pVnode, tb_uid_t suid, int *num) {
1,119,297 ✔
1758
  SSchemaWrapper *pSW = metaGetTableSchema(pVnode->pMeta, suid, -1, 0, NULL, 0, false);
1,119,297 ✔
1759
  if (pSW) {
1,119,298 ✔
1760
    *num = pSW->nCols;
1,118,492 ✔
1761
    tDeleteSchemaWrapper(pSW);
776 ✔
1762
  } else {
1763
    *num = 2;
806 ✔
1764
  }
1765

1766
  return TSDB_CODE_SUCCESS;
1,119,368 ✔
1767
}
1768

1769
int32_t vnodeGetStbInfo(SVnode *pVnode, tb_uid_t suid, int64_t *keep, int8_t *flags) {
1,119,368 ✔
1770
  SMetaReader mr = {0};
1,119,368 ✔
1771
  metaReaderDoInit(&mr, pVnode->pMeta, META_READER_NOLOCK, 0);
1,119,368 ✔
1772

1773
  int32_t code = metaReaderGetTableEntryByUid(&mr, suid);
1,119,368 ✔
1774
  if (code == TSDB_CODE_SUCCESS) {
1,119,368 ✔
1775
    if (keep) *keep = mr.me.stbEntry.keep;
1,118,562 ✔
1776
    if (flags) *flags = mr.me.flags;
1,118,562 ✔
1777
  } else {
1778
    if (keep) *keep = 0;
806 ✔
1779
    if (flags) *flags = 0;
806 ✔
1780
  }
1781

1782
  metaReaderClear(&mr);
1,119,368 ✔
1783
  return TSDB_CODE_SUCCESS;
1,119,368 ✔
1784
}
1785

1786
#ifdef TD_ENTERPRISE
1787
const char *tkLogStb[] = {"cluster_info",
1788
                          "data_dir",
1789
                          "disk_free",
1790
                          "disk_total",
1791
                          "dnodes_info",
1792
                          "d_info",
1793
                          "explorer_sys",
1794
                          "grants_info",
1795
                          "keeper_monitor",
1796
                          "logs",
1797
                          "log_dir",
1798
                          "log_summary",
1799
                          "http_client_requests",
1800
                          "http_server_requests_idmp",
1801
                          "m_info",
1802
                          "taosadapter_restful_http_request_fail",
1803
                          "taosadapter_restful_http_request_in_flight",
1804
                          "taosadapter_restful_http_request_summary_milliseconds",
1805
                          "taosadapter_restful_http_request_total",
1806
                          "taosadapter_system_cpu_percent",
1807
                          "taosadapter_system_mem_percent",
1808
                          "temp_dir",
1809
                          "vgroups_info",
1810
                          "vnodes_role",
1811
                          "taosd_dnodes_status",
1812
                          "adapter_conn_pool",
1813
                          "taosd_vnodes_info",
1814
                          "taosd_dnodes_metrics",
1815
                          "taosd_vgroups_info",
1816
                          "taos_sql_req",
1817
                          "taosd_mnodes_info",
1818
                          "adapter_c_interface",
1819
                          "taosd_cluster_info",
1820
                          "taosd_sql_req",
1821
                          "taosd_dnodes_info",
1822
                          "adapter_requests",
1823
                          "taosd_write_metrics",
1824
                          "adapter_status",
1825
                          "taos_slow_sql",
1826
                          "taos_slow_sql_detail",
1827
                          "taosd_cluster_basic",
1828
                          "taosd_dnodes_data_dirs",
1829
                          "taosd_dnodes_log_dirs",
1830
                          "xnode_agent_activities",
1831
                          "xnode_task_activities",
1832
                          "xnode_task_metrics",
1833
                          "taosx_sys",
1834
                          "taosx_task_csv",
1835
                          "taosx_task_progress",
1836
                          "taosx_task_kinghist",
1837
                          "taosx_task_tdengine2",
1838
                          "taosx_task_tdengine3",
1839
                          "taosx_task_opc_da",
1840
                          "taosx_task_opc_ua",
1841
                          "taosx_task_kafka",
1842
                          "taosx_task_influxdb",
1843
                          "taosx_task_mqtt",
1844
                          "taosx_task_avevahistorian",
1845
                          "taosx_task_opentsdb",
1846
                          "taosx_task_mysql",
1847
                          "taosx_task_postgres",
1848
                          "taosx_task_oracle",
1849
                          "taosx_task_mssql",
1850
                          "taosx_task_mongodb",
1851
                          "taosx_task_sparkplugb",
1852
                          "taosx_task_orc",
1853
                          "taosx_task_pulsar",
1854
                          "taosx_task_pspace"};
1855
const char *tkAuditStb[] = {"operations"};
1856
const int   tkLogStbNum = ARRAY_SIZE(tkLogStb);
1857
const int   tkAuditStbNum = ARRAY_SIZE(tkAuditStb);
1858

1859
// exclude stbs of taoskeeper log
1860
static int32_t vnodeGetTimeSeriesBlackList(SVnode *pVnode, int32_t *tbSize) {
36,486,703 ✔
1861
  int32_t      code = TSDB_CODE_SUCCESS;
36,486,703 ✔
1862
  int32_t      tbNum = 0;
36,486,703 ✔
1863
  const char **pTbArr = NULL;
36,486,703 ✔
1864
  const char  *dbName = NULL;
36,486,703 ✔
1865
  *tbSize = 0;
36,486,703 ✔
1866

1867
  if (!(dbName = strchr(pVnode->config.dbname, '.'))) return 0;
36,486,703 ✔
1868
  if (0 == strncmp(++dbName, "log", TSDB_DB_NAME_LEN)) {
36,486,703 ✔
1869
    tbNum = tkLogStbNum;
2,244 ✔
1870
    pTbArr = (const char **)&tkLogStb;
2,244 ✔
1871
  } else if (0 == strncmp(dbName, "audit", TSDB_DB_NAME_LEN) || pVnode->config.isAudit) {
36,484,459 ✔
1872
    tbNum = tkAuditStbNum;
×
1873
    pTbArr = (const char **)&tkAuditStb;
×
1874
  }
1875
  if (tbNum && pTbArr) {
36,486,703 ✔
1876
    *tbSize = metaSizeOfTbFilterCache(pVnode->pMeta, 0);
2,244 ✔
1877
    if (*tbSize < tbNum) {
2,244 ✔
1878
      for (int32_t i = 0; i < tbNum; ++i) {
129,184 ✔
1879
        tb_uid_t suid = metaGetTableEntryUidByName(pVnode->pMeta, pTbArr[i]);
127,424 ✔
1880
        if (suid != 0) {
127,424 ✔
1881
          code = metaPutTbToFilterCache(pVnode->pMeta, &suid, 0);
704 ✔
1882
          if (TSDB_CODE_SUCCESS != code) {
704 ✔
1883
            return code;
484 ✔
1884
          }
1885
        }
1886
      }
1887
      *tbSize = metaSizeOfTbFilterCache(pVnode->pMeta, 0);
1,760 ✔
1888
    }
1889
  }
1890

1891
  return code;
36,461,976 ✔
1892
}
1893
#endif
1894

1895
static bool vnodeTimeSeriesFilter(void *arg1, void *arg2) {
220 ✔
1896
  SVnode *pVnode = (SVnode *)arg1;
220 ✔
1897

1898
  if (metaTbInFilterCache(pVnode->pMeta, arg2, 0)) {
220 ✔
1899
    return true;
220 ✔
1900
  }
1901
  return false;
×
1902
}
1903

1904
int32_t vnodeGetTimeSeriesNum(SVnode *pVnode, int64_t *num) {
36,487,124 ✔
1905
  SArray *suidList = NULL;
36,487,124 ✔
1906

1907
  if (!(suidList = taosArrayInit(1, sizeof(tb_uid_t)))) {
36,487,124 ✔
1908
    return terrno;
×
1909
  }
1910

1911
  int32_t tbFilterSize = 0;
36,487,403 ✔
1912
  int32_t code = TSDB_CODE_SUCCESS;
36,487,753 ✔
1913
#ifdef TD_ENTERPRISE
1914
  code = vnodeGetTimeSeriesBlackList(pVnode, &tbFilterSize);
36,487,753 ✔
1915
  if (TSDB_CODE_SUCCESS != code) {
36,488,019 ✔
1916
    goto _exit;
484 ✔
1917
  }
1918
#endif
1919

1920
  if ((!tbFilterSize && vnodeGetStbIdList(pVnode, 0, suidList) < 0) ||
36,487,535 ✔
1921
      (tbFilterSize && vnodeGetStbIdListByFilter(pVnode, 0, suidList, vnodeTimeSeriesFilter, pVnode) < 0)) {
36,461,924 ✔
1922
    qError("vgId:%d, failed to get stb id list error: %s", TD_VID(pVnode), terrstr());
×
1923
    taosArrayDestroy(suidList);
×
1924
    return terrno;
×
1925
  }
1926

1927
  *num = 0;
36,485,817 ✔
1928
  int64_t arrSize = taosArrayGetSize(suidList);
36,485,817 ✔
1929
  for (int64_t i = 0; i < arrSize; ++i) {
45,230,633 ✔
1930
    tb_uid_t suid = *(tb_uid_t *)taosArrayGet(suidList, i);
8,741,698 ✔
1931

1932
    int64_t ctbNum = 0;
8,742,645 ✔
1933
    int32_t numOfCols = 0;
8,743,715 ✔
1934
    int8_t  flags = 0;
8,743,695 ✔
1935
    code = metaGetStbStats(pVnode, suid, &ctbNum, &numOfCols, &flags);
8,742,418 ✔
1936
    if (TSDB_CODE_SUCCESS != code) {
8,743,468 ✔
1937
      goto _exit;
×
1938
    }
1939
    if (!TABLE_IS_VIRTUAL(flags)) {
8,743,468 ✔
1940
      *num += ctbNum * (numOfCols - 1);
5,759,768 ✔
1941
    }
1942
  }
1943

1944
_exit:
36,489,439 ✔
1945
  taosArrayDestroy(suidList);
36,488,699 ✔
1946
  return TSDB_CODE_SUCCESS;
36,487,176 ✔
1947
}
1948

1949
int32_t vnodeGetAllCtbNum(SVnode *pVnode, int64_t *num) {
×
1950
  SMStbCursor *pCur = metaOpenStbCursor(pVnode->pMeta, 0);
×
1951
  if (!pCur) {
×
1952
    return terrno;
×
1953
  }
1954

1955
  *num = 0;
×
1956
  while (1) {
×
1957
    tb_uid_t id = metaStbCursorNext(pCur);
×
1958
    if (id == 0) {
×
1959
      break;
×
1960
    }
1961

1962
    int64_t ctbNum = 0;
×
1963
    int32_t code = vnodeGetCtbNum(pVnode, id, &ctbNum);
×
1964
    if (TSDB_CODE_SUCCESS != code) {
×
1965
      metaCloseStbCursor(pCur);
×
1966
      return code;
×
1967
    }
1968

1969
    *num += ctbNum;
×
1970
  }
1971

1972
  metaCloseStbCursor(pCur);
×
1973
  return TSDB_CODE_SUCCESS;
×
1974
}
1975

1976
void *vnodeGetIdx(void *pVnode) {
860,869 ✔
1977
  if (pVnode == NULL) {
860,869 ✔
1978
    return NULL;
×
1979
  }
1980

1981
  return metaGetIdx(((SVnode *)pVnode)->pMeta);
860,869 ✔
1982
}
1983

1984
void *vnodeGetIvtIdx(void *pVnode) {
860,869 ✔
1985
  if (pVnode == NULL) {
860,869 ✔
1986
    return NULL;
×
1987
  }
1988
  return metaGetIvtIdx(((SVnode *)pVnode)->pMeta);
860,869 ✔
1989
}
1990

1991
int32_t vnodeGetTableSchema(void *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid, SSchemaWrapper **pTagSchema) {
356,622 ✔
1992
  return tsdbGetTableSchema(((SVnode *)pVnode)->pMeta, uid, pSchema, suid, pTagSchema);
356,622 ✔
1993
}
1994

1995
static FORCE_INLINE int32_t vnodeGetDBPrimaryInfo(SVnode *pVnode, SDbSizeStatisInfo *pInfo) {
1,267 ✔
1996
  int32_t code = 0;
2,564,568 ✔
1997
  char    path[TSDB_FILENAME_LEN] = {0};
2,564,568 ✔
1998

1999
  char   *dirName[] = {VNODE_TSDB_DIR, VNODE_WAL_DIR, VNODE_META_DIR, VNODE_TSDB_CACHE_DIR};
2,564,568 ✔
2000
  int64_t dirSize[4];
2,564,568 ✔
2001

2002
  vnodeGetPrimaryPath(pVnode, false, path, TSDB_FILENAME_LEN);
2,564,568 ✔
2003
  int32_t offset = strlen(path);
2,564,568 ✔
2004

2005
  for (int i = 0; i < sizeof(dirName) / sizeof(dirName[0]); i++) {
12,822,840 ✔
2006
    int64_t size = {0};
10,258,272 ✔
2007
    (void)snprintf(path + offset, TSDB_FILENAME_LEN - offset, "%s%s", TD_DIRSEP, dirName[i]);
10,258,272 ✔
2008
    code = taosGetDirSize(path, &size);
10,258,272 ✔
2009
    if (code != 0) {
10,258,272 ✔
2010
      uWarn("vnode %d get dir %s %s size failed since %s", TD_VID(pVnode), path, dirName[i], tstrerror(code));
877 ✔
2011
    }
2012
    path[offset] = 0;
10,258,272 ✔
2013
    dirSize[i] = size;
10,258,272 ✔
2014
  }
2015

2016
  pInfo->l1Size = 0;
2,564,568 ✔
2017
  pInfo->walSize = dirSize[1];
2,564,568 ✔
2018
  pInfo->metaSize = dirSize[2];
2,564,568 ✔
2019
  pInfo->cacheSize = dirSize[3];
2,564,568 ✔
2020
  return code;
2,564,568 ✔
2021
}
2022
int32_t vnodeGetDBSize(void *pVnode, SDbSizeStatisInfo *pInfo) {
2,564,568 ✔
2023
  int32_t code = 0;
2,564,568 ✔
2024
  int32_t lino = 0;
2,564,568 ✔
2025
  SVnode *pVnodeObj = pVnode;
2,564,568 ✔
2026
  if (pVnodeObj == NULL) {
2,564,568 ✔
2027
    return TSDB_CODE_VND_NOT_EXIST;
×
2028
  }
2029
  code = vnodeGetDBPrimaryInfo(pVnode, pInfo);
2,564,568 ✔
2030
  if (code != 0) goto _exit;
2,564,568 ✔
2031

2032
  code = tsdbGetFsSize(pVnodeObj->pTsdb, pInfo);
2,564,568 ✔
2033
_exit:
2,563,301 ✔
2034
  return code;
2,563,301 ✔
2035
}
2036

2037
int32_t vnodeGetLastCacheStats(void *pVnode, SLastCacheStats *pStats) {
×
2038
  SVnode *pVnodeObj = pVnode;
×
2039
  if (pVnodeObj == NULL || pVnodeObj->pTsdb == NULL) {
×
2040
    return TSDB_CODE_INVALID_PARA;
×
2041
  }
2042

2043
  int32_t code = tsdbGetLastCacheStats(pVnodeObj->pTsdb, pStats);
×
2044
  if (code == 0) {
×
2045
    pStats->dnodeId = vnodeGetDnodeId();
×
2046
  }
2047
  return code;
×
2048
}
2049

2050
/*
2051
 * Get raw write metrics for a vnode
2052
 */
2053
int32_t vnodeGetRawWriteMetrics(void *pVnode, SRawWriteMetrics *pRawMetrics) {
×
2054
  if (pVnode == NULL || pRawMetrics == NULL) {
×
2055
    return TSDB_CODE_INVALID_PARA;
×
2056
  }
2057

2058
  SVnode      *pVnode1 = (SVnode *)pVnode;
×
2059
  SSyncMetrics syncMetrics = syncGetMetrics(pVnode1->sync);
×
2060

2061
  // Copy values following SRawWriteMetrics structure order
2062
  pRawMetrics->total_requests = atomic_load_64(&pVnode1->writeMetrics.total_requests);
×
2063
  pRawMetrics->total_rows = atomic_load_64(&pVnode1->writeMetrics.total_rows);
×
2064
  pRawMetrics->total_bytes = atomic_load_64(&pVnode1->writeMetrics.total_bytes);
×
2065
  pRawMetrics->fetch_batch_meta_time = atomic_load_64(&pVnode1->writeMetrics.fetch_batch_meta_time);
×
2066
  pRawMetrics->fetch_batch_meta_count = atomic_load_64(&pVnode1->writeMetrics.fetch_batch_meta_count);
×
2067
  pRawMetrics->preprocess_time = atomic_load_64(&pVnode1->writeMetrics.preprocess_time);
×
2068
  pRawMetrics->wal_write_bytes = atomic_load_64(&syncMetrics.wal_write_bytes);
×
2069
  pRawMetrics->wal_write_time = atomic_load_64(&syncMetrics.wal_write_time);
×
2070
  pRawMetrics->apply_bytes = atomic_load_64(&pVnode1->writeMetrics.apply_bytes);
×
2071
  pRawMetrics->apply_time = atomic_load_64(&pVnode1->writeMetrics.apply_time);
×
2072
  pRawMetrics->commit_count = atomic_load_64(&pVnode1->writeMetrics.commit_count);
×
2073
  pRawMetrics->commit_time = atomic_load_64(&pVnode1->writeMetrics.commit_time);
×
2074
  pRawMetrics->memtable_wait_time = atomic_load_64(&pVnode1->writeMetrics.memtable_wait_time);
×
2075
  pRawMetrics->blocked_commit_count = atomic_load_64(&pVnode1->writeMetrics.blocked_commit_count);
×
2076
  pRawMetrics->blocked_commit_time = atomic_load_64(&pVnode1->writeMetrics.block_commit_time);
×
2077
  pRawMetrics->merge_count = atomic_load_64(&pVnode1->writeMetrics.merge_count);
×
2078
  pRawMetrics->merge_time = atomic_load_64(&pVnode1->writeMetrics.merge_time);
×
2079
  pRawMetrics->last_cache_commit_time = atomic_load_64(&pVnode1->writeMetrics.last_cache_commit_time);
×
2080
  pRawMetrics->last_cache_commit_count = atomic_load_64(&pVnode1->writeMetrics.last_cache_commit_count);
×
2081

2082
  return 0;
×
2083
}
2084

2085
/*
2086
 * Reset raw write metrics for a vnode by subtracting old values
2087
 */
2088
int32_t vnodeResetRawWriteMetrics(void *pVnode, const SRawWriteMetrics *pOldMetrics) {
×
2089
  if (pVnode == NULL || pOldMetrics == NULL) {
×
2090
    return TSDB_CODE_INVALID_PARA;
×
2091
  }
2092

2093
  SVnode *pVnode1 = (SVnode *)pVnode;
×
2094

2095
  // Reset vnode write metrics using atomic operations to subtract old values
2096
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.total_requests, pOldMetrics->total_requests);
×
2097
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.total_rows, pOldMetrics->total_rows);
×
2098
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.total_bytes, pOldMetrics->total_bytes);
×
2099

2100
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.fetch_batch_meta_time, pOldMetrics->fetch_batch_meta_time);
×
2101
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.fetch_batch_meta_count, pOldMetrics->fetch_batch_meta_count);
×
2102
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.preprocess_time, pOldMetrics->preprocess_time);
×
2103
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.apply_bytes, pOldMetrics->apply_bytes);
×
2104
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.apply_time, pOldMetrics->apply_time);
×
2105
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.commit_count, pOldMetrics->commit_count);
×
2106

2107
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.commit_time, pOldMetrics->commit_time);
×
2108
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.merge_time, pOldMetrics->merge_time);
×
2109

2110
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.memtable_wait_time, pOldMetrics->memtable_wait_time);
×
2111
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.blocked_commit_count, pOldMetrics->blocked_commit_count);
×
2112
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.block_commit_time, pOldMetrics->blocked_commit_time);
×
2113
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.merge_count, pOldMetrics->merge_count);
×
2114

2115
  // Reset new cache metrics
2116
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.last_cache_commit_time, pOldMetrics->last_cache_commit_time);
×
2117
  (void)atomic_sub_fetch_64(&pVnode1->writeMetrics.last_cache_commit_count, pOldMetrics->last_cache_commit_count);
×
2118

2119
  // Reset sync metrics
2120
  SSyncMetrics syncMetrics = {
×
2121
      .wal_write_bytes = pOldMetrics->wal_write_bytes,
×
2122
      .wal_write_time = pOldMetrics->wal_write_time,
×
2123
  };
2124
  syncResetMetrics(pVnode1->sync, &syncMetrics);
×
2125

2126
  return 0;
×
2127
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc