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

taosdata / TDengine / #4899

27 Dec 2025 07:32AM UTC coverage: 65.534% (+0.5%) from 65.061%
#4899

push

travis-ci

web-flow
test: remove semaphore test (#34071)

189567 of 289265 relevant lines covered (65.53%)

114701701.06 hits per line

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

87.06
/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) {
333,856,284✔
22
  switch (type) {
333,856,284✔
23
    case SDB_TRANS:
48,959,964✔
24
      return "trans";
48,959,964✔
25
    case SDB_CLUSTER:
3,021,891✔
26
      return "cluster";
3,021,891✔
27
    case SDB_MNODE:
3,179,467✔
28
      return "mnode";
3,179,467✔
29
    case SDB_QNODE:
1,676,860✔
30
      return "qnode";
1,676,860✔
31
    case SDB_SNODE:
2,718,464✔
32
      return "snode";
2,718,464✔
33
    case SDB_DNODE:
5,934,087✔
34
      return "dnode";
5,934,087✔
35
    case SDB_USER:
5,489,012✔
36
      return "user";
5,489,012✔
37
    case SDB_AUTH:
126✔
38
      return "auth";
126✔
39
    case SDB_ACCT:
2,869,692✔
40
      return "acct";
2,869,692✔
41
    case SDB_STREAM_CK:
126✔
42
      return "stream_ck";
126✔
43
    case SDB_STREAM:
2,028,523✔
44
      return "stream";
2,028,523✔
45
    case SDB_OFFSET:
126✔
46
      return "offset";
126✔
47
    case SDB_SUBSCRIBE:
2,610,849✔
48
      return "subscribe";
2,610,849✔
49
    case SDB_CONSUMER:
3,482,318✔
50
      return "consumer";
3,482,318✔
51
    case SDB_TOPIC:
2,273,095✔
52
      return "topic";
2,273,095✔
53
    case SDB_VGROUP:
25,746,455✔
54
      return "vgroup";
25,746,455✔
55
    case SDB_SMA:
1,626,860✔
56
      return "sma";
1,626,860✔
57
    case SDB_STB:
39,300,068✔
58
      return "stb";
39,300,068✔
59
    case SDB_DB:
21,166,250✔
60
      return "db";
21,166,250✔
61
    case SDB_FUNC:
1,689,081✔
62
      return "func";
1,689,081✔
63
    case SDB_IDX:
9,677,755✔
64
      return "idx";
9,677,755✔
65
    case SDB_VIEW:
2,534,957✔
66
      return "view";
2,534,957✔
67
    case SDB_STREAM_SEQ:
126✔
68
      return "stream_seq";
126✔
69
    case SDB_COMPACT:
1,829,747✔
70
      return "compact";
1,829,747✔
71
    case SDB_COMPACT_DETAIL:
2,400,221✔
72
      return "compact_detail";
2,400,221✔
73
    case SDB_GRANT:
3,417,479✔
74
      return "grant";
3,417,479✔
75
    case SDB_ARBGROUP:
1,702,292✔
76
      return "arb_group";
1,702,292✔
77
    case SDB_ANODE:
1,626,860✔
78
      return "anode";
1,626,860✔
79
    case SDB_BNODE:
1,886,068✔
80
      return "bnode";
1,886,068✔
81
    case SDB_CFG:
111,278,332✔
82
      return "config";
111,278,332✔
83
    case SDB_MOUNT:
1,629,934✔
84
      return "mount";
1,629,934✔
85
    case SDB_MOUNT_LOG:
1,628,629✔
86
      return "mount_log";
1,628,629✔
87
    case SDB_SSMIGRATE:
1,626,860✔
88
      return "ssmigrate";
1,626,860✔
89
    case SDB_SCAN:
1,628,180✔
90
      return "scan";
1,628,180✔
91
    case SDB_SCAN_DETAIL:
1,628,840✔
92
      return "scan_detail";
1,628,840✔
93
    case SDB_RSMA:
1,760,861✔
94
      return "rsma";
1,760,861✔
95
    case SDB_INSTANCE:
884,863✔
96
      return "instance";
884,863✔
97
    case SDB_ENCRYPT_ALGORITHMS:
7,750,777✔
98
      return "encrypt_algr";
7,750,777✔
99
    case SDB_TOKEN:
1,626,860✔
100
      return "token";
1,626,860✔
101
    default:
3,563,329✔
102
      return "undefine";
3,563,329✔
103
  }
104
}
105

