wal.h 4.7 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 20
#include "tdef.h"
#include "tlog.h"
L
Liu Jicong 已提交
21
#include "tarray.h"
H
refact  
Hongze Cheng 已提交
22 23 24 25
#ifdef __cplusplus
extern "C" {
#endif

L
Liu Jicong 已提交
26 27 28 29 30 31 32 33 34
extern int32_t wDebugFlag;

#define wFatal(...) { if (wDebugFlag & DEBUG_FATAL) { taosPrintLog("WAL FATAL ", 255, __VA_ARGS__); }}
#define wError(...) { if (wDebugFlag & DEBUG_ERROR) { taosPrintLog("WAL ERROR ", 255, __VA_ARGS__); }}
#define wWarn(...)  { if (wDebugFlag & DEBUG_WARN)  { taosPrintLog("WAL WARN ", 255, __VA_ARGS__); }}
#define wInfo(...)  { if (wDebugFlag & DEBUG_INFO)  { taosPrintLog("WAL ", 255, __VA_ARGS__); }}
#define wDebug(...) { if (wDebugFlag & DEBUG_DEBUG) { taosPrintLog("WAL ", wDebugFlag, __VA_ARGS__); }}
#define wTrace(...) { if (wDebugFlag & DEBUG_TRACE) { taosPrintLog("WAL ", wDebugFlag, __VA_ARGS__); }}

L
Liu Jicong 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#define WAL_PREFIX       "wal"
#define WAL_PREFIX_LEN   3
#define WAL_NOSUFFIX_LEN 20
#define WAL_SUFFIX_AT    (WAL_NOSUFFIX_LEN+1)
#define WAL_LOG_SUFFIX   "log"
#define WAL_INDEX_SUFFIX "idx"
#define WAL_REFRESH_MS   1000
#define WAL_MAX_SIZE     (TSDB_MAX_WAL_SIZE + sizeof(SWalHead) + 16)
#define WAL_PATH_LEN     (TSDB_FILENAME_LEN + 12)
#define WAL_FILE_LEN     (WAL_PATH_LEN + 32)

#define WAL_IDX_ENTRY_SIZE    (sizeof(int64_t)*2)
#define WAL_CUR_POS_WRITABLE  1
#define WAL_CUR_FILE_WRITABLE 2
#define WAL_CUR_FAILED        4

#pragma pack(push,1)
52 53
typedef enum {
  TAOS_WAL_NOLOG = 0,
L
Liu Jicong 已提交
54 55
  TAOS_WAL_WRITE = 1,
  TAOS_WAL_FSYNC = 2
56 57
} EWalType;

L
Liu Jicong 已提交
58 59 60 61 62
typedef struct SWalReadHead {
  int8_t   sver;
  uint8_t  msgType;
  int8_t   reserved[2];
  int32_t  len;
L
Liu Jicong 已提交
63
  //int64_t  ingestTs;  //not implemented
L
Liu Jicong 已提交
64
  int64_t  version;
L
Liu Jicong 已提交
65
  char     body[];
L
Liu Jicong 已提交
66 67 68 69 70 71 72
} SWalReadHead;

typedef struct {
  int32_t  vgId;
  int32_t  fsyncPeriod;      // millisecond
  int32_t  retentionPeriod;  // secs
  int32_t  rollPeriod;       // secs
L
Liu Jicong 已提交
73
  int64_t  retentionSize;
L
Liu Jicong 已提交
74
  int64_t  segSize;
L
Liu Jicong 已提交
75
  EWalType level;         // wal level
L
Liu Jicong 已提交
76 77
} SWalCfg;

78
typedef struct {
L
Liu Jicong 已提交
79 80 81 82 83 84 85 86
  //union {
    //uint32_t info;
    //struct {
      //uint32_t sver:3;
      //uint32_t msgtype: 5;
      //uint32_t reserved : 24;
    //};
  //};
L
Liu Jicong 已提交
87 88
  uint32_t cksumHead;
  uint32_t cksumBody;
L
Liu Jicong 已提交
89
  SWalReadHead head;
90 91
} SWalHead;

L
Liu Jicong 已提交
92 93 94 95 96 97 98 99
typedef struct SWalVer {
  int64_t firstVer;
  int64_t verInSnapshotting;
  int64_t snapshotVer;
  int64_t commitVer;
  int64_t lastVer;
} SWalVer;

L
Liu Jicong 已提交
100
typedef struct SWal {
L
Liu Jicong 已提交
101
  // cfg
L
Liu Jicong 已提交
102 103
  SWalCfg cfg;
  SWalVer vers;
L
Liu Jicong 已提交
104
  //file set
L
Liu Jicong 已提交
105
  int32_t writeCur;
L
Liu Jicong 已提交
106 107
  int64_t writeLogTfd;
  int64_t writeIdxTfd;
L
Liu Jicong 已提交
108
  SArray* fileInfoSet;
L
Liu Jicong 已提交
109 110
  //ctl
  int32_t curStatus;
L
Liu Jicong 已提交
111 112 113 114
  int32_t fsyncSeq;
  int64_t totSize;
  int64_t refId;
  int64_t lastRollSeq;
L
Liu Jicong 已提交
115
  pthread_mutex_t mutex;
L
Liu Jicong 已提交
116 117
  //path
  char path[WAL_PATH_LEN];
L
Liu Jicong 已提交
118
  //reusable write head
L
Liu Jicong 已提交
119
  SWalHead writeHead;
L
Liu Jicong 已提交
120 121
} SWal;  // WAL HANDLE

L
Liu Jicong 已提交
122 123 124 125 126 127 128 129
typedef struct SWalReadHandle {
  SWal*        pWal;
  int64_t      readLogTfd;
  int64_t      readIdxTfd;
  int64_t      curFileFirstVer;
  int64_t      curVersion;
  int64_t      capacity;
  int64_t      status;  //if cursor valid
L
Liu Jicong 已提交
130
  SWalHead*    pHead;
L
Liu Jicong 已提交
131
} SWalReadHandle;
L
Liu Jicong 已提交
132
#pragma pack(pop)
L
Liu Jicong 已提交
133

L
Liu Jicong 已提交
134
typedef int32_t (*FWalWrite)(void *ahandle, void *pHead);
135

S
Shengliang Guan 已提交
136 137 138
// module initialization
int32_t walInit();
void    walCleanUp();
139

S
Shengliang Guan 已提交
140
// handle open and ctl
L
Liu Jicong 已提交
141
SWal   *walOpen(const char *path, SWalCfg *pCfg);
S
Shengliang Guan 已提交
142 143
int32_t walAlter(SWal *, SWalCfg *pCfg);
void    walClose(SWal *);
144

S
Shengliang Guan 已提交
145
// write
L
Liu Jicong 已提交
146
int64_t walWrite(SWal *, int64_t index, uint8_t msgType, const void *body, int32_t bodyLen);
L
Liu Jicong 已提交
147
void    walFsync(SWal *, bool force);
L
Liu Jicong 已提交
148

S
Shengliang Guan 已提交
149 150 151 152
// apis for lifecycle management
int32_t walCommit(SWal *, int64_t ver);
// truncate after
int32_t walRollback(SWal *, int64_t ver);
L
Liu Jicong 已提交
153
// notify that previous logs can be pruned safely
L
Liu Jicong 已提交
154 155
int32_t walBeginTakeSnapshot(SWal *, int64_t ver);
int32_t walEndTakeSnapshot(SWal *);
L
Liu Jicong 已提交
156
//int32_t  walDataCorrupted(SWal*);
157

S
Shengliang Guan 已提交
158
// read
L
Liu Jicong 已提交
159 160 161 162
SWalReadHandle* walOpenReadHandle(SWal *);
void    walCloseReadHandle(SWalReadHandle *);
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver);

S
Shengliang Guan 已提交
163 164
int32_t walRead(SWal *, SWalHead **, int64_t ver);
int32_t walReadWithFp(SWal *, FWalWrite writeFp, int64_t verStart, int32_t readNum);
165

S
Shengliang Guan 已提交
166
// lifecycle check
L
Liu Jicong 已提交
167 168 169
int64_t walGetFirstVer(SWal *);
int64_t walGetSnapshotVer(SWal *);
int64_t walGetLastVer(SWal *);
170

H
refact  
Hongze Cheng 已提交
171 172 173 174
#ifdef __cplusplus
}
#endif

175
#endif  // _TD_WAL_H_