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

taosdata / TDengine / #4875

09 Dec 2025 01:22AM UTC coverage: 64.472% (-0.2%) from 64.623%
#4875

push

travis-ci

guanshengliang
fix: temporarily disable memory leak detection for UDF tests (#33856)

162014 of 251293 relevant lines covered (64.47%)

104318075.66 hits per line

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

70.16
/source/dnode/mgmt/node_mgmt/src/dmEnv.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
// clang-format off
18
//#include "storageapi.h"
19
#include "dmMgmt.h"
20
#include "audit.h"
21
#include "libs/function/tudf.h"
22
#include "metrics.h"
23
#include "tgrant.h"
24
#include "tcompare.h"
25
#include "tss.h"
26
#include "tanalytics.h"
27
#include "stream.h"
28
// clang-format on
29

30
extern void cryptUnloadProviders();
31

32
#define DM_INIT_AUDIT()                       \
33
  do {                                        \
34
    auditCfg.port = tsMonitorPort;            \
35
    auditCfg.server = tsMonitorFqdn;          \
36
    auditCfg.comp = tsMonitorComp;            \
37
    if ((code = auditInit(&auditCfg)) != 0) { \
38
      return code;                            \
39
    }                                         \
40
  } while (0)
41

42
static SDnode globalDnode = {0};
43

44
SDnode *dmInstance() { return &globalDnode; }
535,784,682✔
45

46
static int32_t dmCheckRepeatInit(SDnode *pDnode) {
708,257✔
47
  int32_t code = 0;
708,257✔
48
  if (atomic_val_compare_exchange_8(&pDnode->once, DND_ENV_INIT, DND_ENV_READY) != DND_ENV_INIT) {
708,257✔
49
    dError("env is already initialized");
×
50
    code = TSDB_CODE_REPEAT_INIT;
×
51
    return code;
×
52
  }
53
  return 0;
708,257✔
54
}
55

56
static int32_t dmInitSystem() {
708,257✔
57
  if (taosIgnSIGPIPE() != 0) {
708,257✔
58
    dError("failed to ignore SIGPIPE");
×
59
  }
60

61
  if (taosBlockSIGPIPE() != 0) {
708,257✔
62
    dError("failed to block SIGPIPE");
×
63
  }
64

65
  taosResolveCRC();
708,257✔
66
  return 0;
708,257✔
67
}
68

69
static int32_t dmInitMonitor() {
708,257✔
70
  int32_t code = 0;
708,257✔
71
  SMonCfg monCfg = {0};
708,257✔
72

73
  monCfg.maxLogs = tsMonitorMaxLogs;
708,257✔
74
  monCfg.port = tsMonitorPort;
708,257✔
75
  monCfg.server = tsMonitorFqdn;
708,257✔
76
  monCfg.comp = tsMonitorComp;
708,257✔
77
  if ((code = monInit(&monCfg)) != 0) {
708,257✔
78
    dError("failed to init monitor since %s", tstrerror(code));
×
79
  }
80
  return code;
708,257✔
81
}
82

83
static int32_t dmInitMetrics() {
708,257✔
84
  int32_t code = 0;
708,257✔
85
  if ((code = initMetricsManager()) != 0) {
708,257✔
86
    dError("failed to init metrics since %s", tstrerror(code));
×
87
  }
88
  return code;
708,257✔
89
}
90

91
static int32_t dmInitAudit() {
708,257✔
92
  SAuditCfg auditCfg = {0};
708,257✔
93
  int32_t   code = 0;
708,257✔
94

95
  DM_INIT_AUDIT();
708,257✔
96

97
  return 0;
708,257✔
98
}
99

100
static bool dmDataSpaceAvailable() {
708,257✔
101
  SDnode *pDnode = dmInstance();
708,257✔
102
  if (pDnode->pTfs) {
708,257✔
103
    return tfsDiskSpaceAvailable(pDnode->pTfs, 0);
708,257✔
104
  }
105
  if (!osDataSpaceAvailable()) {
×
106
    dError("data disk space unavailable, i.e. %s", tsDataDir);
×
107
    return false;
×
108
  }
109
  return true;
×
110
}
111

112
static int32_t dmCheckDiskSpace() {
708,257✔
113
  // availability
114
  int32_t code = 0;
708,257✔
115
  code = osUpdate();
708,257✔
116
  if (code != 0) {
708,257✔
117
    dError("failed to update os info since %s", tstrerror(code));
×
118
    code = 0;  // ignore the error, just log it
×
119
  }
120
  if (!dmDataSpaceAvailable()) {
708,257✔
121
    code = TSDB_CODE_NO_DISKSPACE;
×
122
    return code;
×
123
  }
124
  if (!osLogSpaceAvailable()) {
708,257✔
125
    dError("log disk space unavailable, i.e. %s", tsLogDir);
×
126
    code = TSDB_CODE_NO_DISKSPACE;
×
127
    return code;
×
128
  }
129
  if (!osTempSpaceAvailable()) {
708,257✔
130
    dError("temp disk space unavailable, i.e. %s", tsTempDir);
×
131
    code = TSDB_CODE_NO_DISKSPACE;
×
132
    return code;
×
133
  }
134
  return code;
708,257✔
135
}
136

137
int32_t dmDiskInit() {
715,489✔
138
  SDnode  *pDnode = dmInstance();
715,489✔
139
  SDiskCfg dCfg = {.level = 0, .primary = 1, .disable = 0};
715,489✔
140
  tstrncpy(dCfg.dir, tsDataDir, TSDB_FILENAME_LEN);
715,489✔
141
  SDiskCfg *pDisks = tsDiskCfg;
715,489✔
142
  int32_t   numOfDisks = tsDiskCfgNum;
715,489✔
143
  if (numOfDisks <= 0 || pDisks == NULL) {
715,489✔
144
    pDisks = &dCfg;
×
145
    numOfDisks = 1;
×
146
  }
147

148
  int32_t code = tfsOpen(pDisks, numOfDisks, &pDnode->pTfs);
715,489✔
149
  if (code != 0) {
715,489✔
150
    dError("failed to init tfs since %s", tstrerror(code));
7,232✔
151
    TAOS_RETURN(code);
7,232✔
152
  }
153
  return 0;
708,257✔
154
}
155

156
int32_t dmDiskClose() {
698,648✔
157
  SDnode *pDnode = dmInstance();
698,648✔
158
  tfsClose(pDnode->pTfs);
698,648✔
159
  pDnode->pTfs = NULL;
698,648✔
160
  return 0;
698,648✔
161
}
162

163
static bool dmCheckDataDirVersion() {
708,257✔
164
  char checkDataDirJsonFileName[PATH_MAX] = {0};
708,257✔
165
  snprintf(checkDataDirJsonFileName, PATH_MAX, "%s/dnode/dnodeCfg.json", tsDataDir);
708,257✔
166
  if (taosCheckExistFile(checkDataDirJsonFileName)) {
708,257✔
167
    dError("The default data directory %s contains old data of tdengine 2.x, please clear it before running!",
×
168
           tsDataDir);
169
    return false;
×
170
  }
171
  return true;
708,257✔
172
}
173

174
static int32_t dmCheckDataDirVersionWrapper() {
×
175
  if (!dmCheckDataDirVersion()) {
×
176
    return TSDB_CODE_INVALID_DATA_FMT;
×
177
  }
178
  return 0;
×
179
}
180

181
int32_t dmInit() {
715,489✔
182
  dInfo("start to init dnode env");
715,489✔
183
  int32_t code = 0;
715,489✔
184

185
#ifdef USE_SHARED_STORAGE
186
  if (tsSsEnabled) {
715,489✔
187
    if ((code = tssInit()) != 0) return code;
×
188
    if ((code = tssCreateDefaultInstance()) != 0) return code;
×
189
  }
190
#endif
191

192
  if ((code = dmDiskInit()) != 0) return code;
715,489✔
193
  if (!dmCheckDataDirVersion()) {
708,257✔
194
    code = TSDB_CODE_INVALID_DATA_FMT;
×
195
    return code;
×
196
  }
197
  SDnode* pDnode = dmInstance();
708,257✔
198
  if ((code = dmCheckDiskSpace()) != 0) return code;
708,257✔
199
  if ((code = dmCheckRepeatInit(pDnode)) != 0) return code;
708,257✔
200
  if ((code = dmInitSystem()) != 0) return code;
708,257✔
201
  if ((code = dmInitMonitor()) != 0) return code;
708,257✔
202
  if ((code = dmInitMetrics()) != 0) return code;
708,257✔
203
  if ((code = dmInitAudit()) != 0) return code;
708,257✔
204
  if ((code = dmInitDnode(pDnode)) != 0) return code;
708,257✔
205
  if ((code = InitRegexCache() != 0)) return code;
698,648✔
206

207
  gExecInfoInit(&pDnode->data, (getDnodeId_f)dmGetDnodeId, dmGetMnodeEpSet);
698,648✔
208
  if ((code = streamInit(&pDnode->data, (getDnodeId_f)dmGetDnodeId, dmGetMnodeEpSet, dmGetSynEpset)) != 0) return code;
698,648✔
209

210
  dInfo("dnode env is initialized");
698,648✔
211
  return 0;
698,648✔
212
}
213

214
static int32_t dmCheckRepeatCleanup(SDnode *pDnode) {
698,648✔
215
  if (atomic_val_compare_exchange_8(&pDnode->once, DND_ENV_READY, DND_ENV_CLEANUP) != DND_ENV_READY) {
698,648✔
216
    dError("dnode env is already cleaned up");
×
217
    return -1;
×
218
  }
219
  return 0;
698,648✔
220
}
221

222
void dmCleanup() {
698,648✔
223
  dDebug("start to cleanup dnode env");
698,648✔
224
  SDnode *pDnode = dmInstance();
698,648✔
225

226
#if defined(TD_ENTERPRISE)
227
  // cryptUnloadProviders();
228
#endif
229

230
  if (dmCheckRepeatCleanup(pDnode) != 0) return;
698,648✔
231
  dmCleanupDnode(pDnode);
698,648✔
232
  monCleanup();
698,648✔
233
  auditCleanup();
698,648✔
234
  syncCleanUp();
698,648✔
235
  walCleanUp();
698,648✔
236
  cleanupMetrics();
698,648✔
237
  if (udfcClose() != 0) {
698,648✔
238
    dError("failed to close udfc");
×
239
  }
240
  udfStopUdfd();
698,648✔
241
  taosAnalyticsCleanup();
698,648✔
242
  taosStopCacheRefreshWorker();
698,648✔
243
  (void)dmDiskClose();
698,648✔
244
  DestroyRegexCache();
698,648✔
245

246
#ifdef USE_SHARED_STORAGE
247
  if (tsSsEnabled) {
698,648✔
248
    (void)tssCloseDefaultInstance();
×
249
    (void)tssUninit();
×
250
  }
251
#endif
252

253
  dInfo("dnode env is cleaned up");
698,648✔
254

255
  taosMemPoolClose(gMemPoolHandle);
698,648✔
256
  taosCleanupCfg();
698,648✔
257
  taosCloseLog();
698,648✔
258
}
259

260
void dmStop() {
726,675✔
261
  SDnode *pDnode = dmInstance();
726,675✔
262
  pDnode->stop = true;
726,675✔
263
}
726,675✔
264

265
int32_t dmRun() {
698,648✔
266
  SDnode *pDnode = dmInstance();
698,648✔
267
  return dmRunDnode(pDnode);
698,648✔
268
}
269

270
static int32_t dmProcessCreateNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
182,056✔
271
  int32_t code = 0;
182,056✔
272
  SDnode *pDnode = dmInstance();
182,056✔
273

274
  SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
182,056✔
275
  if (pWrapper != NULL) {
182,056✔
276
    dmReleaseWrapper(pWrapper);
×
277
    switch (ntype) {
×
278
      case MNODE:
×
279
        code = TSDB_CODE_MNODE_ALREADY_DEPLOYED;
×
280
        break;
×
281
      case QNODE:
×
282
        code = TSDB_CODE_QNODE_ALREADY_DEPLOYED;
×
283
        break;
×
284
      case SNODE:
×
285
        code = TSDB_CODE_SNODE_ALREADY_DEPLOYED;
×
286
        break;
×
287
      case BNODE:
×
288
        code = TSDB_CODE_BNODE_ALREADY_DEPLOYED;
×
289
        break;
×
290
      default:
×
291
        code = TSDB_CODE_APP_ERROR;
×
292
    }
293
    dError("failed to create node since %s", tstrerror(code));
×
294
    return code;
×
295
  }
296

297
  dInfo("start to process create-node-request");
182,056✔
298

299
  pWrapper = &pDnode->wrappers[ntype];
182,056✔
300

301
  if (taosMulMkDir(pWrapper->path) != 0) {
182,056✔
302
    dmReleaseWrapper(pWrapper);
×
303
    code = terrno;
×
304
    dError("failed to create dir:%s since %s", pWrapper->path, tstrerror(code));
×
305
    return code;
×
306
  }
307

308
  dInfo("path %s created", pWrapper->path);
182,056✔
309

310
  (void)taosThreadMutexLock(&pDnode->mutex);
182,056✔
311
  SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
182,056✔
312

313
  dInfo("node:%s, start to create", pWrapper->name);
182,056✔
314
  code = (*pWrapper->func.createFp)(&input, pMsg);
182,056✔
315
  if (code != 0) {
182,056✔
316
    dError("node:%s, failed to create since %s", pWrapper->name, tstrerror(code));
×
317
  } else {
318
    dInfo("node:%s, has been created", pWrapper->name);
182,056✔
319
    code = dmOpenNode(pWrapper);
182,056✔
320
    if (code == 0) {
182,056✔
321
      code = dmStartNode(pWrapper);
182,056✔
322
    }
323
    pWrapper->deployed = true;
182,056✔
324
    pWrapper->required = true;
182,056✔
325
  }
326

327
  (void)taosThreadMutexUnlock(&pDnode->mutex);
182,056✔
328
  return code;
182,056✔
329
}
330

