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

taosdata / TDengine / #3559

18 Dec 2024 12:59AM UTC coverage: 59.805% (+0.03%) from 59.778%
#3559

push

travis-ci

web-flow
Merge pull request #29187 from taosdata/merge/mainto3.0

merge: main to 3.0 branch

132705 of 287544 branches covered (46.15%)

Branch coverage included in aggregate %.

87 of 95 new or added lines in 19 files covered. (91.58%)

1132 existing lines in 133 files now uncovered.

209591 of 284807 relevant lines covered (73.59%)

8125235.78 hits per line

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

54.38
/source/dnode/mnode/impl/src/mndCompactDetail.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
#include "mndCompactDetail.h"
16
#include "mndDb.h"
17
#include "mndShow.h"
18
#include "mndTrans.h"
19

20
#define MND_COMPACT_VER_NUMBER 1
21

22
int32_t mndInitCompactDetail(SMnode *pMnode) {
1,518✔
23
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COMPACT_DETAIL, mndRetrieveCompactDetail);
1,518✔
24

25
  SSdbTable table = {
1,518✔
26
      .sdbType = SDB_COMPACT_DETAIL,
27
      .keyType = SDB_KEY_INT64,
28
      .encodeFp = (SdbEncodeFp)mndCompactDetailActionEncode,
29
      .decodeFp = (SdbDecodeFp)mndCompactDetailActionDecode,
30
      .insertFp = (SdbInsertFp)mndCompactDetailActionInsert,
31
      .updateFp = (SdbUpdateFp)mndCompactDetailActionUpdate,
32
      .deleteFp = (SdbDeleteFp)mndCompactDetailActionDelete,
33
  };
34

35
  return sdbSetTable(pMnode->pSdb, table);
1,518✔
36
}
37

38
void mndCleanupCompactDetail(SMnode *pMnode) { mDebug("mnd compact detail cleanup"); }
1,517✔
39

UNCOV
40
int32_t mndRetrieveCompactDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
×
UNCOV
41
  SMnode            *pMnode = pReq->info.node;
×
UNCOV
42
  SSdb              *pSdb = pMnode->pSdb;
×
UNCOV
43
  int32_t            numOfRows = 0;
×
UNCOV
44
  SCompactDetailObj *pCompactDetail = NULL;
×
UNCOV
45
  char              *sep = NULL;
×
UNCOV
46
  SDbObj            *pDb = NULL;
×
47

UNCOV
48
  if (strlen(pShow->db) > 0) {
×
49
    sep = strchr(pShow->db, '.');
×
50
    if (sep &&
×
51
        ((0 == strcmp(sep + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(sep + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
×
52
      sep++;
×
53
    } else {
54
      pDb = mndAcquireDb(pMnode, pShow->db);
×
55
      if (pDb == NULL) return terrno;
×
56
    }
57
  }
58

UNCOV
59
  while (numOfRows < rows) {
×
UNCOV
60
    pShow->pIter = sdbFetch(pSdb, SDB_COMPACT_DETAIL, pShow->pIter, (void **)&pCompactDetail);
×
UNCOV
61
    if (pShow->pIter == NULL) break;
×
62

63
    SColumnInfoData *pColInfo;
64
    SName            n;
65
    int32_t          cols = 0;
×
66

67
    char tmpBuf[TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE] = {0};
×
68

69
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
70
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->compactId, false),
×
71
                                   pSdb, pCompactDetail);
72

73
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
74
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->vgId, false), pSdb,
×
75
                                   pCompactDetail);
76

77
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
78
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->dnodeId, false),
×
79
                                   pSdb, pCompactDetail);
80

81
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
82
    TAOS_CHECK_RETURN_WITH_RELEASE(
×
83
        colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->numberFileset, false), pSdb, pCompactDetail);
84

85
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
86
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->finished, false),
×
87
                                   pSdb, pCompactDetail);
88

89
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
90
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->startTime, false),
×
91
                                   pSdb, pCompactDetail);
92

93
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
94
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->progress, false),
×
95
                                   pSdb, pCompactDetail);
96

97
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
98
    TAOS_CHECK_RETURN_WITH_RELEASE(
×
99
        colDataSetVal(pColInfo, numOfRows, (const char *)&pCompactDetail->remainingTime, false), pSdb, pCompactDetail);
100

101
    numOfRows++;
×
102
    sdbRelease(pSdb, pCompactDetail);
×
103
  }
104

UNCOV
105
  pShow->numOfRows += numOfRows;
×
UNCOV
106
  mndReleaseDb(pMnode, pDb);
×
UNCOV
107
  return numOfRows;
×
108
}
109

110
void tFreeCompactDetailObj(SCompactDetailObj *pCompact) {}
50✔
111

