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

taosdata / TDengine / #4800

16 Oct 2025 09:19AM UTC coverage: 53.935% (-7.1%) from 61.083%
#4800

push

travis-ci

web-flow
Merge b32e3a393 into a190048d5

134724 of 323629 branches covered (41.63%)

Branch coverage included in aggregate %.

184803 of 268802 relevant lines covered (68.75%)

69058627.2 hits per line

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

83.16
/source/dnode/mnode/sdb/src/sdbHash.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 "sdb.h"
18

19
static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow);
20

21
const char *sdbTableName(ESdbType type) {
114,271,725✔
22
  switch (type) {
114,271,725✔
23
    case SDB_TRANS:
15,431,670✔
24
      return "trans";
15,431,670✔
25
    case SDB_CLUSTER:
1,281,075✔
26
      return "cluster";
1,281,075✔
27
    case SDB_MNODE:
1,311,518✔
28
      return "mnode";
1,311,518✔
29
    case SDB_QNODE:
680,985✔
30
      return "qnode";
680,985✔
31
    case SDB_SNODE:
1,544,099✔
32
      return "snode";
1,544,099✔
33
    case SDB_DNODE:
2,681,125✔
34
      return "dnode";
2,681,125✔
35
    case SDB_USER:
2,623,583✔
36
      return "user";
2,623,583✔
37
    case SDB_AUTH:
88✔
38
      return "auth";
88✔
39
    case SDB_ACCT:
1,210,623✔
40
      return "acct";
1,210,623✔
41
    case SDB_STREAM_CK:
88✔
42
      return "stream_ck";
88✔
43
    case SDB_STREAM:
862,609✔
44
      return "stream";
862,609✔
45
    case SDB_OFFSET:
88✔
46
      return "offset";
88✔
47
    case SDB_SUBSCRIBE:
704,398✔
48
      return "subscribe";
704,398✔
49
    case SDB_CONSUMER:
721,990✔
50
      return "consumer";
721,990✔
51
    case SDB_TOPIC:
710,170✔
52
      return "topic";
710,170✔
53
    case SDB_VGROUP:
9,287,269✔
54
      return "vgroup";
9,287,269✔
55
    case SDB_SMA:
675,682✔
56
      return "sma";
675,682✔
57
    case SDB_STB:
8,702,155✔
58
      return "stb";
8,702,155✔
59
    case SDB_DB:
5,986,166✔
60
      return "db";
5,986,166✔
61
    case SDB_FUNC:
675,682✔
62
      return "func";
675,682✔
63
    case SDB_IDX:
4,028,899✔
64
      return "idx";
4,028,899✔
65
    case SDB_VIEW:
930,667✔
66
      return "view";
930,667✔
67
    case SDB_STREAM_SEQ:
88✔
68
      return "stream_seq";
88✔
69
    case SDB_COMPACT:
689,374✔
70
      return "compact";
689,374✔
71
    case SDB_COMPACT_DETAIL:
738,778✔
72
      return "compact_detail";
738,778✔
73
    case SDB_GRANT:
1,449,560✔
74
      return "grant";
1,449,560✔
75
    case SDB_ARBGROUP:
726,293✔
76
      return "arb_group";
726,293✔
77
    case SDB_ANODE:
675,682✔
78
      return "anode";
675,682✔
79
    case SDB_BNODE:
876,987✔
80
      return "bnode";
876,987✔
81
    case SDB_CFG:
43,592,020✔
82
      return "config";
43,592,020✔
83
    case SDB_MOUNT:
675,682✔
84
      return "mount";
675,682✔
85
    case SDB_MOUNT_LOG:
675,682✔
86
      return "mount_log";
675,682✔
87
    case SDB_SSMIGRATE:
675,682✔
88
      return "ssmigrate";
675,682✔
89
    case SDB_SCAN:
675,682✔
90
      return "scan";
675,682✔
91
    case SDB_SCAN_DETAIL:
675,682✔
92
      return "scan_detail";
675,682✔
93
    case SDB_RSMA:
695,347✔
94
      return "rsma";
695,347✔
95
    default:
1,398,557✔
96
      return "undefine";
1,398,557✔
97
  }
98
}
99