331

332
static int32_t dmProcessAlterNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
183,836✔
333
  int32_t code = 0;
183,836✔
334
  if (SNODE != ntype) {
183,836✔
335
    dError("failed to process msgType %d since node type is NOT snode", pMsg->msgType);
×
336
    return TSDB_CODE_INVALID_MSG;
×
337
  }
338
  
339
  SDnode *pDnode = dmInstance();
183,836✔
340
  SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
183,836✔
341

342
  dInfo("start to process alter-node-request");
183,836✔
343

344
  pWrapper = &pDnode->wrappers[ntype];
183,836✔
345

346
  (void)taosThreadMutexLock(&pDnode->mutex);
183,836✔
347
  SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
183,836✔
348

349
  dInfo("node:%s, start to update", pWrapper->name);
183,836✔
350
  code = (*pWrapper->func.createFp)(&input, pMsg);
183,836✔
351
  if (code != 0) {
183,836✔
352
    dError("node:%s, failed to update since %s", pWrapper->name, tstrerror(code));
×
353
  } else {
354
    dInfo("node:%s, has been updated", pWrapper->name);
183,836✔
355
  }
356

357
  (void)taosThreadMutexUnlock(&pDnode->mutex);
183,836✔
358

359
  dmReleaseWrapper(pWrapper);