106
const char *sdbStatusName(ESdbStatus status) {
138,281,358✔
107
  switch (status) {
138,281,358✔
108
    case SDB_STATUS_CREATING:
7,048,653✔
109
      return "creating";
7,048,653✔
110
    case SDB_STATUS_DROPPING:
2,197,798✔
111
      return "dropping";
2,197,798✔
112
    case SDB_STATUS_READY:
116,393,338✔
113
      return "ready";
116,393,338✔
114
    case SDB_STATUS_DROPPED:
12,562,657✔
115
      return "dropped";
12,562,657✔
116
    case SDB_STATUS_INIT:
78,912✔
117
      return "init";
78,912✔
118
    case SDB_STATUS_UPDATE:
×
119
      return "update";
×
120
    default:
×
121
      return "undefine";
×
122
  }
123
}
124

125
void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper) {
2,147,483,647✔
126
#if 1
127
  EKeyType keyType = pSdb->keyTypes[pRow->type];
2,147,483,647✔
128

129
  if (keyType == SDB_KEY_BINARY) {
2,147,483,647✔
130
    mTrace("%s:%s, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), (char *)pRow->pObj,
972,151,548✔
131
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
132
  } else if (keyType == SDB_KEY_INT32) {
1,975,677,486✔
133
    mTrace("%s:%d, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj,
1,872,296,036✔
134
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
135
  } else if (keyType == SDB_KEY_INT64) {
103,381,450✔
136
    mTrace("%s:%" PRId64 ", ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type),
103,381,450✔
137
           *(int64_t *)pRow->pObj, pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
138
  } else {
139
  }
140
#endif
141
}
2,147,483,647✔
142

143
static SHashObj *sdbGetHash(SSdb *pSdb, int32_t type) {
2,139,474,811✔
144
  if (type >= SDB_MAX || type < 0) {
2,139,474,811✔
145
    terrno = TSDB_CODE_SDB_INVALID_TABLE_TYPE;
×
146
    return NULL;
×
147
  }
148

149
  SHashObj *hash = pSdb->hashObjs[type];
2,139,477,369✔
150
  if (hash == NULL) {
2,139,483,518✔
151
    terrno = TSDB_CODE_APP_ERROR;
×
152
    return NULL;
×
153
  }
154

155
  return hash;
2,139,483,518✔
156
}
157

158
static int32_t sdbGetkeySize(SSdb *pSdb, ESdbType type, const void *pKey) {
854,946,345✔
159
  int32_t  keySize = 0;
854,946,345✔
160
  EKeyType keyType = pSdb->keyTypes[type];
854,946,345✔
161

162
  if (keyType == SDB_KEY_INT32) {
854,948,302✔
163
    keySize = sizeof(int32_t);
562,444,218✔
164
  } else if (keyType == SDB_KEY_BINARY) {
292,504,084✔
165
    keySize = strlen(pKey) + 1;
285,802,291✔
166
  } else {
167
    keySize = sizeof(int64_t);
6,701,793✔
168
  }
169

170
  return keySize;
854,948,302✔
171
}
172

173
static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
72,463,684✔
174
  int32_t type = pRow->type;
72,463,684✔
175
  sdbWriteLock(pSdb, type);
72,463,684✔
176

177
  SSdbRow *pOldRow = taosHashGet(hash, pRow->pObj, keySize);
72,463,684✔
178
  if (pOldRow != NULL) {
72,463,684✔
179
    sdbUnLock(pSdb, type);
×
180
    sdbFreeRow(pSdb, pRow, false);
×
181
    terrno = TSDB_CODE_SDB_OBJ_ALREADY_THERE;
×
182
    return terrno;
×
183
  }
184

185
  pRow->refCount = 0;
72,463,684✔
186
  pRow->status = pRaw->status;
72,463,684✔
187
  sdbPrintOper(pSdb, pRow, "insert");
72,463,684✔
188

189
  int32_t code = 0;
72,463,684✔
190
  if ((code = taosHashPut(hash, pRow->pObj, keySize, &pRow, sizeof(void *))) != 0) {
72,463,684✔
191
    sdbUnLock(pSdb, type);
×
192
    sdbFreeRow(pSdb, pRow, false);
×
193
    return code;
×
194
  }
195

196
  SdbInsertFp insertFp = pSdb->insertFps[pRow->type];
72,463,684✔
197
  if (insertFp != NULL) {
72,463,684✔
198
    code = (*insertFp)(pSdb, pRow->pObj);
72,463,684✔
199
    if (code != 0) {
72,463,684✔
200
      if (taosHashRemove(hash, pRow->pObj, keySize) != 0) {
×
201
        mError("failed to remove row from hash");
×
202
      }
203
      sdbFreeRow(pSdb, pRow, false);
×
204
      sdbUnLock(pSdb, type);
×
205
      terrno = code;
×
206
      return terrno;
×
207
    }
208
  }
209

210
  sdbUnLock(pSdb, type);
72,463,684✔
211

212
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
72,463,684✔
213
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
21,064,400✔
214
  }
215
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT64) {
72,463,684✔
216
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int64_t *)pRow->pObj));
692,584✔
217
  }