100
const char *sdbStatusName(ESdbStatus status) {
47,819,299✔
101
  switch (status) {
47,819,299!
102
    case SDB_STATUS_CREATING:
2,621,253✔
103
      return "creating";
2,621,253✔
104
    case SDB_STATUS_DROPPING:
1,102,119✔
105
      return "dropping";
1,102,119✔
106
    case SDB_STATUS_READY:
39,129,010✔
107
      return "ready";
39,129,010✔
108
    case SDB_STATUS_DROPPED:
4,918,929✔
109
      return "dropped";
4,918,929✔
110
    case SDB_STATUS_INIT:
47,988✔
111
      return "init";
47,988✔
112
    case SDB_STATUS_UPDATE:
×
113
      return "update";
×
114
    default:
×
115
      return "undefine";
×
116
  }
117
}
118

119
void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper) {
956,431,168✔
120
#if 1
121
  EKeyType keyType = pSdb->keyTypes[pRow->type];
956,431,168✔
122

123
  if (keyType == SDB_KEY_BINARY) {
956,436,987✔
124
    mTrace("%s:%s, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), (char *)pRow->pObj,
336,266,460✔
125
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
126
  } else if (keyType == SDB_KEY_INT32) {
620,170,527✔
127
    mTrace("%s:%d, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj,
590,851,229✔
128
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
129
  } else if (keyType == SDB_KEY_INT64) {
29,319,298!
130
    mTrace("%s:%" PRId64 ", ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type),
29,319,298✔
131
           *(int64_t *)pRow->pObj, pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
132
  } else {
133
  }
134
#endif
135
}
956,436,987✔
136

137
static SHashObj *sdbGetHash(SSdb *pSdb, int32_t type) {
700,319,962✔
138
  if (type >= SDB_MAX || type < 0) {
700,319,962!
139
    terrno = TSDB_CODE_SDB_INVALID_TABLE_TYPE;
×
140
    return NULL;
×
141
  }
142

143
  SHashObj *hash = pSdb->hashObjs[type];
700,320,589✔
144
  if (hash == NULL) {
700,317,874!
145
    terrno = TSDB_CODE_APP_ERROR;
×
146
    return NULL;
×
147
  }
148

149
  return hash;
700,317,874✔
150
}
151

152
static int32_t sdbGetkeySize(SSdb *pSdb, ESdbType type, const void *pKey) {
303,547,387✔
153
  int32_t  keySize = 0;
303,547,387✔
154
  EKeyType keyType = pSdb->keyTypes[type];
303,547,387✔
155

156
  if (keyType == SDB_KEY_INT32) {
303,548,142✔
157
    keySize = sizeof(int32_t);
181,449,708✔
158
  } else if (keyType == SDB_KEY_BINARY) {
122,098,434✔
159
    keySize = strlen(pKey) + 1;
121,812,029!
160
  } else {
161
    keySize = sizeof(int64_t);
286,405✔
162
  }
163

164
  return keySize;
303,548,142✔
165
}
166

167
static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
25,536,680✔
168
  int32_t type = pRow->type;
25,536,680✔
169
  sdbWriteLock(pSdb, type);
25,536,680✔
170

171
  SSdbRow *pOldRow = taosHashGet(hash, pRow->pObj, keySize);
25,536,680✔
172
  if (pOldRow != NULL) {
25,536,680!
173
    sdbUnLock(pSdb, type);
×
174
    sdbFreeRow(pSdb, pRow, false);
×
175
    terrno = TSDB_CODE_SDB_OBJ_ALREADY_THERE;
×
176
    return terrno;
×
177
  }
178

179
  pRow->refCount = 0;
25,536,680✔
180
  pRow->status = pRaw->status;
25,536,680✔
181
  sdbPrintOper(pSdb, pRow, "insert");
25,536,680✔
182

183
  int32_t code = 0;
25,536,680✔
184
  if ((code = taosHashPut(hash, pRow->pObj, keySize, &pRow, sizeof(void *))) != 0) {
25,536,680!
185
    sdbUnLock(pSdb, type);
×
186
    sdbFreeRow(pSdb, pRow, false);
×
187
    return code;
×
188
  }
189

190
  SdbInsertFp insertFp = pSdb->insertFps[pRow->type];
25,536,680✔
191
  if (insertFp != NULL) {
25,536,680!
192
    code = (*insertFp)(pSdb, pRow->pObj);
25,536,680✔
193
    if (code != 0) {
25,536,680!
194
      if (taosHashRemove(hash, pRow->pObj, keySize) != 0) {
×
195
        mError("failed to remove row from hash");
×
196
      }
197
      sdbFreeRow(pSdb, pRow, false);
×
198
      sdbUnLock(pSdb, type);
×
199
      terrno = code;
×
200
      return terrno;
×
201
    }
202
  }
203

204
  sdbUnLock(pSdb, type);
25,536,680✔
205

206
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
25,536,680✔
207
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
5,854,152✔
208
  }
209
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT64) {
25,536,680✔
210
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int64_t *)pRow->pObj));
184,954✔
211
  }
