sync.h 4.3 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>
H
Haojun Liao 已提交
24
#include <tdatablock.h>
M
Minghao Li 已提交
25
#include "cJSON.h"
S
Shengliang Guan 已提交
26
#include "taosdef.h"
M
Minghao Li 已提交
27
#include "trpc.h"
M
Minghao Li 已提交
28
#include "wal.h"
S
Shengliang Guan 已提交
29

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

typedef enum {
M
Minghao Li 已提交
36 37 38
  TAOS_SYNC_STATE_FOLLOWER = 100,
  TAOS_SYNC_STATE_CANDIDATE = 101,
  TAOS_SYNC_STATE_LEADER = 102,
M
Minghao Li 已提交
39
  TAOS_SYNC_STATE_ERROR = 103,
M
syncInt  
Minghao Li 已提交
40
} ESyncState;
S
Shengliang Guan 已提交
41

M
Minghao Li 已提交
42
typedef struct SNodeInfo {
M
Minghao Li 已提交
43 44
  uint16_t nodePort;
  char     nodeFqdn[TSDB_FQDN_LEN];
S
Shengliang Guan 已提交
45 46
} SNodeInfo;

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

M
Minghao Li 已提交
53 54 55 56
typedef struct SRaftId {
  SyncNodeId  addr;
  SyncGroupId vgId;
} SRaftId;
S
Shengliang Guan 已提交
57

M
Minghao Li 已提交
58 59 60 61
typedef struct SSnapshot {
  void*     data;
  SyncIndex lastApplyIndex;
} SSnapshot;
S
Shengliang Guan 已提交
62

M
Minghao Li 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75
typedef enum {
  TAOS_SYNC_FSM_CB_SUCCESS = 0,
  TAOS_SYNC_FSM_CB_OTHER_ERROR,
} ESyncFsmCbCode;

typedef struct SFsmCbMeta {
  SyncIndex  index;
  bool       isWeak;
  int32_t    code;
  ESyncState state;
  uint64_t   seqNum;
} SFsmCbMeta;

M
Minghao Li 已提交
76 77
typedef struct SSyncFSM {
  void* data;
S
Shengliang Guan 已提交
78

M
Minghao Li 已提交
79 80 81
  void (*FpCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta);
  void (*FpPreCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta);
  void (*FpRollBackCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta);
S
Shengliang Guan 已提交
82

M
Minghao Li 已提交
83 84
  int32_t (*FpTakeSnapshot)(SSnapshot* snapshot);
  int32_t (*FpRestoreSnapshot)(const SSnapshot* snapshot);
S
Shengliang Guan 已提交
85 86 87

} SSyncFSM;

M
Minghao Li 已提交
88 89 90
struct SSyncRaftEntry;
typedef struct SSyncRaftEntry SSyncRaftEntry;

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

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

M
Minghao Li 已提交
99
  // get one log entry, user need to free pEntry->pCont
M
Minghao Li 已提交
100
  SSyncRaftEntry* (*getEntry)(struct SSyncLogStore* pLogStore, SyncIndex index);
S
Shengliang Guan 已提交
101

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

M
Minghao Li 已提交
105 106 107 108 109
  // return index of last entry
  SyncIndex (*getLastIndex)(struct SSyncLogStore* pLogStore);

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

M
Minghao Li 已提交
111 112 113 114 115 116
  // update log store commit index with "index"
  int32_t (*updateCommitIndex)(struct SSyncLogStore* pLogStore, SyncIndex index);

  // return commit index of log
  SyncIndex (*getCommitIndex)(struct SSyncLogStore* pLogStore);

S
Shengliang Guan 已提交
117 118
} SSyncLogStore;

M
Minghao Li 已提交
119 120 121
typedef struct SSyncInfo {
  SyncGroupId vgId;
  SSyncCfg    syncCfg;
M
Minghao Li 已提交
122
  char        path[TSDB_FILENAME_LEN];
M
Minghao Li 已提交
123
  SWal*       pWal;
M
Minghao Li 已提交
124
  SSyncFSM*   pFsm;
M
Minghao Li 已提交
125 126 127

  void* rpcClient;
  int32_t (*FpSendMsg)(void* rpcClient, const SEpSet* pEpSet, SRpcMsg* pMsg);
M
Minghao Li 已提交
128 129
  void* queue;
  int32_t (*FpEqMsg)(void* queue, SRpcMsg* pMsg);
M
Minghao Li 已提交
130

S
Shengliang Guan 已提交
131 132
} SSyncInfo;

M
Minghao Li 已提交
133 134 135 136 137 138 139 140 141
int32_t     syncInit();
void        syncCleanUp();
int64_t     syncOpen(const SSyncInfo* pSyncInfo);
void        syncStart(int64_t rid);
void        syncStop(int64_t rid);
int32_t     syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg);
ESyncState  syncGetMyRole(int64_t rid);
const char* syncGetMyRoleStr(int64_t rid);
SyncTerm    syncGetMyTerm(int64_t rid);
S
Shengliang Guan 已提交
142

M
Minghao Li 已提交
143 144 145 146 147
typedef enum {
  TAOS_SYNC_PROPOSE_SUCCESS = 0,
  TAOS_SYNC_PROPOSE_NOT_LEADER,
  TAOS_SYNC_PROPOSE_OTHER_ERROR,
} ESyncProposeCode;
S
Shengliang Guan 已提交
148

M
Minghao Li 已提交
149
int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak);
S
Shengliang Guan 已提交
150

M
Minghao Li 已提交
151
extern int32_t sDebugFlag;
M
Minghao Li 已提交
152

M
Minghao Li 已提交
153 154 155
//-----------------------------------------
struct SSyncNode;
typedef struct SSyncNode SSyncNode;
M
Minghao Li 已提交
156

M
Minghao Li 已提交
157 158 159
struct SSyncBuffer;
typedef struct SSyncBuffer SSyncBuffer;
//-----------------------------------------
S
Shengliang Guan 已提交
160 161 162 163 164 165

#ifdef __cplusplus
}
#endif

#endif /*_TD_LIBS_SYNC_H*/