wal.h 6.9 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
  }

H
Hongze Cheng 已提交
64
#define WAL_HEAD_VER     0
L
Liu Jicong 已提交
65
#define WAL_NOSUFFIX_LEN 20
H
Hongze Cheng 已提交
66 67
#define WAL_SUFFIX_AT    (WAL_NOSUFFIX_LEN + 1)
#define WAL_LOG_SUFFIX   "log"
L
Liu Jicong 已提交
68
#define WAL_INDEX_SUFFIX "idx"
H
Hongze Cheng 已提交
69 70 71 72 73
#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)
#define WAL_MAGIC        0xFAFBFCFDULL
L
Liu Jicong 已提交
74

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

L
Liu Jicong 已提交
82 83 84 85 86
// used by sync module
typedef struct {
  int8_t   isWeek;
  uint64_t seqNum;
  uint64_t term;
L
Liu Jicong 已提交
87
} SSyncLogMeta;
L
Liu Jicong 已提交
88

L
Liu Jicong 已提交
89
typedef struct SWalReadHead {
L
Liu Jicong 已提交
90
  int8_t  headVer;
L
Liu Jicong 已提交
91
  int8_t  reserved;
L
Liu Jicong 已提交
92
  int16_t msgType;
L
Liu Jicong 已提交
93
  int32_t bodyLen;
L
Liu Jicong 已提交
94 95
  int64_t ingestTs;  // not implemented
  int64_t version;
L
Liu Jicong 已提交
96

L
Liu Jicong 已提交
97 98
  // sync meta
  SSyncLogMeta syncMeta;
L
Liu Jicong 已提交
99 100

  char body[];
L
Liu Jicong 已提交
101 102 103 104 105 106 107
} SWalReadHead;

typedef struct {
  int32_t  vgId;
  int32_t  fsyncPeriod;      // millisecond
  int32_t  retentionPeriod;  // secs
  int32_t  rollPeriod;       // secs
L
Liu Jicong 已提交
108
  int64_t  retentionSize;
L
Liu Jicong 已提交
109
  int64_t  segSize;
L
Liu Jicong 已提交
110
  EWalType level;  // wal level
L
Liu Jicong 已提交
111 112
} SWalCfg;

113
typedef struct {
L
Liu Jicong 已提交
114
  uint64_t     magic;
L
Liu Jicong 已提交
115 116
  uint32_t     cksumHead;
  uint32_t     cksumBody;
L
Liu Jicong 已提交
117
  SWalReadHead head;
118 119
} SWalHead;

L
Liu Jicong 已提交
120 121 122 123 124 125 126 127
typedef struct SWalVer {
  int64_t firstVer;
  int64_t verInSnapshotting;
  int64_t snapshotVer;
  int64_t commitVer;
  int64_t lastVer;
} SWalVer;

L
Liu Jicong 已提交
128
typedef struct SWal {
L
Liu Jicong 已提交
129
  // cfg
L
Liu Jicong 已提交
130
  SWalCfg cfg;
L
Liu Jicong 已提交
131
  int32_t fsyncSeq;
L
Liu Jicong 已提交
132
  // meta
L
Liu Jicong 已提交
133
  SWalVer   vers;
134 135
  TdFilePtr pWriteLogTFile;
  TdFilePtr pWriteIdxTFile;
L
Liu Jicong 已提交
136 137
  int32_t   writeCur;
  SArray   *fileInfoSet;
L
Liu Jicong 已提交
138
  // status
L
Liu Jicong 已提交
139 140
  int64_t totSize;
  int64_t lastRollSeq;
L
Liu Jicong 已提交
141
  // ctl
L
Liu Jicong 已提交
142
  int64_t       refId;
wafwerar's avatar
wafwerar 已提交
143
  TdThreadMutex mutex;
144 145
  // ref
  SHashObj *pRefHash;  // ref -> SWalRef
L
Liu Jicong 已提交
146
  // path
L
Liu Jicong 已提交
147
  char path[WAL_PATH_LEN];
L
Liu Jicong 已提交
148
  // reusable write head
L
Liu Jicong 已提交
149
  SWalHead writeHead;
L
Liu Jicong 已提交
150 151
} SWal;  // WAL HANDLE

