tsdbFile.h 6.2 KB
Newer Older
H
refact  
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * 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/>.
 */

#ifndef _TS_TSDB_FILE_H_
#define _TS_TSDB_FILE_H_

#ifdef __cplusplus
extern "C" {
#endif

#define TSDB_FILE_HEAD_SIZE 512
#define TSDB_FILE_DELIMITER 0xF00AFA0F
#define TSDB_FILE_INIT_MAGIC 0xFFFFFFFF

H
refact  
Hongze Cheng 已提交
27 28 29 30 31 32
#define TSDB_FILE_INFO(tf) (&((tf)->info))
#define TSDB_FILE_F(tf) (&((tf)->f))
#define TSDB_FILE_FD(tf) ((tf)->fd)
#define TSDB_FILE_FULL_NAME(f) TFILE_NAME(TSDB_FILE_F(f))
#define TSDB_FILE_OPENED(f) (TSDB_FILE_FD(f) >= 0)
#define TSDB_FILE_SET_CLOSED(f) (TSDB_FILE_FD(f) = -1)
H
Hongze Cheng 已提交
33 34
#define TSDB_FILE_LEVEL(tf) TFILE_LEVEL(TSDB_FILE_F(tf))
#define TSDB_FILE_ID(tf) TFILE_ID(TSDB_FILE_F(tf))
H
refact  
Hongze Cheng 已提交
35

H
refact  
Hongze Cheng 已提交
36 37 38 39 40 41 42 43 44
typedef enum {
  TSDB_FILE_HEAD = 0,
  TSDB_FILE_DATA,
  TSDB_FILE_LAST,
  TSDB_FILE_MAX,
  TSDB_FILE_META,
  TSDB_FILE_MANIFEST
} TSDB_FILE_T;

H
refact  
Hongze Cheng 已提交
45
// =============== SMFile
H
refact  
Hongze Cheng 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59
typedef struct {
  int64_t  size;
  int64_t  tombSize;
  int64_t  nRecords;
  int64_t  nDels;
  uint32_t magic;
} SMFInfo;

typedef struct {
  SMFInfo info;
  TFILE   f;
  int     fd;
} SMFile;

H
refact  
Hongze Cheng 已提交
60 61 62 63
void  tsdbInitMFile(SMFile* pMFile, int vid, int ver, SMFInfo* pInfo);
int   tsdbEncodeSMFile(void** buf, SMFile* pMFile);
void* tsdbDecodeSMFile(void* buf, SMFile* pMFile);

H
refact  
Hongze Cheng 已提交
64
static FORCE_INLINE int tsdbOpenMFile(SMFile* pMFile, int flags) {
H
refact  
Hongze Cheng 已提交
65 66 67 68 69 70 71 72 73 74 75
  ASSERT(!TSDB_FILE_OPENED(pMFile));

  pMFile->fd = open(TSDB_FILE_FULL_NAME(pMFile), flags);
  if (pMFile->fd < 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return 0;
}

H
refact  
Hongze Cheng 已提交
76
static FORCE_INLINE void tsdbCloseMFile(SMFile* pMFile) {
H
refact  
Hongze Cheng 已提交
77 78 79 80 81 82
  if (TSDB_FILE_OPENED(pMFile)) {
    close(pMFile->fd);
    TSDB_FILE_SET_CLOSED(pMFile);
  }
}

H
refact  
Hongze Cheng 已提交
83
static FORCE_INLINE int64_t tsdbSeekMFile(SMFile* pMFile, int64_t offset, int whence) {
H
refact  
Hongze Cheng 已提交
84 85 86 87 88 89 90 91 92 93
  ASSERT(TSDB_FILE_OPENED(pMFile));

  int64_t loffset = taosLSeek(TSDB_FILE_FD(pMFile), offset, whence);
  if (loffset < 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return loffset;
}
H
refact  
Hongze Cheng 已提交
94

H
refact  
Hongze Cheng 已提交
95
static FORCE_INLINE int64_t tsdbWriteMFile(SMFile* pMFile, void* buf, int64_t nbyte) {
H
refact  
Hongze Cheng 已提交
96 97 98 99 100 101 102 103 104 105 106
  ASSERT(TSDB_FILE_OPENED(pMFile));

  int64_t nwrite = taosWrite(pMFile->fd, buf, nbyte);
  if (nwrite < nbyte) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return nwrite;
}

H
refact  
Hongze Cheng 已提交
107
static FORCE_INLINE void tsdbUpdateMFileMagic(SMFile* pMFile, void* pCksum) {
H
refact  
Hongze Cheng 已提交
108 109 110
  pMFile->info.magic = taosCalcChecksum(pMFile->info.magic, (uint8_t*)(pCksum), sizeof(TSCKSUM));
}

H
refact  
Hongze Cheng 已提交
111
static FORCE_INLINE int64_t tsdbTellMFile(SMFile* pMFile) { return tsdbSeekMFile(pMFile, 0, SEEK_CUR); }
H
refact  
Hongze Cheng 已提交
112 113

// =============== SDFile
H
refact  
Hongze Cheng 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
typedef struct {
  uint32_t magic;
  uint32_t len;
  uint32_t totalBlocks;
  uint32_t totalSubBlocks;
  uint32_t offset;
  uint64_t size;
  uint64_t tombSize;
} SDFInfo;

typedef struct {
  SDFInfo info;
  TFILE   f;
  int     fd;
} SDFile;

H
refact  
Hongze Cheng 已提交
130 131 132 133 134 135
void  tsdbInitDFile(SDFile* pDFile, int vid, int fid, int ver, int level, int id, const SDFInfo* pInfo,
                    TSDB_FILE_T ftype);
void  tsdbInitDFileWithOld(SDFile* pDFile, SDFile* pOldDFile);
int   tsdbEncodeSDFile(void** buf, SDFile* pDFile);
void* tsdbDecodeSDFile(void* buf, SDFile* pDFile);

H
refact  
Hongze Cheng 已提交
136
static FORCE_INLINE int tsdbOpenDFile(SDFile *pDFile, int flags) {
H
refact  
Hongze Cheng 已提交
137 138 139 140 141 142 143 144 145 146 147
  ASSERT(!TSDB_FILE_OPENED(pDFile));

  pDFile->fd = open(pDFile->f.aname, flags);
  if (pDFile->fd < 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return 0;
}

H
refact  
Hongze Cheng 已提交
148
static FORCE_INLINE void tsdbCloseDFile(SDFile* pDFile) {
H
refact  
Hongze Cheng 已提交
149 150 151 152 153 154
  if (TSDB_FILE_OPENED(pDFile)) {
    close(pDFile->fd);
    TSDB_FILE_SET_CLOSED(pDFile);
  }
}

H
refact  
Hongze Cheng 已提交
155
static FORCE_INLINE int64_t tsdbSeekDFile(SDFile *pDFile, int64_t offset, int whence) {
H
refact  
Hongze Cheng 已提交
156 157 158 159 160 161 162 163 164 165 166
  ASSERT(TSDB_FILE_OPENED(pDFile));

  int64_t loffset = taosLSeek(pDFile->fd, offset, whence);
  if (loffset < 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return loffset;
}

H
refact  
Hongze Cheng 已提交
167
static FORCE_INLINE int64_t tsdbWriteDFile(SDFile* pDFile, void* buf, int64_t nbyte) {
H
refact  
Hongze Cheng 已提交
168 169 170 171 172 173 174 175 176 177 178
  ASSERT(TSDB_FILE_OPENED(pDFile));

  int64_t nwrite = taosWrite(pDFile->fd, buf, nbyte);
  if (nwrite < nbyte) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return nwrite;
}

H
refact  
Hongze Cheng 已提交
179
static FORCE_INLINE int64_t tsdbAppendDFile(SDFile* pDFile, void* buf, int64_t nbyte, int64_t* offset) {
H
refact  
Hongze Cheng 已提交
180 181 182
  ASSERT(TSDB_FILE_OPENED(pDFile));
  int64_t nwrite;

H
refact  
Hongze Cheng 已提交
183
  *offset = tsdbSeekDFile(pDFile, 0, SEEK_SET);
H
refact  
Hongze Cheng 已提交
184
  if (*offset < 0) return -1;
H
refact  
Hongze Cheng 已提交
185

H
refact  
Hongze Cheng 已提交
186
  nwrite = tsdbWriteDFile(pDFile, buf, nbyte);
H
refact  
Hongze Cheng 已提交
187 188 189 190 191
  if (nwrite < 0) return nwrite;

  return nwrite;
}

H
refact  
Hongze Cheng 已提交
192
static FORCE_INLINE int64_t tsdbReadDFile(SDFile* pDFile, void* buf, int64_t nbyte) {
H
refact  
Hongze Cheng 已提交
193 194 195 196 197 198 199 200 201 202 203
  ASSERT(TSDB_FILE_OPENED(pDFile));

  int64_t nread = taosRead(pDFile->fd, buf, nbyte);
  if (nread < 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }

  return nread;
}

H
refact  
Hongze Cheng 已提交
204
static FORCE_INLINE int64_t tsdbTellDFile(SDFile *pDFile) { return tsdbSeekDFile(pDFile, 0, SEEK_CUR); }
H
refact  
Hongze Cheng 已提交
205

H
refact  
Hongze Cheng 已提交
206
static FORCE_INLINE void tsdbUpdateDFileMagic(SDFile* pDFile, void* pCksm) {
H
refact  
Hongze Cheng 已提交
207 208 209 210
  pDFile->info.magic = taosCalcChecksum(pDFile->info.magic, (uint8_t*)(pCksm), sizeof(TSCKSUM));
}

// =============== SDFileSet
H
refact  
Hongze Cheng 已提交
211 212 213 214 215 216
typedef struct {
  int    fid;
  int    state;
  SDFile files[TSDB_FILE_MAX];
} SDFileSet;

H
refact  
Hongze Cheng 已提交
217
#define TSDB_FSET_FID(s) ((s)->fid)
H
refact  
Hongze Cheng 已提交
218
#define TSDB_DFILE_IN_SET(s, t) ((s)->files + (t))
H
Hongze Cheng 已提交
219 220
#define TSDB_FSET_LEVEL(s) TSDB_FILE_LEVEL(TSDB_DFILE_IN_SET(s, 0))
#define TSDB_FSET_ID(s) TSDB_FILE_ID(TSDB_DFILE_IN_SET(s, 0))
H
refact  
Hongze Cheng 已提交
221 222

void tsdbInitDFileSet(SDFileSet* pSet, int vid, int fid, int ver, int level, int id);
H
refact  
Hongze Cheng 已提交
223
void tsdbInitDFileSetWithOld(SDFileSet* pSet, SDFileSet* pOldSet);
H
refact  
Hongze Cheng 已提交
224 225 226
int  tsdbOpenDFileSet(SDFileSet* pSet, int flags);
void tsdbCloseDFileSet(SDFileSet* pSet);
int  tsdbUpdateDFileSetHeader(SDFileSet* pSet);
H
Hongze Cheng 已提交
227 228
int  tsdbCopyDFileSet(SDFileSet src, int tolevel, int toid, SDFileSet* pDest);
int  tsdbCopyDFileSet(SDFileSet src, int tolevel, int toid, SDFileSet* pDest);
H
refact  
Hongze Cheng 已提交
229 230 231 232 233 234

#ifdef __cplusplus
}
#endif

#endif /* _TS_TSDB_FILE_H_ */