sdb.c 5.0 KB
Newer Older
H
refact  
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/>.
 */

S
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
Shengliang Guan 已提交
17
#include "sdb.h"
S
Shengliang Guan 已提交
18

S
Shengliang Guan 已提交
19 20
static int32_t sdbCreateDir(SSdb *pSdb);

S
Shengliang Guan 已提交
21 22
SSdb *sdbInit(SSdbOpt *pOption) {
  mDebug("start to init sdb in %s", pOption->path);
S
Shengliang Guan 已提交
23

wafwerar's avatar
wafwerar 已提交
24
  SSdb *pSdb = taosMemoryCalloc(1, sizeof(SSdb));
25 26
  if (pSdb == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
27
    mError("failed to init sdb since %s", terrstr());
28 29
    return NULL;
  }
S
Shengliang Guan 已提交
30

S
Shengliang Guan 已提交
31 32
  char path[PATH_MAX + 100] = {0};
  snprintf(path, sizeof(path), "%s%sdata", pOption->path, TD_DIRSEP);
33
  pSdb->currDir = strdup(path);
S
Shengliang Guan 已提交
34
  snprintf(path, sizeof(path), "%s%stmp", pOption->path, TD_DIRSEP);
35
  pSdb->tmpDir = strdup(path);
36
  if (pSdb->currDir == NULL || pSdb->tmpDir == NULL) {
S
Shengliang Guan 已提交
37
    sdbCleanup(pSdb);
38
    terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
39
    mError("failed to init sdb since %s", terrstr());
40
    return NULL;
S
Shengliang Guan 已提交
41 42
  }

S
Shengliang Guan 已提交
43 44 45 46 47
  if (sdbCreateDir(pSdb) != 0) {
    sdbCleanup(pSdb);
    return NULL;
  }

48
  for (ESdbType i = 0; i < SDB_MAX; ++i) {
49
    taosThreadRwlockInit(&pSdb->locks[i], NULL);
S
Shengliang Guan 已提交
50
    pSdb->maxId[i] = 0;
S
Shengliang Guan 已提交
51
    pSdb->tableVer[i] = 0;
S
Shengliang Guan 已提交
52
    pSdb->keyTypes[i] = SDB_KEY_INT32;
S
Shengliang Guan 已提交
53 54
  }

55
  pSdb->pWal = pOption->pWal;
56
  pSdb->curVer = -1;
57
  pSdb->curTerm = -1;
58
  pSdb->lastCommitVer = -1;
59
  pSdb->lastCommitTerm = -1;
60
  pSdb->curConfig = -1;
S
Shengliang Guan 已提交
61
  pSdb->pMnode = pOption->pMnode;
S
Shengliang Guan 已提交
62
  taosThreadMutexInit(&pSdb->filelock, NULL);
S
Shengliang Guan 已提交
63
  mDebug("sdb init successfully");
S
Shengliang Guan 已提交
64
  return pSdb;
S
Shengliang Guan 已提交
65 66
}

S
Shengliang Guan 已提交
67 68
void sdbCleanup(SSdb *pSdb) {
  mDebug("start to cleanup sdb");
S
Shengliang Guan 已提交
69

S
Shengliang Guan 已提交
70
  sdbWriteFile(pSdb);
S
Shengliang Guan 已提交
71

72
  if (pSdb->currDir != NULL) {
wafwerar's avatar
wafwerar 已提交
73
    taosMemoryFreeClear(pSdb->currDir);
S
Shengliang Guan 已提交
74
  }
S
Shengliang Guan 已提交
75

76
  if (pSdb->tmpDir != NULL) {
S
Shengliang Guan 已提交
77
    taosRemoveDir(pSdb->tmpDir);
wafwerar's avatar
wafwerar 已提交
78
    taosMemoryFreeClear(pSdb->tmpDir);
S
Shengliang Guan 已提交
79 80
  }

81
  for (ESdbType i = 0; i < SDB_MAX; ++i) {
82
    SHashObj *hash = pSdb->hashObjs[i];
83 84
    if (hash == NULL) continue;

S
Shengliang Guan 已提交
85
    SSdbRow **ppRow = taosHashIterate(hash, NULL);
86 87 88 89
    while (ppRow != NULL) {
      SSdbRow *pRow = *ppRow;
      if (pRow == NULL) continue;

90
      sdbFreeRow(pSdb, pRow, true);
91
      ppRow = taosHashIterate(hash, ppRow);
S
Shengliang Guan 已提交
92
    }
93 94 95 96 97 98 99 100
  }

  for (ESdbType i = 0; i < SDB_MAX; ++i) {
    SHashObj *hash = pSdb->hashObjs[i];
    if (hash == NULL) continue;

    taosHashClear(hash);
    taosHashCleanup(hash);
101
    taosThreadRwlockDestroy(&pSdb->locks[i]);
102
    pSdb->hashObjs[i] = NULL;
103 104
    memset(&pSdb->locks[i], 0, sizeof(pSdb->locks[i]));

S
Shengliang Guan 已提交
105
    mDebug("sdb table:%s is cleaned up", sdbTableName(i));
S
Shengliang Guan 已提交
106
  }
S
Shengliang Guan 已提交
107

S
Shengliang Guan 已提交
108
  taosThreadMutexDestroy(&pSdb->filelock);
wafwerar's avatar
wafwerar 已提交
109
  taosMemoryFree(pSdb);
S
Shengliang Guan 已提交
110
  mDebug("sdb is cleaned up");
S
Shengliang Guan 已提交
111 112
}