218
  pSdb->tableVer[pRow->type]++;
72,463,684✔
219

220
  return 0;
72,463,684✔
221
}
222

223
static int32_t sdbUpdateRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pNewRow, int32_t keySize) {
103,865,371✔
224
  int32_t type = pNewRow->type;
103,865,371✔
225
  sdbWriteLock(pSdb, type);
103,865,371✔
226

227
  SSdbRow **ppOldRow = taosHashGet(hash, pNewRow->pObj, keySize);
103,865,371✔
228
  if (ppOldRow == NULL || *ppOldRow == NULL) {
103,865,371✔
229
    sdbUnLock(pSdb, type);
68,884,349✔
230
    return sdbInsertRow(pSdb, hash, pRaw, pNewRow, keySize);
68,884,349✔
231
  }
232

233
  SSdbRow *pOldRow = *ppOldRow;
34,981,022✔
234
  pOldRow->status = pRaw->status;
34,981,022✔
235
  sdbPrintOper(pSdb, pOldRow, "update");
34,981,022✔
236

237
  int32_t     code = 0;
34,981,022✔
238
  SdbUpdateFp updateFp = pSdb->updateFps[type];
34,981,022✔
239
  if (updateFp != NULL) {
34,981,022✔
240
    code = (*updateFp)(pSdb, pOldRow->pObj, pNewRow->pObj);
34,981,022✔
241
  }
242
  sdbUnLock(pSdb, type);
34,981,022✔
243

244
  // sdbUnLock(pSdb, type);
245
  sdbFreeRow(pSdb, pNewRow, false);
34,981,022✔
246

247
  pSdb->tableVer[pOldRow->type]++;
34,981,022✔
248
  return code;
34,981,022✔
249
}
250

251
static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
19,215,382✔
252
  int32_t type = pRow->type;
19,215,382✔
253
  sdbWriteLock(pSdb, type);
19,215,382✔
254

255
  SSdbRow **ppOldRow = taosHashGet(hash, pRow->pObj, keySize);