212
  pSdb->tableVer[pRow->type]++;
25,536,680✔
213

214
  return 0;
25,536,680✔
215
}
216

217
static int32_t sdbUpdateRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pNewRow, int32_t keySize) {
34,321,524✔
218
  int32_t type = pNewRow->type;
34,321,524✔
219
  sdbWriteLock(pSdb, type);
34,321,524✔
220

221
  SSdbRow **ppOldRow = taosHashGet(hash, pNewRow->pObj, keySize);
34,321,524✔
222
  if (ppOldRow == NULL || *ppOldRow == NULL) {
34,321,524!
223
    sdbUnLock(pSdb, type);
24,221,871✔
224
    return sdbInsertRow(pSdb, hash, pRaw, pNewRow, keySize);
24,221,871✔
225
  }
226

227
  SSdbRow *pOldRow = *ppOldRow;
10,099,653✔
228
  pOldRow->status = pRaw->status;
10,099,653✔
229
  sdbPrintOper(pSdb, pOldRow, "update");
10,099,653✔
230

231
  int32_t     code = 0;
10,099,653✔
232
  SdbUpdateFp updateFp = pSdb->updateFps[type];
10,099,653✔
233
  if (updateFp != NULL) {
10,099,653!
234
    code = (*updateFp)(pSdb, pOldRow->pObj, pNewRow->pObj);
10,099,653✔
235
  }
236
  sdbUnLock(pSdb, type);
10,099,653✔
237

238
  // sdbUnLock(pSdb, type);
239
  sdbFreeRow(pSdb, pNewRow, false);
10,099,653✔
240

241
  pSdb->tableVer[pOldRow->type]++;
10,099,653✔
242
  return code;
10,099,653✔
243
}
244

245
static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
6,201,100✔
246
  int32_t type = pRow->type;
6,201,100✔
247
  sdbWriteLock(pSdb, type);
6,201,100✔
248

249
  SSdbRow **ppOldRow = taosHashGet(hash, pRow->pObj, keySize);
6,201,100✔
250
  if (ppOldRow == NULL || *ppOldRow == NULL) {
6,201,100!
251
    sdbUnLock(pSdb, type);
486✔
252
    sdbFreeRow(pSdb, pRow, false);
486✔
253
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
486✔
254
    return terrno;
486✔
255
  }
256
  SSdbRow *pOldRow = *ppOldRow;
6,200,614✔
257
  pOldRow->status = pRaw->status;
6,200,614✔
258

259
  (void)atomic_add_fetch_32(&pOldRow->refCount, 1);
6,200,614✔
260
  sdbPrintOper(pSdb, pOldRow, "delete");
6,200,614✔
261

262
  if (taosHashRemove(hash, pOldRow->pObj, keySize) != 0) {
6,200,614!
263
    sdbUnLock(pSdb, type);
×
264
    sdbFreeRow(pSdb, pRow, false);
×
265
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
×
266
    return terrno;
×
267
  }
268
  pSdb->tableVer[pOldRow->type]++;
6,200,614✔
269
  sdbUnLock(pSdb, type);
6,200,614✔
270

271
  sdbFreeRow(pSdb, pRow, false);
6,200,614✔
272

273
  sdbCheckRow(pSdb, pOldRow);
6,200,614✔
274
  return 0;
6,200,614✔
275
}
276

