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

taosdata / TDengine / #3541

26 Nov 2024 03:56AM UTC coverage: 60.776% (-0.07%) from 60.846%
#3541

push

travis-ci

web-flow
Merge pull request #28920 from taosdata/fix/TD-33008-3.0

fix(query)[TD-33008]. fix error handling in tsdbCacheRead

120076 of 252763 branches covered (47.51%)

Branch coverage included in aggregate %.

0 of 2 new or added lines in 1 file covered. (0.0%)

1395 existing lines in 154 files now uncovered.

200995 of 275526 relevant lines covered (72.95%)

19612328.37 hits per line

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

55.66
/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 "tmisce.h"
18
#include "tdatablock.h"
19
#include "tglobal.h"
20
#include "tjson.h"
21

22
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
41,959✔
23
  pEp->port = 0;
41,959✔
24
  memset(pEp->fqdn, 0, TSDB_FQDN_LEN);
41,959✔
25
  strncpy(pEp->fqdn, ep, TSDB_FQDN_LEN - 1);
41,959✔
26

27
  char* temp = strchr(pEp->fqdn, ':');
41,959✔
28
  if (temp) {
41,959✔
29
    *temp = 0;
32,577✔
30
    pEp->port = atoi(temp + 1);
32,577✔
31
  }
32

33
  if (pEp->port == 0) {
41,959✔
34
    pEp->port = tsServerPort;
9,383✔
35
  }
36

37
  if (pEp->port <= 0) {
41,959!
38
    return TSDB_CODE_INVALID_PARA;
×
39
  }
40

41
  return 0;
41,959✔
42
}
43

44
int32_t addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port) {
1,058,829✔
45
  if (pEpSet == NULL || fqdn == NULL || strlen(fqdn) == 0) {
1,058,829!
46
    return TSDB_CODE_INVALID_PARA;
×
47
  }
48

49
  int32_t index = pEpSet->numOfEps;
1,058,863✔
50
  if (index >= sizeof(pEpSet->eps) / sizeof(pEpSet->eps[0])) {
1,058,863!
51
    return TSDB_CODE_OUT_OF_RANGE;
×
52
  }
53
  tstrncpy(pEpSet->eps[index].fqdn, fqdn, tListLen(pEpSet->eps[index].fqdn));
1,058,863✔
54
  pEpSet->eps[index].port = port;
1,058,863✔
55
  pEpSet->numOfEps += 1;
1,058,863✔
56
  return 0;
1,058,863✔
57
}
58

59
bool isEpsetEqual(const SEpSet* s1, const SEpSet* s2) {
56,219✔
60
  if (s1->numOfEps != s2->numOfEps || s1->inUse != s2->inUse) {
56,219✔
61
    return false;
2,630✔
62
  }
63

64
  for (int32_t i = 0; i < s1->numOfEps; i++) {
111,290✔
65
    if (s1->eps[i].port != s2->eps[i].port || strncmp(s1->eps[i].fqdn, s2->eps[i].fqdn, TSDB_FQDN_LEN) != 0)
57,776✔
66
      return false;
75✔
67
  }
68
  return true;
53,514✔
69
}
70

71
void epsetAssign(SEpSet* pDst, const SEpSet* pSrc) {
61,556✔
72
  if (pSrc == NULL || pDst == NULL) {
61,556!
73
    return;
×
74
  }
75

76
  pDst->inUse = pSrc->inUse;
61,556✔
77
  pDst->numOfEps = pSrc->numOfEps;
61,556✔
78
  for (int32_t i = 0; i < pSrc->numOfEps; ++i) {
124,690✔
79
    pDst->eps[i].port = pSrc->eps[i].port;
63,134✔
80
    tstrncpy(pDst->eps[i].fqdn, pSrc->eps[i].fqdn, tListLen(pSrc->eps[i].fqdn));
63,134✔
81
  }
82
}
83

84
void epAssign(SEp* pDst, SEp* pSrc) {
200,982✔
85
  if (pSrc == NULL || pDst == NULL) {
200,982!
86
    return;
×
87
  }
88
  memset(pDst->fqdn, 0, tListLen(pSrc->fqdn));
200,982✔
89
  tstrncpy(pDst->fqdn, pSrc->fqdn, tListLen(pSrc->fqdn));
200,982✔
90
  pDst->port = pSrc->port;
200,982✔
91
}
92

