wal.h 6.3 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
#define WAL_CUR_FAILED 1
L
Liu Jicong 已提交
76

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

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

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

L
Liu Jicong 已提交
99 100
  // sync meta
  SSyncLogMeta syncMeta;
L
Liu Jicong 已提交
101 102

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

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

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

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

L
Liu Jicong 已提交
130
typedef struct SWal {
L
Liu Jicong 已提交
131
  // cfg
L
Liu Jicong 已提交
132
  SWalCfg cfg;
L
Liu Jicong 已提交
133
  int32_t fsyncSeq;
L
Liu Jicong 已提交
134
  // meta
L
Liu Jicong 已提交
135
  SWalVer   vers;
136 137
  TdFilePtr pWriteLogTFile;
  TdFilePtr pWriteIdxTFile;
L
Liu Jicong 已提交
138 139
  int32_t   writeCur;
  SArray   *fileInfoSet;
L
Liu Jicong 已提交
140
  // status
L
Liu Jicong 已提交
141 142
  int64_t totSize;
  int64_t lastRollSeq;
L
Liu Jicong 已提交
143
  // ctl
L
Liu Jicong 已提交
144
  int64_t       refId;
wafwerar's avatar
wafwerar 已提交
145
  TdThreadMutex mutex;
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 *);
L
Liu Jicong 已提交
189
// int32_t  walDataCorrupted(SWal*);
190

S
Shengliang Guan 已提交
191
// read
L
Liu Jicong 已提交
192 193 194
SWalReadHandle *walOpenReadHandle(SWal *);
void            walCloseReadHandle(SWalReadHandle *);
int32_t         walReadWithHandle(SWalReadHandle *pRead, int64_t ver);
L
fix  
Liu Jicong 已提交
195
int32_t         walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **ppHead);
L
Liu Jicong 已提交
196

L
Liu Jicong 已提交
197 198
// deprecated
#if 0
S
Shengliang Guan 已提交
199
int32_t walRead(SWal *, SWalHead **, int64_t ver);
L
Liu Jicong 已提交
200 201
int32_t walReadWithFp(SWal *, FWalWrite writeFp, int64_t verStart, int32_t readNum);
#endif
202

S
Shengliang Guan 已提交
203
// lifecycle check
L
Liu Jicong 已提交
204 205 206
int64_t walGetFirstVer(SWal *);
int64_t walGetSnapshotVer(SWal *);
int64_t walGetLastVer(SWal *);
207

H
refact  
Hongze Cheng 已提交
208 209 210 211
#ifdef __cplusplus
}
#endif

212
#endif  // _TD_WAL_H_