277
int32_t sdbWriteWithoutFree(SSdb *pSdb, SSdbRaw *pRaw) {
41,837,433✔
278
  if (pRaw->type == SDB_CFG) {
41,837,433✔
279
    mTrace("sdb write cfg");
17,052,673✔
280
  }
281
  SHashObj *hash = sdbGetHash(pSdb, pRaw->type);
41,837,433✔
282
  if (hash == NULL) return terrno;
41,837,433!
283

284
  SdbDecodeFp decodeFp = pSdb->decodeFps[pRaw->type];
41,837,433✔
285
  SSdbRow    *pRow = (*decodeFp)(pRaw);
41,837,433✔
286
  if (pRow == NULL) return terrno;
41,837,433!
287

288
  pRow->type = pRaw->type;
41,837,433✔
289

290
  int32_t keySize = sdbGetkeySize(pSdb, pRow->type, pRow->pObj);
41,837,433✔
291
  int32_t code = TSDB_CODE_SDB_INVALID_ACTION_TYPE;
41,837,433✔
292

293
  switch (pRaw->status) {
41,837,433!
294
    case SDB_STATUS_CREATING:
1,314,809✔
295
      code = sdbInsertRow(pSdb, hash, pRaw, pRow, keySize);
1,314,809✔
296
      break;
1,314,809✔
297
    case SDB_STATUS_READY:
34,321,524✔
298
    case SDB_STATUS_UPDATE:
299
    case SDB_STATUS_DROPPING:
300
      code = sdbUpdateRow(pSdb, hash, pRaw, pRow, keySize);
34,321,524✔
301
      break;
34,321,524✔
302
    case SDB_STATUS_DROPPED:
6,201,100✔
303
      code = sdbDeleteRow(pSdb, hash, pRaw, pRow, keySize);
6,201,100✔
304
      break;
6,201,100✔
305
  }
306

307
  return code;
41,837,433✔
308
}
309

310
int32_t sdbWrite(SSdb *pSdb, SSdbRaw *pRaw) {
4,423,518✔
311
  int32_t code = sdbWriteWithoutFree(pSdb, pRaw);
4,423,518✔
312
  sdbFreeRaw(pRaw);
4,423,518✔
313
  return code;
4,423,518✔
314
}
315

316
void *sdbAcquireAll(SSdb *pSdb, ESdbType type, const void *pKey, bool onlyReady) {
261,589,874✔
317
  terrno = 0;
261,589,874✔
318

319
  SHashObj *hash = sdbGetHash(pSdb, type);
261,589,700✔
320
  if (hash == NULL) return NULL;
261,590,370!
321

322
  void   *pRet = NULL;
261,590,370✔
323
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
261,590,370✔
324

325
  sdbReadLock(pSdb, type);
261,590,416✔
326

327
  SSdbRow **ppRow = taosHashGet(hash, pKey, keySize);
261,590,473✔
328
  if (ppRow == NULL || *ppRow == NULL) {
261,590,364!
329
    sdbUnLock(pSdb, type);
60,481,672✔
330
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
60,481,858✔
331
    return NULL;
60,481,858✔
332
  }
333

334
  SSdbRow *pRow = *ppRow;
201,108,692✔
335
  switch (pRow->status) {
201,108,681!
336
    case SDB_STATUS_READY:
200,892,654✔
337
      (void)atomic_add_fetch_32(&pRow->refCount, 1);
200,892,654✔
338
      pRet = pRow->pObj;
200,892,858✔
339
      sdbPrintOper(pSdb, pRow, "acquire");
200,892,858✔
340
      break;
200,892,564✔
341
    case SDB_STATUS_CREATING:
45,258✔
342
      terrno = TSDB_CODE_SDB_OBJ_CREATING;
45,258✔
343
      break;
45,258✔
344
    case SDB_STATUS_DROPPING:
170,905✔
345
      terrno = TSDB_CODE_SDB_OBJ_DROPPING;
170,905✔
346
      break;
170,905✔
347
    default:
×
348
      terrno = TSDB_CODE_APP_ERROR;
×
349
      break;
×
350
  }
351

352
  if (pRet == NULL) {
201,108,727✔
353
    if (!onlyReady) {
216,163!
354
      terrno = 0;
×
355
      (void)atomic_add_fetch_32(&pRow->refCount, 1);
×
356
      pRet = pRow->pObj;
×
357
      sdbPrintOper(pSdb, pRow, "acquire");
×
358
    }
359
  }
360

361
  sdbUnLock(pSdb, type);
201,108,727✔
362
  return pRet;
201,109,010✔
363
}
364

365
void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) { return sdbAcquireAll(pSdb, type, pKey, true); }
261,407,897✔
366
void *sdbAcquireNotReadyObj(SSdb *pSdb, ESdbType type, const void *pKey) {
180,953✔
367
  return sdbAcquireAll(pSdb, type, pKey, false);
180,953✔
368
}
369

370
static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow) {
6,200,614✔
371
  int32_t type = pRow->type;
6,200,614✔
372
  sdbWriteLock(pSdb, type);
6,200,614✔
373

374
  int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
6,200,614✔
375
  sdbPrintOper(pSdb, pRow, "check");
6,200,614✔
376
  if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) {
6,200,614!
377
    sdbFreeRow(pSdb, pRow, true);
1,726,152✔
378
  }
379

