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

taosdata / TDengine / #3632

08 Mar 2025 06:17AM UTC coverage: 60.719% (+0.05%) from 60.671%
#3632

push

travis-ci

web-flow
Merge pull request #29999 from taosdata/enh/TS-5089

feat: taosBenchmark supports exporting to CSV files

141890 of 300701 branches covered (47.19%)

Branch coverage included in aggregate %.

599 of 766 new or added lines in 3 files covered. (78.2%)

1025 existing lines in 124 files now uncovered.

223757 of 301490 relevant lines covered (74.22%)

17284906.68 hits per line

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

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

16
#define _DEFAULT_SOURCE
17
#include "tdatablock.h"
18
#include "tglobal.h"
19
#include "tjson.h"
20
#include "tmisce.h"
21
#include "tcompare.h"
22

23
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
41,988✔
24
  pEp->port = 0;
41,988✔
25
  memset(pEp->fqdn, 0, TSDB_FQDN_LEN);
41,988✔
26
  tstrncpy(pEp->fqdn, ep, TSDB_FQDN_LEN);
41,988✔
27

28
  char* temp = strchr(pEp->fqdn, ':');
41,988✔
29
  if (temp) {
41,988✔
30
    *temp = 0;
30,463✔
31
    pEp->port = taosStr2UInt16(temp + 1, NULL, 10);
30,463✔
32
    if (pEp->port < 0) {
33
      return TSDB_CODE_INVALID_PARA;
34
    }
35
  }
36

37
  if (pEp->port == 0) {
41,986✔
38
    pEp->port = tsServerPort;
11,529✔
39
  }
40

41
  if (pEp->port <= 0) {
41,986!
42
    return TSDB_CODE_INVALID_PARA;
×
43
  }
44

45
  return 0;
41,986✔
46
}
47

48
int32_t addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port) {
1,169,189✔
49
  if (pEpSet == NULL || fqdn == NULL || strlen(fqdn) == 0) {
1,169,189!
50
    return TSDB_CODE_INVALID_PARA;
×
51
  }
52

53
  int32_t index = pEpSet->numOfEps;
1,169,258✔
54
  if (index >= sizeof(pEpSet->eps) / sizeof(pEpSet->eps[0])) {
1,169,258!
55
    return TSDB_CODE_OUT_OF_RANGE;
×
56
  }
57
  tstrncpy(pEpSet->eps[index].fqdn, fqdn, tListLen(pEpSet->eps[index].fqdn));
1,169,258✔
58
  pEpSet->eps[index].port = port;
1,169,258✔
59
  pEpSet->numOfEps += 1;
1,169,258✔
60
  return 0;
1,169,258✔
61
}
62

63
bool isEpsetEqual(const SEpSet* s1, const SEpSet* s2) {
94,468✔
64
  if (s1->numOfEps != s2->numOfEps || s1->inUse != s2->inUse) {
94,468✔
65
    return false;
1,593✔
66
  }
67

68
  for (int32_t i = 0; i < s1->numOfEps; i++) {
191,670✔
69
    if (s1->eps[i].port != s2->eps[i].port || strncmp(s1->eps[i].fqdn, s2->eps[i].fqdn, TSDB_FQDN_LEN) != 0)
98,880✔
70
      return false;
85✔
71
  }
72
  return true;
92,790✔
73
}
74

75
void epsetAssign(SEpSet* pDst, const SEpSet* pSrc) {
124,418✔
76
  if (pSrc == NULL || pDst == NULL) {
124,418!
77
    return;
×
78
  }
79

80
  pDst->inUse = pSrc->inUse;
124,418✔
81
  pDst->numOfEps = pSrc->numOfEps;
124,418✔
82
  for (int32_t i = 0; i < pSrc->numOfEps; ++i) {
251,507✔
83
    pDst->eps[i].port = pSrc->eps[i].port;
127,089✔
84
    tstrncpy(pDst->eps[i].fqdn, pSrc->eps[i].fqdn, tListLen(pSrc->eps[i].fqdn));
127,089✔
85
  }
86
}
87

88
void epAssign(SEp* pDst, SEp* pSrc) {
240,643✔
89
  if (pSrc == NULL || pDst == NULL) {
240,643!
90
    return;
×
91
  }
92
  memset(pDst->fqdn, 0, tListLen(pSrc->fqdn));
240,644✔
93
  tstrncpy(pDst->fqdn, pSrc->fqdn, tListLen(pSrc->fqdn));
240,644✔
94
  pDst->port = pSrc->port;
240,644✔
95
}
96