112
static int32_t tSerializeSCompactDetailObj(void *buf, int32_t bufLen, const SCompactDetailObj *pObj) {
104✔
113
  SEncoder encoder = {0};
104✔
114
  int32_t  code = 0;
104✔
115
  int32_t  lino;
116
  int32_t  tlen;
117
  tEncoderInit(&encoder, buf, bufLen);
104✔
118

119
  TAOS_CHECK_EXIT(tStartEncode(&encoder));
104!
120
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->compactDetailId));
208!
121
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->compactId));
208!
122
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->vgId));
208!
123
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->dnodeId));
208!
124
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->numberFileset));
208!
125
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->finished));
208!
126
  TAOS_CHECK_EXIT(tEncodeI64(&encoder, pObj->startTime));
208!
127
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->newNumberFileset));
208!
128
  TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->newFinished));
312!
129
  // 1. add progress and remaining time
130
  TAOS_CHECK_EXIT(tEncodeI32v(&encoder, pObj->progress));
208!
131
  TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->remainingTime));
208!
132

133
  tEndEncode(&encoder);
104✔
134

135
_exit:
104✔
136
  if (code) {
104!
137
    tlen = code;
×
138
  } else {
139
    tlen = encoder.pos;
104✔
140
  }
141
  tEncoderClear(&encoder);
104✔
142
  return tlen;
104✔
143
}
144

145
static int32_t tDeserializeSCompactDetailObj(void *buf, int32_t bufLen, SCompactDetailObj *pObj) {
50✔
146
  int32_t  code = 0;
50✔
147
  int32_t  lino;
148
  SDecoder decoder = {0};
50✔
149
  tDecoderInit(&decoder, buf, bufLen);
50✔
150

151
  TAOS_CHECK_EXIT(tStartDecode(&decoder));
50!
152
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->compactDetailId));
100!
153
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->compactId));
100!
154
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->vgId));
100!
155
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->dnodeId));
100!
156
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->numberFileset));
100!
157
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->finished));
100!
158
  TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pObj->startTime));
100!
159
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->newNumberFileset));
100!
160
  TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->newFinished));
100!
161
  // 1. add progress and remaining time decode
162
  if (!tDecodeIsEnd(&decoder)) {
50!
163
    TAOS_CHECK_EXIT(tDecodeI32v(&decoder, &pObj->progress));
100!
164
    TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->remainingTime));
100!
165
  } else {
166
    pObj->progress = 0;
×
167
    pObj->remainingTime = 0;
×
168
  }
169

170
  tEndDecode(&decoder);
50✔
171

172
_exit:
50✔
173
  tDecoderClear(&decoder);
50✔
174
  return code;
50✔
175
}
176

177
SSdbRaw *mndCompactDetailActionEncode(SCompactDetailObj *pCompact) {
52✔
178
  int32_t code = 0;
52✔
179
  int32_t lino = 0;
52✔
180
  terrno = TSDB_CODE_SUCCESS;
52✔
181

182
  void    *buf = NULL;
52✔
183
  SSdbRaw *pRaw = NULL;
52✔
184

185
  int32_t tlen = tSerializeSCompactDetailObj(NULL, 0, pCompact);
52✔
186
  if (tlen < 0) {
52!
187
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
188
    goto OVER;
×
189
  }
190

191
  int32_t size = sizeof(int32_t) + tlen;
52✔
192
  pRaw = sdbAllocRaw(SDB_COMPACT_DETAIL, MND_COMPACT_VER_NUMBER, size);
52✔
193
  if (pRaw == NULL) {
52!
194
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
195
    goto OVER;
×
196
  }
197

198
  buf = taosMemoryMalloc(tlen);
52!
199
  if (buf == NULL) {
52!
200
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
201
    goto OVER;
×
202
  }
203

204
  tlen = tSerializeSCompactDetailObj(buf, tlen, pCompact);
52✔
205
  if (tlen < 0) {
52!
206
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
207
    goto OVER;
×
208
  }
209

210
  int32_t dataPos = 0;
52✔
211
  SDB_SET_INT32(pRaw, dataPos, tlen, OVER);
52!
212
  SDB_SET_BINARY(pRaw, dataPos, buf, tlen, OVER);
52!
213
  SDB_SET_DATALEN(pRaw, dataPos, OVER);
52!
214

215
OVER:
52✔
216
  taosMemoryFreeClear(buf);
52!
217
  if (terrno != TSDB_CODE_SUCCESS) {
52!
218
    mError("compact detail:%" PRId32 ", failed to encode to raw:%p since %s", pCompact->compactId, pRaw, terrstr());
×
219
    sdbFreeRaw(pRaw);
×
220
    return NULL;
×
221
  }
222

223
  mTrace("compact detail:%" PRId32 ", encode to raw:%p, row:%p", pCompact->compactId, pRaw, pCompact);
52!
224
  return pRaw;
52✔
225
}
226

227
SSdbRow *mndCompactDetailActionDecode(SSdbRaw *pRaw) {
50✔
228
  int32_t            code = 0;
50✔
229
  int32_t            lino = 0;
50✔
230
  SSdbRow           *pRow = NULL;
50✔
231
  SCompactDetailObj *pCompact = NULL;
50✔
232
  void              *buf = NULL;
50✔
233
  terrno = TSDB_CODE_SUCCESS;
50✔
234

235
  int8_t sver = 0;
50✔
236
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
50!
237
    goto OVER;
×
238
  }