380
  sdbUnLock(pSdb, type);
6,200,614✔
381
}
6,200,614✔
382

383
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
420,752,300✔
384
  if (pObj == NULL) return;
420,752,300✔
385

386
  SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
416,082,438✔
387
  if (pRow->type >= SDB_MAX) return;
416,082,438!
388

389
  int32_t type = pRow->type;
416,080,904✔
390
  if (lock) {
416,081,875✔
391
    sdbWriteLock(pSdb, type);
415,862,351✔
392
  }
393

394
  int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
416,085,099✔
395
  sdbPrintOper(pSdb, pRow, "release");
416,087,182✔
396
  if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) {
416,083,608✔
397
    sdbFreeRow(pSdb, pRow, true);
4,474,462✔
398
  }
399
  if (ref < 0) {
416,083,608✔
400
    mError("row:%p, ref:%d, type:%s", pRow, ref, sdbTableName(type));
734,571!
401
  }
402

403
  if (lock) {
416,083,221✔
404
    sdbUnLock(pSdb, type);
415,863,357✔
405
  }
406
}
407

408
void sdbRelease(SSdb *pSdb, void *pObj) { sdbReleaseLock(pSdb, pObj, true); }
420,532,330✔
409

410
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
241,444,393✔
411
  *ppObj = NULL;
241,444,393✔
412

413
  SHashObj *hash = sdbGetHash(pSdb, type);
241,444,250✔
414
  if (hash == NULL) return NULL;
241,440,974!
415

416
  sdbReadLock(pSdb, type);
241,440,974✔
417

418
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
241,444,088✔
419
  while (ppRow != NULL) {
242,200,934✔
420
    SSdbRow *pRow = *ppRow;
175,031,871✔
421
    if (pRow == NULL || pRow->status != SDB_STATUS_READY) {
175,031,871!
422
      ppRow = taosHashIterate(hash, ppRow);
756,594✔
423
      continue;
754,397✔
424
    }
425

426
    (void) atomic_add_fetch_32(&pRow->refCount, 1);
174,275,277✔
427

428
    sdbPrintOper(pSdb, pRow, "fetch");
174,275,795✔
429
    *ppObj = pRow->pObj;
174,275,259✔
430
    break;
174,275,700✔
431
  }
432
  sdbUnLock(pSdb, type);
241,444,763✔
433

434
  return ppRow;
241,446,394✔
435
}
436

437
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status, bool lock) {
50,764,788✔
438
  *ppObj = NULL;
50,764,788✔
439

440
  SHashObj *hash = sdbGetHash(pSdb, type);
50,764,788✔
441
  if (hash == NULL) return NULL;
50,764,788!
442

443
  if (lock) {
50,764,788✔
444
    sdbReadLock(pSdb, type);
50,356,576✔
445
  }
446

447
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
50,764,788✔
448
  while (ppRow != NULL) {
50,764,788✔
449
    SSdbRow *pRow = *ppRow;
40,905,806✔
450
    if (pRow == NULL) {
40,905,806!
451
      ppRow = taosHashIterate(hash, ppRow);
×
452
      continue;
×
453
    }
454

455
    (void)atomic_add_fetch_32(&pRow->refCount, 1);
40,905,806✔
456
    sdbPrintOper(pSdb, pRow, "fetch");
40,905,806✔
457
    *ppObj = pRow->pObj;
40,905,806✔
458
    *status = pRow->status;
40,905,806✔
459
    break;
40,905,806✔
460
  }
461
  if (lock) {
50,764,788✔
462
    sdbUnLock(pSdb, type);
50,356,576✔
463
  }
464

465
  return ppRow;
50,764,788✔
466
}
467

468
void sdbCancelFetch(SSdb *pSdb, void *pIter) {
31,239,004✔
469
  if (pIter == NULL) return;
31,239,004✔
470
  SSdbRow *pRow = *(SSdbRow **)pIter;
31,228,107✔
471
  mTrace("cancel fetch row:%p", pRow);
31,228,107✔
472
  SHashObj *hash = sdbGetHash(pSdb, pRow->type);
31,228,107✔
473
  if (hash == NULL) return;
31,228,107!
474

475
  int32_t type = pRow->type;
31,228,107✔
476
  sdbReadLock(pSdb, type);
31,228,107✔
477
  taosHashCancelIterate(hash, pIter);
31,228,107✔
478
  sdbUnLock(pSdb, type);
31,228,107✔
479
}
480

