wal.h 5.8 KB
Newer Older
H
refact  
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * 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 _TD_WAL_H_
#define _TD_WAL_H_

L
Liu Jicong 已提交
18
#include "os.h"
L
Liu Jicong 已提交
19
#include "tarray.h"
L
Liu Jicong 已提交
20 21
#include "tdef.h"
#include "tlog.h"
L
Liu Jicong 已提交
22
#include "tmsg.h"
H
refact  
Hongze Cheng 已提交
23 24 25 26
#ifdef __cplusplus
extern "C" {
#endif

27 28 29 30 31
#define wFatal(...)                                              \
  {                                                              \
    if (wDebugFlag & DEBUG_FATAL) {                              \
      taosPrintLog("WAL FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); \
    }                                                            \
L
Liu Jicong 已提交
32
  }
33 34 35 36 37
#define wError(...)                                              \
  {                                                              \
    if (wDebugFlag & DEBUG_ERROR) {                              \
      taosPrintLog("WAL ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); \
    }                                                            \
L
Liu Jicong 已提交
38
  }
39 40 41 42 43
#define wWarn(...)                                             \
  {                                                            \
    if (wDebugFlag & DEBUG_WARN) {                             \
      taosPrintLog("WAL WARN ", DEBUG_WARN, 255, __VA_ARGS__); \
    }                                                          \
L
Liu Jicong 已提交
44
  }
45 46 47 48 49
#define wInfo(...)                                        \
  {                                                       \
    if (wDebugFlag & DEBUG_INFO) {                        \
      taosPrintLog("WAL ", DEBUG_INFO, 255, __VA_ARGS__); \
    }                                                     \
L
Liu Jicong 已提交
50
  }
51 52 53 54 55
#define wDebug(...)                                               \
  {                                                               \
    if (wDebugFlag & DEBUG_DEBUG) {                               \
      taosPrintLog("WAL ", DEBUG_DEBUG, wDebugFlag, __VA_ARGS__); \
    }                                                             \
L
Liu Jicong 已提交
56
  }
57 58 59 60 61
#define wTrace(...)                                               \
  {                                                               \
    if (wDebugFlag & DEBUG_TRACE) {                               \
      taosPrintLog("WAL ", DEBUG_TRACE, wDebugFlag, __VA_ARGS__); \
    }                                                             \
L
Liu Jicong 已提交
62 63 64
  }

#define WAL_HEAD_VER 0
L
Liu Jicong 已提交
65
#define WAL_NOSUFFIX_LEN 20
L
Liu Jicong 已提交
66 67
#define WAL_SUFFIX_AT (WAL_NOSUFFIX_LEN + 1)
#define WAL_LOG_SUFFIX "log"
L
Liu Jicong 已提交
68
#define WAL_INDEX_SUFFIX "idx"
L
Liu Jicong 已提交
69 70 71 72
#define WAL_REFRESH_MS 1000
#define WAL_MAX_SIZE (TSDB_MAX_WAL_SIZE + sizeof(SWalHead))
#define WAL_PATH_LEN (TSDB_FILENAME_LEN + 12)
#define WAL_FILE_LEN (WAL_PATH_LEN + 32)
L
Liu Jicong 已提交
73
#define WAL_MAGIC 0xFAFBFCFDULL
L
Liu Jicong 已提交
74

L
Liu Jicong 已提交
75
#define WAL_CUR_FAILED 1
L
Liu Jicong 已提交
76

L
Liu Jicong 已提交
77
#pragma pack(push, 1)
L
Liu Jicong 已提交
78
typedef enum { TAOS_WAL_NOLOG = 0, TAOS_WAL_WRITE = 1, TAOS_WAL_FSYNC = 2 } EWalType;
79

L
Liu Jicong 已提交
80
typedef struct SWalReadHead {
L
Liu Jicong 已提交
81
  int8_t  headVer;
L
Liu Jicong 已提交
82 83
  int16_t msgType;
  int8_t  reserved;
L
Liu Jicong 已提交
84 85 86 87
  int32_t len;
  int64_t ingestTs;  // not implemented
  int64_t version;
  char    body[];
L
Liu Jicong 已提交
88 89 90 91 92 93 94
} SWalReadHead;

typedef struct {
  int32_t  vgId;
  int32_t  fsyncPeriod;      // millisecond
  int32_t  retentionPeriod;  // secs
  int32_t  rollPeriod;       // secs
L
Liu Jicong 已提交
95
  int64_t  retentionSize;
L
Liu Jicong 已提交
96
  int64_t  segSize;
L
Liu Jicong 已提交
97
  EWalType level;  // wal level
L
Liu Jicong 已提交
98 99
} SWalCfg;

100
typedef struct {
L
Liu Jicong 已提交
101
  uint64_t     magic;
L
Liu Jicong 已提交
102 103
  uint32_t     cksumHead;
  uint32_t     cksumBody;
L
Liu Jicong 已提交
104
  SWalReadHead head;
105 106
} SWalHead;

L
Liu Jicong 已提交
107 108 109 110 111 112 113 114
typedef struct SWalVer {
  int64_t firstVer;
  int64_t verInSnapshotting;
  int64_t snapshotVer;
  int64_t commitVer;
  int64_t lastVer;
} SWalVer;

L
Liu Jicong 已提交
115
typedef struct SWal {
L
Liu Jicong 已提交
116
  // cfg
L
Liu Jicong 已提交
117
  SWalCfg cfg;
L
Liu Jicong 已提交
118
  int32_t fsyncSeq;
L
Liu Jicong 已提交
119
  // meta
L
Liu Jicong 已提交
120
  SWalVer vers;
121 122
  TdFilePtr pWriteLogTFile;
  TdFilePtr pWriteIdxTFile;
L
Liu Jicong 已提交
123
  int32_t writeCur;
L
Liu Jicong 已提交
124 125
  SArray *fileInfoSet;
  // status
L
Liu Jicong 已提交
126 127
  int64_t totSize;
  int64_t lastRollSeq;
L
Liu Jicong 已提交
128 129
  // ctl
  int64_t         refId;
L
Liu Jicong 已提交
130
  pthread_mutex_t mutex;
L
Liu Jicong 已提交
131
  // path
L
Liu Jicong 已提交
132
  char path[WAL_PATH_LEN];
L
Liu Jicong 已提交
133
  // reusable write head
L
Liu Jicong 已提交
134
  SWalHead writeHead;
L
Liu Jicong 已提交
135 136
} SWal;  // WAL HANDLE

L
Liu Jicong 已提交
137
typedef struct SWalReadHandle {
L
Liu Jicong 已提交
138
  SWal     *pWal;
139 140
  TdFilePtr pReadLogTFile;
  TdFilePtr pReadIdxTFile;
L
Liu Jicong 已提交
141 142 143 144 145
  int64_t   curFileFirstVer;
  int64_t   curVersion;
  int64_t   capacity;
  int64_t   status;  // if cursor valid
  SWalHead *pHead;
L
Liu Jicong 已提交
146
} SWalReadHandle;
L
Liu Jicong 已提交
147
#pragma pack(pop)
L
Liu Jicong 已提交
148

L
Liu Jicong 已提交
149
// typedef int32_t (*FWalWrite)(void *ahandle, void *pHead);
150

S
Shengliang Guan 已提交
151 152 153
// module initialization
int32_t walInit();
void    walCleanUp();
154

S
Shengliang Guan 已提交
155
// handle open and ctl
L
Liu Jicong 已提交
156
SWal   *walOpen(const char *path, SWalCfg *pCfg);
S
Shengliang Guan 已提交
157 158
int32_t walAlter(SWal *, SWalCfg *pCfg);
void    walClose(SWal *);
159

S
Shengliang Guan 已提交
160
// write
L
Liu Jicong 已提交
161
int64_t walWrite(SWal *, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen);
L
Liu Jicong 已提交
162
void    walFsync(SWal *, bool force);
L
Liu Jicong 已提交
163

S
Shengliang Guan 已提交
164 165 166 167
// apis for lifecycle management
int32_t walCommit(SWal *, int64_t ver);
// truncate after
int32_t walRollback(SWal *, int64_t ver);
L
Liu Jicong 已提交
168
// notify that previous logs can be pruned safely
L
Liu Jicong 已提交
169 170
int32_t walBeginSnapshot(SWal *, int64_t ver);
int32_t walEndSnapshot(SWal *);
L
Liu Jicong 已提交
171
// int32_t  walDataCorrupted(SWal*);
172

S
Shengliang Guan 已提交
173
// read
L
Liu Jicong 已提交
174 175 176
SWalReadHandle *walOpenReadHandle(SWal *);
void            walCloseReadHandle(SWalReadHandle *);
int32_t         walReadWithHandle(SWalReadHandle *pRead, int64_t ver);
L
Liu Jicong 已提交
177

L
Liu Jicong 已提交
178 179
// deprecated
#if 0
S
Shengliang Guan 已提交
180
int32_t walRead(SWal *, SWalHead **, int64_t ver);
L
Liu Jicong 已提交
181 182
int32_t walReadWithFp(SWal *, FWalWrite writeFp, int64_t verStart, int32_t readNum);
#endif
183

S
Shengliang Guan 已提交
184
// lifecycle check
L
Liu Jicong 已提交
185 186 187
int64_t walGetFirstVer(SWal *);
int64_t walGetSnapshotVer(SWal *);
int64_t walGetLastVer(SWal *);
188

H
refact  
Hongze Cheng 已提交
189 190 191 192
#ifdef __cplusplus
}
#endif

193
#endif  // _TD_WAL_H_