S
Shengliang Guan 已提交
113
int32_t sdbSetTable(SSdb *pSdb, SSdbTable table) {
S
Shengliang Guan 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
  ESdbType sdbType = table.sdbType;
  EKeyType keyType = table.keyType;
  pSdb->keyTypes[sdbType] = table.keyType;
  pSdb->insertFps[sdbType] = table.insertFp;
  pSdb->updateFps[sdbType] = table.updateFp;
  pSdb->deleteFps[sdbType] = table.deleteFp;
  pSdb->deployFps[sdbType] = table.deployFp;
  pSdb->encodeFps[sdbType] = table.encodeFp;
  pSdb->decodeFps[sdbType] = table.decodeFp;

  int32_t hashType = 0;
  if (keyType == SDB_KEY_INT32) {
    hashType = TSDB_DATA_TYPE_INT;
  } else if (keyType == SDB_KEY_INT64) {
    hashType = TSDB_DATA_TYPE_BIGINT;
  } else {
    hashType = TSDB_DATA_TYPE_BINARY;
  }
S
Shengliang Guan 已提交
132

S
Shengliang Guan 已提交
133 134 135 136
  SHashObj *hash = taosHashInit(64, taosGetDefaultHashFunction(hashType), true, HASH_NO_LOCK);
  if (hash == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
S
Shengliang Guan 已提交
137 138
  }

S
Shengliang Guan 已提交
139
  pSdb->maxId[sdbType] = 0;
S
Shengliang Guan 已提交
140
  pSdb->hashObjs[sdbType] = hash;
S
Shengliang Guan 已提交
141
  mDebug("sdb table:%s is initialized", sdbTableName(sdbType));
S
Shengliang Guan 已提交
142

S
Shengliang Guan 已提交
143
  return 0;
S
Shengliang Guan 已提交
144 145 146
}

static int32_t sdbCreateDir(SSdb *pSdb) {
S
Shengliang Guan 已提交
147
  if (taosMulMkDir(pSdb->currDir) != 0) {
S
Shengliang Guan 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160
    terrno = TAOS_SYSTEM_ERROR(errno);
    mError("failed to create dir:%s since %s", pSdb->currDir, terrstr());
    return -1;
  }

  if (taosMkDir(pSdb->tmpDir) != 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    mError("failed to create dir:%s since %s", pSdb->tmpDir, terrstr());
    return -1;
  }

  return 0;
}
S
Shengliang Guan 已提交
161

162 163
void sdbSetApplyIndex(SSdb *pSdb, int64_t index) { pSdb->curVer = index; }

164 165
void sdbSetApplyTerm(SSdb *pSdb, int64_t term) { pSdb->curTerm = term; }

S
Shengliang Guan 已提交
166
void sdbSetCurConfig(SSdb *pSdb, int64_t config) {
S
Shengliang Guan 已提交
167 168 169 170
  if (pSdb->curConfig != config) {
    mDebug("mnode sync config set from %" PRId64 " to %" PRId64, pSdb->curConfig, config);
    pSdb->curConfig = config;
  }
S
Shengliang Guan 已提交
171
}
S
Shengliang Guan 已提交
172

173 174
int64_t sdbGetApplyIndex(SSdb *pSdb) { return pSdb->curVer; }

175
int64_t sdbGetApplyTerm(SSdb *pSdb) { return pSdb->curTerm; }
176 177 178

int64_t sdbGetCommitIndex(SSdb *pSdb) { return pSdb->lastCommitVer; }

S
Shengliang Guan 已提交
179 180 181
int64_t sdbGetCommitTerm(SSdb *pSdb) { return pSdb->lastCommitTerm; }

int64_t sdbGetCurConfig(SSdb *pSdb) { return pSdb->curConfig; }