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

taosdata / TDengine / #4898

26 Dec 2025 09:58AM UTC coverage: 65.061% (-0.7%) from 65.717%
#4898

push

travis-ci

web-flow
feat: support encryption of configuration files, data files and metadata files (#33801)

350 of 1333 new or added lines in 31 files covered. (26.26%)

2796 existing lines in 159 files now uncovered.

184024 of 282850 relevant lines covered (65.06%)

113940470.33 hits per line

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

89.05
/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) {
346,075,674✔
22
  switch (type) {
346,075,674✔
23
    case SDB_TRANS:
51,092,339✔
24
      return "trans";
51,092,339✔
25
    case SDB_CLUSTER:
3,106,611✔
26
      return "cluster";
3,106,611✔
27
    case SDB_MNODE:
3,289,018✔
28
      return "mnode";
3,289,018✔
29
    case SDB_QNODE:
1,735,489✔
30
      return "qnode";
1,735,489✔
31
    case SDB_SNODE:
2,963,779✔
32
      return "snode";
2,963,779✔
33
    case SDB_DNODE:
6,251,849✔
34
      return "dnode";
6,251,849✔
35
    case SDB_USER:
5,662,904✔
36
      return "user";
5,662,904✔
37
    case SDB_AUTH:
128✔
38
      return "auth";
128✔
39
    case SDB_ACCT:
2,965,727✔
40
      return "acct";
2,965,727✔
41
    case SDB_STREAM_CK:
128✔
42
      return "stream_ck";
128✔
43
    case SDB_STREAM:
2,114,696✔
44
      return "stream";
2,114,696✔
45
    case SDB_OFFSET:
128✔
46
      return "offset";
128✔
47
    case SDB_SUBSCRIBE:
2,692,961✔
48
      return "subscribe";
2,692,961✔
49
    case SDB_CONSUMER:
3,579,081✔
50
      return "consumer";
3,579,081✔
51
    case SDB_TOPIC:
2,346,397✔
52
      return "topic";
2,346,397✔
53
    case SDB_VGROUP:
26,685,397✔
54
      return "vgroup";
26,685,397✔
55
    case SDB_SMA:
1,681,129✔
56
      return "sma";
1,681,129✔
57
    case SDB_STB:
40,866,091✔
58
      return "stb";
40,866,091✔
59
    case SDB_DB:
21,612,793✔
60
      return "db";
21,612,793✔
61
    case SDB_FUNC:
1,717,614✔
62
      return "func";
1,717,614✔
63
    case SDB_IDX:
10,099,952✔
64
      return "idx";
10,099,952✔
65
    case SDB_VIEW:
2,616,040✔
66
      return "view";
2,616,040✔
67
    case SDB_STREAM_SEQ:
128✔
68
      return "stream_seq";
128✔
69
    case SDB_COMPACT:
1,888,525✔
70
      return "compact";
1,888,525✔
71
    case SDB_COMPACT_DETAIL:
2,506,196✔
72
      return "compact_detail";
2,506,196✔
73
    case SDB_GRANT:
3,548,141✔
74
      return "grant";
3,548,141✔
75
    case SDB_ARBGROUP:
1,757,957✔
76
      return "arb_group";
1,757,957✔
77
    case SDB_ANODE:
1,681,129✔
78
      return "anode";
1,681,129✔
79
    case SDB_BNODE:
1,951,873✔
80
      return "bnode";
1,951,873✔
81
    case SDB_CFG:
115,115,436✔
82
      return "config";
115,115,436✔
83
    case SDB_MOUNT:
1,684,462✔
84
      return "mount";
1,684,462✔
85
    case SDB_MOUNT_LOG:
1,683,050✔
86
      return "mount_log";
1,683,050✔
87
    case SDB_SSMIGRATE:
1,681,129✔
88
      return "ssmigrate";
1,681,129✔
89
    case SDB_SCAN:
1,682,959✔
90
      return "scan";
1,682,959✔
91
    case SDB_SCAN_DETAIL:
1,683,874✔
92
      return "scan_detail";
1,683,874✔
93
    case SDB_RSMA:
1,819,288✔
94
      return "rsma";
1,819,288✔
95
    case SDB_INSTANCE:
919,165✔
96
      return "instance";
919,165✔
97
    case SDB_ENCRYPT_ALGORITHMS:
8,013,768✔
98
      return "encrypt_algr";
8,013,768✔
99
    case SDB_TOKEN:
1,681,129✔
100
      return "token";
1,681,129✔
101
    default:
3,697,214✔
102
      return "undefine";
3,697,214✔
103
  }
104
}
105