97
void epsetSort(SEpSet* pDst) {
1,145,339✔
98
  if (pDst->numOfEps <= 1) {
1,145,339✔
99
    return;
1,009,422✔
100
  }
101
  int validIdx = false;
135,917✔
102
  SEp ep = {0};
135,917✔
103
  if (pDst->inUse >= 0 && pDst->inUse < pDst->numOfEps) {
135,917!
104
    validIdx = true;
135,919✔
105
    epAssign(&ep, &pDst->eps[pDst->inUse]);
135,919✔
106
  }
107

108
  for (int i = 0; i < pDst->numOfEps - 1; i++) {
361,100✔
109
    for (int j = 0; j < pDst->numOfEps - 1 - i; j++) {
548,632✔
110
      SEp* f = &pDst->eps[j];
323,449✔
111
      SEp* s = &pDst->eps[j + 1];
323,449✔
112
      int  cmp = strncmp(f->fqdn, s->fqdn, sizeof(f->fqdn));
323,449✔
113
      if (cmp > 0 || (cmp == 0 && f->port > s->port)) {
323,449!
114
        SEp ep1 = {0};
34,912✔
115
        epAssign(&ep1, f);
34,912✔
116
        epAssign(f, s);
34,910✔
117
        epAssign(s, &ep1);
34,909✔
118
      }
119
    }
120
  }
121
  if (validIdx == true)
135,915!
122
    for (int i = 0; i < pDst->numOfEps; i++) {
202,704!
123
      int cmp = strncmp(ep.fqdn, pDst->eps[i].fqdn, sizeof(ep.fqdn));
202,707✔
124
      if (cmp == 0 && ep.port == pDst->eps[i].port) {
202,707✔
125
        pDst->inUse = i;
135,918✔
126
        break;
135,918✔
127
      }
128
    }
129
}
130

131
void updateEpSet_s(SCorEpSet* pEpSet, SEpSet* pNewEpSet) {
1,614✔
132
  taosCorBeginWrite(&pEpSet->version);
1,614!
133
  pEpSet->epSet = *pNewEpSet;
1,614✔
134
  taosCorEndWrite(&pEpSet->version);
1,614✔
135
}
1,614✔
136

137
SEpSet getEpSet_s(SCorEpSet* pEpSet) {
31,833,572✔
138
  SEpSet ep = {0};
31,833,572✔
139
  taosCorBeginRead(&pEpSet->version);
31,831,253!
140
  ep = pEpSet->epSet;
32,159,074✔
141
  taosCorEndRead(&pEpSet->version);
32,159,074!
142

143
  return ep;
32,173,494✔
144
}
145

146
int32_t epsetToStr(const SEpSet* pEpSet, char* pBuf, int32_t cap) {
420,938✔
147
  int32_t ret = 0;
420,938✔
148
  int32_t nwrite = 0;
420,938✔
149

150
  nwrite = snprintf(pBuf + nwrite, cap, "epset:{");
420,938✔
151
  if (nwrite <= 0 || nwrite >= cap) {
420,938!
152
    return TSDB_CODE_OUT_OF_BUFFER;
×
153
  }
154
  cap -= nwrite;
420,938✔
155

156
  for (int _i = 0; (_i < pEpSet->numOfEps) && (cap > 0); _i++) {
1,024,787!
157
    if (_i == pEpSet->numOfEps - 1) {
603,851✔
158
      ret = snprintf(pBuf + nwrite, cap, "%d. %s:%d", _i, pEpSet->eps[_i].fqdn, pEpSet->eps[_i].port);
420,920✔
159
    } else {
160
      ret = snprintf(pBuf + nwrite, cap, "%d. %s:%d, ", _i, pEpSet->eps[_i].fqdn, pEpSet->eps[_i].port);
182,931✔
161
    }
162

163
    if (ret <= 0 || ret >= cap) {
603,851!
164
      return TSDB_CODE_OUT_OF_BUFFER;
2✔
165
    }
166

167
    nwrite += ret;
603,849✔
168
    cap -= ret;
603,849✔
169
  }
170

171
  if (cap <= 0) {
420,936!
172
    return TSDB_CODE_OUT_OF_BUFFER;
×
173
  }
174

175
  ret = snprintf(pBuf + nwrite, cap, "}, inUse:%d", pEpSet->inUse);
420,936✔
176
  if (ret <= 0 || ret >= cap) {
420,936!
UNCOV
177
    return TSDB_CODE_OUT_OF_BUFFER;
×
178
  } else {
179
    return TSDB_CODE_SUCCESS;
420,938✔
180
  }
181
}
182

