tdbEnv.c 4.2 KB
Newer Older
H
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * 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/>.
 */

#include "tdbInt.h"

struct STDbEnv {
H
Hongze Cheng 已提交
19
  char *      rootDir;    // root directory of the environment
H
Hongze Cheng 已提交
20 21
  char *      jname;      // journal file name
  int         jfd;        // journal file fd
H
Hongze Cheng 已提交
22 23
  pgsz_t      pgSize;     // page size
  cachesz_t   cacheSize;  // total cache size
H
Hongze Cheng 已提交
24 25 26
  STDbList    dbList;     // TDB List
  SPgFileList pgfList;    // SPgFile List
  SPgCache *  pPgCache;   // page cache
H
Hongze Cheng 已提交
27
  struct {
H
Hongze Cheng 已提交
28 29
#define TDB_ENV_PGF_HASH_BUCKETS 17
    SPgFileList buckets[TDB_ENV_PGF_HASH_BUCKETS];
H
Hongze Cheng 已提交
30
  } pgfht;  // page file hash table;
H
Hongze Cheng 已提交
31 32
};

H
Hongze Cheng 已提交
33 34 35 36 37 38
#define TDB_ENV_PGF_HASH(fileid)        \
  ({                                    \
    uint8_t *tmp = (uint8_t *)(fileid); \
    tmp[0] + tmp[1] + tmp[2];           \
  })

H
Hongze Cheng 已提交
39 40
static int tdbEnvDestroy(TENV *pEnv);

H
Hongze Cheng 已提交
41 42 43
int tdbEnvCreate(TENV **ppEnv, const char *rootDir) {
  TENV * pEnv;
  size_t slen;
H
Hongze Cheng 已提交
44
  size_t jlen;
H
Hongze Cheng 已提交
45

H
Hongze Cheng 已提交
46 47 48 49
  ASSERT(rootDir != NULL);

  *ppEnv = NULL;
  slen = strlen(rootDir);
H
Hongze Cheng 已提交
50 51
  jlen = slen + strlen(TDB_JOURNAL_NAME) + 1;
  pEnv = (TENV *)calloc(1, sizeof(*pEnv) + slen + 1 + jlen + 1);
H
Hongze Cheng 已提交
52 53 54 55
  if (pEnv == NULL) {
    return -1;
  }

H
Hongze Cheng 已提交
56 57 58
  pEnv->rootDir = (char *)(&pEnv[1]);
  pEnv->jname = pEnv->rootDir + slen + 1;
  pEnv->jfd = -1;
H
Hongze Cheng 已提交
59 60 61
  pEnv->pgSize = TDB_DEFAULT_PGSIZE;
  pEnv->cacheSize = TDB_DEFAULT_CACHE_SIZE;

H
Hongze Cheng 已提交
62
  memcpy(pEnv->rootDir, rootDir, slen);
H
Hongze Cheng 已提交
63
  pEnv->rootDir[slen] = '\0';
H
Hongze Cheng 已提交
64
  sprintf(pEnv->jname, "%s/%s", rootDir, TDB_JOURNAL_NAME);
H
Hongze Cheng 已提交
65

H
Hongze Cheng 已提交
66 67
  TD_DLIST_INIT(&(pEnv->dbList));
  TD_DLIST_INIT(&(pEnv->pgfList));
H
Hongze Cheng 已提交
68 69 70 71

  /* TODO */

  *ppEnv = pEnv;
H
Hongze Cheng 已提交
72 73 74
  return 0;
}

H
Hongze Cheng 已提交
75
int tdbEnvOpen(TENV *pEnv) {
H
Hongze Cheng 已提交
76 77 78
  SPgCache *pPgCache;
  int       ret;

H
Hongze Cheng 已提交
79
  ASSERT(pEnv != NULL);
H
Hongze Cheng 已提交
80

H
Hongze Cheng 已提交
81 82 83 84 85
  /* TODO: here we do not need to create the root directory, more
   * work should be done here
   */
  mkdir(pEnv->rootDir, 0755);

H
Hongze Cheng 已提交
86
  ret = pgCacheOpen(&pPgCache, pEnv);
H
Hongze Cheng 已提交
87 88 89
  if (ret != 0) {
    goto _err;
  }
H
Hongze Cheng 已提交
90

H
Hongze Cheng 已提交
91
  pEnv->pPgCache = pPgCache;
H
Hongze Cheng 已提交
92
  return 0;
H
Hongze Cheng 已提交
93 94 95

_err:
  return -1;
H
Hongze Cheng 已提交
96 97 98
}