106
const char *sdbStatusName(ESdbStatus status) {
143,196,152✔
107
  switch (status) {
143,196,152✔
108
    case SDB_STATUS_CREATING:
7,324,298✔
109
      return "creating";
7,324,298✔
110
    case SDB_STATUS_DROPPING:
2,270,042✔
111
      return "dropping";
2,270,042✔
112
    case SDB_STATUS_READY:
120,547,131✔
113
      return "ready";
120,547,131✔
114
    case SDB_STATUS_DROPPED:
12,974,653✔
115
      return "dropped";
12,974,653✔
116
    case SDB_STATUS_INIT:
80,028✔
117
      return "init";
80,028✔
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,
1,015,548,805✔
131
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
132
  } else if (keyType == SDB_KEY_INT32) {
2,067,711,372✔
133
    mTrace("%s:%d, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj,
1,959,650,067✔
134
           pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status));
135
  } else if (keyType == SDB_KEY_INT64) {
108,061,305✔
136
    mTrace("%s:%" PRId64 ", ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type),
108,061,305✔
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,147,483,647✔
144
  if (type >= SDB_MAX || type < 0) {
2,147,483,647✔
UNCOV
145
    terrno = TSDB_CODE_SDB_INVALID_TABLE_TYPE;
×
146
    return NULL;
×
147
  }
148

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

155
  return hash;
2,147,483,647✔
156
}
157

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

162
  if (keyType == SDB_KEY_INT32) {
890,965,446✔
163
    keySize = sizeof(int32_t);
589,132,834✔
164
  } else if (keyType == SDB_KEY_BINARY) {
301,832,612✔
165
    keySize = strlen(pKey) + 1;
294,844,940✔
166
  } else {
167
    keySize = sizeof(int64_t);
6,987,672✔
168
  }
169

170
  return keySize;
890,965,446✔
171
}
172

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

177
  SSdbRow *pOldRow = taosHashGet(hash, pRow->pObj, keySize);
75,348,235✔
178
  if (pOldRow != NULL) {
75,348,235✔
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;
75,348,235✔
186
  pRow->status = pRaw->status;
75,348,235✔
187
  sdbPrintOper(pSdb, pRow, "insert");
75,348,235✔
188

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

196
  SdbInsertFp insertFp = pSdb->insertFps[pRow->type];
75,348,235✔
197
  if (insertFp != NULL) {
75,348,235✔
198
    code = (*insertFp)(pSdb, pRow->pObj);
75,348,235✔
199
    if (code != 0) {
75,348,235✔
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);
75,348,235✔
211

212
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
75,348,235✔
213
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
21,983,145✔
214
  }
215
  if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT64) {
75,348,235✔
216
    pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int64_t *)pRow->pObj));
728,045✔
217
  }
218
  pSdb->tableVer[pRow->type]++;
75,348,235✔
219

220
  return 0;
75,348,235✔
221
}
222

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

227
  SSdbRow **ppOldRow = taosHashGet(hash, pNewRow->pObj, keySize);
108,198,577✔
228
  if (ppOldRow == NULL || *ppOldRow == NULL) {
108,198,577✔
229
    sdbUnLock(pSdb, type);
71,626,382✔
230
    return sdbInsertRow(pSdb, hash, pRaw, pNewRow, keySize);
71,626,382✔
231
  }
