syncInt.h 11.0 KB
Newer Older
M
Minghao Li 已提交
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
/*
 * 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_LIBS_SYNC_INT_H
#define _TD_LIBS_SYNC_INT_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
M
Minghao Li 已提交
26
#include "cJSON.h"
M
Minghao Li 已提交
27
#include "sync.h"
M
Minghao Li 已提交
28
#include "syncTools.h"
M
Minghao Li 已提交
29
#include "taosdef.h"
M
syncInt  
Minghao Li 已提交
30
#include "tglobal.h"
M
Minghao Li 已提交
31
#include "tlog.h"
M
Minghao Li 已提交
32
#include "ttimer.h"
M
Minghao Li 已提交
33

34 35 36 37 38
#define sFatal(...)                                              \
  {                                                              \
    if (sDebugFlag & DEBUG_FATAL) {                              \
      taosPrintLog("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); \
    }                                                            \
M
Minghao Li 已提交
39
  }
40 41 42 43 44
#define sError(...)                                              \
  {                                                              \
    if (sDebugFlag & DEBUG_ERROR) {                              \
      taosPrintLog("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); \
    }                                                            \
M
Minghao Li 已提交
45
  }
46 47 48 49 50
#define sWarn(...)                                             \
  {                                                            \
    if (sDebugFlag & DEBUG_WARN) {                             \
      taosPrintLog("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); \
    }                                                          \
M
Minghao Li 已提交
51
  }
52 53 54 55 56
#define sInfo(...)                                             \
  {                                                            \
    if (sDebugFlag & DEBUG_INFO) {                             \
      taosPrintLog("SYN INFO ", DEBUG_INFO, 255, __VA_ARGS__); \
    }                                                          \
M
Minghao Li 已提交
57
  }
58 59 60 61 62
#define sDebug(...)                                                     \
  {                                                                     \
    if (sDebugFlag & DEBUG_DEBUG) {                                     \
      taosPrintLog("SYN DEBUG ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); \
    }                                                                   \
M
Minghao Li 已提交
63
  }
64 65 66 67 68
#define sTrace(...)                                                     \
  {                                                                     \
    if (sDebugFlag & DEBUG_TRACE) {                                     \
      taosPrintLog("SYN TRACE ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); \
    }                                                                   \
M
Minghao Li 已提交
69 70
  }

M
Minghao Li 已提交
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#define sFatalLong(...)                                                 \
  {                                                                     \
    if (sDebugFlag & DEBUG_FATAL) {                                     \
      taosPrintLongString("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); \
    }                                                                   \
  }
#define sErrorLong(...)                                                 \
  {                                                                     \
    if (sDebugFlag & DEBUG_ERROR) {                                     \
      taosPrintLongString("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); \
    }                                                                   \
  }
#define sWarnLong(...)                                                \
  {                                                                   \
    if (sDebugFlag & DEBUG_WARN) {                                    \
      taosPrintLongString("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); \
    }                                                                 \
  }
#define sInfoLong(...)                                                \
  {                                                                   \
    if (sDebugFlag & DEBUG_INFO) {                                    \
      taosPrintLongString("SYN INFO ", DEBUG_INFO, 255, __VA_ARGS__); \
    }                                                                 \
  }
#define sDebugLong(...)                                                        \
  {                                                                            \
    if (sDebugFlag & DEBUG_DEBUG) {                                            \
      taosPrintLongString("SYN DEBUG ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); \
    }                                                                          \
  }
#define sTraceLong(...)                                                        \
  {                                                                            \
    if (sDebugFlag & DEBUG_TRACE) {                                            \
      taosPrintLongString("SYN TRACE ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); \
    }                                                                          \
  }

M
Minghao Li 已提交
108 109 110
struct SyncTimeout;
typedef struct SyncTimeout SyncTimeout;

M
Minghao Li 已提交
111 112 113
struct SyncClientRequest;
typedef struct SyncClientRequest SyncClientRequest;

M
Minghao Li 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
struct SyncPing;
typedef struct SyncPing SyncPing;

struct SyncPingReply;
typedef struct SyncPingReply SyncPingReply;

struct SyncRequestVote;
typedef struct SyncRequestVote SyncRequestVote;

struct SyncRequestVoteReply;
typedef struct SyncRequestVoteReply SyncRequestVoteReply;

struct SyncAppendEntries;
typedef struct SyncAppendEntries SyncAppendEntries;

struct SyncAppendEntriesReply;
typedef struct SyncAppendEntriesReply SyncAppendEntriesReply;
M
Minghao Li 已提交
131

M
Minghao Li 已提交
132 133 134
struct SSyncEnv;
typedef struct SSyncEnv SSyncEnv;

M
syncInt  
Minghao Li 已提交
135 136 137 138 139 140
struct SRaftStore;
typedef struct SRaftStore SRaftStore;

struct SVotesGranted;
typedef struct SVotesGranted SVotesGranted;

M
Minghao Li 已提交
141 142
struct SVotesRespond;
typedef struct SVotesRespond SVotesRespond;
M
syncInt  
Minghao Li 已提交
143

M
Minghao Li 已提交
144 145 146
struct SSyncIndexMgr;
typedef struct SSyncIndexMgr SSyncIndexMgr;

M
Minghao Li 已提交
147 148 149 150 151
struct SRaftCfg;
typedef struct SRaftCfg SRaftCfg;

struct SSyncRespMgr;
typedef struct SSyncRespMgr SSyncRespMgr;
M
Minghao Li 已提交
152

M
Minghao Li 已提交
153
typedef struct SSyncNode {
M
syncInt  
Minghao Li 已提交
154
  // init by SSyncInfo
M
Minghao Li 已提交
155
  SyncGroupId vgId;
M
Minghao Li 已提交
156
  SRaftCfg*   pRaftCfg;
M
Minghao Li 已提交
157
  char        path[TSDB_FILENAME_LEN];
M
Minghao Li 已提交
158
  char        raftStorePath[TSDB_FILENAME_LEN * 2];
M
Minghao Li 已提交
159
  char        configPath[TSDB_FILENAME_LEN * 2];
M
Minghao Li 已提交
160 161

  // sync io
S
Shengliang Guan 已提交
162 163 164 165
  SWal*         pWal;
  const SMsgCb* msgcb;
  int32_t (*FpSendMsg)(const SEpSet* pEpSet, SRpcMsg* pMsg);
  int32_t (*FpEqMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg);
M
Minghao Li 已提交
166

M
syncInt  
Minghao Li 已提交
167
  // init internal
M
Minghao Li 已提交
168 169
  SNodeInfo myNodeInfo;
  SRaftId   myRaftId;
M
Minghao Li 已提交
170

M
Minghao Li 已提交
171
  int32_t   peersNum;
M
Minghao Li 已提交
172
  SNodeInfo peersNodeInfo[TSDB_MAX_REPLICA];
M
Minghao Li 已提交
173 174 175 176
  SRaftId   peersId[TSDB_MAX_REPLICA];

  int32_t replicaNum;
  SRaftId replicasId[TSDB_MAX_REPLICA];
M
Minghao Li 已提交
177

M
syncInt  
Minghao Li 已提交
178 179 180
  // raft algorithm
  SSyncFSM* pFsm;
  int32_t   quorum;
M
Minghao Li 已提交
181
  SRaftId   leaderCache;
M
syncInt  
Minghao Li 已提交
182 183 184 185 186 187 188 189 190

  // life cycle
  int64_t rid;

  // tla+ server vars
  ESyncState  state;
  SRaftStore* pRaftStore;

  // tla+ candidate vars
M
Minghao Li 已提交
191 192
  SVotesGranted* pVotesGranted;
  SVotesRespond* pVotesRespond;
M
Minghao Li 已提交
193

M
syncInt  
Minghao Li 已提交
194
  // tla+ leader vars
M
Minghao Li 已提交
195 196
  SSyncIndexMgr* pNextIndex;
  SSyncIndexMgr* pMatchIndex;
M
syncInt  
Minghao Li 已提交
197 198 199 200 201

  // tla+ log vars
  SSyncLogStore* pLogStore;
  SyncIndex      commitIndex;

M
Minghao Li 已提交
202 203 204 205 206
  // timer ms init
  int32_t pingBaseLine;
  int32_t electBaseLine;
  int32_t hbBaseLine;

M
Minghao Li 已提交
207
  // ping timer
M
Minghao Li 已提交
208 209
  tmr_h             pPingTimer;
  int32_t           pingTimerMS;
M
Minghao Li 已提交
210 211
  uint64_t          pingTimerLogicClock;
  uint64_t          pingTimerLogicClockUser;
M
Minghao Li 已提交
212
  TAOS_TMR_CALLBACK FpPingTimerCB;  // Timer Fp
M
Minghao Li 已提交
213 214
  uint64_t          pingTimerCounter;

M
Minghao Li 已提交
215
  // elect timer
M
Minghao Li 已提交
216 217
  tmr_h             pElectTimer;
  int32_t           electTimerMS;
M
Minghao Li 已提交
218 219
  uint64_t          electTimerLogicClock;
  uint64_t          electTimerLogicClockUser;
M
Minghao Li 已提交
220
  TAOS_TMR_CALLBACK FpElectTimerCB;  // Timer Fp
M
Minghao Li 已提交
221 222
  uint64_t          electTimerCounter;

M
Minghao Li 已提交
223
  // heartbeat timer
M
Minghao Li 已提交
224 225
  tmr_h             pHeartbeatTimer;
  int32_t           heartbeatTimerMS;
M
Minghao Li 已提交
226 227
  uint64_t          heartbeatTimerLogicClock;
  uint64_t          heartbeatTimerLogicClockUser;
M
Minghao Li 已提交
228
  TAOS_TMR_CALLBACK FpHeartbeatTimerCB;  // Timer Fp
M
Minghao Li 已提交
229 230 231
  uint64_t          heartbeatTimerCounter;

  // callback
M
Minghao Li 已提交
232 233
  int32_t (*FpOnPing)(SSyncNode* ths, SyncPing* pMsg);
  int32_t (*FpOnPingReply)(SSyncNode* ths, SyncPingReply* pMsg);
M
Minghao Li 已提交
234
  int32_t (*FpOnClientRequest)(SSyncNode* ths, SyncClientRequest* pMsg);
M
Minghao Li 已提交
235 236 237 238
  int32_t (*FpOnRequestVote)(SSyncNode* ths, SyncRequestVote* pMsg);
  int32_t (*FpOnRequestVoteReply)(SSyncNode* ths, SyncRequestVoteReply* pMsg);
  int32_t (*FpOnAppendEntries)(SSyncNode* ths, SyncAppendEntries* pMsg);
  int32_t (*FpOnAppendEntriesReply)(SSyncNode* ths, SyncAppendEntriesReply* pMsg);
M
Minghao Li 已提交
239
  int32_t (*FpOnTimeout)(SSyncNode* pSyncNode, SyncTimeout* pMsg);
M
Minghao Li 已提交
240

M
Minghao Li 已提交
241 242 243
  // tools
  SSyncRespMgr* pSyncRespMgr;

M
Minghao Li 已提交
244 245
} SSyncNode;

M
Minghao Li 已提交
246
// open/close --------------
M
Minghao Li 已提交
247
SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo);
M
Minghao Li 已提交
248
void       syncNodeStart(SSyncNode* pSyncNode);
M
Minghao Li 已提交
249
void       syncNodeStartStandBy(SSyncNode* pSyncNode);
M
syncInt  
Minghao Li 已提交
250
void       syncNodeClose(SSyncNode* pSyncNode);
M
Minghao Li 已提交
251

M
Minghao Li 已提交
252
// ping --------------
M
Minghao Li 已提交
253
int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing* pMsg);
M
Minghao Li 已提交
254
int32_t syncNodePingSelf(SSyncNode* pSyncNode);
M
Minghao Li 已提交
255 256
int32_t syncNodePingPeers(SSyncNode* pSyncNode);
int32_t syncNodePingAll(SSyncNode* pSyncNode);
M
Minghao Li 已提交
257

M
Minghao Li 已提交
258
// timer control --------------
M
Minghao Li 已提交
259 260
int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode);
int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode);
M
Minghao Li 已提交
261
int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms);
M
Minghao Li 已提交
262
int32_t syncNodeStopElectTimer(SSyncNode* pSyncNode);
M
Minghao Li 已提交
263
int32_t syncNodeRestartElectTimer(SSyncNode* pSyncNode, int32_t ms);
M
Minghao Li 已提交
264
int32_t syncNodeResetElectTimer(SSyncNode* pSyncNode);
M
Minghao Li 已提交
265 266
int32_t syncNodeStartHeartbeatTimer(SSyncNode* pSyncNode);
int32_t syncNodeStopHeartbeatTimer(SSyncNode* pSyncNode);
M
Minghao Li 已提交
267 268

// utils --------------
M
Minghao Li 已提交
269 270 271 272 273
int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRpcMsg* pMsg);
int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, SRpcMsg* pMsg);
cJSON*  syncNode2Json(const SSyncNode* pSyncNode);
char*   syncNode2Str(const SSyncNode* pSyncNode);
char*   syncNode2SimpleStr(const SSyncNode* pSyncNode);
M
Minghao Li 已提交
274
void    syncNodeUpdateConfig(SSyncNode* pSyncNode, SSyncCfg* newConfig);
M
Minghao Li 已提交
275

M
Minghao Li 已提交
276 277
SSyncNode* syncNodeAcquire(int64_t rid);
void       syncNodeRelease(SSyncNode* pNode);
M
Minghao Li 已提交
278

M
Minghao Li 已提交
279 280 281 282 283 284 285 286 287 288 289 290 291 292
// raft state change --------------
void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term);
void syncNodeBecomeFollower(SSyncNode* pSyncNode);
void syncNodeBecomeLeader(SSyncNode* pSyncNode);

void syncNodeCandidate2Leader(SSyncNode* pSyncNode);
void syncNodeFollower2Candidate(SSyncNode* pSyncNode);
void syncNodeLeader2Follower(SSyncNode* pSyncNode);
void syncNodeCandidate2Follower(SSyncNode* pSyncNode);

// raft vote --------------
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId);
void syncNodeVoteForSelf(SSyncNode* pSyncNode);

M
Minghao Li 已提交
293 294 295 296 297
// for debug --------------
void syncNodePrint(SSyncNode* pObj);
void syncNodePrint2(char* s, SSyncNode* pObj);
void syncNodeLog(SSyncNode* pObj);
void syncNodeLog2(char* s, SSyncNode* pObj);
M
Minghao Li 已提交
298

M
Minghao Li 已提交
299 300 301 302 303
#ifdef __cplusplus
}
#endif

#endif /*_TD_LIBS_SYNC_INT_H*/