tsdbCommit.c 50.6 KB
Newer Older
H
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

H
Hongze Cheng 已提交
16
#include "tsdb.h"
H
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18
typedef enum { MEMORY_DATA_ITER = 0, STT_DATA_ITER } EDataIterT;
H
Hongze Cheng 已提交
19

H
more  
Hongze Cheng 已提交
20
#define USE_STREAM_COMPRESSION 0
H
compare  
Hongze Cheng 已提交
21

H
Hongze Cheng 已提交
22 23 24
typedef struct {
  SRBTreeNode n;
  SRowInfo    r;
H
Hongze Cheng 已提交
25
  EDataIterT  type;
H
Hongze Cheng 已提交
26 27 28 29 30 31
  union {
    struct {
      int32_t     iTbDataP;
      STbDataIter iter;
    };  // memory data iter
    struct {
H
Hongze Cheng 已提交
32 33 34
      int32_t    iStt;
      SArray    *aSttBlk;
      int32_t    iSttBlk;
H
Hongze Cheng 已提交
35 36
      SBlockData bData;
      int32_t    iRow;
H
Hongze Cheng 已提交
37
    };  // stt file data iter
H
Hongze Cheng 已提交
38 39 40
  };
} SDataIter;

H
Hongze Cheng 已提交
41
typedef struct {
H
Hongze Cheng 已提交
42
  STsdb *pTsdb;
H
Hongze Cheng 已提交
43
  /* commit data */
H
Hongze Cheng 已提交
44
  int64_t commitID;
H
Hongze Cheng 已提交
45 46
  int32_t minutes;
  int8_t  precision;
H
Hongze Cheng 已提交
47 48
  int32_t minRow;
  int32_t maxRow;
H
Hongze Cheng 已提交
49
  int8_t  cmprAlg;
H
Hongze Cheng 已提交
50
  int8_t  sttTrigger;
H
Hongze Cheng 已提交
51 52
  SArray *aTbDataP;  // memory
  STsdbFS fs;        // disk
H
Hongze Cheng 已提交
53
  // --------------
H
Hongze Cheng 已提交
54
  TSKEY   nextKey;  // reset by each table commit
H
Hongze Cheng 已提交
55 56 57
  int32_t commitFid;
  TSKEY   minKey;
  TSKEY   maxKey;
H
Hongze Cheng 已提交
58
  // commit file data
H
Hongze Cheng 已提交
59 60
  struct {
    SDataFReader *pReader;
H
Hongze Cheng 已提交
61 62 63
    SArray       *aBlockIdx;  // SArray<SBlockIdx>
    int32_t       iBlockIdx;
    SBlockIdx    *pBlockIdx;
H
Hongze Cheng 已提交
64
    SMapData      mBlock;  // SMapData<SDataBlk>
H
Hongze Cheng 已提交
65
    SBlockData    bData;
H
Hongze Cheng 已提交
66
  } dReader;
H
Hongze Cheng 已提交
67 68 69
  struct {
    SDataIter *pIter;
    SRBTree    rbt;
H
Hongze Cheng 已提交
70
    SDataIter  dataIter;
H
Hongze Cheng 已提交
71
    SDataIter  aDataIter[TSDB_MAX_STT_TRIGGER];
H
Hongze Cheng 已提交
72
    int8_t     toLastOnly;
H
Hongze Cheng 已提交
73
  };
H
Hongze Cheng 已提交
74
  struct {
H
compare  
Hongze Cheng 已提交
75 76 77 78 79 80
    SDataFWriter *pWriter;
    SArray       *aBlockIdx;  // SArray<SBlockIdx>
    SArray       *aSttBlk;    // SArray<SSttBlk>
    SMapData      mBlock;     // SMapData<SDataBlk>
    SBlockData    bData;
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
81
    SDiskDataBuilder *pBuilder;
H
compare  
Hongze Cheng 已提交
82 83 84
#else
    SBlockData bDatal;
#endif
H
Hongze Cheng 已提交
85 86 87
  } dWriter;
  SSkmInfo skmTable;
  SSkmInfo skmRow;
H
Hongze Cheng 已提交
88
  /* commit del */
H
Hongze Cheng 已提交
89 90
  SDelFReader *pDelFReader;
  SDelFWriter *pDelFWriter;
H
Hongze Cheng 已提交
91 92 93
  SArray      *aDelIdx;   // SArray<SDelIdx>
  SArray      *aDelIdxN;  // SArray<SDelIdx>
  SArray      *aDelData;  // SArray<SDelData>
H
Hongze Cheng 已提交
94
} SCommitter;
H
refact  
Hongze Cheng 已提交
95

H
Hongze Cheng 已提交
96 97 98 99 100
static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter);
static int32_t tsdbCommitData(SCommitter *pCommitter);
static int32_t tsdbCommitDel(SCommitter *pCommitter);
static int32_t tsdbCommitCache(SCommitter *pCommitter);
static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno);
H
Hongze Cheng 已提交
101 102
static int32_t tsdbNextCommitRow(SCommitter *pCommitter);

H
Hongze Cheng 已提交
103
int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
H
Hongze Cheng 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
  SRowInfo *pInfo1 = (SRowInfo *)p1;
  SRowInfo *pInfo2 = (SRowInfo *)p2;

  if (pInfo1->suid < pInfo2->suid) {
    return -1;
  } else if (pInfo1->suid > pInfo2->suid) {
    return 1;
  }

  if (pInfo1->uid < pInfo2->uid) {
    return -1;
  } else if (pInfo1->uid > pInfo2->uid) {
    return 1;
  }

  return tsdbRowCmprFn(&pInfo1->row, &pInfo2->row);
}
H
refact  
Hongze Cheng 已提交
121

H
refact  
Hongze Cheng 已提交
122
int32_t tsdbBegin(STsdb *pTsdb) {
H
Hongze Cheng 已提交
123
  int32_t code = 0;
H
Hongze Cheng 已提交
124
  int32_t lino = 0;
H
Hongze Cheng 已提交
125

126 127
  if (!pTsdb) return code;

H
Hongze Cheng 已提交
128 129
  SMemTable *pMemTable;
  code = tsdbMemTableCreate(pTsdb, &pMemTable);
H
Hongze Cheng 已提交
130
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
131

H
Hongze Cheng 已提交
132
  // lock
H
Hongze Cheng 已提交
133
  if ((code = taosThreadRwlockWrlock(&pTsdb->rwLock))) {
H
Hongze Cheng 已提交
134
    code = TAOS_SYSTEM_ERROR(code);
H
Hongze Cheng 已提交
135
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
136 137 138 139 140
  }

  pTsdb->mem = pMemTable;

  // unlock
H
Hongze Cheng 已提交
141
  if ((code = taosThreadRwlockUnlock(&pTsdb->rwLock))) {
H
Hongze Cheng 已提交
142
    code = TAOS_SYSTEM_ERROR(code);
H
Hongze Cheng 已提交
143
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
144 145
  }

H
Hongze Cheng 已提交
146 147
_exit:
  if (code) {
S
Shengliang Guan 已提交
148
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
149
  }
H
Hongze Cheng 已提交
150
  return code;
H
Hongze Cheng 已提交
151 152
}

H
more  
Hongze Cheng 已提交
153
int32_t tsdbCommit(STsdb *pTsdb) {
154
  if (!pTsdb) return 0;
H
Hongze Cheng 已提交
155

H
more  
Hongze Cheng 已提交
156
  int32_t    code = 0;
H
Hongze Cheng 已提交
157
  int32_t    lino = 0;
H
Hongze Cheng 已提交
158 159 160 161
  SCommitter commith;
  SMemTable *pMemTable = pTsdb->mem;

  // check
H
Hongze Cheng 已提交
162
  if (pMemTable->nRow == 0 && pMemTable->nDel == 0) {
H
Hongze Cheng 已提交
163
    taosThreadRwlockWrlock(&pTsdb->rwLock);
H
Hongze Cheng 已提交
164
    pTsdb->mem = NULL;
H
Hongze Cheng 已提交
165 166 167
    taosThreadRwlockUnlock(&pTsdb->rwLock);

    tsdbUnrefMemTable(pMemTable);
H
Hongze Cheng 已提交
168 169
    goto _exit;
  }
H
refact  
Hongze Cheng 已提交
170

H
more  
Hongze Cheng 已提交
171
  // start commit
H
more  
Hongze Cheng 已提交
172
  code = tsdbStartCommit(pTsdb, &commith);
H
Hongze Cheng 已提交
173
  TSDB_CHECK_CODE(code, lino, _exit);
H
refact  
Hongze Cheng 已提交
174

H
refact  
Hongze Cheng 已提交
175 176
  // commit impl
  code = tsdbCommitData(&commith);
H
Hongze Cheng 已提交
177
  TSDB_CHECK_CODE(code, lino, _exit);
H
refact  
Hongze Cheng 已提交
178 179

  code = tsdbCommitDel(&commith);
H
Hongze Cheng 已提交
180
  TSDB_CHECK_CODE(code, lino, _exit);
H
refact  
Hongze Cheng 已提交
181 182

  // end commit
H
more  
Hongze Cheng 已提交
183
  code = tsdbEndCommit(&commith, 0);
H
Hongze Cheng 已提交
184
  TSDB_CHECK_CODE(code, lino, _exit);
H
refact  
Hongze Cheng 已提交
185

H
Hongze Cheng 已提交
186
_exit:
H
Hongze Cheng 已提交
187 188
  if (code) {
    tsdbEndCommit(&commith, code);
S
Shengliang Guan 已提交
189
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
190
  }
H
refact  
Hongze Cheng 已提交
191 192 193
  return code;
}