232

233
  SSdbRow *pOldRow = *ppOldRow;
36,572,195✔
234
  pOldRow->status = pRaw->status;
36,572,195✔
235
  sdbPrintOper(pSdb, pOldRow, "update");
36,572,195✔
236

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

244
  // sdbUnLock(pSdb, type);
245
  sdbFreeRow(pSdb, pNewRow, false);
36,572,195✔
246

247
  pSdb->tableVer[pOldRow->type]++;
36,572,195✔
248
  return code;
36,572,195✔
249
}
250

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

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

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

268
  if (taosHashRemove(hash, pOldRow->pObj, keySize) != 0) {
19,997,974✔
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,997,974✔
275
  sdbUnLock(pSdb, type);
19,997,974✔
276

277
  sdbFreeRow(pSdb, pRow, false);
19,997,974✔
278

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

283
int32_t sdbWriteWithoutFree(SSdb *pSdb, SSdbRaw *pRaw) {
131,930,217✔
284
  if (pRaw->type == SDB_CFG) {
131,930,217✔
285
    mTrace("sdb write cfg");
45,438,276✔
286
  }
287
  SHashObj *hash = sdbGetHash(pSdb, pRaw->type);
131,930,217✔
288
  if (hash == NULL) return terrno;
131,930,217✔
289

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

294
  pRow->type = pRaw->type;
131,930,217✔
295

296
  int32_t keySize = sdbGetkeySize(pSdb, pRow->type, pRow->pObj);
131,930,217✔
297
  int32_t code = TSDB_CODE_SDB_INVALID_ACTION_TYPE;
131,930,217✔
298

299
  switch (pRaw->status) {
131,930,217✔
300
    case SDB_STATUS_CREATING:
3,721,853✔
301
      code = sdbInsertRow(pSdb, hash, pRaw, pRow, keySize);
3,721,853✔
302
      break;
3,721,853✔
303
    case SDB_STATUS_READY:
108,198,577✔
304
    case SDB_STATUS_UPDATE:
305
    case SDB_STATUS_DROPPING:
306
      code = sdbUpdateRow(pSdb, hash, pRaw, pRow, keySize);
108,198,577✔
307
      break;
108,198,577✔
308
    case SDB_STATUS_DROPPED:
20,009,787✔
309
      code = sdbDeleteRow(pSdb, hash, pRaw, pRow, keySize);
20,009,787✔
310
      break;
20,009,787✔
311
  }
312

313
  return code;
131,930,217✔
314
}
315

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

322
void *sdbAcquireAll(SSdb *pSdb, ESdbType type, const void *pKey, bool onlyReady) {
758,801,415✔
323
  terrno = 0;
758,801,415✔
324

325
  SHashObj *hash = sdbGetHash(pSdb, type);
758,803,224✔
326
  if (hash == NULL) return NULL;
758,800,913✔
327

328
  void   *pRet = NULL;
758,800,913✔
329
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
758,800,913✔
330

331
  sdbReadLock(pSdb, type);
758,800,496✔
332

333
  SSdbRow **ppRow = taosHashGet(hash, pKey, keySize);
758,802,070✔
334
  if (ppRow == NULL || *ppRow == NULL) {
758,799,219✔
335
    sdbUnLock(pSdb, type);
161,598,312✔
336
    terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
161,600,795✔
337
    return NULL;
161,600,795✔
338
  }
339

340
  SSdbRow *pRow = *ppRow;
597,200,907✔
341
  switch (pRow->status) {
597,200,394✔
342
    case SDB_STATUS_READY:
596,203,902✔
343
      (void)atomic_add_fetch_32(&pRow->refCount, 1);
596,203,902✔
344
      pRet = pRow->pObj;
596,203,720✔
345
      sdbPrintOper(pSdb, pRow, "acquire");
596,203,202✔
346
      break;
596,201,600✔
347
    case SDB_STATUS_CREATING:
676,031✔
348
      terrno = TSDB_CODE_SDB_OBJ_CREATING;
676,031✔
349
      break;
676,031✔
350
    case SDB_STATUS_DROPPING:
322,130✔
351
      terrno = TSDB_CODE_SDB_OBJ_DROPPING;
322,130✔
352
      break;
322,130✔
353
    default:
×
354
      terrno = TSDB_CODE_APP_ERROR;
×
355
      break;
×
356
  }
357

358
  if (pRet == NULL) {
597,199,761✔
359
    if (!onlyReady) {
998,161✔
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);
597,199,761✔
368
  return pRet;
597,202,137✔
369
}
370

371
void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) { return sdbAcquireAll(pSdb, type, pKey, true); }
758,316,739✔
372
void *sdbAcquireNotReadyObj(SSdb *pSdb, ESdbType type, const void *pKey) {
484,716✔
373
  return sdbAcquireAll(pSdb, type, pKey, false);
484,716✔
374
}
375

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

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

386
  sdbUnLock(pSdb, type);
19,997,974✔
387
}
19,997,974✔
388