183,836✔
360
  
361
  return code;
183,836✔
362
}
363

364

365
static int32_t dmProcessAlterNodeTypeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
370,529✔
366
  int32_t code = 0;
370,529✔
367
  SDnode *pDnode = dmInstance();
370,529✔
368

369
  SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
370,529✔
370
  if (pWrapper == NULL) {
370,529✔
371
    dError("fail to process alter node type since node not exist");
×
372
    return TSDB_CODE_INVALID_MSG;
×
373
  }
374
  dmReleaseWrapper(pWrapper);
370,529✔
375

376
  dInfo("node:%s, start to process alter-node-type-request", pWrapper->name);
370,529✔
377

378
  pWrapper = &pDnode->wrappers[ntype];
370,529✔
379

380
  if (pWrapper->func.nodeRoleFp != NULL) {
370,529✔
381
    ESyncRole role = (*pWrapper->func.nodeRoleFp)(pWrapper->pMgmt);
370,529✔
382
    dInfo("node:%s, checking node role:%d", pWrapper->name, role);
370,529✔
383
    if (role == TAOS_SYNC_ROLE_VOTER) {
370,529✔
384
      dError("node:%s, failed to alter node type since node already is role:%d", pWrapper->name, role);
×
385
      code = TSDB_CODE_MNODE_ALREADY_IS_VOTER;
×
386
      return code;
×
387
    }
388
  }