19,215,382✔
256
  if (ppOldRow == NULL || *ppOldRow == NULL) {
19,215,382✔
257
    sdbUnLock(pSdb, type);
11,546✔
258
    sdbFreeRow(pSdb, pRow, false);
11,546✔
259
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
11,546✔
260
    return terrno;
11,546✔
261
  }
262
  SSdbRow *pOldRow = *ppOldRow;
19,203,836✔
263
  pOldRow->status = pRaw->status;
19,203,836✔
264

265
  (void)atomic_add_fetch_32(&pOldRow->refCount, 1);
19,203,836✔
266
  sdbPrintOper(pSdb, pOldRow, "delete");
19,203,836✔
267

268
  if (taosHashRemove(hash, pOldRow->pObj, keySize) != 0) {
19,203,836✔
269
    sdbUnLock(pSdb, type);
×
270
    sdbFreeRow(pSdb, pRow, false);
×
271
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
×
272
    return terrno;
×
273
  }
274
  pSdb->tableVer[pOldRow->type]++;
19,203,836✔
275
  sdbUnLock(pSdb, type);
19,203,836✔
276

277
  sdbFreeRow(pSdb, pRow, false);
19,203,836✔
278

279
  sdbCheckRow(pSdb, pOldRow);
19,203,836✔
280
  return 0;
19,203,836✔
281
}
282

283
int32_t sdbWriteWithoutFree(SSdb *pSdb, SSdbRaw *pRaw) {
126,660,088✔
284
  if (pRaw->type == SDB_CFG) {
126,660,088✔
285
    mTrace("sdb write cfg");
43,830,119✔
286
  }
287
  SHashObj *hash = sdbGetHash(pSdb, pRaw->type);
126,660,088✔
288
  if (hash == NULL) return terrno;
126,660,088✔
289

290
  SdbDecodeFp decodeFp = pSdb->decodeFps[pRaw->type];
126,660,088✔
291
  SSdbRow    *pRow = (*decodeFp)(pRaw);
126,660,088✔
292
  if (pRow == NULL) return terrno;
126,660,088✔
293

294
  pRow->type = pRaw->type;
126,660,088✔
295

296
  int32_t keySize = sdbGetkeySize(pSdb, pRow->type, pRow->pObj);
126,660,088✔
297
  int32_t code = TSDB_CODE_SDB_INVALID_ACTION_TYPE;
126,660,088✔
298

299
  switch (pRaw->status) {
126,660,088✔
300
    case SDB_STATUS_CREATING:
3,579,335✔
301
      code = sdbInsertRow(pSdb, hash, pRaw, pRow, keySize);
3,579,335✔
302
      break;
3,579,335✔
303
    case SDB_STATUS_READY:
103,865,371✔
304
    case SDB_STATUS_UPDATE:
305
    case SDB_STATUS_DROPPING:
306
      code = sdbUpdateRow(pSdb, hash, pRaw, pRow, keySize);
103,865,371✔
307
      break;
103,865,371✔
308
    case SDB_STATUS_DROPPED:
19,215,382✔
309
      code = sdbDeleteRow(pSdb, hash, pRaw, pRow, keySize);
19,215,382✔
310
      break;
19,215,382✔
311
  }
312

313
  return code;
126,660,088✔
314
}
315

316
int32_t sdbWrite(SSdb *pSdb, SSdbRaw *pRaw) {
14,790,795✔
317
  int32_t code = sdbWriteWithoutFree(pSdb, pRaw);
14,790,795✔
318
  sdbFreeRaw(pRaw);
14,790,795✔
319
  return code;
14,790,795✔
320
}
321

