sync.h 5.1 KB
Newer Older
S
Shengliang Guan 已提交
1
/*
M
Minghao Li 已提交
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
S
Shengliang Guan 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 *
 * 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_H
#define _TD_LIBS_SYNC_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
M
Minghao Li 已提交
24
#include <tep.h>
S
Shengliang Guan 已提交
25
#include "taosdef.h"
M
Minghao Li 已提交
26
#include "trpc.h"
S
Shengliang Guan 已提交
27

M
Minghao Li 已提交
28
typedef uint64_t SyncNodeId;
S
Shengliang Guan 已提交
29 30 31 32 33 34 35 36
typedef int32_t  SyncGroupId;
typedef int64_t  SyncIndex;
typedef uint64_t SyncTerm;

typedef enum {
  TAOS_SYNC_STATE_FOLLOWER = 0,
  TAOS_SYNC_STATE_CANDIDATE = 1,
  TAOS_SYNC_STATE_LEADER = 2,
M
syncInt  
Minghao Li 已提交
37
} ESyncState;
S
Shengliang Guan 已提交
38

M
Minghao Li 已提交
39
typedef struct SSyncBuffer {
S
Shengliang Guan 已提交
40 41 42 43
  void*  data;
  size_t len;
} SSyncBuffer;

M
Minghao Li 已提交
44 45 46
typedef struct SNodeInfo {
  uint16_t nodePort;                 // node sync Port
  char     nodeFqdn[TSDB_FQDN_LEN];  // node FQDN
S
Shengliang Guan 已提交
47 48
} SNodeInfo;

M
Minghao Li 已提交
49
typedef struct SSyncCfg {
M
Minghao Li 已提交
50
  int32_t   replicaNum;
M
Minghao Li 已提交
51
  int32_t   myIndex;
S
Shengliang Guan 已提交
52
  SNodeInfo nodeInfo[TSDB_MAX_REPLICA];
M
Minghao Li 已提交
53
} SSyncCfg;
S
Shengliang Guan 已提交
54

M
Minghao Li 已提交
55
typedef struct SNodesRole {
M
Minghao Li 已提交
56 57
  int32_t    replicaNum;
  SNodeInfo  nodeInfo[TSDB_MAX_REPLICA];
S
Shengliang Guan 已提交
58 59 60
  ESyncState role[TSDB_MAX_REPLICA];
} SNodesRole;

M
Minghao Li 已提交
61 62 63 64 65
// abstract definition of snapshot
typedef struct SSnapshot {
  void*     data;
  SyncIndex lastApplyIndex;
} SSnapshot;
S
Shengliang Guan 已提交
66

M
Minghao Li 已提交
67 68
typedef struct SSyncFSM {
  void* data;
S
Shengliang Guan 已提交
69

M
Minghao Li 已提交
70 71
  // when value in pBuf finish a raft flow, FpCommitCb is called, code indicates the result
  // user can do something according to the code and isWeak. for example, write data into tsdb
M
Minghao Li 已提交
72
  void (*FpCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
S
Shengliang Guan 已提交
73

M
Minghao Li 已提交
74 75
  // when value in pBuf has been written into local log store, FpPreCommitCb is called, code indicates the result
  // user can do something according to the code and isWeak. for example, write data into tsdb
M
Minghao Li 已提交
76
  void (*FpPreCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
S
Shengliang Guan 已提交
77

M
Minghao Li 已提交
78 79
  // when log entry is updated by a new one, FpRollBackCb is called
  // user can do something to roll back. for example, delete data from tsdb, or just ignore it
M
Minghao Li 已提交
80
  void (*FpRollBackCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
S
Shengliang Guan 已提交
81

M
Minghao Li 已提交
82 83
  // user should implement this function, use "data" to take snapshot into "snapshot"
  int32_t (*FpTakeSnapshot)(SSnapshot* snapshot);
S
Shengliang Guan 已提交
84

M
Minghao Li 已提交
85 86
  // user should implement this function, restore "data" from "snapshot"
  int32_t (*FpRestoreSnapshot)(const SSnapshot* snapshot);
S
Shengliang Guan 已提交
87 88 89

} SSyncFSM;

M
Minghao Li 已提交
90 91
// abstract definition of log store in raft
// SWal implements it
S
Shengliang Guan 已提交
92
typedef struct SSyncLogStore {
M
Minghao Li 已提交
93 94 95
  void* data;

  // append one log entry
M
Minghao Li 已提交
96
  int32_t (*appendEntry)(struct SSyncLogStore* pLogStore, SRpcMsg* pBuf);
S
Shengliang Guan 已提交
97

M
Minghao Li 已提交
98
  // get one log entry, user need to free pBuf->data
M
Minghao Li 已提交
99
  int32_t (*getEntry)(struct SSyncLogStore* pLogStore, SyncIndex index, SRpcMsg* pBuf);
S
Shengliang Guan 已提交
100

M
Minghao Li 已提交
101 102
  // update log store commit index with "index"
  int32_t (*updateCommitIndex)(struct SSyncLogStore* pLogStore, SyncIndex index);
S
Shengliang Guan 已提交
103

M
Minghao Li 已提交
104 105
  // truncate log with index, entries after the given index (>index) will be deleted
  int32_t (*truncate)(struct SSyncLogStore* pLogStore, SyncIndex index);
S
Shengliang Guan 已提交
106

M
Minghao Li 已提交
107 108
  // return commit index of log
  SyncIndex (*getCommitIndex)(struct SSyncLogStore* pLogStore);
S
Shengliang Guan 已提交
109

M
Minghao Li 已提交
110 111 112 113 114
  // return index of last entry
  SyncIndex (*getLastIndex)(struct SSyncLogStore* pLogStore);

  // return term of last entry
  SyncTerm (*getLastTerm)(struct SSyncLogStore* pLogStore);
S
Shengliang Guan 已提交
115 116 117

} SSyncLogStore;

M
Minghao Li 已提交
118 119 120
// raft need to persist two variables in storage: currentTerm, voteFor
typedef struct SStateMgr {
  void* data;
S
Shengliang Guan 已提交
121

M
Minghao Li 已提交
122 123
  int32_t (*getCurrentTerm)(struct SStateMgr* pMgr, SyncTerm* pCurrentTerm);
  int32_t (*persistCurrentTerm)(struct SStateMgr* pMgr, SyncTerm pCurrentTerm);
S
Shengliang Guan 已提交
124

M
Minghao Li 已提交
125 126
  int32_t (*getVoteFor)(struct SStateMgr* pMgr, SyncNodeId* pVoteFor);
  int32_t (*persistVoteFor)(struct SStateMgr* pMgr, SyncNodeId voteFor);
S
Shengliang Guan 已提交
127

M
Minghao Li 已提交
128 129
  int32_t (*getSyncCfg)(struct SStateMgr* pMgr, SSyncCfg* pSyncCfg);
  int32_t (*persistSyncCfg)(struct SStateMgr* pMgr, SSyncCfg* pSyncCfg);
S
Shengliang Guan 已提交
130

M
Minghao Li 已提交
131
} SStateMgr;
S
Shengliang Guan 已提交
132

M
Minghao Li 已提交
133 134 135
typedef struct SSyncInfo {
  SyncGroupId vgId;
  SSyncCfg    syncCfg;
M
Minghao Li 已提交
136 137
  char        path[TSDB_FILENAME_LEN];
  SSyncFSM*   pFsm;
M
Minghao Li 已提交
138 139 140

  void* rpcClient;
  int32_t (*FpSendMsg)(void* rpcClient, const SEpSet* pEpSet, SRpcMsg* pMsg);
M
Minghao Li 已提交
141

S
Shengliang Guan 已提交
142 143
} SSyncInfo;

M
Minghao Li 已提交
144 145
struct SSyncNode;
typedef struct SSyncNode SSyncNode;
S
Shengliang Guan 已提交
146 147 148 149

int32_t syncInit();
void    syncCleanUp();

M
Minghao Li 已提交
150
int64_t syncStart(const SSyncInfo* pSyncInfo);
M
Minghao Li 已提交
151
void    syncStop(int64_t rid);
M
Minghao Li 已提交
152
int32_t syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg);
S
Shengliang Guan 已提交
153

M
Minghao Li 已提交
154 155
int32_t syncForwardToPeer(int64_t rid, const SRpcMsg* pBuf, bool isWeak);
// int32_t syncForwardToPeer(int64_t rid, const SSyncBuffer* pBuf, bool isWeak);
S
Shengliang Guan 已提交
156

M
Minghao Li 已提交
157
ESyncState syncGetMyRole(int64_t rid);
M
Minghao Li 已提交
158
void       syncGetNodesRole(int64_t rid, SNodesRole* pNodeRole);
S
Shengliang Guan 已提交
159 160 161 162 163 164 165 166

extern int32_t sDebugFlag;

#ifdef __cplusplus
}
#endif

#endif /*_TD_LIBS_SYNC_H*/