481
void sdbCancelFetchByType(SSdb *pSdb, void *pIter, ESdbType type) {
×
482
  if (pIter == NULL) return;
×
483
  if (type >= SDB_MAX || type < 0) return;
×
484
  SHashObj *hash = sdbGetHash(pSdb, type);
×
485
  if (hash == NULL) return;
×
486

487
  sdbReadLock(pSdb, type);
×
488
  taosHashCancelIterate(hash, pIter);
×
489
  sdbUnLock(pSdb, type);
×
490
}
491

492
void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2, void *p3) {
3,496,628✔
493
  SHashObj *hash = sdbGetHash(pSdb, type);
3,496,628✔
494
  if (hash == NULL) return;
3,496,628!
495

496
  sdbReadLock(pSdb, type);
3,496,628✔
497

498
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
3,496,628✔
499
  while (ppRow != NULL) {
9,543,036✔
500
    SSdbRow *pRow = *ppRow;
6,052,179✔
501
    if (pRow->status == SDB_STATUS_READY) {
6,052,179!
502
      bool isContinue = (*fp)(pSdb->pMnode, pRow->pObj, p1, p2, p3);
6,052,179✔
503
      if (!isContinue) {
6,052,179✔
504
        taosHashCancelIterate(hash, ppRow);
5,771✔
505
        break;
5,771✔
506
      }
507
    }
508

509
    ppRow = taosHashIterate(hash, ppRow);
6,046,408✔
510
  }
511

512
  sdbUnLock(pSdb, type);
3,496,628✔
513
}
514

515
int32_t sdbGetSize(SSdb *pSdb, ESdbType type) {
64,118,950✔
516
  SHashObj *hash = sdbGetHash(pSdb, type);
64,118,950✔
517
  if (hash == NULL) return 0;
64,118,893!
518

519
  sdbReadLock(pSdb, type);
64,118,893✔
520
  int32_t size = taosHashGetSize(hash);
64,118,961✔
521
  sdbUnLock(pSdb, type);
64,118,756✔
522

523
  return size;
64,118,960✔
524
}
525

526
int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type) {
5,725,529✔
527
  SHashObj *hash = sdbGetHash(pSdb, type);
5,725,529✔
528
  if (hash == NULL) return -1;
5,725,529!
529

530
  if (pSdb->keyTypes[type] != SDB_KEY_INT32) return -1;
5,725,529!
531

532
  int32_t maxId = 0;
5,725,529✔
533
  sdbReadLock(pSdb, type);
5,725,529✔
534

535
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
5,725,529✔
536
  while (ppRow != NULL) {
7,674,185✔
537
    SSdbRow *pRow = *ppRow;
1,948,656✔
538
    int32_t  id = *(int32_t *)pRow->pObj;
1,948,656✔
539
    maxId = TMAX(id, maxId);
1,948,656✔
540
    ppRow = taosHashIterate(hash, ppRow);
1,948,656✔
541
  }
542

543
  sdbUnLock(pSdb, type);
5,725,529✔
544
  maxId = TMAX(maxId, pSdb->maxId[type]);
5,725,529✔
545
  return maxId + 1;
5,725,529✔
546
}
547

548
int64_t sdbGetTableVer(SSdb *pSdb, ESdbType type) {
39,431,208✔
549
  if (type >= SDB_MAX || type < 0) {
39,431,208!
550
    terrno = TSDB_CODE_SDB_INVALID_TABLE_TYPE;
×
551
    return -1;
×
552
  }
553

554
  return pSdb->tableVer[type];
39,431,208✔
555
}
556

557
bool countValid(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
×
558
  int32_t *pInt = p1;
×
559
  (*pInt) += 1;
×
560
  return true;
×
561
}
562

563
int32_t sdbGetValidSize(SSdb *pSdb, ESdbType type) {
×
564
  int32_t num = 0;
×
565
  sdbTraverse(pSdb, type, countValid, &num, 0, 0);
×
566
  return num;
×
567
}
568

569

570
bool sdbCheckExists(SSdb *pSdb, ESdbType type, const void *pKey) {
119,852✔
571
  SHashObj *hash = sdbGetHash(pSdb, type);
119,852✔
572
  if (hash == NULL) return false;
119,852!
573
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
119,852✔
574

575
  sdbReadLock(pSdb, type);
119,852✔
576
  void* p = taosHashGet(hash, pKey, keySize);
119,852✔
577
  sdbUnLock(pSdb, type);
119,852✔
578

579
  return (NULL != p);
119,852✔
580
}
581

582

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