322
void *sdbAcquireAll(SSdb *pSdb, ESdbType type, const void *pKey, bool onlyReady) {
728,037,091✔
323
  terrno = 0;
728,037,091✔
324

325
  SHashObj *hash = sdbGetHash(pSdb, type);
728,036,222✔
326
  if (hash == NULL) return NULL;
728,031,105✔
327

328
  void   *pRet = NULL;
728,031,105✔
329
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
728,031,105✔
330

331
  sdbReadLock(pSdb, type);
728,030,311✔
332

333
  SSdbRow **ppRow = taosHashGet(hash, pKey, keySize);
728,035,243✔
334
  if (ppRow == NULL || *ppRow == NULL) {
728,037,787✔
335
    sdbUnLock(pSdb, type);
156,380,227✔
336
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
156,381,264✔
337
    return NULL;
156,381,264✔
338
  }
339

340
  SSdbRow *pRow = *ppRow;
571,657,565✔
341
  switch (pRow->status) {
571,657,662✔
342
    case SDB_STATUS_READY:
570,534,240✔
343
      (void)atomic_add_fetch_32(&pRow->refCount, 1);
570,534,240✔
344
      pRet = pRow->pObj;
570,535,740✔
345
      sdbPrintOper(pSdb, pRow, "acquire");
570,536,062✔
346
      break;
570,533,775✔
347
    case SDB_STATUS_CREATING:
762,270✔
348
      terrno = TSDB_CODE_SDB_OBJ_CREATING;
762,270✔
349
      break;
762,270✔
350
    case SDB_STATUS_DROPPING:
360,086✔
351
      terrno = TSDB_CODE_SDB_OBJ_DROPPING;
360,086✔
352
      break;
360,086✔
353
    default:
×
354
      terrno = TSDB_CODE_APP_ERROR;
×
355
      break;
×
356
  }
357

358
  if (pRet == NULL) {
571,656,131✔
359
    if (!onlyReady) {
1,122,356✔
360
      terrno = 0;
×
361
      (void)atomic_add_fetch_32(&pRow->refCount, 1);
×
362
      pRet = pRow->pObj;
×
363
      sdbPrintOper(pSdb, pRow, "acquire");
×
364
    }
365
  }
366

367
  sdbUnLock(pSdb, type);
571,656,131✔
368
  return pRet;
571,657,592✔
369
}
370

371
void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) { return sdbAcquireAll(pSdb, type, pKey, true); }
727,574,250✔
372
void *sdbAcquireNotReadyObj(SSdb *pSdb, ESdbType type, const void *pKey) {
463,572✔
373
  return sdbAcquireAll(pSdb, type, pKey, false);
463,572✔
374
}
375

376
static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow) {
19,203,836✔
377
  int32_t type = pRow->type;
19,203,836✔
378
  sdbWriteLock(pSdb, type);
19,203,836✔
379

380
  int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
19,203,836✔
381
  sdbPrintOper(pSdb, pRow, "check");
19,203,836✔
382
  if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) {
19,203,836✔
383
    sdbFreeRow(pSdb, pRow, true);
4,081,106✔
384
  }
385

386
  sdbUnLock(pSdb, type);
19,203,836✔
387
}
19,203,836✔
388

389
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
1,302,736,971✔
390
  if (pObj == NULL) return;
1,302,736,971✔
391

392
  SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
1,288,863,132✔
393
  if (pRow->type >= SDB_MAX) return;
1,288,864,732✔
394

395
  int32_t type = pRow->type;
1,288,861,785✔
396
  if (lock) {
1,288,862,328✔
397
    sdbWriteLock(pSdb, type);
1,288,216,057✔
398
  }
399

400
  int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
1,288,881,742✔
401
  sdbPrintOper(pSdb, pRow, "release");
1,288,882,215✔
402
  if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) {
1,288,873,444✔
403
    sdbFreeRow(pSdb, pRow, true);
15,122,730✔
404
  }
405
  if (ref < 0) {
1,288,874,105✔
406
    mError("row:%p, ref:%d, type:%s", pRow, ref, sdbTableName(type));
7,295,316✔
407
  }
408

409
  if (lock) {
1,288,872,545✔
410
    sdbUnLock(pSdb, type);
1,288,226,104✔
411
  }
412
}
413

414
void sdbRelease(SSdb *pSdb, void *pObj) { sdbReleaseLock(pSdb, pObj, true); }
1,302,088,329✔
415