389
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
1,363,706,886✔
390
  if (pObj == NULL) return;
1,363,706,886✔
391

392
  SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
1,349,440,319✔
393
  if (pRow->type >= SDB_MAX) return;
1,349,441,255✔
394

395
  int32_t type = pRow->type;
1,349,440,130✔
396
  if (lock) {
1,349,438,155✔
397
    sdbWriteLock(pSdb, type);
1,348,753,375✔
398
  }
399

400
  int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
1,349,454,799✔
401
  sdbPrintOper(pSdb, pRow, "release");
1,349,462,819✔
402
  if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) {
1,349,454,822✔
403
    sdbFreeRow(pSdb, pRow, true);
15,785,739✔
404
  }
405
  if (ref < 0) {
1,349,455,191✔
406
    mError("row:%p, ref:%d, type:%s", pRow, ref, sdbTableName(type));
7,293,822✔
407
  }
408

409
  if (lock) {
1,349,454,420✔
410
    sdbUnLock(pSdb, type);
1,348,771,226✔
411
  }
412
}
413

414
void sdbRelease(SSdb *pSdb, void *pObj) { sdbReleaseLock(pSdb, pObj, true); }
1,363,023,225✔
415

416
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
793,154,833✔
417
  *ppObj = NULL;
793,154,833✔
418

419
  SHashObj *hash = sdbGetHash(pSdb, type);
793,157,167✔
420
  if (hash == NULL) return NULL;
793,157,389✔
421

422
  sdbReadLock(pSdb, type);
793,157,389✔
423

424
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
793,161,042✔
425
  while (ppRow != NULL) {
798,391,143✔
426
    SSdbRow *pRow = *ppRow;
574,722,597✔
427
    if (pRow == NULL || pRow->status != SDB_STATUS_READY) {
574,722,479✔
428
      ppRow = taosHashIterate(hash, ppRow);
5,233,106✔
429
      continue;
5,231,744✔
430
    }
431

432
    (void) atomic_add_fetch_32(&pRow->refCount, 1);
569,488,117✔
433

434
    sdbPrintOper(pSdb, pRow, "fetch");
569,493,807✔
435
    *ppObj = pRow->pObj;
569,485,534✔
436
    break;
569,486,390✔
437
  }
438
  sdbUnLock(pSdb, type);
793,154,936✔
439

440
  return ppRow;
793,162,938✔
441
}
442

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

446
  SHashObj *hash = sdbGetHash(pSdb, type);
252,215,998✔
447
  if (hash == NULL) return NULL;
252,215,998✔
448

449
  if (lock) {
252,215,998✔
450
    sdbReadLock(pSdb, type);
251,016,261✔
451
  }
452

453
  SSdbRow **ppRow = taosHashIterate(hash, pIter);