389

390
  if (pWrapper->func.isCatchUpFp != NULL) {
370,529✔
391
    dInfo("node:%s, checking node catch up", pWrapper->name);
370,529✔
392
    if ((*pWrapper->func.isCatchUpFp)(pWrapper->pMgmt) != 1) {
370,529✔
393
      code = TSDB_CODE_MNODE_NOT_CATCH_UP;
340,069✔
394
      return code;
340,069✔
395
    }
396
  }
397

398
  dInfo("node:%s, catched up leader, continue to process alter-node-type-request", pWrapper->name);
30,460✔
399

400
  (void)taosThreadMutexLock(&pDnode->mutex);
30,460✔
401

402
  dInfo("node:%s, stopping node", pWrapper->name);
30,460✔
403
  dmStopNode(pWrapper);
30,460✔
404
  dInfo("node:%s, closing node", pWrapper->name);
30,460✔
405
  dmCloseNode(pWrapper);
30,460✔
406

407
  pWrapper = &pDnode->wrappers[ntype];
30,460✔
408
  if (taosMkDir(pWrapper->path) != 0) {
30,460✔
409
    (void)taosThreadMutexUnlock(&pDnode->mutex);
×
410
    code = terrno;
×
411
    dError("failed to create dir:%s since %s", pWrapper->path, tstrerror(code));
×
412
    return code;
×
413
  }