H
Hongze Cheng 已提交
194
static int32_t tsdbCommitDelStart(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
195
  int32_t    code = 0;
H
Hongze Cheng 已提交
196
  int32_t    lino = 0;
H
Hongze Cheng 已提交
197 198 199
  STsdb     *pTsdb = pCommitter->pTsdb;
  SMemTable *pMemTable = pTsdb->imem;

H
Hongze Cheng 已提交
200
  if ((pCommitter->aDelIdx = taosArrayInit(0, sizeof(SDelIdx))) == NULL) {
H
Hongze Cheng 已提交
201
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
202
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
203 204
  }

H
Hongze Cheng 已提交
205
  if ((pCommitter->aDelData = taosArrayInit(0, sizeof(SDelData))) == NULL) {
H
Hongze Cheng 已提交
206
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
207
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
208 209
  }

H
Hongze Cheng 已提交
210
  if ((pCommitter->aDelIdxN = taosArrayInit(0, sizeof(SDelIdx))) == NULL) {
H
Hongze Cheng 已提交
211
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
212
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
213
  }
H
Hongze Cheng 已提交
214

H
Hongze Cheng 已提交
215
  SDelFile *pDelFileR = pCommitter->fs.pDelFile;
H
Hongze Cheng 已提交
216
  if (pDelFileR) {
H
Hongze Cheng 已提交
217
    code = tsdbDelFReaderOpen(&pCommitter->pDelFReader, pDelFileR, pTsdb);
H
Hongze Cheng 已提交
218
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
219

H
Hongze Cheng 已提交
220
    code = tsdbReadDelIdx(pCommitter->pDelFReader, pCommitter->aDelIdx);
H
Hongze Cheng 已提交
221
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
222 223
  }

H
Hongze Cheng 已提交
224
  // prepare new
H
Hongze Cheng 已提交
225 226
  SDelFile wDelFile = {.commitID = pCommitter->commitID, .size = 0, .offset = 0};
  code = tsdbDelFWriterOpen(&pCommitter->pDelFWriter, &wDelFile, pTsdb);
H
Hongze Cheng 已提交
227
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
228 229

_exit:
H
Hongze Cheng 已提交
230
  if (code) {
H
Hongze Cheng 已提交
231
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
232 233 234
  } else {
    tsdbDebug("vgId:%d, commit del start", TD_VID(pTsdb->pVnode));
  }
H
Hongze Cheng 已提交
235 236 237
  return code;
}

H
Hongze Cheng 已提交
238
static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDelIdx *pDelIdx) {
H
Hongze Cheng 已提交
239
  int32_t   code = 0;
H
Hongze Cheng 已提交
240
  int32_t   lino = 0;
H
Hongze Cheng 已提交
241
  SDelData *pDelData;
H
Hongze Cheng 已提交
242 243
  tb_uid_t  suid;
  tb_uid_t  uid;
H
Hongze Cheng 已提交
244 245

  if (pTbData) {
H
Hongze Cheng 已提交
246 247
    suid = pTbData->suid;
    uid = pTbData->uid;
H
Hongze Cheng 已提交
248

H
Hongze Cheng 已提交
249 250 251 252
    if (pTbData->pHead == NULL) {
      pTbData = NULL;
    }
  }
H
Hongze Cheng 已提交
253 254

  if (pDelIdx) {
H
Hongze Cheng 已提交
255 256 257
    suid = pDelIdx->suid;
    uid = pDelIdx->uid;

H
Hongze Cheng 已提交
258
    code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData);
H
Hongze Cheng 已提交
259
    TSDB_CHECK_CODE(code, lino, _exit);
260 261
  } else {
    taosArrayClear(pCommitter->aDelData);
H
Hongze Cheng 已提交
262 263
  }

H
Hongze Cheng 已提交
264
  if (pTbData == NULL && pDelIdx == NULL) goto _exit;
H
Hongze Cheng 已提交
265

H
Hongze Cheng 已提交
266
  SDelIdx delIdx = {.suid = suid, .uid = uid};
H
Hongze Cheng 已提交
267 268

  // memory
H
Hongze Cheng 已提交
269 270
  pDelData = pTbData ? pTbData->pHead : NULL;
  for (; pDelData; pDelData = pDelData->pNext) {
H
Hongze Cheng 已提交
271 272
    if (taosArrayPush(pCommitter->aDelData, pDelData) == NULL) {
      code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
273
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
274
    }
H
Hongze Cheng 已提交
275 276 277
  }

  // write
H
Hongze Cheng 已提交
278
  code = tsdbWriteDelData(pCommitter->pDelFWriter, pCommitter->aDelData, &delIdx);
H
Hongze Cheng 已提交
279
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
280 281

  // put delIdx
282
  if (taosArrayPush(pCommitter->aDelIdxN, &delIdx) == NULL) {
H
Hongze Cheng 已提交
283
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
284
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
285
  }
H
Hongze Cheng 已提交
286 287

_exit:
H
Hongze Cheng 已提交
288
  if (code) {
H
Hongze Cheng 已提交
289
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
290
              tstrerror(code));
H
Hongze Cheng 已提交
291
  }
H
Hongze Cheng 已提交
292 293 294
  return code;
}

H
Hongze Cheng 已提交
295 296
static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
297
  int32_t lino = 0;
H
Hongze Cheng 已提交
298
  STsdb  *pTsdb = pCommitter->pTsdb;
H
Hongze Cheng 已提交
299

H
Hongze Cheng 已提交
300
  code = tsdbWriteDelIdx(pCommitter->pDelFWriter, pCommitter->aDelIdxN);
H
Hongze Cheng 已提交
301
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
302

H
Hongze Cheng 已提交
303
  code = tsdbUpdateDelFileHdr(pCommitter->pDelFWriter);
H
Hongze Cheng 已提交
304
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
305

H
Hongze Cheng 已提交
306
  code = tsdbFSUpsertDelFile(&pCommitter->fs, &pCommitter->pDelFWriter->fDel);
H
Hongze Cheng 已提交
307
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
308

H
Hongze Cheng 已提交
309
  code = tsdbDelFWriterClose(&pCommitter->pDelFWriter, 1);
H
Hongze Cheng 已提交
310
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
311 312

  if (pCommitter->pDelFReader) {
H
Hongze Cheng 已提交
313
    code = tsdbDelFReaderClose(&pCommitter->pDelFReader);
H
Hongze Cheng 已提交
314
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
315 316
  }

H
Hongze Cheng 已提交
317 318 319 320
  taosArrayDestroy(pCommitter->aDelIdx);
  taosArrayDestroy(pCommitter->aDelData);
  taosArrayDestroy(pCommitter->aDelIdxN);

H
Hongze Cheng 已提交
321 322
_exit:
  if (code) {
H
Hongze Cheng 已提交
323
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
324
              tstrerror(code));
H
Hongze Cheng 已提交
325
  }
H
Hongze Cheng 已提交
326 327 328
  return code;
}

H
Hongze Cheng 已提交
329
int32_t tsdbUpdateTableSchema(SMeta *pMeta, int64_t suid, int64_t uid, SSkmInfo *pSkmInfo) {
H
Hongze Cheng 已提交
330
  int32_t code = 0;
H
Hongze Cheng 已提交
331
  int32_t lino = 0;
H
Hongze Cheng 已提交
332

H
Hongze Cheng 已提交
333
  if (suid) {
H
Hongze Cheng 已提交
334 335
    if (pSkmInfo->suid == suid) {
      pSkmInfo->uid = uid;
H
Hongze Cheng 已提交
336 337
      goto _exit;
    }
H
Hongze Cheng 已提交
338
  } else {
H
Hongze Cheng 已提交
339
    if (pSkmInfo->uid == uid) goto _exit;
H
Hongze Cheng 已提交
340 341
  }

H
Hongze Cheng 已提交
342 343
  pSkmInfo->suid = suid;
  pSkmInfo->uid = uid;
H
Hongze Cheng 已提交
344
  tTSchemaDestroy(pSkmInfo->pTSchema);
H
Hongze Cheng 已提交
345
  code = metaGetTbTSchemaEx(pMeta, suid, uid, -1, &pSkmInfo->pTSchema);
H
Hongze Cheng 已提交
346
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
347 348 349 350 351 352 353

_exit:
  return code;
}

static int32_t tsdbCommitterUpdateRowSchema(SCommitter *pCommitter, int64_t suid, int64_t uid, int32_t sver) {
  int32_t code = 0;
H
Hongze Cheng 已提交
354
  int32_t lino = 0;
H
Hongze Cheng 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367

  if (pCommitter->skmRow.pTSchema) {
    if (pCommitter->skmRow.suid == suid) {
      if (suid == 0) {
        if (pCommitter->skmRow.uid == uid && sver == pCommitter->skmRow.pTSchema->version) goto _exit;
      } else {
        if (sver == pCommitter->skmRow.pTSchema->version) goto _exit;
      }
    }
  }

  pCommitter->skmRow.suid = suid;
  pCommitter->skmRow.uid = uid;
H
Hongze Cheng 已提交
368
  tTSchemaDestroy(pCommitter->skmRow.pTSchema);
H
Hongze Cheng 已提交
369
  code = metaGetTbTSchemaEx(pCommitter->pTsdb->pVnode->pMeta, suid, uid, sver, &pCommitter->skmRow.pTSchema);
H
Hongze Cheng 已提交
370
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
371 372 373 374 375

_exit:
  return code;
}

H
Hongze Cheng 已提交
376 377
static int32_t tsdbCommitterNextTableData(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
378
  int32_t lino = 0;
H
Hongze Cheng 已提交
379 380 381 382 383 384 385 386

  ASSERT(pCommitter->dReader.pBlockIdx);

  pCommitter->dReader.iBlockIdx++;
  if (pCommitter->dReader.iBlockIdx < taosArrayGetSize(pCommitter->dReader.aBlockIdx)) {
    pCommitter->dReader.pBlockIdx =
        (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, pCommitter->dReader.iBlockIdx);

H
Hongze Cheng 已提交
387
    code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
H
Hongze Cheng 已提交
388
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
389 390 391 392 393 394 395 396 397 398

    ASSERT(pCommitter->dReader.mBlock.nItem > 0);
  } else {
    pCommitter->dReader.pBlockIdx = NULL;
  }

_exit:
  return code;
}

H
Hongze Cheng 已提交
399 400 401 402 403 404 405
static int32_t tDataIterCmprFn(const SRBTreeNode *n1, const SRBTreeNode *n2) {
  SDataIter *pIter1 = (SDataIter *)((uint8_t *)n1 - offsetof(SDataIter, n));
  SDataIter *pIter2 = (SDataIter *)((uint8_t *)n2 - offsetof(SDataIter, n));

  return tRowInfoCmprFn(&pIter1->r, &pIter2->r);
}

H
Hongze Cheng 已提交
406 407
static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
408
  int32_t lino = 0;
H
Hongze Cheng 已提交
409 410

  pCommitter->pIter = NULL;
H
Hongze Cheng 已提交
411
  tRBTreeCreate(&pCommitter->rbt, tDataIterCmprFn);
H
Hongze Cheng 已提交
412 413

  // memory
H
Hongze Cheng 已提交
414
  TSDBKEY    tKey = {.ts = pCommitter->minKey, .version = VERSION_MIN};
H
Hongze Cheng 已提交
415 416
  SDataIter *pIter = &pCommitter->dataIter;
  pIter->type = MEMORY_DATA_ITER;