252,215,998✔
454
  while (ppRow != NULL) {
252,215,998✔
455
    SSdbRow *pRow = *ppRow;
183,735,081✔
456
    if (pRow == NULL) {
183,735,081✔
457
      ppRow = taosHashIterate(hash, ppRow);
×
458
      continue;
×
459
    }
460

461
    (void)atomic_add_fetch_32(&pRow->refCount, 1);
183,735,081✔
462
    sdbPrintOper(pSdb, pRow, "fetch");
183,735,081✔
463
    *ppObj = pRow->pObj;
183,735,081✔
464
    *status = pRow->status;
183,735,081✔
465
    break;
183,735,081✔
466
  }
467
  if (lock) {
252,215,998✔
468
    sdbUnLock(pSdb, type);
251,016,261✔
469
  }
470

471
  return ppRow;
252,215,998✔
472
}
473

474
void sdbCancelFetch(SSdb *pSdb, void *pIter) {
97,105,447✔
475
  if (pIter == NULL) return;
97,105,447✔
476
  SSdbRow *pRow = *(SSdbRow **)pIter;
84,786,620✔
477
  mTrace("cancel fetch row:%p", pRow);
84,786,620✔
478
  SHashObj *hash = sdbGetHash(pSdb, pRow->type);
84,786,620✔
479
  if (hash == NULL) return;
84,786,620✔
480

481
  int32_t type = pRow->type;
84,786,620✔
482
  sdbReadLock(pSdb, type);
84,786,620✔
483
  taosHashCancelIterate(hash, pIter);
84,786,578✔
484
  sdbUnLock(pSdb, type);
84,786,620✔
485
}
486

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

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

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

502
  sdbReadLock(pSdb, type);
8,896,568✔
503

504
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
8,896,568✔
505
  while (ppRow != NULL) {
35,242,563✔
506
    SSdbRow *pRow = *ppRow;
26,355,510✔
507
    if (pRow->status == SDB_STATUS_READY) {
26,355,510✔
508
      bool isContinue = (*fp)(pSdb->pMnode, pRow->pObj, p1, p2, p3);
25,659,450✔
509
      if (!isContinue) {
25,659,450✔
510
        taosHashCancelIterate(hash, ppRow);
9,515✔
511
        break;
9,515✔
512
      }
513
    }
514

515
    ppRow = taosHashIterate(hash, ppRow);
26,345,995✔
516
  }
517

518
  sdbUnLock(pSdb, type);
8,896,568✔
519
}
520

521
int32_t sdbGetSize(SSdb *pSdb, ESdbType type) {
182,976,879✔
522
  SHashObj *hash = sdbGetHash(pSdb, type);
182,976,879✔
523
  if (hash == NULL) return 0;
182,974,751✔
524

525
  sdbReadLock(pSdb, type);
182,974,751✔
526
  int32_t size = taosHashGetSize(hash);
182,974,882✔
527
  sdbUnLock(pSdb, type);
182,972,056✔
528

529
  return size;
182,975,605✔
530
}
531

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

536
  if (pSdb->keyTypes[type] != SDB_KEY_INT32) return -1;
18,081,421✔
537

538
  int32_t maxId = 0;
18,081,421✔
539
  sdbReadLock(pSdb, type);
18,081,421✔
540

541
  SSdbRow **ppRow = taosHashIterate(hash, NULL);
18,081,421✔
542
  while (ppRow != NULL) {
31,353,038✔
543
    SSdbRow *pRow = *ppRow;
13,271,617✔
544
    int32_t  id = *(int32_t *)pRow->pObj;
13,271,617✔
545
    maxId = TMAX(id, maxId);
13,271,617✔
546
    ppRow = taosHashIterate(hash, ppRow);
13,271,617✔
547
  }
548

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

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

560
  return pSdb->tableVer[type];
127,842,739✔
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) {
233,297✔
577
  SHashObj *hash = sdbGetHash(pSdb, type);
233,297✔
578
  if (hash == NULL) return false;
233,297✔
579
  int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
233,297✔
580

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

585
  return (NULL != p);
233,297✔
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