93
void epsetSort(SEpSet* pDst) {
1,040,258✔
94
  if (pDst->numOfEps <= 1) {
1,040,258✔
95
    return;
937,200✔
96
  }
97
  int validIdx = false;
103,058✔
98
  SEp ep = {0};
103,058✔
99
  if (pDst->inUse >= 0 && pDst->inUse < pDst->numOfEps) {
103,058!
100
    validIdx = true;
103,059✔
101
    epAssign(&ep, &pDst->eps[pDst->inUse]);
103,059✔
102
  }
103

104
  for (int i = 0; i < pDst->numOfEps - 1; i++) {
276,145✔
105
    for (int j = 0; j < pDst->numOfEps - 1 - i; j++) {
422,217✔
106
      SEp* f = &pDst->eps[j];
249,132✔
107
      SEp* s = &pDst->eps[j + 1];
249,132✔
108
      int  cmp = strncmp(f->fqdn, s->fqdn, sizeof(f->fqdn));
249,132✔
109
      if (cmp > 0 || (cmp == 0 && f->port > s->port)) {
249,132!
110
        SEp ep1 = {0};
32,641✔
111
        epAssign(&ep1, f);
32,641✔
112
        epAssign(f, s);
32,641✔
113
        epAssign(s, &ep1);
32,641✔
114
      }
115
    }
116
  }
117
  if (validIdx == true)
103,060!
118
    for (int i = 0; i < pDst->numOfEps; i++) {
152,462!
119
      int cmp = strncmp(ep.fqdn, pDst->eps[i].fqdn, sizeof(ep.fqdn));
152,462✔
120
      if (cmp == 0 && ep.port == pDst->eps[i].port) {
152,462!
121
        pDst->inUse = i;
103,060✔
122
        break;
103,060✔
123
      }
124
    }
125
}
126

127
void updateEpSet_s(SCorEpSet* pEpSet, SEpSet* pNewEpSet) {
2,678✔
128
  taosCorBeginWrite(&pEpSet->version);
2,678!
129
  pEpSet->epSet = *pNewEpSet;
2,678✔
130
  taosCorEndWrite(&pEpSet->version);
2,678✔
131
}
2,678✔
132

133
SEpSet getEpSet_s(SCorEpSet* pEpSet) {
31,776,775✔
134
  SEpSet ep = {0};
31,776,775✔
135
  taosCorBeginRead(&pEpSet->version);
31,772,024!
136
  ep = pEpSet->epSet;
31,969,549✔
137
  taosCorEndRead(&pEpSet->version);
31,969,549!
138

139
  return ep;
31,987,180✔
140
}
141

142
int32_t epsetToStr(const SEpSet* pEpSet, char* pBuf, int32_t cap) {
376,566✔
143
  int32_t ret = 0;
376,566✔
144
  int32_t nwrite = 0;
376,566✔
145

146
  nwrite = snprintf(pBuf + nwrite, cap, "epset:{");
376,566✔
147
  if (nwrite <= 0 || nwrite >= cap) {
376,566!
UNCOV
148
    return TSDB_CODE_OUT_OF_BUFFER;
×
149
  }
150
  cap -= nwrite;
376,567✔
151

152
  for (int _i = 0; (_i < pEpSet->numOfEps) && (cap > 0); _i++) {
913,162!
153
    if (_i == pEpSet->numOfEps - 1) {
536,594✔
154
      ret = snprintf(pBuf + nwrite, cap, "%d. %s:%d", _i, pEpSet->eps[_i].fqdn, pEpSet->eps[_i].port);
376,546✔
155
    } else {
156
      ret = snprintf(pBuf + nwrite, cap, "%d. %s:%d, ", _i, pEpSet->eps[_i].fqdn, pEpSet->eps[_i].port);
160,048✔
157
    }
158

159
    if (ret <= 0 || ret >= cap) {
536,594!
UNCOV
160
      return TSDB_CODE_OUT_OF_BUFFER;
×
161
    }
162

163
    nwrite += ret;
536,595✔
164
    cap -= ret;
536,595✔
165
  }
166

167
  if (cap <= 0) {
376,568!
168
    return TSDB_CODE_OUT_OF_BUFFER;
×
169
  }
170

171
  ret = snprintf(pBuf + nwrite, cap, "}, inUse:%d", pEpSet->inUse);
376,568✔
172
  if (ret <= 0 || ret >= cap) {
376,568!
173
    return TSDB_CODE_OUT_OF_BUFFER;
1✔
174
  } else {
175
    return TSDB_CODE_SUCCESS;
376,567✔
176
  }
177
}
178