int tdbEnvClose(TENV *pEnv) {
H
Hongze Cheng 已提交
99
  if (pEnv == NULL) return 0;
H
Hongze Cheng 已提交
100
  pgCacheClose(pEnv->pPgCache);
H
Hongze Cheng 已提交
101
  tdbEnvDestroy(pEnv);
H
Hongze Cheng 已提交
102 103 104
  return 0;
}

H
Hongze Cheng 已提交
105 106 107 108
int tdbEnvSetCache(TENV *pEnv, pgsz_t pgSize, cachesz_t cacheSize) {
  if (!TDB_IS_PGSIZE_VLD(pgSize) || cacheSize / pgSize < 10) {
    return -1;
  }
H
Hongze Cheng 已提交
109 110

  /* TODO */
H
Hongze Cheng 已提交
111 112 113 114

  pEnv->pgSize = pgSize;
  pEnv->cacheSize = cacheSize;

H
Hongze Cheng 已提交
115 116 117
  return 0;
}

H
Hongze Cheng 已提交
118
pgsz_t tdbEnvGetPageSize(TENV *pEnv) { return pEnv->pgSize; }
H
Hongze Cheng 已提交
119 120 121

cachesz_t tdbEnvGetCacheSize(TENV *pEnv) { return pEnv->cacheSize; }

H
Hongze Cheng 已提交
122
SPgFile *tdbEnvGetPageFile(TENV *pEnv, const uint8_t fileid[]) {
H
Hongze Cheng 已提交
123 124 125 126 127 128 129 130 131
  SPgFileList *pBucket;
  SPgFile *    pPgFile;

  pBucket = pEnv->pgfht.buckets + (TDB_ENV_PGF_HASH(fileid) % TDB_ENV_PGF_HASH_BUCKETS);  // TODO
  for (pPgFile = TD_DLIST_HEAD(pBucket); pPgFile != NULL; pPgFile = TD_DLIST_NODE_NEXT_WITH_FIELD(pPgFile, envHash)) {
    if (memcmp(fileid, pPgFile->fileid, TDB_FILE_ID_LEN) == 0) break;
  };

  return pPgFile;
H
Hongze Cheng 已提交
132 133
}

H
Hongze Cheng 已提交
134
SPgCache *tdbEnvGetPgCache(TENV *pEnv) { return pEnv->pPgCache; }
H
Hongze Cheng 已提交
135 136 137 138

static int tdbEnvDestroy(TENV *pEnv) {
  // TODO
  return 0;
H
Hongze Cheng 已提交
139 140 141
}

int tdbEnvBeginTxn(TENV *pEnv) {
H
Hongze Cheng 已提交
142 143
  pEnv->jfd = open(pEnv->jname, O_CREAT | O_RDWR, 0755);
  if (pEnv->jfd < 0) {
H
Hongze Cheng 已提交
144 145 146
    return -1;
  }

H
Hongze Cheng 已提交
147 148 149 150
  return 0;
}

int tdbEnvCommit(TENV *pEnv) {
H
Hongze Cheng 已提交
151
  /* TODO */
H
Hongze Cheng 已提交
152 153
  close(pEnv->jfd);
  pEnv->jfd = -1;
H
Hongze Cheng 已提交
154
  return 0;
H
Hongze Cheng 已提交
155 156 157
}

const char *tdbEnvGetRootDir(TENV *pEnv) { return pEnv->rootDir; }
H
Hongze Cheng 已提交
158 159 160 161

int tdbEnvRgstPageFile(TENV *pEnv, SPgFile *pPgFile) {
  SPgFileList *pBucket;

H
Hongze Cheng 已提交
162 163 164
  TD_DLIST_APPEND_WITH_FIELD(&(pEnv->pgfList), pPgFile, envPgfList);

  pBucket = pEnv->pgfht.buckets + (TDB_ENV_PGF_HASH(pPgFile->fileid) % TDB_ENV_PGF_HASH_BUCKETS);  // TODO
H
Hongze Cheng 已提交
165 166
  TD_DLIST_APPEND_WITH_FIELD(pBucket, pPgFile, envHash);

H
Hongze Cheng 已提交
167 168 169 170 171
  return 0;
}

int tdbEnvRgstDB(TENV *pEnv, TDB *pDb) {
  // TODO
H
Hongze Cheng 已提交
172 173
  return 0;
}