L
Liu Jicong 已提交
152
typedef struct SWalReadHandle {
L
fix  
Liu Jicong 已提交
153 154 155 156 157 158 159 160 161
  SWal         *pWal;
  TdFilePtr     pReadLogTFile;
  TdFilePtr     pReadIdxTFile;
  int64_t       curFileFirstVer;
  int64_t       curVersion;
  int64_t       capacity;
  int64_t       status;  // if cursor valid
  TdThreadMutex mutex;
  SWalHead     *pHead;
L
Liu Jicong 已提交
162
} SWalReadHandle;
L
Liu Jicong 已提交
163
#pragma pack(pop)
L
Liu Jicong 已提交
164

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

S
Shengliang Guan 已提交
167 168 169
// module initialization
int32_t walInit();
void    walCleanUp();
170

S
Shengliang Guan 已提交
171
// handle open and ctl
L
Liu Jicong 已提交
172
SWal   *walOpen(const char *path, SWalCfg *pCfg);
S
Shengliang Guan 已提交
173 174
int32_t walAlter(SWal *, SWalCfg *pCfg);
void    walClose(SWal *);
175

S
Shengliang Guan 已提交
176
// write
L
Liu Jicong 已提交
177 178
int64_t walWriteWithSyncInfo(SWal *, int64_t index, tmsg_t msgType, SSyncLogMeta syncMeta, const void *body,
                             int32_t bodyLen);
L
Liu Jicong 已提交
179
int64_t walWrite(SWal *, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen);
L
Liu Jicong 已提交
180
void    walFsync(SWal *, bool force);
L
Liu Jicong 已提交
181

S
Shengliang Guan 已提交
182 183 184 185
// apis for lifecycle management
int32_t walCommit(SWal *, int64_t ver);
// truncate after
int32_t walRollback(SWal *, int64_t ver);
L
Liu Jicong 已提交
186
// notify that previous logs can be pruned safely
L
Liu Jicong 已提交
187 188
int32_t walBeginSnapshot(SWal *, int64_t ver);
int32_t walEndSnapshot(SWal *);
189
int32_t walRestoreFromSnapshot(SWal *, int64_t ver);
L
Liu Jicong 已提交
190
// int32_t  walDataCorrupted(SWal*);
191

S
Shengliang Guan 已提交
192
// read
L
Liu Jicong 已提交
193 194 195
SWalReadHandle *walOpenReadHandle(SWal *);
void            walCloseReadHandle(SWalReadHandle *);
int32_t         walReadWithHandle(SWalReadHandle *pRead, int64_t ver);
196 197 198 199 200 201 202

// only for tq usage
// int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **ppHead);
void    walSetReaderCapacity(SWalReadHandle *pRead, int32_t capacity);
int32_t walFetchHead(SWalReadHandle *pRead, int64_t ver, SWalHead *pHead);
int32_t walFetchBody(SWalReadHandle *pRead, SWalHead **ppHead);
int32_t walSkipFetchBody(SWalReadHandle *pRead, const SWalHead *pHead);
L
Liu Jicong 已提交
203

204 205 206 207 208 209 210 211 212 213
typedef struct {
  int64_t refId;
  int64_t ver;
} SWalRef;

SWalRef *walOpenRef(SWal *);
void     walCloseRef(SWalRef *);
int32_t  walRefVer(SWalRef *, int64_t ver);
int32_t  walUnrefVer(SWal *);

L
Liu Jicong 已提交
214 215
// deprecated
#if 0
S
Shengliang Guan 已提交
216
int32_t walRead(SWal *, SWalHead **, int64_t ver);
L
Liu Jicong 已提交
217 218
int32_t walReadWithFp(SWal *, FWalWrite writeFp, int64_t verStart, int32_t readNum);
#endif
219

S
Shengliang Guan 已提交
220
// lifecycle check
L
Liu Jicong 已提交
221 222 223
int64_t walGetFirstVer(SWal *);
int64_t walGetSnapshotVer(SWal *);
int64_t walGetLastVer(SWal *);
L
Liu Jicong 已提交
224
int64_t walGetCommittedVer(SWal *);
225

H
refact  
Hongze Cheng 已提交
226 227 228 229
#ifdef __cplusplus
}
#endif

230
#endif  // _TD_WAL_H_