179
int32_t taosGenCrashJsonMsg(int signum, char** pMsg, int64_t clusterId, int64_t startTime) {
×
180
  int32_t code = 0;
×
181
  SJson*  pJson = tjsonCreateObject();
×
182
  if (pJson == NULL) return terrno;
×
183

184
  char tmp[4096] = {0};
×
185

186
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "reportVersion", 1), NULL, _exit);
×
187

188
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "clusterId", clusterId), NULL, _exit);
×
189
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "startTime", startTime), NULL, _exit);
×
190

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

196
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "pid", taosGetPId()), NULL, _exit);
×
197

198
  code = taosGetAppName(tmp, NULL);
×
199
  if (code != 0) {
×
200
    TAOS_CHECK_GOTO(code, NULL, _exit);
×
201
  }
202
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "appName", tmp), NULL, _exit);
×
203

204
  if (taosGetOsReleaseName(tmp, NULL, NULL, sizeof(tmp)) == 0) {
×
205
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "os", tmp), NULL, _exit);
×
206
  } else {
207
    // do nothing
208
  }
209

210
  float numOfCores = 0;
×
211
  if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) {
×
212
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "cpuModel", tmp), NULL, _exit);
×
213
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores), NULL, _exit);
×
214
  } else {
215
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", tsNumOfCores), NULL, _exit);
×
216
  }
217

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

224
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "version", td_version), NULL, _exit);
×
225
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "buildInfo", td_buildinfo), NULL, _exit);
×
226
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "gitInfo", td_gitinfo), NULL, _exit);
×
227

228
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "crashSig", signum), NULL, _exit);
×
229
  TAOS_CHECK_GOTO(tjsonAddIntegerToObject(pJson, "crashTs", taosGetTimestampUs()), NULL, _exit);
×
230

231
#ifdef _TD_DARWIN_64
232
  taosLogTraceToBuf(tmp, sizeof(tmp), 4);
233
#elif !defined(WINDOWS)
234
  taosLogTraceToBuf(tmp, sizeof(tmp), 3);
×
235
#else
236
  taosLogTraceToBuf(tmp, sizeof(tmp), 8);
237
#endif
238

239
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "stackInfo", tmp), NULL, _exit);
×
240

241
  char* pCont = tjsonToString(pJson);
×
242
  if (pCont == NULL) {
×
243
    code = terrno;
×
244
    TAOS_CHECK_GOTO(code, NULL, _exit);
×
245
    goto _exit;
×
246
  }
247

248
  tjsonDelete(pJson);
×
249
  *pMsg = pCont;
×
250
  pJson = NULL;
×
251
_exit:
×
252
  tjsonDelete(pJson);
×
253
  TAOS_RETURN(code);
×
254
}
255

256
int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
4,148✔
257
  int32_t  code = 0;
4,148✔
258
  SConfig* pConf = taosGetCfg();
4,148✔
259
  if (pConf == NULL) {
4,148!
260
    return TSDB_CODE_INVALID_CFG;
×
261
  }
262

263
  int32_t      numOfRows = 0;
4,148✔
264
  int32_t      col = startCol;
4,148✔
265
  SConfigItem* pItem = NULL;
4,148✔
266
  SConfigIter* pIter = NULL;
4,148✔
267

268
  int8_t locked = 0;
4,148✔
269

270
  size_t       exSize = 0;
4,148✔
271
  size_t       index = 0;
4,148✔
272
  SConfigItem* pDataDirItem = cfgGetItem(pConf, "dataDir");