416
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
757,241,195✔
417
  *ppObj = NULL;
757,241,195✔
418

419
  SHashObj *hash = sdbGetHash(pSdb, type);
757,241,614✔
420
  if (hash == NULL) return NULL;
757,244,409✔
421

422
  sdbReadLock(pSdb, type);
757,244,409✔
423

424
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
757,245,965✔
425
  while (ppRow != NULL) {
763,372,945✔
426
    SSdbRow *pRow = *ppRow;
547,940,481✔
427
    if (pRow == NULL || pRow->status != SDB_STATUS_READY) {
547,939,986✔
428
      ppRow = taosHashIterate(hash, ppRow);
6,125,733✔
429
      continue;
6,124,679✔
430
    }
431

432
    (void) atomic_add_fetch_32(&pRow->refCount, 1);
541,813,880✔
433

434
    sdbPrintOper(pSdb, pRow, "fetch");
541,816,822✔
435
    *ppObj = pRow->pObj;
541,810,181✔
436
    break;
541,811,343✔
437
  }
438
  sdbUnLock(pSdb, type);
757,243,807✔
439

440
  return ppRow;
757,249,724✔
441
}
442

443
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status, bool lock) {
242,270,177✔
444
  *ppObj = NULL;
242,270,177✔
445

446
  SHashObj *hash = sdbGetHash(pSdb, type);
242,270,177✔
447
  if (hash == NULL) return NULL;
242,270,177✔
448

449
  if (lock) {
242,270,177✔
450
    sdbReadLock(pSdb, type);
241,130,534✔
451
  }
452

453
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
242,270,177✔
454
  while (ppRow != NULL) {
242,270,177✔
455
    SSdbRow *pRow = *ppRow;
176,504,225✔
456
    if (pRow == NULL) {
176,504,225✔
457
      ppRow = taosHashIterate(hash, ppRow);
×
458
      continue;
×
459
    }
460

461
    (void)atomic_add_fetch_32(&pRow->refCount, 1);
176,504,225✔
462
    sdbPrintOper(pSdb, pRow, "fetch");
176,504,225✔
463
    *ppObj = pRow->pObj;
176,504,225✔
464
    *status = pRow->status;
176,504,225✔
465
    break;
176,504,225✔
466
  }
467
  if (lock) {
242,270,177✔
468
    sdbUnLock(pSdb, type);
241,130,534✔
469
  }
470

471
  return ppRow;
242,270,177✔
472
}
473

474
void sdbCancelFetch(SSdb *pSdb, void *pIter) {
94,288,587✔
475
  if (pIter == NULL) return;
94,288,587✔
476
  SSdbRow *pRow = *(SSdbRow **)pIter;
82,452,568✔
477
  mTrace("cancel fetch row:%p", pRow);
82,452,568✔
478
  SHashObj *hash = sdbGetHash(pSdb, pRow->type);
82,452,568✔
479
  if (hash == NULL) return;
82,452,568✔
480

481
  int32_t type = pRow->type;
82,452,568✔
482
  sdbReadLock(pSdb, type);
82,452,568✔
483
  taosHashCancelIterate(hash, pIter);
82,452,568✔
484
  sdbUnLock(pSdb, type);
82,452,568✔
485
}
486

487
void sdbCancelFetchByType(SSdb *pSdb, void *pIter, ESdbType type) {
×
488
  if (pIter == NULL) return;
×
489
  if (type >= SDB_MAX || type < 0) return;
×
490
  SHashObj *hash = sdbGetHash(pSdb, type);
×
491
  if (hash == NULL) return;
×
492

493
  sdbReadLock(pSdb, type);
×
494
  taosHashCancelIterate(hash, pIter);
×
495
  sdbUnLock(pSdb, type);
×
496
}
497