H
Hongze Cheng 已提交
417 418 419 420 421 422 423
  pIter->iTbDataP = 0;
  for (; pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP); pIter->iTbDataP++) {
    STbData *pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, pIter->iTbDataP);
    tsdbTbDataIterOpen(pTbData, &tKey, 0, &pIter->iter);
    TSDBROW *pRow = tsdbTbDataIterGet(&pIter->iter);
    if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) {
      pCommitter->nextKey = TMIN(pCommitter->nextKey, TSDBROW_TS(pRow));
H
Hongze Cheng 已提交
424
      pRow = NULL;
H
Hongze Cheng 已提交
425 426
    }

H
Hongze Cheng 已提交
427 428
    if (pRow == NULL) continue;

H
Hongze Cheng 已提交
429 430 431 432 433
    pIter->r.suid = pTbData->suid;
    pIter->r.uid = pTbData->uid;
    pIter->r.row = *pRow;
    break;
  }
H
Hongze Cheng 已提交
434
  ASSERT(pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP));
H
Hongze Cheng 已提交
435 436 437
  tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pIter);

  // disk
H
Hongze Cheng 已提交
438
  pCommitter->toLastOnly = 0;
H
Hongze Cheng 已提交
439
  SDataFReader *pReader = pCommitter->dReader.pReader;
H
Hongze Cheng 已提交
440
  if (pReader) {
H
Hongze Cheng 已提交
441
    if (pReader->pSet->nSttF >= pCommitter->sttTrigger) {
H
Hongze Cheng 已提交
442
      int8_t iIter = 0;
H
Hongze Cheng 已提交
443
      for (int32_t iStt = 0; iStt < pReader->pSet->nSttF; iStt++) {
H
Hongze Cheng 已提交
444
        pIter = &pCommitter->aDataIter[iIter];
H
Hongze Cheng 已提交
445
        pIter->type = STT_DATA_ITER;
H
Hongze Cheng 已提交
446
        pIter->iStt = iStt;
H
Hongze Cheng 已提交
447

H
Hongze Cheng 已提交
448
        code = tsdbReadSttBlk(pCommitter->dReader.pReader, iStt, pIter->aSttBlk);
H
Hongze Cheng 已提交
449
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
450

H
Hongze Cheng 已提交
451
        if (taosArrayGetSize(pIter->aSttBlk) == 0) continue;
H
Hongze Cheng 已提交
452

H
Hongze Cheng 已提交
453 454
        pIter->iSttBlk = 0;
        SSttBlk *pSttBlk = (SSttBlk *)taosArrayGet(pIter->aSttBlk, 0);
H
Hongze Cheng 已提交
455
        code = tsdbReadSttBlockEx(pCommitter->dReader.pReader, iStt, pSttBlk, &pIter->bData);
H
Hongze Cheng 已提交
456
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
457 458 459 460 461 462 463 464 465

        pIter->iRow = 0;
        pIter->r.suid = pIter->bData.suid;
        pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[0];
        pIter->r.row = tsdbRowFromBlockData(&pIter->bData, 0);

        tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pIter);
        iIter++;
      }
H
Hongze Cheng 已提交
466
    } else {
H
Hongze Cheng 已提交
467 468 469
      for (int32_t iStt = 0; iStt < pReader->pSet->nSttF; iStt++) {
        SSttFile *pSttFile = pReader->pSet->aSttF[iStt];
        if (pSttFile->size > pSttFile->offset) {
H
Hongze Cheng 已提交
470 471 472 473
          pCommitter->toLastOnly = 1;
          break;
        }
      }
H
Hongze Cheng 已提交
474
    }
H
Hongze Cheng 已提交
475 476 477
  }

  code = tsdbNextCommitRow(pCommitter);
H
Hongze Cheng 已提交
478
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
479

H
Hongze Cheng 已提交
480 481
_exit:
  if (code) {
S
Shengliang Guan 已提交
482
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
483
              tstrerror(code));
H
Hongze Cheng 已提交
484
  }
H
Hongze Cheng 已提交
485 486 487
  return code;
}

H
Hongze Cheng 已提交
488 489
static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
  int32_t    code = 0;
H
Hongze Cheng 已提交
490
  int32_t    lino = 0;
H
Hongze Cheng 已提交
491 492
  STsdb     *pTsdb = pCommitter->pTsdb;
  SDFileSet *pRSet = NULL;
H
Hongze Cheng 已提交
493

H
Hongze Cheng 已提交
494
  // memory
H
Hongze Cheng 已提交
495 496 497
  pCommitter->commitFid = tsdbKeyFid(pCommitter->nextKey, pCommitter->minutes, pCommitter->precision);
  tsdbFidKeyRange(pCommitter->commitFid, pCommitter->minutes, pCommitter->precision, &pCommitter->minKey,
                  &pCommitter->maxKey);
498 499 500
#if 0
  ASSERT(pCommitter->minKey <= pCommitter->nextKey && pCommitter->maxKey >= pCommitter->nextKey);
#endif
H
Hongze Cheng 已提交
501
  
H
Hongze Cheng 已提交
502
  pCommitter->nextKey = TSKEY_MAX;
H
Hongze Cheng 已提交
503

H
Hongze Cheng 已提交
504
  // Reader
H
Hongze Cheng 已提交
505 506
  SDFileSet tDFileSet = {.fid = pCommitter->commitFid};
  pRSet = (SDFileSet *)taosArraySearch(pCommitter->fs.aDFileSet, &tDFileSet, tDFileSetCmprFn, TD_EQ);
H
Hongze Cheng 已提交
507
  if (pRSet) {
H
Hongze Cheng 已提交
508
    code = tsdbDataFReaderOpen(&pCommitter->dReader.pReader, pTsdb, pRSet);
H
Hongze Cheng 已提交
509
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
510

H
Hongze Cheng 已提交
511
    // data
H
Hongze Cheng 已提交
512
    code = tsdbReadBlockIdx(pCommitter->dReader.pReader, pCommitter->dReader.aBlockIdx);
H
Hongze Cheng 已提交
513
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
514

H
Hongze Cheng 已提交
515
    pCommitter->dReader.iBlockIdx = 0;
H
Hongze Cheng 已提交
516 517
    if (taosArrayGetSize(pCommitter->dReader.aBlockIdx) > 0) {
      pCommitter->dReader.pBlockIdx = (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, 0);
H
Hongze Cheng 已提交
518
      code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
H
Hongze Cheng 已提交
519
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
520 521 522
    } else {
      pCommitter->dReader.pBlockIdx = NULL;
    }
H
Hongze Cheng 已提交
523
    tBlockDataReset(&pCommitter->dReader.bData);
H
Hongze Cheng 已提交
524
  } else {
H
Hongze Cheng 已提交
525
    pCommitter->dReader.pBlockIdx = NULL;
H
Hongze Cheng 已提交
526
  }
H
Hongze Cheng 已提交
527

H
Hongze Cheng 已提交
528
  // Writer
H
Hongze Cheng 已提交
529 530 531
  SHeadFile fHead = {.commitID = pCommitter->commitID};
  SDataFile fData = {.commitID = pCommitter->commitID};
  SSmaFile  fSma = {.commitID = pCommitter->commitID};
H
Hongze Cheng 已提交
532
  SSttFile  fStt = {.commitID = pCommitter->commitID};
H
Hongze Cheng 已提交
533
  SDFileSet wSet = {.fid = pCommitter->commitFid, .pHeadF = &fHead, .pDataF = &fData, .pSmaF = &fSma};
H
Hongze Cheng 已提交
534
  if (pRSet) {
H
Hongze Cheng 已提交
535
    ASSERT(pRSet->nSttF <= pCommitter->sttTrigger);
H
Hongze Cheng 已提交
536 537
    fData = *pRSet->pDataF;
    fSma = *pRSet->pSmaF;
H
Hongze Cheng 已提交
538
    wSet.diskId = pRSet->diskId;
H
Hongze Cheng 已提交
539
    if (pRSet->nSttF < pCommitter->sttTrigger) {
H
Hongze Cheng 已提交
540 541
      for (int32_t iStt = 0; iStt < pRSet->nSttF; iStt++) {
        wSet.aSttF[iStt] = pRSet->aSttF[iStt];
H
Hongze Cheng 已提交
542
      }
H
Hongze Cheng 已提交
543
      wSet.nSttF = pRSet->nSttF + 1;
H
Hongze Cheng 已提交
544
    } else {
H
Hongze Cheng 已提交
545
      wSet.nSttF = 1;
H
Hongze Cheng 已提交
546
    }
H
Hongze Cheng 已提交
547
  } else {
H
Hongze Cheng 已提交
548
    SDiskID did = {0};
549
    tfsAllocDisk(pTsdb->pVnode->pTfs, 0, &did);
H
Hongze Cheng 已提交
550
    tfsMkdirRecurAt(pTsdb->pVnode->pTfs, pTsdb->path, did);
551
    wSet.diskId = did;
H
Hongze Cheng 已提交
552
    wSet.nSttF = 1;
H
Hongze Cheng 已提交
553
  }
H
Hongze Cheng 已提交
554
  wSet.aSttF[wSet.nSttF - 1] = &fStt;
H
Hongze Cheng 已提交
555
  code = tsdbDataFWriterOpen(&pCommitter->dWriter.pWriter, pTsdb, &wSet);
H
Hongze Cheng 已提交
556
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
557

H
Hongze Cheng 已提交
558
  taosArrayClear(pCommitter->dWriter.aBlockIdx);
H
Hongze Cheng 已提交
559
  taosArrayClear(pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
560 561
  tMapDataReset(&pCommitter->dWriter.mBlock);
  tBlockDataReset(&pCommitter->dWriter.bData);
H
compare  
Hongze Cheng 已提交
562
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
563
  tDiskDataBuilderClear(pCommitter->dWriter.pBuilder);
H
compare  
Hongze Cheng 已提交
564 565 566
#else
  tBlockDataReset(&pCommitter->dWriter.bDatal);
#endif
H
Hongze Cheng 已提交
567

H
Hongze Cheng 已提交
568 569
  // open iter
  code = tsdbOpenCommitIter(pCommitter);
H
Hongze Cheng 已提交
570
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
571

H
Hongze Cheng 已提交
572
_exit:
H
Hongze Cheng 已提交
573
  if (code) {
S
Shengliang Guan 已提交
574
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
575
  }
H
Hongze Cheng 已提交
576
  return code;
H
Hongze Cheng 已提交
577 578
}

H
Hongze Cheng 已提交
579 580
int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapData *mDataBlk, int8_t cmprAlg) {
  int32_t code = 0;
H
Hongze Cheng 已提交
581
  int32_t lino = 0;
H
Hongze Cheng 已提交
582

H
Hongze Cheng 已提交
583
  if (pBlockData->nRow == 0) return code;
H
Hongze Cheng 已提交
584

H
Hongze Cheng 已提交
585
  SDataBlk dataBlk;
H
Hongze Cheng 已提交
586
  tDataBlkReset(&dataBlk);
H
Hongze Cheng 已提交
587

H
Hongze Cheng 已提交
588
  // info
H
Hongze Cheng 已提交
589
  dataBlk.nRow += pBlockData->nRow;
H
Hongze Cheng 已提交
590 591
  for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
    TSDBKEY key = {.ts = pBlockData->aTSKEY[iRow], .version = pBlockData->aVersion[iRow]};
H
Hongze Cheng 已提交
592

H
Hongze Cheng 已提交
593
    if (iRow == 0) {
H
Hongze Cheng 已提交
594 595
      if (tsdbKeyCmprFn(&dataBlk.minKey, &key) > 0) {
        dataBlk.minKey = key;
H
Hongze Cheng 已提交
596 597 598
      }
    } else {
      if (pBlockData->aTSKEY[iRow] == pBlockData->aTSKEY[iRow - 1]) {
H
Hongze Cheng 已提交
599
        dataBlk.hasDup = 1;
H
Hongze Cheng 已提交
600 601 602
      }
    }

H
Hongze Cheng 已提交
603 604
    if (iRow == pBlockData->nRow - 1 && tsdbKeyCmprFn(&dataBlk.maxKey, &key) < 0) {
      dataBlk.maxKey = key;
H
Hongze Cheng 已提交
605 606
    }

H
Hongze Cheng 已提交
607 608
    dataBlk.minVer = TMIN(dataBlk.minVer, key.version);
    dataBlk.maxVer = TMAX(dataBlk.maxVer, key.version);
H
Hongze Cheng 已提交
609 610 611
  }

  // write
H
Hongze Cheng 已提交
612
  dataBlk.nSubBlock++;
H
Hongze Cheng 已提交
613 614
  code = tsdbWriteBlockData(pWriter, pBlockData, &dataBlk.aSubBlock[dataBlk.nSubBlock - 1],
                            ((dataBlk.nSubBlock == 1) && !dataBlk.hasDup) ? &dataBlk.smaInfo : NULL, cmprAlg, 0);
H
Hongze Cheng 已提交
615
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
616

H
Hongze Cheng 已提交
617
  // put SDataBlk
H
Hongze Cheng 已提交
618
  code = tMapDataPutItem(mDataBlk, &dataBlk, tPutDataBlk);
H
Hongze Cheng 已提交
619
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
620

H
Hongze Cheng 已提交
621
  // clear
H
Hongze Cheng 已提交
622
  tBlockDataClear(pBlockData);
H
Hongze Cheng 已提交
623

H
Hongze Cheng 已提交
624 625
_exit:
  if (code) {
H
Hongze Cheng 已提交
626
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
627
  }
H
Hongze Cheng 已提交
628 629 630
  return code;
}

H
Hongze Cheng 已提交
631 632
int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray *aSttBlk, int8_t cmprAlg) {
  int32_t code = 0;
H
Hongze Cheng 已提交
633
  int32_t lino = 0;
H
Hongze Cheng 已提交
634
  SSttBlk sstBlk;
H
Hongze Cheng 已提交
635

H
Hongze Cheng 已提交
636
  if (pBlockData->nRow == 0) return code;
H
Hongze Cheng 已提交
637

H
Hongze Cheng 已提交
638
  // info
H
Hongze Cheng 已提交
639 640 641 642 643 644
  sstBlk.suid = pBlockData->suid;
  sstBlk.nRow = pBlockData->nRow;
  sstBlk.minKey = TSKEY_MAX;
  sstBlk.maxKey = TSKEY_MIN;
  sstBlk.minVer = VERSION_MAX;
  sstBlk.maxVer = VERSION_MIN;
H
Hongze Cheng 已提交
645
  for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
H
Hongze Cheng 已提交
646 647 648 649
    sstBlk.minKey = TMIN(sstBlk.minKey, pBlockData->aTSKEY[iRow]);
    sstBlk.maxKey = TMAX(sstBlk.maxKey, pBlockData->aTSKEY[iRow]);
    sstBlk.minVer = TMIN(sstBlk.minVer, pBlockData->aVersion[iRow]);
    sstBlk.maxVer = TMAX(sstBlk.maxVer, pBlockData->aVersion[iRow]);
H
Hongze Cheng 已提交
650
  }
H
Hongze Cheng 已提交
651 652
  sstBlk.minUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[0];
  sstBlk.maxUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[pBlockData->nRow - 1];
H
Hongze Cheng 已提交
653

H
Hongze Cheng 已提交
654
  // write
H
Hongze Cheng 已提交
655
  code = tsdbWriteBlockData(pWriter, pBlockData, &sstBlk.bInfo, NULL, cmprAlg, 1);
H
Hongze Cheng 已提交
656
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
657

H
Hongze Cheng 已提交
658
  // push SSttBlk
H
Hongze Cheng 已提交
659
  if (taosArrayPush(aSttBlk, &sstBlk) == NULL) {
H
Hongze Cheng 已提交
660
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
661
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
662 663
  }

H
Hongze Cheng 已提交
664
  // clear
H
Hongze Cheng 已提交
665
  tBlockDataClear(pBlockData);
H
Hongze Cheng 已提交
666

H
Hongze Cheng 已提交
667 668
_exit:
  if (code) {
H
Hongze Cheng 已提交
669
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
670
  }
H
Hongze Cheng 已提交
671 672 673
  return code;
}

H
Hongze Cheng 已提交
674 675 676 677 678 679 680
static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilder, SArray *aSttBlk) {
  int32_t code = 0;
  int32_t lino = 0;

  if (pBuilder->nRow == 0) return code;

  // gnrt
H
Hongze Cheng 已提交
681 682 683
  const SDiskData *pDiskData;
  const SBlkInfo  *pBlkInfo;
  code = tGnrtDiskData(pBuilder, &pDiskData, &pBlkInfo);
H
Hongze Cheng 已提交
684 685
  TSDB_CHECK_CODE(code, lino, _exit);

H
Hongze Cheng 已提交
686 687 688 689 690 691
  SSttBlk sttBlk = {.suid = pBuilder->suid,
                    .minUid = pBlkInfo->minUid,
                    .maxUid = pBlkInfo->maxUid,
                    .minKey = pBlkInfo->minKey,
                    .maxKey = pBlkInfo->maxKey,
                    .minVer = pBlkInfo->minVer,
H
Hongze Cheng 已提交
692 693
                    .maxVer = pBlkInfo->maxVer,
                    .nRow = pBuilder->nRow};
H
Hongze Cheng 已提交
694
  // write
H
Hongze Cheng 已提交
695
  code = tsdbWriteDiskData(pWriter, pDiskData, &sttBlk.bInfo, NULL);
H
Hongze Cheng 已提交
696 697 698 699 700 701 702 703
  TSDB_CHECK_CODE(code, lino, _exit);

  // push
  if (taosArrayPush(aSttBlk, &sttBlk) == NULL) {
    code = TSDB_CODE_OUT_OF_MEMORY;
    TSDB_CHECK_CODE(code, lino, _exit);
  }

H
Hongze Cheng 已提交
704 705
  // clear
  tDiskDataBuilderClear(pBuilder);
H
Hongze Cheng 已提交
706 707 708

_exit:
  if (code) {
H
Hongze Cheng 已提交
709
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
710 711 712 713
  }
  return code;
}

H
Hongze Cheng 已提交
714 715
static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
716
  int32_t lino = 0;
H
Hongze Cheng 已提交
717

H
Hongze Cheng 已提交
718
  // write aBlockIdx
H
Hongze Cheng 已提交
719
  code = tsdbWriteBlockIdx(pCommitter->dWriter.pWriter, pCommitter->dWriter.aBlockIdx);
H
Hongze Cheng 已提交
720
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
721

H
Hongze Cheng 已提交
722 723
  // write aSttBlk
  code = tsdbWriteSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
724
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
725

H
Hongze Cheng 已提交
726
  // update file header
H
Hongze Cheng 已提交
727
  code = tsdbUpdateDFileSetHeader(pCommitter->dWriter.pWriter);
H
Hongze Cheng 已提交
728
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
729 730

  // upsert SDFileSet
H
Hongze Cheng 已提交
731
  code = tsdbFSUpsertFSet(&pCommitter->fs, &pCommitter->dWriter.pWriter->wSet);
H
Hongze Cheng 已提交
732
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
733 734

  // close and sync
H
Hongze Cheng 已提交
735
  code = tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 1);
H
Hongze Cheng 已提交
736
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
737

H
Hongze Cheng 已提交
738 739
  if (pCommitter->dReader.pReader) {
    code = tsdbDataFReaderClose(&pCommitter->dReader.pReader);
H
Hongze Cheng 已提交
740
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
741 742 743
  }

_exit:
H
Hongze Cheng 已提交
744
  if (code) {
S
Shengliang Guan 已提交
745
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
746
              tstrerror(code));
H
Hongze Cheng 已提交
747
  }
H
Hongze Cheng 已提交
748 749 750
  return code;
}

H
Hongze Cheng 已提交
751 752
static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) {
  int32_t code = 0;
H
Hongze Cheng 已提交
753
  int32_t lino = 0;
H
Hongze Cheng 已提交
754

H
Hongze Cheng 已提交
755
  while (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) < 0) {
H
Hongze Cheng 已提交
756
    SBlockIdx blockIdx = *pCommitter->dReader.pBlockIdx;
H
Hongze Cheng 已提交
757
    code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx);
H
Hongze Cheng 已提交
758
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
759 760 761

    if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
      code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
762
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
763 764
    }

H
Hongze Cheng 已提交
765
    code = tsdbCommitterNextTableData(pCommitter);
H
Hongze Cheng 已提交
766
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
767 768
  }

H
Hongze Cheng 已提交
769 770
_exit:
  if (code) {
S
Shengliang Guan 已提交
771
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
772
              tstrerror(code));
H
Hongze Cheng 已提交
773
  }
H
Hongze Cheng 已提交
774 775 776
  return code;
}

H
Hongze Cheng 已提交
777
static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter);
H
Hongze Cheng 已提交
778
static int32_t tsdbCommitFileData(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
779
  int32_t    code = 0;
H
Hongze Cheng 已提交
780
  int32_t    lino = 0;
H
Hongze Cheng 已提交
781 782
  STsdb     *pTsdb = pCommitter->pTsdb;
  SMemTable *pMemTable = pTsdb->imem;
H
Hongze Cheng 已提交
783 784 785

  // commit file data start
  code = tsdbCommitFileDataStart(pCommitter);
H
Hongze Cheng 已提交
786
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
787

H
Hongze Cheng 已提交
788 789
  // impl
  code = tsdbCommitFileDataImpl(pCommitter);
H
Hongze Cheng 已提交
790
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
791

H
Hongze Cheng 已提交
792 793
  // commit file data end
  code = tsdbCommitFileDataEnd(pCommitter);
H
Hongze Cheng 已提交
794
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
795

H
Hongze Cheng 已提交
796 797
_exit:
  if (code) {
S
Shengliang Guan 已提交
798
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
799 800 801
    tsdbDataFReaderClose(&pCommitter->dReader.pReader);
    tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 0);
  }
H
Hongze Cheng 已提交
802 803 804
  return code;
}

H
Hongze Cheng 已提交
805 806
// ----------------------------------------------------------------------------
static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
H
Hongze Cheng 已提交
807
  int32_t code = 0;
H
Hongze Cheng 已提交
808
  int32_t lino = 0;
H
Hongze Cheng 已提交
809

H
Hongze Cheng 已提交
810 811
  memset(pCommitter, 0, sizeof(*pCommitter));
  ASSERT(pTsdb->mem && pTsdb->imem == NULL);
H
Hongze Cheng 已提交
812

H
more  
Hongze Cheng 已提交
813
  taosThreadRwlockWrlock(&pTsdb->rwLock);
H
Hongze Cheng 已提交
814 815
  pTsdb->imem = pTsdb->mem;
  pTsdb->mem = NULL;
H
more  
Hongze Cheng 已提交
816
  taosThreadRwlockUnlock(&pTsdb->rwLock);
H
Hongze Cheng 已提交
817

H
Hongze Cheng 已提交
818
  pCommitter->pTsdb = pTsdb;
H
Hongze Cheng 已提交
819
  pCommitter->commitID = pTsdb->pVnode->state.commitID;
H
Hongze Cheng 已提交
820 821 822 823
  pCommitter->minutes = pTsdb->keepCfg.days;
  pCommitter->precision = pTsdb->keepCfg.precision;
  pCommitter->minRow = pTsdb->pVnode->config.tsdbCfg.minRows;
  pCommitter->maxRow = pTsdb->pVnode->config.tsdbCfg.maxRows;
H
Hongze Cheng 已提交
824
  pCommitter->cmprAlg = pTsdb->pVnode->config.tsdbCfg.compression;
H
Hongze Cheng 已提交
825
  pCommitter->sttTrigger = pTsdb->pVnode->config.sttTrigger;
H
Hongze Cheng 已提交
826 827 828
  pCommitter->aTbDataP = tsdbMemTableGetTbDataArray(pTsdb->imem);
  if (pCommitter->aTbDataP == NULL) {
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
829
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
830
  }
H
Hongze Cheng 已提交
831
  code = tsdbFSCopy(pTsdb, &pCommitter->fs);
H
Hongze Cheng 已提交
832
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
833

H
Hongze Cheng 已提交
834 835
_exit:
  if (code) {
S
Shengliang Guan 已提交
836
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
837
  }
H
Hongze Cheng 已提交
838 839 840
  return code;
}

H
Hongze Cheng 已提交
841 842
static int32_t tsdbCommitDataStart(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
843
  int32_t lino = 0;
H
Hongze Cheng 已提交
844

H
Hongze Cheng 已提交
845
  // reader
H
Hongze Cheng 已提交
846 847
  pCommitter->dReader.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
  if (pCommitter->dReader.aBlockIdx == NULL) {
H
Hongze Cheng 已提交
848
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
849
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
850 851
  }

H
Hongze Cheng 已提交
852
  code = tBlockDataCreate(&pCommitter->dReader.bData);
H
Hongze Cheng 已提交
853
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
854

H
Hongze Cheng 已提交
855
  // merger
H
Hongze Cheng 已提交
856
  for (int32_t iStt = 0; iStt < TSDB_MAX_STT_TRIGGER; iStt++) {
H
Hongze Cheng 已提交
857 858 859
    SDataIter *pIter = &pCommitter->aDataIter[iStt];
    pIter->aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
    if (pIter->aSttBlk == NULL) {
H
Hongze Cheng 已提交
860
      code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
861
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
862 863 864
    }

    code = tBlockDataCreate(&pIter->bData);
H
Hongze Cheng 已提交
865
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
866 867 868
  }

  // writer
H
Hongze Cheng 已提交
869 870 871
  pCommitter->dWriter.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
  if (pCommitter->dWriter.aBlockIdx == NULL) {
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
872
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
873 874
  }

H
Hongze Cheng 已提交
875 876
  pCommitter->dWriter.aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
  if (pCommitter->dWriter.aSttBlk == NULL) {
H
Hongze Cheng 已提交
877
    code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
878
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
879 880
  }

H
Hongze Cheng 已提交
881
  code = tBlockDataCreate(&pCommitter->dWriter.bData);
H
Hongze Cheng 已提交
882
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
883

H
compare  
Hongze Cheng 已提交
884
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
885
  code = tDiskDataBuilderCreate(&pCommitter->dWriter.pBuilder);
H
compare  
Hongze Cheng 已提交
886 887 888
#else
  code = tBlockDataCreate(&pCommitter->dWriter.bDatal);
#endif
H
Hongze Cheng 已提交
889
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
890

H
Hongze Cheng 已提交
891
_exit:
H
Hongze Cheng 已提交
892
  if (code) {
S
Shengliang Guan 已提交
893
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
894
              tstrerror(code));
H
Hongze Cheng 已提交
895
  }
H
Hongze Cheng 已提交
896 897 898 899
  return code;
}

static void tsdbCommitDataEnd(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
900
  // reader
H
Hongze Cheng 已提交
901 902
  taosArrayDestroy(pCommitter->dReader.aBlockIdx);
  tMapDataClear(&pCommitter->dReader.mBlock);
H
Hongze Cheng 已提交
903
  tBlockDataDestroy(&pCommitter->dReader.bData, 1);
H
Hongze Cheng 已提交
904

H
Hongze Cheng 已提交
905
  // merger
H
Hongze Cheng 已提交
906
  for (int32_t iStt = 0; iStt < TSDB_MAX_STT_TRIGGER; iStt++) {
H
Hongze Cheng 已提交
907 908
    SDataIter *pIter = &pCommitter->aDataIter[iStt];
    taosArrayDestroy(pIter->aSttBlk);
H
Hongze Cheng 已提交
909 910 911 912
    tBlockDataDestroy(&pIter->bData, 1);
  }

  // writer
H
Hongze Cheng 已提交
913
  taosArrayDestroy(pCommitter->dWriter.aBlockIdx);
H
Hongze Cheng 已提交
914
  taosArrayDestroy(pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
915
  tMapDataClear(&pCommitter->dWriter.mBlock);
H
Hongze Cheng 已提交
916
  tBlockDataDestroy(&pCommitter->dWriter.bData, 1);
H
compare  
Hongze Cheng 已提交
917
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
918
  tDiskDataBuilderDestroy(pCommitter->dWriter.pBuilder);
H
compare  
Hongze Cheng 已提交
919 920 921
#else
  tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1);
#endif
H
Hongze Cheng 已提交
922 923
  tTSchemaDestroy(pCommitter->skmTable.pTSchema);
  tTSchemaDestroy(pCommitter->skmRow.pTSchema);
H
Hongze Cheng 已提交
924 925
}

H
Hongze Cheng 已提交
926
static int32_t tsdbCommitData(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
927 928 929
  int32_t code = 0;
  int32_t lino = 0;

H
Hongze Cheng 已提交
930 931
  STsdb     *pTsdb = pCommitter->pTsdb;
  SMemTable *pMemTable = pTsdb->imem;
H
Hongze Cheng 已提交
932

H
Hongze Cheng 已提交
933
  // check
H
Hongze Cheng 已提交
934
  if (pMemTable->nRow == 0) goto _exit;
H
Hongze Cheng 已提交
935

H
Hongze Cheng 已提交
936 937
  // start ====================
  code = tsdbCommitDataStart(pCommitter);
H
Hongze Cheng 已提交
938
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
939 940 941

  // impl ====================
  pCommitter->nextKey = pMemTable->minKey;
H
Hongze Cheng 已提交
942 943
  while (pCommitter->nextKey < TSKEY_MAX) {
    code = tsdbCommitFileData(pCommitter);
H
Hongze Cheng 已提交
944
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
945
  }
H
Hongze Cheng 已提交
946

H
Hongze Cheng 已提交
947 948 949
  // end ====================
  tsdbCommitDataEnd(pCommitter);

H
Hongze Cheng 已提交
950
_exit:
H
Hongze Cheng 已提交
951
  if (code) {
S
Shengliang Guan 已提交
952
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
953
  }
H
Hongze Cheng 已提交
954 955
  return code;
}
H
Hongze Cheng 已提交
956

H
Hongze Cheng 已提交
957
static int32_t tsdbCommitDel(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
958 959 960
  int32_t code = 0;
  int32_t lino = 0;

H
Hongze Cheng 已提交
961 962
  STsdb     *pTsdb = pCommitter->pTsdb;
  SMemTable *pMemTable = pTsdb->imem;
H
Hongze Cheng 已提交
963

H
Hongze Cheng 已提交
964 965
  if (pMemTable->nDel == 0) {
    goto _exit;
H
Hongze Cheng 已提交
966
  }
H
Hongze Cheng 已提交
967

H
Hongze Cheng 已提交
968 969 970
  // start
  code = tsdbCommitDelStart(pCommitter);
  if (code) {
H
Hongze Cheng 已提交
971
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
972
  }
H
Hongze Cheng 已提交
973

H
Hongze Cheng 已提交
974
  // impl
H
Hongze Cheng 已提交
975 976 977
  int32_t  iDelIdx = 0;
  int32_t  nDelIdx = taosArrayGetSize(pCommitter->aDelIdx);
  int32_t  iTbData = 0;
H
Hongze Cheng 已提交
978
  int32_t  nTbData = taosArrayGetSize(pCommitter->aTbDataP);
H
Hongze Cheng 已提交
979 980 981 982 983
  STbData *pTbData;
  SDelIdx *pDelIdx;

  ASSERT(nTbData > 0);

H
Hongze Cheng 已提交
984
  pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData);
H
Hongze Cheng 已提交
985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
  pDelIdx = (iDelIdx < nDelIdx) ? (SDelIdx *)taosArrayGet(pCommitter->aDelIdx, iDelIdx) : NULL;
  while (true) {
    if (pTbData == NULL && pDelIdx == NULL) break;

    if (pTbData && pDelIdx) {
      int32_t c = tTABLEIDCmprFn(pTbData, pDelIdx);

      if (c == 0) {
        goto _commit_mem_and_disk_del;
      } else if (c < 0) {
        goto _commit_mem_del;
      } else {
        goto _commit_disk_del;
      }
    } else if (pTbData) {
      goto _commit_mem_del;
    } else {
      goto _commit_disk_del;
    }

  _commit_mem_del:
    code = tsdbCommitTableDel(pCommitter, pTbData, NULL);
H
Hongze Cheng 已提交
1007
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1008 1009

    iTbData++;
H
Hongze Cheng 已提交
1010
    pTbData = (iTbData < nTbData) ? (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData) : NULL;
H
Hongze Cheng 已提交
1011 1012 1013 1014
    continue;

  _commit_disk_del:
    code = tsdbCommitTableDel(pCommitter, NULL, pDelIdx);
H
Hongze Cheng 已提交
1015
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1016 1017 1018 1019 1020 1021 1022

    iDelIdx++;
    pDelIdx = (iDelIdx < nDelIdx) ? (SDelIdx *)taosArrayGet(pCommitter->aDelIdx, iDelIdx) : NULL;
    continue;

  _commit_mem_and_disk_del:
    code = tsdbCommitTableDel(pCommitter, pTbData, pDelIdx);
H
Hongze Cheng 已提交
1023
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1024 1025

    iTbData++;
H
Hongze Cheng 已提交
1026
    pTbData = (iTbData < nTbData) ? (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData) : NULL;
H
Hongze Cheng 已提交
1027 1028 1029
    iDelIdx++;
    pDelIdx = (iDelIdx < nDelIdx) ? (SDelIdx *)taosArrayGet(pCommitter->aDelIdx, iDelIdx) : NULL;
    continue;
H
Hongze Cheng 已提交
1030
  }
H
Hongze Cheng 已提交
1031

H
Hongze Cheng 已提交
1032 1033
  // end
  code = tsdbCommitDelEnd(pCommitter);
H
Hongze Cheng 已提交
1034
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1035

H
Hongze Cheng 已提交
1036
_exit:
H
Hongze Cheng 已提交
1037
  if (code) {
S
Shengliang Guan 已提交
1038
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
1039
  } else {
S
Shengliang Guan 已提交
1040
    tsdbDebug("vgId:%d, commit del done, nDel:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nDel);
H
Hongze Cheng 已提交
1041
  }
H
Hongze Cheng 已提交
1042
  return code;
H
Hongze Cheng 已提交
1043 1044
}

H
Hongze Cheng 已提交
1045
static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) {
H
Hongze Cheng 已提交
1046 1047
  int32_t code = 0;
  int32_t lino = 0;
H
Hongze Cheng 已提交
1048
  STsdb  *pTsdb = pCommitter->pTsdb;
H
Hongze Cheng 已提交
1049

H
Hongze Cheng 已提交
1050 1051 1052 1053 1054
  if (eno) {
    code = eno;
    TSDB_CHECK_CODE(code, lino, _exit);
  } else {
    code = tsdbFSPrepareCommit(pCommitter->pTsdb, &pCommitter->fs);
H
Hongze Cheng 已提交
1055
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1056 1057
  }

H
Hongze Cheng 已提交
1058
_exit:
H
Hongze Cheng 已提交
1059
  tsdbFSDestroy(&pCommitter->fs);
H
Hongze Cheng 已提交
1060
  taosArrayDestroy(pCommitter->aTbDataP);
H
Hongze Cheng 已提交
1061
  pCommitter->aTbDataP = NULL;
H
Hongze Cheng 已提交
1062
  if (code || eno) {
S
Shengliang Guan 已提交
1063
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
1064
  } else {
S
Shengliang Guan 已提交
1065
    tsdbInfo("vgId:%d, tsdb end commit", TD_VID(pTsdb->pVnode));
H
Hongze Cheng 已提交
1066
  }
H
Hongze Cheng 已提交
1067 1068
  return code;
}
H
Hongze Cheng 已提交
1069

H
Hongze Cheng 已提交
1070
// ================================================================================
H
Hongze Cheng 已提交
1071

H
Hongze Cheng 已提交
1072 1073
static FORCE_INLINE SRowInfo *tsdbGetCommitRow(SCommitter *pCommitter) {
  return (pCommitter->pIter) ? &pCommitter->pIter->r : NULL;
H
Hongze Cheng 已提交
1074 1075
}

H
Hongze Cheng 已提交
1076
static int32_t tsdbNextCommitRow(SCommitter *pCommitter) {
H
Hongze Cheng 已提交
1077
  int32_t code = 0;
H
Hongze Cheng 已提交
1078
  int32_t lino = 0;
H
Hongze Cheng 已提交
1079 1080 1081

  if (pCommitter->pIter) {
    SDataIter *pIter = pCommitter->pIter;
H
Hongze Cheng 已提交
1082
    if (pCommitter->pIter->type == MEMORY_DATA_ITER) {  // memory
H
Hongze Cheng 已提交
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
      tsdbTbDataIterNext(&pIter->iter);
      TSDBROW *pRow = tsdbTbDataIterGet(&pIter->iter);
      while (true) {
        if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) {
          pCommitter->nextKey = TMIN(pCommitter->nextKey, TSDBROW_TS(pRow));
          pRow = NULL;
        }

        if (pRow) {
          pIter->r.suid = pIter->iter.pTbData->suid;
          pIter->r.uid = pIter->iter.pTbData->uid;
          pIter->r.row = *pRow;
          break;
        }

        pIter->iTbDataP++;
H
Hongze Cheng 已提交
1099 1100
        if (pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP)) {
          STbData *pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, pIter->iTbDataP);
H
Hongze Cheng 已提交
1101 1102 1103 1104 1105 1106 1107 1108 1109
          TSDBKEY  keyFrom = {.ts = pCommitter->minKey, .version = VERSION_MIN};
          tsdbTbDataIterOpen(pTbData, &keyFrom, 0, &pIter->iter);
          pRow = tsdbTbDataIterGet(&pIter->iter);
          continue;
        } else {
          pCommitter->pIter = NULL;
          break;
        }
      }
H
Hongze Cheng 已提交
1110
    } else if (pCommitter->pIter->type == STT_DATA_ITER) {  // last file
H
Hongze Cheng 已提交
1111 1112 1113 1114 1115
      pIter->iRow++;
      if (pIter->iRow < pIter->bData.nRow) {
        pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow];
        pIter->r.row = tsdbRowFromBlockData(&pIter->bData, pIter->iRow);
      } else {
H
Hongze Cheng 已提交
1116 1117 1118
        pIter->iSttBlk++;
        if (pIter->iSttBlk < taosArrayGetSize(pIter->aSttBlk)) {
          SSttBlk *pSttBlk = (SSttBlk *)taosArrayGet(pIter->aSttBlk, pIter->iSttBlk);
H
Hongze Cheng 已提交
1119

H
Hongze Cheng 已提交
1120
          code = tsdbReadSttBlockEx(pCommitter->dReader.pReader, pIter->iStt, pSttBlk, &pIter->bData);
H
Hongze Cheng 已提交
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155
          if (code) goto _exit;

          pIter->iRow = 0;
          pIter->r.suid = pIter->bData.suid;
          pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[0];
          pIter->r.row = tsdbRowFromBlockData(&pIter->bData, 0);
        } else {
          pCommitter->pIter = NULL;
        }
      }
    } else {
      ASSERT(0);
    }

    // compare with min in RB Tree
    pIter = (SDataIter *)tRBTreeMin(&pCommitter->rbt);
    if (pCommitter->pIter && pIter) {
      int32_t c = tRowInfoCmprFn(&pCommitter->pIter->r, &pIter->r);
      if (c > 0) {
        tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pCommitter->pIter);
        pCommitter->pIter = NULL;
      } else {
        ASSERT(c);
      }
    }
  }

  if (pCommitter->pIter == NULL) {
    pCommitter->pIter = (SDataIter *)tRBTreeMin(&pCommitter->rbt);
    if (pCommitter->pIter) {
      tRBTreeDrop(&pCommitter->rbt, (SRBTreeNode *)pCommitter->pIter);
    }
  }

_exit:
H
Hongze Cheng 已提交
1156
  if (code) {
S
Shengliang Guan 已提交
1157
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1158
              tstrerror(code));
H
Hongze Cheng 已提交
1159
  }
H
Hongze Cheng 已提交
1160 1161 1162
  return code;
}

H
Hongze Cheng 已提交
1163
static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) {
H
Hongze Cheng 已提交
1164 1165 1166
  int32_t code = 0;
  int32_t lino = 0;

H
Hongze Cheng 已提交
1167 1168 1169 1170 1171 1172 1173 1174
  SBlockData *pBlockData = &pCommitter->dWriter.bData;
  SRowInfo   *pRowInfo = tsdbGetCommitRow(pCommitter);
  TABLEID     id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid};

  tBlockDataClear(pBlockData);
  while (pRowInfo) {
    ASSERT(pRowInfo->row.type == 0);
    code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row));
H
Hongze Cheng 已提交
1175
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1176 1177

    code = tBlockDataAppendRow(pBlockData, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid);
H
Hongze Cheng 已提交
1178
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1179 1180

    code = tsdbNextCommitRow(pCommitter);
H
Hongze Cheng 已提交
1181
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1182 1183 1184 1185 1186 1187 1188

    pRowInfo = tsdbGetCommitRow(pCommitter);
    if (pRowInfo) {
      if (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid) {
        pRowInfo = NULL;
      } else {
        TSDBKEY tKey = TSDBROW_KEY(&pRowInfo->row);
H
Hongze Cheng 已提交
1189
        if (tsdbKeyCmprFn(&tKey, &pDataBlk->minKey) >= 0) pRowInfo = NULL;
H
Hongze Cheng 已提交
1190 1191 1192
      }
    }

H
Hongze Cheng 已提交
1193
    if (pBlockData->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1194 1195
      code =
          tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1196
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1197 1198 1199
    }
  }

H
Hongze Cheng 已提交
1200
  code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1201
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1202

H
Hongze Cheng 已提交
1203 1204
_exit:
  if (code) {
S
Shengliang Guan 已提交
1205
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1206
              tstrerror(code));
H
Hongze Cheng 已提交
1207
  }
H
Hongze Cheng 已提交
1208 1209 1210
  return code;
}

H
Hongze Cheng 已提交
1211
static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) {
H
Hongze Cheng 已提交
1212 1213 1214
  int32_t code = 0;
  int32_t lino = 0;

H
Hongze Cheng 已提交
1215 1216 1217 1218 1219
  SRowInfo   *pRowInfo = tsdbGetCommitRow(pCommitter);
  TABLEID     id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid};
  SBlockData *pBDataR = &pCommitter->dReader.bData;
  SBlockData *pBDataW = &pCommitter->dWriter.bData;

H
Hongze Cheng 已提交
1220
  code = tsdbReadDataBlock(pCommitter->dReader.pReader, pDataBlk, pBDataR);
H
Hongze Cheng 已提交
1221
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231

  tBlockDataClear(pBDataW);
  int32_t  iRow = 0;
  TSDBROW  row = tsdbRowFromBlockData(pBDataR, 0);
  TSDBROW *pRow = &row;

  while (pRow && pRowInfo) {
    int32_t c = tsdbRowCmprFn(pRow, &pRowInfo->row);
    if (c < 0) {
      code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid);
H
Hongze Cheng 已提交
1232
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242

      iRow++;
      if (iRow < pBDataR->nRow) {
        row = tsdbRowFromBlockData(pBDataR, iRow);
      } else {
        pRow = NULL;
      }
    } else if (c > 0) {
      ASSERT(pRowInfo->row.type == 0);
      code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row));
H
Hongze Cheng 已提交
1243
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1244 1245

      code = tBlockDataAppendRow(pBDataW, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid);
H
Hongze Cheng 已提交
1246
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1247 1248

      code = tsdbNextCommitRow(pCommitter);
H
Hongze Cheng 已提交
1249
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1250 1251 1252 1253 1254 1255 1256

      pRowInfo = tsdbGetCommitRow(pCommitter);
      if (pRowInfo) {
        if (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid) {
          pRowInfo = NULL;
        } else {
          TSDBKEY tKey = TSDBROW_KEY(&pRowInfo->row);
H
Hongze Cheng 已提交
1257
          if (tsdbKeyCmprFn(&tKey, &pDataBlk->maxKey) > 0) pRowInfo = NULL;
H
Hongze Cheng 已提交
1258 1259 1260 1261 1262 1263
        }
      }
    } else {
      ASSERT(0);
    }

H
Hongze Cheng 已提交
1264
    if (pBDataW->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1265
      code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1266
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1267 1268 1269 1270 1271
    }
  }

  while (pRow) {
    code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid);
H
Hongze Cheng 已提交
1272
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1273 1274 1275 1276 1277 1278 1279 1280

    iRow++;
    if (iRow < pBDataR->nRow) {
      row = tsdbRowFromBlockData(pBDataR, iRow);
    } else {
      pRow = NULL;
    }

H
Hongze Cheng 已提交
1281
    if (pBDataW->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1282
      code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1283
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1284 1285 1286
    }
  }

H
Hongze Cheng 已提交
1287
  code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1288
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1289

H
Hongze Cheng 已提交
1290 1291
_exit:
  if (code) {
S
Shengliang Guan 已提交
1292
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1293
              tstrerror(code));
H
Hongze Cheng 已提交
1294
  }
H
Hongze Cheng 已提交
1295 1296 1297
  return code;
}

H
Hongze Cheng 已提交
1298
static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) {
H
Hongze Cheng 已提交
1299 1300 1301
  int32_t code = 0;
  int32_t lino = 0;

H
Hongze Cheng 已提交
1302 1303 1304 1305 1306
  SBlockIdx *pBlockIdx = pCommitter->dReader.pBlockIdx;

  ASSERT(pBlockIdx == NULL || tTABLEIDCmprFn(pBlockIdx, &id) >= 0);
  if (pBlockIdx && pBlockIdx->suid == id.suid && pBlockIdx->uid == id.uid) {
    int32_t   iBlock = 0;
H
Hongze Cheng 已提交
1307 1308
    SDataBlk  block;
    SDataBlk *pDataBlk = &block;
H
Hongze Cheng 已提交
1309 1310 1311 1312
    SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter);

    ASSERT(pRowInfo->suid == id.suid && pRowInfo->uid == id.uid);

H
Hongze Cheng 已提交
1313 1314 1315
    tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk);
    while (pDataBlk && pRowInfo) {
      SDataBlk tBlock = {.minKey = TSDBROW_KEY(&pRowInfo->row), .maxKey = TSDBROW_KEY(&pRowInfo->row)};
H
Hongze Cheng 已提交
1316
      int32_t  c = tDataBlkCmprFn(pDataBlk, &tBlock);
H
Hongze Cheng 已提交
1317 1318

      if (c < 0) {
H
Hongze Cheng 已提交
1319
        code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk);
H
Hongze Cheng 已提交
1320
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1321 1322 1323

        iBlock++;
        if (iBlock < pCommitter->dReader.mBlock.nItem) {
H
Hongze Cheng 已提交
1324
          tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk);
H
Hongze Cheng 已提交
1325
        } else {
H
Hongze Cheng 已提交
1326
          pDataBlk = NULL;
H
Hongze Cheng 已提交
1327 1328
        }
      } else if (c > 0) {
H
Hongze Cheng 已提交
1329
        code = tsdbCommitAheadBlock(pCommitter, pDataBlk);
H
Hongze Cheng 已提交
1330
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1331 1332 1333

        pRowInfo = tsdbGetCommitRow(pCommitter);
        if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) pRowInfo = NULL;
H
Hongze Cheng 已提交
1334
      } else {
H
Hongze Cheng 已提交
1335
        code = tsdbCommitMergeBlock(pCommitter, pDataBlk);
H
Hongze Cheng 已提交
1336
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1337 1338 1339

        iBlock++;
        if (iBlock < pCommitter->dReader.mBlock.nItem) {
H
Hongze Cheng 已提交
1340
          tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk);
H
Hongze Cheng 已提交
1341
        } else {
H
Hongze Cheng 已提交
1342
          pDataBlk = NULL;
H
Hongze Cheng 已提交
1343 1344 1345
        }
        pRowInfo = tsdbGetCommitRow(pCommitter);
        if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) pRowInfo = NULL;
H
Hongze Cheng 已提交
1346 1347 1348
      }
    }

H
Hongze Cheng 已提交
1349 1350
    while (pDataBlk) {
      code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk);
H
Hongze Cheng 已提交
1351
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1352 1353 1354

      iBlock++;
      if (iBlock < pCommitter->dReader.mBlock.nItem) {
H
Hongze Cheng 已提交
1355
        tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk);
H
Hongze Cheng 已提交
1356
      } else {
H
Hongze Cheng 已提交
1357
        pDataBlk = NULL;
H
Hongze Cheng 已提交
1358 1359
      }
    }
H
Hongze Cheng 已提交
1360 1361

    code = tsdbCommitterNextTableData(pCommitter);
H
Hongze Cheng 已提交
1362
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1363 1364 1365
  }

_exit:
H
Hongze Cheng 已提交
1366
  if (code) {
S
Shengliang Guan 已提交
1367
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1368
              tstrerror(code));
H
Hongze Cheng 已提交
1369
  }
H
Hongze Cheng 已提交
1370 1371 1372
  return code;
}

H
Hongze Cheng 已提交
1373
static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) {
H
Hongze Cheng 已提交
1374
  int32_t code = 0;
H
Hongze Cheng 已提交
1375
  int32_t lino = 0;
H
Hongze Cheng 已提交
1376

H
compare  
Hongze Cheng 已提交
1377
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
1378 1379 1380
  SDiskDataBuilder *pBuilder = pCommitter->dWriter.pBuilder;
  if (pBuilder->suid || pBuilder->uid) {
    if (!TABLE_SAME_SCHEMA(pBuilder->suid, pBuilder->uid, id.suid, id.uid)) {
H
Hongze Cheng 已提交
1381
      code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pBuilder, pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
1382
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1383 1384

      tDiskDataBuilderClear(pBuilder);
H
Hongze Cheng 已提交
1385 1386 1387
    }
  }

H
Hongze Cheng 已提交
1388
  if (!pBuilder->suid && !pBuilder->uid) {
H
Hongze Cheng 已提交
1389 1390
    ASSERT(pCommitter->skmTable.suid == id.suid);
    ASSERT(pCommitter->skmTable.uid == id.uid);
H
Hongze Cheng 已提交
1391
    code = tDiskDataBuilderInit(pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0);
H
Hongze Cheng 已提交
1392
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1393
  }
H
compare  
Hongze Cheng 已提交
1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
#else
  SBlockData *pBData = &pCommitter->dWriter.bDatal;
  if (pBData->suid || pBData->uid) {
    if (!TABLE_SAME_SCHEMA(pBData->suid, pBData->uid, id.suid, id.uid)) {
      code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg);
      TSDB_CHECK_CODE(code, lino, _exit);

      tBlockDataReset(pBData);
    }
  }

  if (!pBData->suid && !pBData->uid) {
    ASSERT(pCommitter->skmTable.suid == id.suid);
    ASSERT(pCommitter->skmTable.uid == id.uid);
    TABLEID tid = {.suid = id.suid, .uid = id.suid ? 0 : id.uid};
    code = tBlockDataInit(pBData, &tid, pCommitter->skmTable.pTSchema, NULL, 0);
    TSDB_CHECK_CODE(code, lino, _exit);
  }
#endif
H
Hongze Cheng 已提交
1413

H
Hongze Cheng 已提交
1414
_exit:
H
Hongze Cheng 已提交
1415
  if (code) {
S
Shengliang Guan 已提交
1416
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1417
              tstrerror(code));
H
Hongze Cheng 已提交
1418
  }
H
Hongze Cheng 已提交
1419 1420 1421 1422 1423
  return code;
}

static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
1424
  int32_t lino = 0;
H
Hongze Cheng 已提交
1425 1426

  SBlockData *pBData = &pCommitter->dWriter.bData;
H
Hongze Cheng 已提交
1427
  TABLEID     id = {.suid = pBData->suid, .uid = pBData->uid};
H
Hongze Cheng 已提交
1428

H
Hongze Cheng 已提交
1429
  code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id);
H
Hongze Cheng 已提交
1430
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1431

H
Hongze Cheng 已提交
1432 1433
  for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) {
    TSDBROW row = tsdbRowFromBlockData(pBData, iRow);
H
Hongze Cheng 已提交
1434

H
compare  
Hongze Cheng 已提交
1435
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
1436
    code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &row, NULL, &id);
H
Hongze Cheng 已提交
1437
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1438

H
Hongze Cheng 已提交
1439
    if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1440
      code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
1441
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1442 1443 1444

      code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id);
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1445
    }
H
compare  
Hongze Cheng 已提交
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455
#else
    code = tBlockDataAppendRow(&pCommitter->dWriter.bDatal, &row, NULL, id.uid);
    TSDB_CHECK_CODE(code, lino, _exit);

    if (pCommitter->dWriter.bDatal.nRow >= pCommitter->maxRow) {
      code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
                               pCommitter->cmprAlg);
      TSDB_CHECK_CODE(code, lino, _exit);
    }
#endif
H
Hongze Cheng 已提交
1456 1457
  }

H
Hongze Cheng 已提交
1458 1459
_exit:
  if (code) {
S
Shengliang Guan 已提交
1460
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1461
              tstrerror(code));
H
Hongze Cheng 已提交
1462
  }
H
Hongze Cheng 已提交
1463 1464 1465
  return code;
}

H
Hongze Cheng 已提交
1466
static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) {
H
Hongze Cheng 已提交
1467
  int32_t code = 0;
H
Hongze Cheng 已提交
1468
  int32_t lino = 0;
H
Hongze Cheng 已提交
1469

H
Hongze Cheng 已提交
1470
  SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter);
H
Hongze Cheng 已提交
1471 1472 1473 1474
  if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) {
    pRowInfo = NULL;
  }

H
Hongze Cheng 已提交
1475
  if (pRowInfo == NULL) goto _exit;
H
Hongze Cheng 已提交
1476

H
Hongze Cheng 已提交
1477
  if (pCommitter->toLastOnly) {
H
Hongze Cheng 已提交
1478 1479
    code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id);
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1480

H
Hongze Cheng 已提交
1481 1482 1483 1484 1485 1486 1487 1488
    while (pRowInfo) {
      STSchema *pTSchema = NULL;
      if (pRowInfo->row.type == 0) {
        code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row));
        TSDB_CHECK_CODE(code, lino, _exit);
        pTSchema = pCommitter->skmRow.pTSchema;
      }

H
compare  
Hongze Cheng 已提交
1489
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
1490
      code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &pRowInfo->row, pTSchema, &id);
H
compare  
Hongze Cheng 已提交
1491 1492 1493
#else
      code = tBlockDataAppendRow(&pCommitter->dWriter.bDatal, &pRowInfo->row, pTSchema, id.uid);
#endif
H
Hongze Cheng 已提交
1494
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1495

H
Hongze Cheng 已提交
1496 1497
      code = tsdbNextCommitRow(pCommitter);
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1498

H
Hongze Cheng 已提交
1499 1500 1501 1502
      pRowInfo = tsdbGetCommitRow(pCommitter);
      if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) {
        pRowInfo = NULL;
      }
H
Hongze Cheng 已提交
1503

H
compare  
Hongze Cheng 已提交
1504
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
1505
      if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1506
        code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk);
H
Hongze Cheng 已提交
1507
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1508 1509 1510

        code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id);
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1511
      }
H
compare  
Hongze Cheng 已提交
1512
#else
1513
      if (pCommitter->dWriter.bDatal.nRow >= pCommitter->maxRow) {
H
compare  
Hongze Cheng 已提交
1514 1515 1516 1517 1518
        code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
                                 pCommitter->cmprAlg);
        TSDB_CHECK_CODE(code, lino, _exit);
      }
#endif
H
Hongze Cheng 已提交
1519
    }
H
Hongze Cheng 已提交
1520 1521 1522
  } else {
    SBlockData *pBData = &pCommitter->dWriter.bData;
    ASSERT(pBData->nRow == 0);
H
Hongze Cheng 已提交
1523

H
Hongze Cheng 已提交
1524 1525 1526 1527
    while (pRowInfo) {
      STSchema *pTSchema = NULL;
      if (pRowInfo->row.type == 0) {
        code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row));
H
Hongze Cheng 已提交
1528
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543
        pTSchema = pCommitter->skmRow.pTSchema;
      }

      code = tBlockDataAppendRow(pBData, &pRowInfo->row, pTSchema, id.uid);
      TSDB_CHECK_CODE(code, lino, _exit);

      code = tsdbNextCommitRow(pCommitter);
      TSDB_CHECK_CODE(code, lino, _exit);

      pRowInfo = tsdbGetCommitRow(pCommitter);
      if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) {
        pRowInfo = NULL;
      }

      if (pBData->nRow >= pCommitter->maxRow) {
H
Hongze Cheng 已提交
1544 1545
        code =
            tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
H
Hongze Cheng 已提交
1546
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1547
      }
H
Hongze Cheng 已提交
1548 1549
    }

H
Hongze Cheng 已提交
1550 1551 1552 1553 1554 1555 1556 1557 1558
    if (pBData->nRow) {
      if (pBData->nRow > pCommitter->minRow) {
        code =
            tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
        TSDB_CHECK_CODE(code, lino, _exit);
      } else {
        code = tsdbAppendLastBlock(pCommitter);
        TSDB_CHECK_CODE(code, lino, _exit);
      }
H
Hongze Cheng 已提交
1559 1560 1561
    }
  }

H
Hongze Cheng 已提交
1562
_exit:
H
Hongze Cheng 已提交
1563
  if (code) {
S
Shengliang Guan 已提交
1564
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1565
              tstrerror(code));
H
Hongze Cheng 已提交
1566
  }
H
Hongze Cheng 已提交
1567 1568 1569
  return code;
}

H
Hongze Cheng 已提交
1570 1571
static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) {
  int32_t code = 0;
H
Hongze Cheng 已提交
1572
  int32_t lino = 0;
H
Hongze Cheng 已提交
1573

H
Hongze Cheng 已提交
1574
  SRowInfo *pRowInfo;
H
Hongze Cheng 已提交
1575
  TABLEID   id = {0};
H
Hongze Cheng 已提交
1576
  while ((pRowInfo = tsdbGetCommitRow(pCommitter)) != NULL) {
H
Hongze Cheng 已提交
1577 1578 1579
    ASSERT(pRowInfo->suid != id.suid || pRowInfo->uid != id.uid);
    id.suid = pRowInfo->suid;
    id.uid = pRowInfo->uid;
H
Hongze Cheng 已提交
1580

H
Hongze Cheng 已提交
1581
    code = tsdbMoveCommitData(pCommitter, id);
H
Hongze Cheng 已提交
1582
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1583 1584

    // start
H
Hongze Cheng 已提交
1585
    tMapDataReset(&pCommitter->dWriter.mBlock);
H
Hongze Cheng 已提交
1586 1587

    // impl
H
Hongze Cheng 已提交
1588
    code = tsdbUpdateTableSchema(pCommitter->pTsdb->pVnode->pMeta, id.suid, id.uid, &pCommitter->skmTable);
H
Hongze Cheng 已提交
1589
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1590
    code = tBlockDataInit(&pCommitter->dReader.bData, &id, pCommitter->skmTable.pTSchema, NULL, 0);
H
Hongze Cheng 已提交
1591
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1592
    code = tBlockDataInit(&pCommitter->dWriter.bData, &id, pCommitter->skmTable.pTSchema, NULL, 0);
H
Hongze Cheng 已提交
1593
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1594

H
Hongze Cheng 已提交
1595 1596
    /* merge with data in .data file */
    code = tsdbMergeTableData(pCommitter, id);
H
Hongze Cheng 已提交
1597
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1598

H
Hongze Cheng 已提交
1599
    /* handle remain table data */
H
Hongze Cheng 已提交
1600
    code = tsdbCommitTableData(pCommitter, id);
H
Hongze Cheng 已提交
1601
    TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1602

H
Hongze Cheng 已提交
1603
    // end
H
Hongze Cheng 已提交
1604 1605
    if (pCommitter->dWriter.mBlock.nItem > 0) {
      SBlockIdx blockIdx = {.suid = id.suid, .uid = id.uid};
H
Hongze Cheng 已提交
1606
      code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx);
H
Hongze Cheng 已提交
1607
      TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1608 1609 1610

      if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
        code = TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
1611
        TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1612 1613
      }
    }
H
Hongze Cheng 已提交
1614 1615
  }

H
Hongze Cheng 已提交
1616 1617 1618
  id.suid = INT64_MAX;
  id.uid = INT64_MAX;
  code = tsdbMoveCommitData(pCommitter, id);
H
Hongze Cheng 已提交
1619
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1620

H
compare  
Hongze Cheng 已提交
1621
#if USE_STREAM_COMPRESSION
H
Hongze Cheng 已提交
1622
  code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk);
H
compare  
Hongze Cheng 已提交
1623 1624 1625 1626
#else
  code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
                           pCommitter->cmprAlg);
#endif
H
Hongze Cheng 已提交
1627
  TSDB_CHECK_CODE(code, lino, _exit);
H
Hongze Cheng 已提交
1628

H
Hongze Cheng 已提交
1629 1630
_exit:
  if (code) {
S
Shengliang Guan 已提交
1631
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino,
H
Hongze Cheng 已提交
1632
              tstrerror(code));
H
Hongze Cheng 已提交
1633
  }
H
Hongze Cheng 已提交
1634 1635
  return code;
}
H
Hongze Cheng 已提交
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654

int32_t tsdbFinishCommit(STsdb *pTsdb) {
  int32_t    code = 0;
  int32_t    lino = 0;
  SMemTable *pMemTable = pTsdb->imem;

  // lock
  taosThreadRwlockWrlock(&pTsdb->rwLock);

  code = tsdbFSCommit(pTsdb);
  if (code) {
    taosThreadRwlockUnlock(&pTsdb->rwLock);
    TSDB_CHECK_CODE(code, lino, _exit);
  }

  pTsdb->imem = NULL;

  // unlock
  taosThreadRwlockUnlock(&pTsdb->rwLock);
H
Hongze Cheng 已提交
1655 1656 1657
  if (pMemTable) {
    tsdbUnrefMemTable(pMemTable);
  }
H
Hongze Cheng 已提交
1658 1659 1660

_exit:
  if (code) {
S
Shengliang Guan 已提交
1661
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
1662
  } else {
S
Shengliang Guan 已提交
1663
    tsdbInfo("vgId:%d, tsdb finish commit", TD_VID(pTsdb->pVnode));
H
Hongze Cheng 已提交
1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676
  }
  return code;
}

int32_t tsdbRollbackCommit(STsdb *pTsdb) {
  int32_t code = 0;
  int32_t lino = 0;

  code = tsdbFSRollback(pTsdb);
  TSDB_CHECK_CODE(code, lino, _exit);

_exit:
  if (code) {
S
Shengliang Guan 已提交
1677
    tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
H
Hongze Cheng 已提交
1678
  } else {
S
Shengliang Guan 已提交
1679
    tsdbInfo("vgId:%d, tsdb rollback commit", TD_VID(pTsdb->pVnode));
H
Hongze Cheng 已提交
1680 1681 1682
  }
  return code;
}