183
int32_t taosGenCrashJsonMsg(int signum, char** pMsg, int64_t clusterId, int64_t startTime) {
×
184
  int32_t code = 0;
×
185
  SJson*  pJson = tjsonCreateObject();
×
186
  if (pJson == NULL) return terrno;
×
187

188
  char tmp[4096] = {0};
×
189

190
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "reportVersion", 1), NULL, _exit);
×
191

192
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "clusterId", clusterId), NULL, _exit);
×
193
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "startTime", startTime), NULL, _exit);
×
194

195
  // Do NOT invoke the taosGetFqdn here.
196
  // this function may be invoked when memory exception occurs,so we should assume that it is running in a memory locked
197
  // environment. The lock operation by taosGetFqdn may cause this program deadlock.
198
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "fqdn", tsLocalFqdn), NULL, _exit);
×
199

200
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "pid", taosGetPId()), NULL, _exit);
×
201

202
  code = taosGetAppName(tmp, NULL);
×
203
  if (code != 0) {
×
204
    TAOS_CHECK_GOTO(code, NULL, _exit);
×
205
  }
206
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "appName", tmp), NULL, _exit);
×
207

208
  if (taosGetOsReleaseName(tmp, NULL, NULL, sizeof(tmp)) == 0) {
×
209
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "os", tmp), NULL, _exit);
×
210
  } else {
211
    // do nothing
212
  }
213

214
  float numOfCores = 0;
×
215
  if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) {
×
216
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "cpuModel", tmp), NULL, _exit);
×
217
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores), NULL, _exit);
×
218
  } else {
219
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", tsNumOfCores), NULL, _exit);
×
220
  }
221

222
  int32_t nBytes = snprintf(tmp, sizeof(tmp), "%" PRId64 " kB", tsTotalMemoryKB);
×
223
  if (nBytes <= 9 || nBytes >= sizeof(tmp)) {
×
224
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_RANGE, NULL, _exit);
×
225
  }
226
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "memory", tmp), NULL, _exit);
×
227

228
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "version", td_version), NULL, _exit);
×
229
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "buildInfo", td_buildinfo), NULL, _exit);
×
230
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "gitInfo", td_gitinfo), NULL, _exit);
×
231

232
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "crashSig", signum), NULL, _exit);
×
233
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "crashTs", taosGetTimestampUs()), NULL, _exit);
×
234

235
#if 0
236
#ifdef _TD_DARWIN_64
237
  taosLogTraceToBuf(tmp, sizeof(tmp), 4);
238
#elif !defined(WINDOWS)
239
  taosLogTraceToBuf(tmp, sizeof(tmp), 3);
240
#else
241
  taosLogTraceToBuf(tmp, sizeof(tmp), 8);
242
#endif
243

244
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "stackInfo", tmp), NULL, _exit);
245
#endif
246
  char* pCont = tjsonToString(pJson);
×
247
  if (pCont == NULL) {
×
248
    code = terrno;
×
249
    TAOS_CHECK_GOTO(code, NULL, _exit);
×
250
    goto _exit;
×
251
  }
252

253
  tjsonDelete(pJson);
×
254
  *pMsg = pCont;
×
255
  pJson = NULL;
×
256
_exit:
×
257
  tjsonDelete(pJson);
×
258
  TAOS_RETURN(code);
×
259
}
260

261
int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol, char* likePattern) {
5,303✔
262
  int32_t  code = 0;
5,303✔
263
  SConfig* pConf = taosGetCfg();
5,303✔
264
  if (pConf == NULL) {
5,303!
265
    return TSDB_CODE_INVALID_CFG;
×
266
  }
267

268
  int32_t      numOfRows = 0;
5,303✔
269
  int32_t      col = startCol;
5,303✔
270
  SConfigItem* pItem = NULL;
5,303✔
271
  SConfigIter* pIter = NULL;
5,303✔
272

273
  int8_t locked = 0;
5,303✔
274

275
  size_t       exSize = 0;
5,303✔
276
  size_t       index = 0;
5,303✔
277
  SConfigItem* pDataDirItem = cfgGetItem(pConf, "dataDir");
5,303✔
278
  if (pDataDirItem) {
5,303✔
279
    exSize = TMAX(taosArrayGetSize(pDataDirItem->array), 1) - 1;
4,810✔
280
  }
281

282
  TAOS_CHECK_GOTO(blockDataEnsureCapacity(pBlock, cfgGetSize(pConf) + exSize), NULL, _exit);
5,303!
283

284
  TAOS_CHECK_GOTO(cfgCreateIter(pConf, &pIter), NULL, _exit);
5,303!
285

286
  cfgLock(pConf);
5,303✔
287
  locked = 1;
5,303✔
288

289
  while ((pItem = cfgNextIter(pIter)) != NULL) {
1,057,308✔
290
  _start:
1,052,005✔
291
    col = startCol;
1,052,005✔
292

293
    // GRANT_CFG_SKIP;
294
    char name[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0};
1,052,005✔
295
    if (likePattern && rawStrPatternMatch(pItem->name, likePattern) != TSDB_PATTERN_MATCH) {
1,052,005!
296
      continue;
×
297
    }
298
    STR_WITH_MAXSIZE_TO_VARSTR(name, pItem->name, TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE);
1,052,005✔
299

300
    SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
1,052,005✔
301
    if (pColInfo == NULL) {
1,052,005!
302
      code = terrno;
×
303
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
304
    }
305

306
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, name, false), NULL, _exit);
1,052,005!
307