239

240
  if (sver != MND_COMPACT_VER_NUMBER) {
50!
241
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
242
    mError("compact detail read invalid ver, data ver: %d, curr ver: %d", sver, MND_COMPACT_VER_NUMBER);
×
243
    goto OVER;
×
244
  }
245

246
  pRow = sdbAllocRow(sizeof(SCompactObj));
50✔
247
  if (pRow == NULL) {
50!
248
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
249
    goto OVER;
×
250
  }
251

252
  pCompact = sdbGetRowObj(pRow);
50✔
253
  if (pCompact == NULL) {
50!
254
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
255
    goto OVER;
×
256
  }
257

258
  int32_t tlen;
259
  int32_t dataPos = 0;
50✔
260
  SDB_GET_INT32(pRaw, dataPos, &tlen, OVER);
50!
261
  buf = taosMemoryMalloc(tlen + 1);
50!
262
  if (buf == NULL) {
50!
263
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
264
    goto OVER;
×
265
  }
266
  SDB_GET_BINARY(pRaw, dataPos, buf, tlen, OVER);
50!
267

268
  if ((terrno = tDeserializeSCompactDetailObj(buf, tlen, pCompact)) < 0) {
50!
269
    goto OVER;
×
270
  }
271

272
OVER:
50✔
273
  taosMemoryFreeClear(buf);
50!
274
  if (terrno != TSDB_CODE_SUCCESS) {
50!
275
    mError("compact detail:%" PRId32 ", failed to decode from raw:%p since %s", pCompact->compactId, pRaw, terrstr());
×
276
    taosMemoryFreeClear(pRow);
×
277
    return NULL;
×
278
  }
279

280
  mTrace("compact detail:%" PRId32 ", decode from raw:%p, row:%p", pCompact->compactId, pRaw, pCompact);
50!
281
  return pRow;
50✔
282
}
283

284
int32_t mndCompactDetailActionInsert(SSdb *pSdb, SCompactDetailObj *pCompact) {
18✔
285
  mTrace("compact detail:%" PRId32 ", perform insert action", pCompact->compactId);
18!
286
  return 0;
18✔
287
}
288

289
int32_t mndCompactDetailActionDelete(SSdb *pSdb, SCompactDetailObj *pCompact) {
50✔
290
  mTrace("compact detail:%" PRId32 ", perform insert action", pCompact->compactId);
50!
291
  tFreeCompactDetailObj(pCompact);
50✔
292
  return 0;
50✔
293
}
294

295
int32_t mndCompactDetailActionUpdate(SSdb *pSdb, SCompactDetailObj *pOldCompact, SCompactDetailObj *pNewCompact) {
16✔
296
  mTrace("compact detail:%" PRId32 ", perform update action, old row:%p new row:%p", pOldCompact->compactId,
16!
297
         pOldCompact, pNewCompact);
298

299
  pOldCompact->numberFileset = pNewCompact->numberFileset;
16✔
300
  pOldCompact->finished = pNewCompact->finished;
16✔
301

302
  return 0;
16✔
303
}
304

305
int32_t mndAddCompactDetailToTran(SMnode *pMnode, STrans *pTrans, SCompactObj *pCompact, SVgObj *pVgroup,
18✔
306
                                  SVnodeGid *pVgid, int32_t index) {
307
  int32_t           code = 0;
18✔
308
  SCompactDetailObj compactDetail = {0};
18✔
309
  compactDetail.compactDetailId = index;
18✔
310
  compactDetail.compactId = pCompact->compactId;
18✔
311
  compactDetail.vgId = pVgroup->vgId;
18✔
312
  compactDetail.dnodeId = pVgid->dnodeId;
18✔
313
  compactDetail.startTime = taosGetTimestampMs();
18✔
314
  compactDetail.numberFileset = -1;
18✔
315
  compactDetail.finished = -1;
18✔
316
  compactDetail.newNumberFileset = -1;
18✔
317
  compactDetail.newFinished = -1;
18✔
318

319
  mInfo("compact:%d, add compact detail to trans, index:%d, vgId:%d, dnodeId:%d", compactDetail.compactId,
18!
320
        compactDetail.compactDetailId, compactDetail.vgId, compactDetail.dnodeId);
321

322
  SSdbRaw *pVgRaw = mndCompactDetailActionEncode(&compactDetail);
18✔
323
  if (pVgRaw == NULL) return -1;
18!
324
  if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) {
18!
325
    sdbFreeRaw(pVgRaw);
×
326
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
327
    if (terrno != 0) code = terrno;
×
328
    TAOS_RETURN(code);
×
329
  }
330
  code = sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
18✔
331

332
  TAOS_RETURN(code);
18✔
333
}
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