4,148✔
273
  if (pDataDirItem) {
4,148✔
274
    exSize = TMAX(taosArrayGetSize(pDataDirItem->array), 1) - 1;
3,698✔
275
  }
276

277
  TAOS_CHECK_GOTO(blockDataEnsureCapacity(pBlock, cfgGetSize(pConf) + exSize), NULL, _exit);
4,148!
278

279
  TAOS_CHECK_GOTO(cfgCreateIter(pConf, &pIter), NULL, _exit);
4,148!
280

281
  cfgLock(pConf);
4,148✔
282
  locked = 1;
4,148✔
283

284
  while ((pItem = cfgNextIter(pIter)) != NULL) {
777,850✔
285
_start:
773,702✔
286
    col = startCol;
773,702✔
287

288
    // GRANT_CFG_SKIP;
289
    char name[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0};
773,702✔
290
    STR_WITH_MAXSIZE_TO_VARSTR(name, pItem->name, TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE);
773,702✔
291

292
    SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
773,702✔
293
    if (pColInfo == NULL) {
773,702!
294
      code = terrno;
×
295
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
296
    }
297

298
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, name, false), NULL, _exit);
773,702!
299

300
    char    value[TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE] = {0};
773,702✔
301
    int32_t valueLen = 0;
773,702✔
302
    SDiskCfg* pDiskCfg = NULL;
773,702✔
303
    if (strcasecmp(pItem->name, "dataDir") == 0 && exSize > 0) {
773,702!
304
      char*     buf = &value[VARSTR_HEADER_SIZE];
×
305
      pDiskCfg = taosArrayGet(pItem->array, index);
×
306
      valueLen = tsnprintf(buf, TSDB_CONFIG_PATH_LEN, "%s", pDiskCfg->dir);
×
307
      index++;
×
308
    } else {
309
      TAOS_CHECK_GOTO(cfgDumpItemValue(pItem, &value[VARSTR_HEADER_SIZE], TSDB_CONFIG_PATH_LEN, &valueLen), NULL,
773,702!
310
                      _exit);
311
    }
312
    varDataSetLen(value, valueLen);
773,702✔
313

314
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
773,702✔
315
    if (pColInfo == NULL) {
773,702!
316
      code = terrno;
×
317
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
318
    }
319

320
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, value, false), NULL, _exit);
773,702!
321

322
    char scope[TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE] = {0};
773,702✔
323
    TAOS_CHECK_GOTO(cfgDumpItemScope(pItem, &scope[VARSTR_HEADER_SIZE], TSDB_CONFIG_SCOPE_LEN, &valueLen), NULL, _exit);
773,702!
324
    varDataSetLen(scope, valueLen);
773,702✔
325

326
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
773,702✔
327
    if (pColInfo == NULL) {
773,702!
328
      code = terrno;
×
329
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
330
    }
331
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, scope, false), NULL, _exit);
773,702!
332

333
    char info[TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE] = {0};
773,702✔
334
    if (strcasecmp(pItem->name, "dataDir") == 0 && pDiskCfg) {
773,702!
335
      char* buf = &info[VARSTR_HEADER_SIZE];
×
336
      valueLen = tsnprintf(buf, TSDB_CONFIG_INFO_LEN, "level %d primary %d disabled %" PRIi8, pDiskCfg->level,
×
337
                              pDiskCfg->primary, pDiskCfg->disable);
×
338
    } else {
339
      valueLen = 0;
773,702✔
340
    }
341
    varDataSetLen(info, valueLen);
773,702✔
342

343
    pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
773,702✔
344
    if (pColInfo == NULL) {
773,702!
345
      code = terrno;
×
346
      TAOS_CHECK_GOTO(code, NULL, _exit);
×
347
    }
348
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, info, false), NULL, _exit);
773,702!
349

350
    numOfRows++;
773,702✔
351
    if (index > 0 && index <= exSize) {
773,702!
352
      goto _start;
×
353
    }
354
}
355
  pBlock->info.rows = numOfRows;
4,148✔
356
_exit:
4,148✔
357
  if (locked) cfgUnLock(pConf);
4,148!
358
  cfgDestroyIter(pIter);
4,148✔
359
  TAOS_RETURN(code);
4,148✔
360
}
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