414

415
  SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
30,460✔
416

417
  dInfo("node:%s, start to create", pWrapper->name);
30,460✔
418
  code = (*pWrapper->func.createFp)(&input, pMsg);
30,460✔
419
  if (code != 0) {
30,460✔
420
    dError("node:%s, failed to create since %s", pWrapper->name, tstrerror(code));
×
421
  } else {
422
    dInfo("node:%s, has been created", pWrapper->name);
30,460✔
423
    code = dmOpenNode(pWrapper);
30,460✔
424
    if (code == 0) {
30,460✔
425
      code = dmStartNode(pWrapper);
30,460✔
426
    }
427
    pWrapper->deployed = true;
30,460✔
428
    pWrapper->required = true;
30,460✔
429
  }
430

431
  (void)taosThreadMutexUnlock(&pDnode->mutex);
30,460✔
432
  return code;
30,460✔
433
}
434

435
static int32_t dmProcessDropNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
107,038✔
436
  int32_t code = 0;
107,038✔
437
  SDnode *pDnode = dmInstance();
107,038✔
438

439
  SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
107,038✔
440
  if (pWrapper == NULL) {
107,038✔
441
    switch (ntype) {
×
442
      case MNODE:
×
443
        code = TSDB_CODE_MNODE_NOT_DEPLOYED;
×
444
        break;
×
445
      case QNODE:
×
446
        code = TSDB_CODE_QNODE_NOT_DEPLOYED;
×
447
        break;
×
448
      case SNODE:
×
449
        code = TSDB_CODE_SNODE_NOT_DEPLOYED;
×
450
        break;
×
451
      case BNODE:
×
452
        code = TSDB_CODE_BNODE_NOT_DEPLOYED;
×
453
        break;
×
454
      default:
×
455
        code = TSDB_CODE_APP_ERROR;
×
456
    }
457

458
    dError("failed to drop node since %s", tstrerror(code));
×
459
    return terrno = code;
×
460
  }