308
    char      value[TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE] = {0};
1,052,005✔
309
    int32_t   valueLen = 0;
1,052,005✔
310
    SDiskCfg* pDiskCfg = NULL;
1,052,005✔
311
    if (strcasecmp(pItem->name, "dataDir") == 0 && exSize > 0) {
1,052,005!
312
      char* buf = &value[VARSTR_HEADER_SIZE];
×
313
      pDiskCfg = taosArrayGet(pItem->array, index);
×
314
      valueLen = tsnprintf(buf, TSDB_CONFIG_PATH_LEN, "%s", pDiskCfg->dir);
×
315
      index++;
×
316
    } else {
317
      TAOS_CHECK_GOTO(cfgDumpItemValue(pItem, &value[VARSTR_HEADER_SIZE], TSDB_CONFIG_PATH_LEN, &valueLen), NULL,
1,052,005!
318
                      _exit);
319
    }
320
    varDataSetLen(value, valueLen);
1,052,005✔
321

322
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
1,052,005✔
323
    if (pColInfo == NULL) {
1,052,005!
324
      code = terrno;
×
325
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
326
    }
327

328
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, value, false), NULL, _exit);
1,052,005!
329

330
    char scope[TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE] = {0};
1,052,005✔
331
    TAOS_CHECK_GOTO(cfgDumpItemScope(pItem, &scope[VARSTR_HEADER_SIZE], TSDB_CONFIG_SCOPE_LEN, &valueLen), NULL, _exit);
1,052,005!
332
    varDataSetLen(scope, valueLen);
1,052,005✔
333

334
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
1,052,005✔
335
    if (pColInfo == NULL) {
1,052,005!
336
      code = terrno;
×
337
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
338
    }
339
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, scope, false), NULL, _exit);
1,052,005!
340

341
    char category[TSDB_CONFIG_CATEGORY_LEN + VARSTR_HEADER_SIZE] = {0};
1,052,005✔
342
    TAOS_CHECK_GOTO(cfgDumpItemCategory(pItem, &category[VARSTR_HEADER_SIZE], TSDB_CONFIG_CATEGORY_LEN, &valueLen),
1,052,005!
343
                    NULL, _exit);
344
    varDataSetLen(category, valueLen);
1,052,005✔
345

346
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
1,052,005✔
347
    if (pColInfo == NULL) {
1,052,005!
348
      code = terrno;
×
349
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
350
    }
351
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, category, false), NULL, _exit);
1,052,005!
352

353
    char info[TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE] = {0};
1,052,005✔
354
    if (strcasecmp(pItem->name, "dataDir") == 0 && pDiskCfg) {
1,052,005!
355
      char* buf = &info[VARSTR_HEADER_SIZE];
×
356
      valueLen = tsnprintf(buf, TSDB_CONFIG_INFO_LEN, "level %d primary %d disabled %" PRIi8, pDiskCfg->level,
×
357
                           pDiskCfg->primary, pDiskCfg->disable);
×
358
    } else {
359
      valueLen = 0;
1,052,005✔
360
    }
361
    varDataSetLen(info, valueLen);
1,052,005✔
362

363
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
1,052,005✔
364
    if (pColInfo == NULL) {
1,052,005!
365
      code = terrno;
×
366
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
367
    }
368
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, info, false), NULL, _exit);
1,052,005!
369

370
    numOfRows++;
1,052,005✔
371
    if (index > 0 && index <= exSize) {
1,052,005!
372
      goto _start;
×
373
    }
374
  }
375
  pBlock->info.rows = numOfRows;
5,303✔
376
_exit:
5,303✔
377
  if (locked) cfgUnLock(pConf);
5,303!
378
  cfgDestroyIter(pIter);
5,303✔
379
  TAOS_RETURN(code);
5,303✔
380
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc