tsdbFSet.c 8.1 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 "inc/tsdbFSet.h"
H
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18
static int32_t stt_lvl_to_json(const SSttLvl *lvl, cJSON *json) {
H
Hongze Cheng 已提交
19
  if (cJSON_AddNumberToObject(json, "level", lvl->level) == NULL) {
H
Hongze Cheng 已提交
20 21 22
    return TSDB_CODE_OUT_OF_MEMORY;
  }

H
Hongze Cheng 已提交
23
  cJSON *ajson = cJSON_AddArrayToObject(json, "files");
H
Hongze Cheng 已提交
24
  if (ajson == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
25

H
Hongze Cheng 已提交
26 27 28
  SRBTreeIter iter = tRBTreeIterCreate(&lvl->sttTree, 1);
  for (SRBTreeNode *node = tRBTreeIterNext(&iter); node; node = tRBTreeIterNext(&iter)) {
    STFileObj *fobj = TCONTAINER_OF(node, STFileObj, rbtn);
H
Hongze Cheng 已提交
29

H
Hongze Cheng 已提交
30 31
    cJSON *item = cJSON_CreateObject();
    if (item == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
32
    cJSON_AddItemToArray(ajson, item);
H
Hongze Cheng 已提交
33

H
Hongze Cheng 已提交
34
    int32_t code = tsdbTFileToJson(&fobj->f, item);
H
Hongze Cheng 已提交
35
    if (code) return code;
H
Hongze Cheng 已提交
36
  }
H
Hongze Cheng 已提交
37 38 39 40

  return 0;
}

H
Hongze Cheng 已提交
41 42 43 44 45 46 47 48 49 50 51
static int32_t stt_file_cmpr(const SRBTreeNode *n1, const SRBTreeNode *n2) {
  STFileObj *f1 = TCONTAINER_OF(n1, STFileObj, rbtn);
  STFileObj *f2 = TCONTAINER_OF(n2, STFileObj, rbtn);
  if (f1->f.cid < f2->f.cid) {
    return -1;
  } else if (f1->f.cid > f2->f.cid) {
    return 1;
  }
  return 0;
}

H
Hongze Cheng 已提交
52 53
static int32_t stt_lvl_init(SSttLvl *lvl, int32_t level) {
  lvl->level = level;
H
Hongze Cheng 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67
  lvl->nstt = 0;
  tRBTreeCreate(&lvl->sttTree, stt_file_cmpr);
  return 0;
}

static int32_t add_file_to_stt_lvl(SSttLvl *lvl, STFileObj *fobj) {
  lvl->nstt++;
  tRBTreePut(&lvl->sttTree, &fobj->rbtn);
  return 0;
}

static int32_t json_to_stt_lvl(const cJSON *json, SSttLvl *lvl) {
  const cJSON *item1, *item2;

H
Hongze Cheng 已提交
68
  item1 = cJSON_GetObjectItem(json, "level");
H
Hongze Cheng 已提交
69
  if (cJSON_IsNumber(item1)) {
H
Hongze Cheng 已提交
70
    lvl->level = item1->valuedouble;
H
Hongze Cheng 已提交
71 72 73 74
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

H
Hongze Cheng 已提交
75 76
  stt_lvl_init(lvl, lvl->level);

H
Hongze Cheng 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
  item1 = cJSON_GetObjectItem(json, "files");
  if (cJSON_IsArray(item1)) {
    cJSON_ArrayForEach(item2, item1) {
      STFileObj *fobj;

      int32_t code = tsdbTFileObjCreate(&fobj);
      if (code) return code;

      code = tsdbJsonToTFile(item2, TSDB_FTYPE_STT, &fobj->f);
      if (code) return code;

      add_file_to_stt_lvl(lvl, fobj);
    }
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

H
Hongze Cheng 已提交
94 95 96
  return 0;
}

H
Hongze Cheng 已提交
97 98 99 100 101 102 103 104
static int32_t add_stt_lvl(STFileSet *fset, SSttLvl *lvl) {
  tRBTreePut(&fset->lvlTree, &lvl->rbtn);
  return 0;
}

static int32_t add_file_to_fset(STFileSet *fset, STFileObj *fobj) {
  if (fobj->f.type == TSDB_FTYPE_STT) {
    SSttLvl *lvl;
H
Hongze Cheng 已提交
105
    SSttLvl  tlvl = {.level = fobj->f.stt.level};
H
Hongze Cheng 已提交
106

H
Hongze Cheng 已提交
107 108 109 110 111 112 113
    SRBTreeNode *node = tRBTreeGet(&fset->lvlTree, &tlvl.rbtn);
    if (node) {
      lvl = TCONTAINER_OF(node, SSttLvl, rbtn);
    } else {
      lvl = taosMemoryMalloc(sizeof(*lvl));
      if (!lvl) return TSDB_CODE_OUT_OF_MEMORY;

H
Hongze Cheng 已提交
114
      stt_lvl_init(lvl, fobj->f.stt.level);
H
Hongze Cheng 已提交
115 116 117
      add_stt_lvl(fset, lvl);
    }
    add_file_to_stt_lvl(lvl, fobj);
H
Hongze Cheng 已提交
118
  } else {
H
Hongze Cheng 已提交
119
    fset->farr[fobj->f.type] = fobj;
H
Hongze Cheng 已提交
120 121 122 123 124
  }

  return 0;
}

H
Hongze Cheng 已提交
125 126 127 128
static int32_t stt_lvl_cmpr(const SRBTreeNode *n1, const SRBTreeNode *n2) {
  SSttLvl *lvl1 = TCONTAINER_OF(n1, SSttLvl, rbtn);
  SSttLvl *lvl2 = TCONTAINER_OF(n2, SSttLvl, rbtn);

H
Hongze Cheng 已提交
129
  if (lvl1->level < lvl2->level) {
H
Hongze Cheng 已提交
130
    return -1;
H
Hongze Cheng 已提交
131
  } else if (lvl1->level > lvl2->level) {
H
Hongze Cheng 已提交
132 133 134 135 136
    return 1;
  }
  return 0;
}

H
Hongze Cheng 已提交
137 138 139 140 141
static int32_t fset_init(STFileSet *fset, int32_t fid) {
  fset->fid = fid;
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
    fset->farr[ftype] = NULL;
  }
H
Hongze Cheng 已提交
142 143 144 145 146 147 148 149 150
  tRBTreeCreate(&fset->lvlTree, stt_lvl_cmpr);
  return 0;
}

static int32_t fset_clear(STFileSet *fset) {
  // TODO
  return 0;
}

H
Hongze Cheng 已提交
151
int32_t tsdbFileSetToJson(const STFileSet *fset, cJSON *json) {
H
Hongze Cheng 已提交
152
  int32_t code = 0;
H
Hongze Cheng 已提交
153
  cJSON  *item1, *item2;
H
Hongze Cheng 已提交
154

H
Hongze Cheng 已提交
155 156 157 158
  // fid
  if (cJSON_AddNumberToObject(json, "fid", fset->fid) == NULL) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }
H
Hongze Cheng 已提交
159

H
Hongze Cheng 已提交
160
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
H
Hongze Cheng 已提交
161
    if (fset->farr[ftype] == NULL) continue;
H
Hongze Cheng 已提交
162

H
Hongze Cheng 已提交
163 164
    code = tsdbTFileToJson(&fset->farr[ftype]->f, json);
    if (code) return code;
H
Hongze Cheng 已提交
165 166 167
  }

  // each level
H
Hongze Cheng 已提交
168 169
  item1 = cJSON_AddArrayToObject(json, "stt levels");
  if (item1 == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
170 171
  SRBTreeIter iter = tRBTreeIterCreate(&fset->lvlTree, 1);
  for (SRBTreeNode *node = tRBTreeIterNext(&iter); node; node = tRBTreeIterNext(&iter)) {
H
Hongze Cheng 已提交
172 173 174 175 176
    item2 = cJSON_CreateObject();
    if (!item2) return TSDB_CODE_OUT_OF_MEMORY;
    cJSON_AddItemToArray(item1, item2);

    code = stt_lvl_to_json(TCONTAINER_OF(node, SSttLvl, rbtn), item2);
H
Hongze Cheng 已提交
177 178
    if (code) return code;
  }
H
Hongze Cheng 已提交
179 180

  return 0;
H
Hongze Cheng 已提交
181 182
}

H
Hongze Cheng 已提交
183
int32_t tsdbJsonToFileSet(const cJSON *json, STFileSet *fset) {
H
Hongze Cheng 已提交
184
  const cJSON *item1, *item2;
H
Hongze Cheng 已提交
185 186
  int32_t      code;
  STFile       tf;
H
Hongze Cheng 已提交
187

H
Hongze Cheng 已提交
188
  /* fid */
H
Hongze Cheng 已提交
189 190 191
  item1 = cJSON_GetObjectItem(json, "fid");
  if (cJSON_IsNumber(item1)) {
    fset->fid = item1->valueint;
H
Hongze Cheng 已提交
192 193 194 195
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

H
Hongze Cheng 已提交
196
  fset_init(fset, fset->fid);
H
Hongze Cheng 已提交
197
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
H
Hongze Cheng 已提交
198 199 200 201 202 203
    code = tsdbJsonToTFile(json, ftype, &tf);
    if (code == TSDB_CODE_NOT_FOUND) {
      continue;
    } else if (code) {
      return code;
    } else {
H
Hongze Cheng 已提交
204 205 206
      code = tsdbTFileObjCreate(&fset->farr[ftype]);
      if (code) return code;
      fset->farr[ftype]->f = tf;
H
Hongze Cheng 已提交
207
    }
H
Hongze Cheng 已提交
208 209 210
  }

  // each level
H
Hongze Cheng 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224
  item1 = cJSON_GetObjectItem(json, "stt");
  if (cJSON_IsArray(item1)) {
    cJSON_ArrayForEach(item2, item1) {
      SSttLvl *lvl = taosMemoryCalloc(1, sizeof(*lvl));
      if (lvl == NULL) return TSDB_CODE_OUT_OF_MEMORY;

      code = json_to_stt_lvl(item2, lvl);
      if (code) {
        taosMemoryFree(lvl);
        return code;
      }

      add_stt_lvl(fset, lvl);
    }
H
Hongze Cheng 已提交
225 226 227 228 229 230 231
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

  return 0;
}

H
Hongze Cheng 已提交
232 233 234 235
int32_t tsdbFSetCmprFn(const STFileSet *pSet1, const STFileSet *pSet2) {
  if (pSet1->fid < pSet2->fid) return -1;
  if (pSet1->fid > pSet2->fid) return 1;
  return 0;
H
Hongze Cheng 已提交
236 237
}

H
Hongze Cheng 已提交
238 239
int32_t tsdbFileSetEdit(STFileSet *fset, const STFileOp *op) {
  int32_t code = 0;
H
Hongze Cheng 已提交
240

H
Hongze Cheng 已提交
241 242 243 244 245 246 247 248
  if (op->oState.size == 0  //
      || 0                  /* TODO*/
  ) {
    STFileObj *fobj;
    code = tsdbTFileObjCreate(&fobj);
    if (code) return code;
    fobj->f = op->nState;
    add_file_to_fset(fset, fobj);
H
Hongze Cheng 已提交
249 250
  } else if (op->nState.size == 0) {
    // delete
H
Hongze Cheng 已提交
251
    ASSERT(0);
H
Hongze Cheng 已提交
252 253
  } else {
    // modify
H
Hongze Cheng 已提交
254
    ASSERT(0);
H
Hongze Cheng 已提交
255 256 257 258
  }
  return 0;
}

H
Hongze Cheng 已提交
259
int32_t tsdbFileSetInit(STFileSet *pSet, int32_t fid) { return fset_init(pSet, fid); }
H
Hongze Cheng 已提交
260

H
Hongze Cheng 已提交
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
int32_t tsdbFileSetInitEx(const STFileSet *fset1, STFileSet *fset2) {
  int32_t code;

  fset_init(fset2, fset1->fid);
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
    if (fset1->farr[ftype] == NULL) continue;

    code = tsdbTFileObjCreate(&fset2->farr[ftype]);
    if (code) return code;
    fset2->farr[ftype]->f = fset1->farr[ftype]->f;
  }

  SRBTreeIter iter = tRBTreeIterCreate(&fset1->lvlTree, 1);
  for (SRBTreeNode *node = tRBTreeIterNext(&iter); node; node = tRBTreeIterNext(&iter)) {
    SSttLvl *lvl1 = TCONTAINER_OF(node, SSttLvl, rbtn);
    SSttLvl *lvl2 = taosMemoryCalloc(1, sizeof(*lvl2));
    if (lvl2 == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
278
    stt_lvl_init(lvl2, lvl1->level);
H
Hongze Cheng 已提交
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
    add_stt_lvl(fset2, lvl2);

    SRBTreeIter iter2 = tRBTreeIterCreate(&lvl1->sttTree, 1);
    for (SRBTreeNode *node2 = tRBTreeIterNext(&iter2); node2; node2 = tRBTreeIterNext(&iter2)) {
      STFileObj *fobj1 = TCONTAINER_OF(node2, STFileObj, rbtn);
      STFileObj *fobj2;
      code = tsdbTFileObjCreate(&fobj2);
      if (code) return code;
      fobj2->f = fobj1->f;
      add_file_to_stt_lvl(lvl2, fobj2);
    }
  }
  return 0;
}

H
Hongze Cheng 已提交
294
int32_t tsdbFileSetClear(STFileSet *pSet) {
H
Hongze Cheng 已提交
295 296
  // TODO
  return 0;
H
Hongze Cheng 已提交
297
}
H
Hongze Cheng 已提交
298 299 300 301 302 303

const SSttLvl *tsdbFileSetGetLvl(const STFileSet *fset, int32_t level) {
  SSttLvl      tlvl = {.level = level};
  SRBTreeNode *node = tRBTreeGet(&fset->lvlTree, &tlvl.rbtn);
  return node ? TCONTAINER_OF(node, SSttLvl, rbtn) : NULL;
}