TDengine/include/libs/sync/sync.h

153 lines
4.3 KiB
C
Raw Normal View History

2022-02-09 06:51:23 +00:00
/*
2022-02-12 13:11:21 +00:00
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
2022-02-09 06:51:23 +00:00
*
* 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
2022-04-18 13:50:56 +00:00
#include "cJSON.h"
2022-04-22 09:11:56 +00:00
#include "tdef.h"
2022-05-19 11:44:01 +00:00
#include "tmsgcb.h"
2022-02-09 06:51:23 +00:00
2022-05-20 02:23:48 +00:00
#define SYNC_INDEX_BEGIN 0
#define SYNC_INDEX_INVALID -1
2022-02-12 13:11:21 +00:00
typedef uint64_t SyncNodeId;
2022-02-09 06:51:23 +00:00
typedef int32_t SyncGroupId;
typedef int64_t SyncIndex;
typedef uint64_t SyncTerm;
2022-05-20 02:23:48 +00:00
typedef struct SSyncNode SSyncNode;
typedef struct SSyncBuffer SSyncBuffer;
typedef struct SWal SWal;
typedef struct SSyncRaftEntry SSyncRaftEntry;
2022-02-09 06:51:23 +00:00
typedef enum {
2022-03-08 05:43:54 +00:00
TAOS_SYNC_STATE_FOLLOWER = 100,
TAOS_SYNC_STATE_CANDIDATE = 101,
TAOS_SYNC_STATE_LEADER = 102,
2022-03-22 08:17:17 +00:00
TAOS_SYNC_STATE_ERROR = 103,
2022-03-03 09:28:00 +00:00
} ESyncState;
2022-02-09 06:51:23 +00:00
2022-05-20 02:23:48 +00:00
typedef enum {
TAOS_SYNC_PROPOSE_SUCCESS = 0,
TAOS_SYNC_PROPOSE_NOT_LEADER = 1,
TAOS_SYNC_PROPOSE_OTHER_ERROR = 2,
} ESyncProposeCode;
typedef enum {
TAOS_SYNC_FSM_CB_SUCCESS = 0,
TAOS_SYNC_FSM_CB_OTHER_ERROR = 1,
} ESyncFsmCbCode;
2022-02-25 09:55:20 +00:00
typedef struct SNodeInfo {
2022-04-18 13:50:56 +00:00
uint16_t nodePort;
char nodeFqdn[TSDB_FQDN_LEN];
2022-02-09 06:51:23 +00:00
} SNodeInfo;
2022-02-25 09:55:20 +00:00
typedef struct SSyncCfg {
2022-02-12 13:11:21 +00:00
int32_t replicaNum;
2022-02-25 09:55:20 +00:00
int32_t myIndex;
2022-02-09 06:51:23 +00:00
SNodeInfo nodeInfo[TSDB_MAX_REPLICA];
2022-02-12 13:11:21 +00:00
} SSyncCfg;
2022-02-09 06:51:23 +00:00
2022-02-12 13:11:21 +00:00
typedef struct SSnapshot {
void* data;
SyncIndex lastApplyIndex;
2022-04-19 03:51:51 +00:00
SyncTerm lastApplyTerm;
2022-02-12 13:11:21 +00:00
} SSnapshot;
2022-02-09 06:51:23 +00:00
2022-04-18 13:50:56 +00:00
typedef struct SFsmCbMeta {
SyncIndex index;
bool isWeak;
int32_t code;
ESyncState state;
uint64_t seqNum;
} SFsmCbMeta;
2022-02-12 13:11:21 +00:00
typedef struct SSyncFSM {
void* data;
2022-04-18 13:50:56 +00:00
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);
2022-04-19 03:51:51 +00:00
int32_t (*FpGetSnapshot)(struct SSyncFSM* pFsm, SSnapshot* pSnapshot);
int32_t (*FpRestoreSnapshot)(struct SSyncFSM* pFsm, const SSnapshot* snapshot);
2022-02-09 06:51:23 +00:00
} SSyncFSM;
2022-02-12 13:11:21 +00:00
// abstract definition of log store in raft
// SWal implements it
2022-02-09 06:51:23 +00:00
typedef struct SSyncLogStore {
2022-02-12 13:11:21 +00:00
void* data;
// append one log entry
2022-03-09 12:24:27 +00:00
int32_t (*appendEntry)(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
2022-02-09 06:51:23 +00:00
2022-03-09 07:07:43 +00:00
// get one log entry, user need to free pEntry->pCont
2022-03-09 12:24:27 +00:00
SSyncRaftEntry* (*getEntry)(struct SSyncLogStore* pLogStore, SyncIndex index);
2022-02-09 06:51:23 +00:00
2022-03-09 07:07:43 +00:00
// truncate log with index, entries after the given index (>=index) will be deleted
int32_t (*truncate)(struct SSyncLogStore* pLogStore, SyncIndex fromIndex);
2022-02-09 06:51:23 +00:00
2022-02-12 13:11:21 +00:00
// return index of last entry
SyncIndex (*getLastIndex)(struct SSyncLogStore* pLogStore);
// return term of last entry
SyncTerm (*getLastTerm)(struct SSyncLogStore* pLogStore);
2022-02-09 06:51:23 +00:00
2022-03-09 07:07:43 +00:00
// 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);
2022-02-09 06:51:23 +00:00
} SSyncLogStore;
2022-02-25 09:55:20 +00:00
typedef struct SSyncInfo {
SyncGroupId vgId;
SSyncCfg syncCfg;
2022-02-26 16:02:18 +00:00
char path[TSDB_FILENAME_LEN];
2022-03-09 07:07:43 +00:00
SWal* pWal;
2022-02-26 16:02:18 +00:00
SSyncFSM* pFsm;
2022-05-19 11:44:01 +00:00
SMsgCb* msgcb;
int32_t (*FpSendMsg)(const SEpSet* pEpSet, SRpcMsg* pMsg);
int32_t (*FpEqMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg);
2022-02-09 06:51:23 +00:00
} SSyncInfo;
2022-04-18 13:50:56 +00:00
int32_t syncInit();
void syncCleanUp();
int64_t syncOpen(const SSyncInfo* pSyncInfo);
void syncStart(int64_t rid);
2022-05-13 04:12:37 +00:00
void syncStartStandBy(int64_t rid);
2022-04-18 13:50:56 +00:00
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);
2022-04-27 11:28:01 +00:00
void syncGetEpSet(int64_t rid, SEpSet* pEpSet);
2022-04-28 08:41:13 +00:00
int32_t syncGetVgId(int64_t rid);
2022-05-20 02:23:48 +00:00
int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak);
bool syncEnvIsStart();
2022-04-22 09:11:56 +00:00
const char* syncStr(ESyncState state);
2022-04-19 13:39:42 +00:00
2022-02-09 06:51:23 +00:00
#ifdef __cplusplus
}
#endif
#endif /*_TD_LIBS_SYNC_H*/