461

462
  (void)taosThreadMutexLock(&pDnode->mutex);
107,038✔
463
  SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
107,038✔
464

465
  dInfo("node:%s, start to drop", pWrapper->name);
107,038✔
466
  code = (*pWrapper->func.dropFp)(&input, pMsg);
107,038✔
467
  if (code != 0) {
107,038✔
468
    dError("node:%s, failed to drop since %s", pWrapper->name, tstrerror(code));
×
469
  } else {
470
    dInfo("node:%s, has been dropped", pWrapper->name);
107,038✔
471
    pWrapper->required = false;
107,038✔
472
    pWrapper->deployed = false;
107,038✔
473
  }
474

475
  dmReleaseWrapper(pWrapper);
107,038✔
476

477
  if (code == 0) {
107,038✔
478
    dmStopNode(pWrapper);
107,038✔
479
    dmCloseNode(pWrapper);
107,038✔
480
    taosRemoveDir(pWrapper->path);
107,038✔
481
  }
482
  (void)taosThreadMutexUnlock(&pDnode->mutex);
107,038✔
483
  return code;
107,038✔
484
}
485

486
SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper) {
6,813,881✔
487
  SMgmtInputOpt opt = {
33,904,981✔
488
      .path = pWrapper->path,
6,813,881✔
489
      .name = pWrapper->name,
6,813,881✔
490
      .pTfs = pWrapper->pDnode->pTfs,
6,813,881✔
491
      .pData = &pWrapper->pDnode->data,
6,813,881✔
492
      .processCreateNodeFp = dmProcessCreateNodeReq,
493
      .processAlterNodeFp = dmProcessAlterNodeReq,
494
      .processAlterNodeTypeFp = dmProcessAlterNodeTypeReq,
495
      .processDropNodeFp = dmProcessDropNodeReq,
496
      .sendMonitorReportFp = dmSendMonitorReport,
497
      .sendMetricsReportFp = dmSendMetricsReport,
498
      .monitorCleanExpiredSamplesFp = dmMonitorCleanExpiredSamples,
499
      .metricsCleanExpiredSamplesFp = dmMetricsCleanExpiredSamples,
500
      .sendAuditRecordFp = auditSendRecordsInBatch,
501
      .getVnodeLoadsFp = dmGetVnodeLoads,
502
      .getVnodeLoadsLiteFp = dmGetVnodeLoadsLite,
503
      .setVnodeSyncTimeoutFp = dmSetVnodeSyncTimeout,
504
      .getMnodeLoadsFp = dmGetMnodeLoads,
505
      .setMnodeSyncTimeoutFp = dmSetMnodeSyncTimeout,
506
      .getQnodeLoadsFp = dmGetQnodeLoads,
507
      .stopDnodeFp = dmStop,
508
  };
509

510
  opt.msgCb = dmGetMsgcb(pWrapper->pDnode);
6,813,881✔
511
  return opt;
6,813,881✔
512
}
513

514
void dmReportStartup(const char *pName, const char *pDesc) {
43,307,086✔
515
  SStartupInfo *pStartup = &(dmInstance()->startup);
43,307,086✔
516
  tstrncpy(pStartup->name, pName, TSDB_STEP_NAME_LEN);
43,307,116✔
517
  tstrncpy(pStartup->desc, pDesc, TSDB_STEP_DESC_LEN);
43,306,683✔
518
  dDebug("step:%s, %s", pStartup->name, pStartup->desc);
43,306,804✔
519
}
43,306,804✔
520

521
int64_t dmGetClusterId() { return globalDnode.data.clusterId; }
×
522

523
bool dmReadyForTest() { return dmInstance()->data.dnodeVer > 0; }
×
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