498
void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2, void *p3) {
8,591,998✔
499
  SHashObj *hash = sdbGetHash(pSdb, type);
8,591,998✔
500
  if (hash == NULL) return;
8,591,998✔
501

502
  sdbReadLock(pSdb, type);
8,591,998✔
503

504
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
8,591,998✔
505
  while (ppRow != NULL) {
33,949,111✔
506
    SSdbRow *pRow = *ppRow;
25,364,764✔
507
    if (pRow->status == SDB_STATUS_READY) {
25,364,764✔
508
      bool isContinue = (*fp)(pSdb->pMnode, pRow->pObj, p1, p2, p3);
24,710,524✔
509
      if (!isContinue) {
24,710,524✔
510
        taosHashCancelIterate(hash, ppRow);
7,651✔
511
        break;
7,651✔
512
      }
513
    }
514

515
    ppRow = taosHashIterate(hash, ppRow);
25,357,113✔
516
  }
517

518
  sdbUnLock(pSdb, type);
8,591,998✔
519
}
520

521
int32_t sdbGetSize(SSdb *pSdb, ESdbType type) {
176,568,573✔
522
  SHashObj *hash = sdbGetHash(pSdb, type);
176,568,573✔
523
  if (hash == NULL) return 0;
176,563,729✔
524

525
  sdbReadLock(pSdb, type);
176,563,729✔
526
  int32_t size = taosHashGetSize(hash);
176,568,132✔
527
  sdbUnLock(pSdb, type);
176,564,616✔
528

529
  return size;
176,565,988✔
530
}
531

532
int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type) {
17,435,217✔
533
  SHashObj *hash = sdbGetHash(pSdb, type);
17,435,217✔
534
  if (hash == NULL) return -1;
17,435,217✔
535

536
  if (pSdb->keyTypes[type] != SDB_KEY_INT32) return -1;
17,435,217✔
537

538
  int32_t maxId = 0;
17,435,217✔
539
  sdbReadLock(pSdb, type);
17,435,217✔
540

541
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
17,435,217✔
542
  while (ppRow != NULL) {
30,196,877✔
543
    SSdbRow *pRow = *ppRow;
12,761,660✔
544
    int32_t  id = *(int32_t *)pRow->pObj;
12,761,660✔
545
    maxId = TMAX(id, maxId);
12,761,660✔
546
    ppRow = taosHashIterate(hash, ppRow);
12,761,660✔
547
  }
548

549
  sdbUnLock(pSdb, type);
17,435,217✔
550
  maxId = TMAX(maxId, pSdb->maxId[type]);
17,435,217✔
551
  return maxId + 1;
17,435,217✔
552
}
553

554
int64_t sdbGetTableVer(SSdb *pSdb, ESdbType type) {
122,750,046✔
555
  if (type >= SDB_MAX || type < 0) {
122,750,046✔
556
    terrno = TSDB_CODE_SDB_INVALID_TABLE_TYPE;
×
557
    return -1;
×
558
  }
559

560
  return pSdb->tableVer[type];
122,750,046✔
561
}
562

563
bool countValid(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
×
564
  int32_t *pInt = p1;
×
565
  (*pInt) += 1;
×
566
  return true;
×
567
}
568

569
int32_t sdbGetValidSize(SSdb *pSdb, ESdbType type) {
×
570
  int32_t num = 0;
×
571
  sdbTraverse(pSdb, type, countValid, &num, 0, 0);
×
572
  return num;
×
573
}
574

575

576
bool sdbCheckExists(SSdb *pSdb, ESdbType type, const void *pKey) {
255,857✔
577
  SHashObj *hash = sdbGetHash(pSdb, type);
255,857✔
578
  if (hash == NULL) return false;
255,857✔
579
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
255,857✔
580

581
  sdbReadLock(pSdb, type);
255,857✔
582
  void* p = taosHashGet(hash, pKey, keySize);
255,857✔
583
  sdbUnLock(pSdb, type);
255,857✔
584

585
  return (NULL != p);
255,857✔
586
}
587

588

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