Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
126801c8
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
126801c8
编写于
4月 22, 2022
作者:
L
Li Minghao
提交者:
GitHub
4月 22, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #11768 from taosdata/feature/sync-vnode-merge-3.0
Feature/sync vnode merge 3.0
上级
d83ce404
caaa87ed
变更
84
显示空白变更内容
内联
并排
Showing
84 changed file
with
3464 addition
and
1948 deletion
+3464
-1948
include/common/tmsgdef.h
include/common/tmsgdef.h
+15
-0
include/libs/sync/sync.h
include/libs/sync/sync.h
+60
-64
include/libs/sync/syncTools.h
include/libs/sync/syncTools.h
+414
-0
include/libs/transport/trpc.h
include/libs/transport/trpc.h
+11
-11
include/util/taoserror.h
include/util/taoserror.h
+4
-0
source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
+1
-0
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+30
-6
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
+16
-0
source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
+77
-12
source/dnode/mnode/impl/src/mndDnode.c
source/dnode/mnode/impl/src/mndDnode.c
+18
-15
source/dnode/vnode/CMakeLists.txt
source/dnode/vnode/CMakeLists.txt
+1
-0
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+10
-0
source/dnode/vnode/src/inc/vnodeInt.h
source/dnode/vnode/src/inc/vnodeInt.h
+16
-13
source/dnode/vnode/src/inc/vnodeSync.h
source/dnode/vnode/src/inc/vnodeSync.h
+44
-0
source/dnode/vnode/src/vnd/vnodeCfg.c
source/dnode/vnode/src/vnd/vnodeCfg.c
+27
-0
source/dnode/vnode/src/vnd/vnodeCommit.c
source/dnode/vnode/src/vnd/vnodeCommit.c
+14
-1
source/dnode/vnode/src/vnd/vnodeOpen.c
source/dnode/vnode/src/vnd/vnodeOpen.c
+17
-2
source/dnode/vnode/src/vnd/vnodeSvr.c
source/dnode/vnode/src/vnd/vnodeSvr.c
+83
-1
source/dnode/vnode/src/vnd/vnodeSync.c
source/dnode/vnode/src/vnd/vnodeSync.c
+178
-0
source/libs/sync/CMakeLists.txt
source/libs/sync/CMakeLists.txt
+1
-1
source/libs/sync/inc/syncEnv.h
source/libs/sync/inc/syncEnv.h
+2
-2
source/libs/sync/inc/syncInt.h
source/libs/sync/inc/syncInt.h
+55
-9
source/libs/sync/inc/syncMessage.h
source/libs/sync/inc/syncMessage.h
+0
-272
source/libs/sync/inc/syncRaftCfg.h
source/libs/sync/inc/syncRaftCfg.h
+65
-0
source/libs/sync/inc/syncRaftEntry.h
source/libs/sync/inc/syncRaftEntry.h
+6
-13
source/libs/sync/inc/syncRaftLog.h
source/libs/sync/inc/syncRaftLog.h
+0
-3
source/libs/sync/inc/syncRaftStore.h
source/libs/sync/inc/syncRaftStore.h
+1
-1
source/libs/sync/inc/syncRespMgr.h
source/libs/sync/inc/syncRespMgr.h
+55
-0
source/libs/sync/inc/syncSnapshot.h
source/libs/sync/inc/syncSnapshot.h
+0
-1
source/libs/sync/inc/syncUtil.h
source/libs/sync/inc/syncUtil.h
+2
-0
source/libs/sync/src/syncAppendEntries.c
source/libs/sync/src/syncAppendEntries.c
+39
-14
source/libs/sync/src/syncAppendEntriesReply.c
source/libs/sync/src/syncAppendEntriesReply.c
+9
-0
source/libs/sync/src/syncCommit.c
source/libs/sync/src/syncCommit.c
+8
-2
source/libs/sync/src/syncElection.c
source/libs/sync/src/syncElection.c
+1
-1
source/libs/sync/src/syncEnv.c
source/libs/sync/src/syncEnv.c
+2
-0
source/libs/sync/src/syncIO.c
source/libs/sync/src/syncIO.c
+31
-23
source/libs/sync/src/syncMain.c
source/libs/sync/src/syncMain.c
+345
-75
source/libs/sync/src/syncMessage.c
source/libs/sync/src/syncMessage.c
+383
-31
source/libs/sync/src/syncRaftCfg.c
source/libs/sync/src/syncRaftCfg.c
+211
-0
source/libs/sync/src/syncRaftEntry.c
source/libs/sync/src/syncRaftEntry.c
+24
-7
source/libs/sync/src/syncRaftLog.c
source/libs/sync/src/syncRaftLog.c
+25
-17
source/libs/sync/src/syncReplication.c
source/libs/sync/src/syncReplication.c
+2
-2
source/libs/sync/src/syncRequestVote.c
source/libs/sync/src/syncRequestVote.c
+1
-1
source/libs/sync/src/syncRequestVoteReply.c
source/libs/sync/src/syncRequestVoteReply.c
+14
-5
source/libs/sync/src/syncRespMgr.c
source/libs/sync/src/syncRespMgr.c
+93
-0
source/libs/sync/src/syncUtil.c
source/libs/sync/src/syncUtil.c
+16
-0
source/libs/sync/test/CMakeLists.txt
source/libs/sync/test/CMakeLists.txt
+75
-89
source/libs/sync/test/syncAppendEntriesReplyTest.cpp
source/libs/sync/test/syncAppendEntriesReplyTest.cpp
+15
-14
source/libs/sync/test/syncAppendEntriesTest.cpp
source/libs/sync/test/syncAppendEntriesTest.cpp
+10
-9
source/libs/sync/test/syncApplyMsgTest.cpp
source/libs/sync/test/syncApplyMsgTest.cpp
+123
-0
source/libs/sync/test/syncClientRequestTest.cpp
source/libs/sync/test/syncClientRequestTest.cpp
+10
-8
source/libs/sync/test/syncElectTest.cpp
source/libs/sync/test/syncElectTest.cpp
+53
-54
source/libs/sync/test/syncElectTest2.cpp
source/libs/sync/test/syncElectTest2.cpp
+0
-135
source/libs/sync/test/syncElectTest3.cpp
source/libs/sync/test/syncElectTest3.cpp
+0
-138
source/libs/sync/test/syncEncodeTest.cpp
source/libs/sync/test/syncEncodeTest.cpp
+10
-9
source/libs/sync/test/syncEnqTest.cpp
source/libs/sync/test/syncEnqTest.cpp
+2
-2
source/libs/sync/test/syncEntryTest.cpp
source/libs/sync/test/syncEntryTest.cpp
+2
-4
source/libs/sync/test/syncIOClientTest.cpp
source/libs/sync/test/syncIOClientTest.cpp
+2
-1
source/libs/sync/test/syncIOSendMsgTest.cpp
source/libs/sync/test/syncIOSendMsgTest.cpp
+4
-3
source/libs/sync/test/syncIndexMgrTest.cpp
source/libs/sync/test/syncIndexMgrTest.cpp
+1
-2
source/libs/sync/test/syncInitTest.cpp
source/libs/sync/test/syncInitTest.cpp
+9
-7
source/libs/sync/test/syncLogStoreCheck.cpp
source/libs/sync/test/syncLogStoreCheck.cpp
+33
-62
source/libs/sync/test/syncLogStoreTest.cpp
source/libs/sync/test/syncLogStoreTest.cpp
+38
-90
source/libs/sync/test/syncPingReplyTest.cpp
source/libs/sync/test/syncPingReplyTest.cpp
+24
-8
source/libs/sync/test/syncPingSelfTest.cpp
source/libs/sync/test/syncPingSelfTest.cpp
+1
-1
source/libs/sync/test/syncPingTest.cpp
source/libs/sync/test/syncPingTest.cpp
+24
-8
source/libs/sync/test/syncPingTimerTest.cpp
source/libs/sync/test/syncPingTimerTest.cpp
+5
-5
source/libs/sync/test/syncPingTimerTest2.cpp
source/libs/sync/test/syncPingTimerTest2.cpp
+1
-1
source/libs/sync/test/syncRaftCfgTest.cpp
source/libs/sync/test/syncRaftCfgTest.cpp
+101
-0
source/libs/sync/test/syncRaftStoreTest.cpp
source/libs/sync/test/syncRaftStoreTest.cpp
+12
-11
source/libs/sync/test/syncReplicateLoadTest.cpp
source/libs/sync/test/syncReplicateLoadTest.cpp
+0
-189
source/libs/sync/test/syncReplicateTest.cpp
source/libs/sync/test/syncReplicateTest.cpp
+134
-121
source/libs/sync/test/syncReplicateTest3.cpp
source/libs/sync/test/syncReplicateTest3.cpp
+0
-217
source/libs/sync/test/syncRequestVoteReplyTest.cpp
source/libs/sync/test/syncRequestVoteReplyTest.cpp
+11
-11
source/libs/sync/test/syncRequestVoteTest.cpp
source/libs/sync/test/syncRequestVoteTest.cpp
+11
-10
source/libs/sync/test/syncRespMgrTest.cpp
source/libs/sync/test/syncRespMgrTest.cpp
+144
-0
source/libs/sync/test/syncRpcMsgTest.cpp
source/libs/sync/test/syncRpcMsgTest.cpp
+17
-18
source/libs/sync/test/syncSnapshotTest.cpp
source/libs/sync/test/syncSnapshotTest.cpp
+79
-70
source/libs/sync/test/syncTest.cpp
source/libs/sync/test/syncTest.cpp
+52
-12
source/libs/sync/test/syncTimeoutTest.cpp
source/libs/sync/test/syncTimeoutTest.cpp
+9
-8
source/libs/sync/test/syncUtilTest.cpp
source/libs/sync/test/syncUtilTest.cpp
+1
-2
source/libs/sync/test/syncVotesGrantedTest.cpp
source/libs/sync/test/syncVotesGrantedTest.cpp
+2
-3
source/libs/sync/test/syncVotesRespondTest.cpp
source/libs/sync/test/syncVotesRespondTest.cpp
+2
-3
source/libs/sync/test/syncWriteTest.cpp
source/libs/sync/test/syncWriteTest.cpp
+20
-18
未找到文件。
include/common/tmsgdef.h
浏览文件 @
126801c8
...
...
@@ -205,6 +205,21 @@ enum {
TD_DEF_MSG_TYPE
(
TDMT_VND_CANCEL_SMA
,
"vnode-cancel-sma"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_DROP_SMA
,
"vnode-drop-sma"
,
NULL
,
NULL
)
// sync integration
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_TIMEOUT
,
"vnode-sync-timeout"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_PING
,
"vnode-sync-ping"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_PING_REPLY
,
"vnode-sync-ping-reply"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_CLIENT_REQUEST
,
"vnode-sync-client-request"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_CLIENT_REQUEST_REPLY
,
"vnode-sync-client-request-reply"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_REQUEST_VOTE
,
"vnode-sync-request-vote"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_REQUEST_VOTE_REPLY
,
"vnode-sync-request-vote-reply"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_APPEND_ENTRIES
,
"vnode-sync-append-entries"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_APPEND_ENTRIES_REPLY
,
"vnode-sync-append-entries-reply"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_NOOP
,
"vnode-sync-noop"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_UNKNOWN
,
"vnode-sync-unknown"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_COMMON_RESPONSE
,
"vnode-sync-common-response"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_APPLY_MSG
,
"vnode-sync-apply-msg"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_SYNC_VNODE
,
"vnode-sync-vnode"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_ALTER_VNODE
,
"vnode-alter-vnode"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_COMPACT_VNODE
,
"vnode-compact-vnode"
,
NULL
,
NULL
)
...
...
include/libs/sync/sync.h
浏览文件 @
126801c8
...
...
@@ -20,11 +20,14 @@
extern
"C"
{
#endif
#include <stdbool.h>
#include <stdint.h>
#include <tdatablock.h>
#include "taosdef.h"
#include "trpc.h"
#include "wal.h"
//#include <tdatablock.h>
#include "cJSON.h"
#include "tdef.h"
//#include "taosdef.h"
//#include "trpc.h"
//#include "wal.h"
typedef
uint64_t
SyncNodeId
;
typedef
int32_t
SyncGroupId
;
...
...
@@ -38,14 +41,9 @@ typedef enum {
TAOS_SYNC_STATE_ERROR
=
103
,
}
ESyncState
;
typedef
struct
SSyncBuffer
{
void
*
data
;
size_t
len
;
}
SSyncBuffer
;
typedef
struct
SNodeInfo
{
uint16_t
nodePort
;
// node sync Port
char
nodeFqdn
[
TSDB_FQDN_LEN
];
// node FQDN
uint16_t
nodePort
;
char
nodeFqdn
[
TSDB_FQDN_LEN
];
}
SNodeInfo
;
typedef
struct
SSyncCfg
{
...
...
@@ -54,47 +52,46 @@ typedef struct SSyncCfg {
SNodeInfo
nodeInfo
[
TSDB_MAX_REPLICA
];
}
SSyncCfg
;
typedef
struct
SNodesRole
{
int32_t
replicaNum
;
SNodeInfo
nodeInfo
[
TSDB_MAX_REPLICA
];
ESyncState
role
[
TSDB_MAX_REPLICA
];
}
SNodesRole
;
// abstract definition of snapshot
typedef
struct
SSnapshot
{
void
*
data
;
SyncIndex
lastApplyIndex
;
SyncTerm
lastApplyTerm
;
}
SSnapshot
;
typedef
struct
SSyncFSM
{
void
*
data
;
typedef
enum
{
TAOS_SYNC_FSM_CB_SUCCESS
=
0
,
TAOS_SYNC_FSM_CB_OTHER_ERROR
,
}
ESyncFsmCbCode
;
// when value in pMsg 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
void
(
*
FpCommitCb
)(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
);
typedef
struct
SFsmCbMeta
{
SyncIndex
index
;
bool
isWeak
;
int32_t
code
;
ESyncState
state
;
uint64_t
seqNum
;
}
SFsmCbMeta
;
// when value in pMsg 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
void
(
*
FpPreCommitCb
)(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
);
struct
SRpcMsg
;
typedef
struct
SRpcMsg
SRpcMsg
;
// 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
void
(
*
FpRollBackCb
)(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
);
typedef
struct
SSyncFSM
{
void
*
data
;
// user should implement this function, use "data" to take snapshot into "snapshot"
int32_t
(
*
FpTakeSnapshot
)(
SSnapshot
*
snapshot
);
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
);
// user should implement this function, restore "data" from "snapshot"
int32_t
(
*
FpRestoreSnapshot
)(
const
SSnapshot
*
snapshot
);
int32_t
(
*
FpGetSnapshot
)(
struct
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
);
int32_t
(
*
FpRestoreSnapshot
)(
struct
SSyncFSM
*
pFsm
,
const
SSnapshot
*
snapshot
);
}
SSyncFSM
;
struct
SSyncRaftEntry
;
typedef
struct
SSyncRaftEntry
SSyncRaftEntry
;
#define SYNC_INDEX_BEGIN 0
#define SYNC_INDEX_INVALID -1
// abstract definition of log store in raft
// SWal implements it
typedef
struct
SSyncLogStore
{
...
...
@@ -123,20 +120,11 @@ typedef struct SSyncLogStore {
}
SSyncLogStore
;
// raft need to persist two variables in storage: currentTerm, voteFor
typedef
struct
SStateMgr
{
void
*
data
;
int32_t
(
*
getCurrentTerm
)(
struct
SStateMgr
*
pMgr
,
SyncTerm
*
pCurrentTerm
);
int32_t
(
*
persistCurrentTerm
)(
struct
SStateMgr
*
pMgr
,
SyncTerm
pCurrentTerm
);
struct
SWal
;
typedef
struct
SWal
SWal
;
int32_t
(
*
getVoteFor
)(
struct
SStateMgr
*
pMgr
,
SyncNodeId
*
pVoteFor
);
int32_t
(
*
persistVoteFor
)(
struct
SStateMgr
*
pMgr
,
SyncNodeId
voteFor
);
int32_t
(
*
getSyncCfg
)(
struct
SStateMgr
*
pMgr
,
SSyncCfg
*
pSyncCfg
);
int32_t
(
*
persistSyncCfg
)(
struct
SStateMgr
*
pMgr
,
SSyncCfg
*
pSyncCfg
);
}
SStateMgr
;
struct
SEpSet
;
typedef
struct
SEpSet
SEpSet
;
typedef
struct
SSyncInfo
{
SyncGroupId
vgId
;
...
...
@@ -152,27 +140,35 @@ typedef struct SSyncInfo {
}
SSyncInfo
;
struct
SSyncNode
;
typedef
struct
SSyncNode
SSyncNode
;
int32_t
syncInit
();
void
syncCleanUp
();
int64_t
syncStart
(
const
SSyncInfo
*
pSyncInfo
);
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
);
int32_t
syncPropose
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
);
ESyncState
syncGetMyRole
(
int64_t
rid
);
const
char
*
syncGetMyRoleStr
(
int64_t
rid
);
SyncTerm
syncGetMyTerm
(
int64_t
rid
);
// propose with sequence number, to implement linearizable semantics
int32_t
syncPropose2
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
,
uint64_t
seqNum
);
typedef
enum
{
TAOS_SYNC_PROPOSE_SUCCESS
=
0
,
TAOS_SYNC_PROPOSE_NOT_LEADER
,
TAOS_SYNC_PROPOSE_OTHER_ERROR
,
}
ESyncProposeCode
;
// for compatibility, the same as syncPropose
int32_t
syncForwardToPeer
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
);
int32_t
syncPropose
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
);
extern
int32_t
sDebugFlag
;
const
char
*
syncStr
(
ESyncState
state
);
//-----------------------------------------
struct
SSyncNode
;
typedef
struct
SSyncNode
SSyncNode
;
struct
SSyncBuffer
;
typedef
struct
SSyncBuffer
SSyncBuffer
;
//-----------------------------------------
const
char
*
syncStr
(
ESyncState
state
);
#ifdef __cplusplus
}
...
...
include/libs/sync/syncTools.h
0 → 100644
浏览文件 @
126801c8
/*
* 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_TOOLS_H
#define _TD_LIBS_SYNC_TOOLS_H
#ifdef __cplusplus
extern
"C"
{
#endif
#include <stdbool.h>
#include <stdint.h>
//#include <tdatablock.h>
#include "cJSON.h"
//#include "taosdef.h"
#include "trpc.h"
//#include "wal.h"
// ------------------ ds -------------------
typedef
struct
SRaftId
{
SyncNodeId
addr
;
SyncGroupId
vgId
;
}
SRaftId
;
// ------------------ control -------------------
struct
SSyncNode
;
typedef
struct
SSyncNode
SSyncNode
;
SSyncNode
*
syncNodeAcquire
(
int64_t
rid
);
void
syncNodeRelease
(
SSyncNode
*
pNode
);
int32_t
syncGetRespRpc
(
int64_t
rid
,
uint64_t
index
,
SRpcMsg
*
msg
);
int32_t
syncGetAndDelRespRpc
(
int64_t
rid
,
uint64_t
index
,
SRpcMsg
*
msg
);
void
syncSetQ
(
int64_t
rid
,
void
*
queueHandle
);
void
syncSetRpc
(
int64_t
rid
,
void
*
rpcHandle
);
char
*
sync2SimpleStr
(
int64_t
rid
);
// set timer ms
void
setPingTimerMS
(
int64_t
rid
,
int32_t
pingTimerMS
);
void
setElectTimerMS
(
int64_t
rid
,
int32_t
electTimerMS
);
void
setHeartbeatTimerMS
(
int64_t
rid
,
int32_t
hbTimerMS
);
// for compatibility, the same as syncPropose
int32_t
syncForwardToPeer
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
);
// utils
const
char
*
syncUtilState2String
(
ESyncState
state
);
// ------------------ for debug -------------------
void
syncRpcMsgPrint
(
SRpcMsg
*
pMsg
);
void
syncRpcMsgPrint2
(
char
*
s
,
SRpcMsg
*
pMsg
);
void
syncRpcMsgLog
(
SRpcMsg
*
pMsg
);
void
syncRpcMsgLog2
(
char
*
s
,
SRpcMsg
*
pMsg
);
// ------------------ for compile -------------------
typedef
struct
SSyncBuffer
{
void
*
data
;
size_t
len
;
}
SSyncBuffer
;
typedef
struct
SNodesRole
{
int32_t
replicaNum
;
SNodeInfo
nodeInfo
[
TSDB_MAX_REPLICA
];
ESyncState
role
[
TSDB_MAX_REPLICA
];
}
SNodesRole
;
typedef
struct
SStateMgr
{
void
*
data
;
int32_t
(
*
getCurrentTerm
)(
struct
SStateMgr
*
pMgr
,
SyncTerm
*
pCurrentTerm
);
int32_t
(
*
persistCurrentTerm
)(
struct
SStateMgr
*
pMgr
,
SyncTerm
pCurrentTerm
);
int32_t
(
*
getVoteFor
)(
struct
SStateMgr
*
pMgr
,
SyncNodeId
*
pVoteFor
);
int32_t
(
*
persistVoteFor
)(
struct
SStateMgr
*
pMgr
,
SyncNodeId
voteFor
);
int32_t
(
*
getSyncCfg
)(
struct
SStateMgr
*
pMgr
,
SSyncCfg
*
pSyncCfg
);
int32_t
(
*
persistSyncCfg
)(
struct
SStateMgr
*
pMgr
,
SSyncCfg
*
pSyncCfg
);
}
SStateMgr
;
// ------------------ for message process -------------------
// ---------------------------------------------
typedef
struct
SyncPing
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
uint32_t
dataLen
;
char
data
[];
}
SyncPing
;
SyncPing
*
syncPingBuild
(
uint32_t
dataLen
);
SyncPing
*
syncPingBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
,
const
char
*
str
);
SyncPing
*
syncPingBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
);
void
syncPingDestroy
(
SyncPing
*
pMsg
);
void
syncPingSerialize
(
const
SyncPing
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncPingDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncPing
*
pMsg
);
char
*
syncPingSerialize2
(
const
SyncPing
*
pMsg
,
uint32_t
*
len
);
SyncPing
*
syncPingDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
int32_t
syncPingSerialize3
(
const
SyncPing
*
pMsg
,
char
*
buf
,
int32_t
bufLen
);
SyncPing
*
syncPingDeserialize3
(
void
*
buf
,
int32_t
bufLen
);
void
syncPing2RpcMsg
(
const
SyncPing
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncPingFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncPing
*
pMsg
);
SyncPing
*
syncPingFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncPing2Json
(
const
SyncPing
*
pMsg
);
char
*
syncPing2Str
(
const
SyncPing
*
pMsg
);
// for debug ----------------------
void
syncPingPrint
(
const
SyncPing
*
pMsg
);
void
syncPingPrint2
(
char
*
s
,
const
SyncPing
*
pMsg
);
void
syncPingLog
(
const
SyncPing
*
pMsg
);
void
syncPingLog2
(
char
*
s
,
const
SyncPing
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncPingReply
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
uint32_t
dataLen
;
char
data
[];
}
SyncPingReply
;
SyncPingReply
*
syncPingReplyBuild
(
uint32_t
dataLen
);
SyncPingReply
*
syncPingReplyBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
,
const
char
*
str
);
SyncPingReply
*
syncPingReplyBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
);
void
syncPingReplyDestroy
(
SyncPingReply
*
pMsg
);
void
syncPingReplySerialize
(
const
SyncPingReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncPingReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncPingReply
*
pMsg
);
char
*
syncPingReplySerialize2
(
const
SyncPingReply
*
pMsg
,
uint32_t
*
len
);
SyncPingReply
*
syncPingReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
int32_t
syncPingReplySerialize3
(
const
SyncPingReply
*
pMsg
,
char
*
buf
,
int32_t
bufLen
);
SyncPingReply
*
syncPingReplyDeserialize3
(
void
*
buf
,
int32_t
bufLen
);
void
syncPingReply2RpcMsg
(
const
SyncPingReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncPingReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncPingReply
*
pMsg
);
SyncPingReply
*
syncPingReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncPingReply2Json
(
const
SyncPingReply
*
pMsg
);
char
*
syncPingReply2Str
(
const
SyncPingReply
*
pMsg
);
// for debug ----------------------
void
syncPingReplyPrint
(
const
SyncPingReply
*
pMsg
);
void
syncPingReplyPrint2
(
char
*
s
,
const
SyncPingReply
*
pMsg
);
void
syncPingReplyLog
(
const
SyncPingReply
*
pMsg
);
void
syncPingReplyLog2
(
char
*
s
,
const
SyncPingReply
*
pMsg
);
// ---------------------------------------------
typedef
enum
ESyncTimeoutType
{
SYNC_TIMEOUT_PING
=
100
,
SYNC_TIMEOUT_ELECTION
,
SYNC_TIMEOUT_HEARTBEAT
,
}
ESyncTimeoutType
;
typedef
struct
SyncTimeout
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
ESyncTimeoutType
timeoutType
;
uint64_t
logicClock
;
int32_t
timerMS
;
void
*
data
;
// need optimized
}
SyncTimeout
;
SyncTimeout
*
syncTimeoutBuild
();
SyncTimeout
*
syncTimeoutBuild2
(
ESyncTimeoutType
timeoutType
,
uint64_t
logicClock
,
int32_t
timerMS
,
int32_t
vgId
,
void
*
data
);
void
syncTimeoutDestroy
(
SyncTimeout
*
pMsg
);
void
syncTimeoutSerialize
(
const
SyncTimeout
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncTimeoutDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncTimeout
*
pMsg
);
char
*
syncTimeoutSerialize2
(
const
SyncTimeout
*
pMsg
,
uint32_t
*
len
);
SyncTimeout
*
syncTimeoutDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncTimeout2RpcMsg
(
const
SyncTimeout
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncTimeoutFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncTimeout
*
pMsg
);
SyncTimeout
*
syncTimeoutFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncTimeout2Json
(
const
SyncTimeout
*
pMsg
);
char
*
syncTimeout2Str
(
const
SyncTimeout
*
pMsg
);
// for debug ----------------------
void
syncTimeoutPrint
(
const
SyncTimeout
*
pMsg
);
void
syncTimeoutPrint2
(
char
*
s
,
const
SyncTimeout
*
pMsg
);
void
syncTimeoutLog
(
const
SyncTimeout
*
pMsg
);
void
syncTimeoutLog2
(
char
*
s
,
const
SyncTimeout
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncClientRequest
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
// SyncClientRequest msgType
uint32_t
originalRpcType
;
// user RpcMsg msgType
uint64_t
seqNum
;
bool
isWeak
;
uint32_t
dataLen
;
// user RpcMsg.contLen
char
data
[];
// user RpcMsg.pCont
}
SyncClientRequest
;
SyncClientRequest
*
syncClientRequestBuild
(
uint32_t
dataLen
);
SyncClientRequest
*
syncClientRequestBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
uint64_t
seqNum
,
bool
isWeak
,
int32_t
vgId
);
// step 1
void
syncClientRequestDestroy
(
SyncClientRequest
*
pMsg
);
void
syncClientRequestSerialize
(
const
SyncClientRequest
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncClientRequestDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncClientRequest
*
pMsg
);
char
*
syncClientRequestSerialize2
(
const
SyncClientRequest
*
pMsg
,
uint32_t
*
len
);
SyncClientRequest
*
syncClientRequestDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncClientRequest2RpcMsg
(
const
SyncClientRequest
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
// step 2
void
syncClientRequestFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncClientRequest
*
pMsg
);
SyncClientRequest
*
syncClientRequestFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
// step 3
cJSON
*
syncClientRequest2Json
(
const
SyncClientRequest
*
pMsg
);
char
*
syncClientRequest2Str
(
const
SyncClientRequest
*
pMsg
);
// for debug ----------------------
void
syncClientRequestPrint
(
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestPrint2
(
char
*
s
,
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestLog
(
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestLog2
(
char
*
s
,
const
SyncClientRequest
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncClientRequestReply
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
int32_t
errCode
;
SRaftId
leaderHint
;
}
SyncClientRequestReply
;
// ---------------------------------------------
typedef
struct
SyncRequestVote
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
SyncIndex
lastLogIndex
;
SyncTerm
lastLogTerm
;
}
SyncRequestVote
;
SyncRequestVote
*
syncRequestVoteBuild
(
int32_t
vgId
);
void
syncRequestVoteDestroy
(
SyncRequestVote
*
pMsg
);
void
syncRequestVoteSerialize
(
const
SyncRequestVote
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncRequestVoteDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncRequestVote
*
pMsg
);
char
*
syncRequestVoteSerialize2
(
const
SyncRequestVote
*
pMsg
,
uint32_t
*
len
);
SyncRequestVote
*
syncRequestVoteDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncRequestVote2RpcMsg
(
const
SyncRequestVote
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncRequestVoteFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncRequestVote
*
pMsg
);
SyncRequestVote
*
syncRequestVoteFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncRequestVote2Json
(
const
SyncRequestVote
*
pMsg
);
char
*
syncRequestVote2Str
(
const
SyncRequestVote
*
pMsg
);
// for debug ----------------------
void
syncRequestVotePrint
(
const
SyncRequestVote
*
pMsg
);
void
syncRequestVotePrint2
(
char
*
s
,
const
SyncRequestVote
*
pMsg
);
void
syncRequestVoteLog
(
const
SyncRequestVote
*
pMsg
);
void
syncRequestVoteLog2
(
char
*
s
,
const
SyncRequestVote
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncRequestVoteReply
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
bool
voteGranted
;
}
SyncRequestVoteReply
;
SyncRequestVoteReply
*
syncRequestVoteReplyBuild
(
int32_t
vgId
);
void
syncRequestVoteReplyDestroy
(
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplySerialize
(
const
SyncRequestVoteReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncRequestVoteReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncRequestVoteReply
*
pMsg
);
char
*
syncRequestVoteReplySerialize2
(
const
SyncRequestVoteReply
*
pMsg
,
uint32_t
*
len
);
SyncRequestVoteReply
*
syncRequestVoteReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncRequestVoteReply2RpcMsg
(
const
SyncRequestVoteReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncRequestVoteReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncRequestVoteReply
*
pMsg
);
SyncRequestVoteReply
*
syncRequestVoteReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncRequestVoteReply2Json
(
const
SyncRequestVoteReply
*
pMsg
);
char
*
syncRequestVoteReply2Str
(
const
SyncRequestVoteReply
*
pMsg
);
// for debug ----------------------
void
syncRequestVoteReplyPrint
(
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyPrint2
(
char
*
s
,
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyLog
(
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyLog2
(
char
*
s
,
const
SyncRequestVoteReply
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncAppendEntries
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
SyncIndex
prevLogIndex
;
SyncTerm
prevLogTerm
;
SyncIndex
commitIndex
;
uint32_t
dataLen
;
char
data
[];
}
SyncAppendEntries
;
SyncAppendEntries
*
syncAppendEntriesBuild
(
uint32_t
dataLen
,
int32_t
vgId
);
void
syncAppendEntriesDestroy
(
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesSerialize
(
const
SyncAppendEntries
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncAppendEntriesDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncAppendEntries
*
pMsg
);
char
*
syncAppendEntriesSerialize2
(
const
SyncAppendEntries
*
pMsg
,
uint32_t
*
len
);
SyncAppendEntries
*
syncAppendEntriesDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncAppendEntries2RpcMsg
(
const
SyncAppendEntries
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncAppendEntriesFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncAppendEntries
*
pMsg
);
SyncAppendEntries
*
syncAppendEntriesFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncAppendEntries2Json
(
const
SyncAppendEntries
*
pMsg
);
char
*
syncAppendEntries2Str
(
const
SyncAppendEntries
*
pMsg
);
// for debug ----------------------
void
syncAppendEntriesPrint
(
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesPrint2
(
char
*
s
,
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesLog
(
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesLog2
(
char
*
s
,
const
SyncAppendEntries
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncAppendEntriesReply
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
bool
success
;
SyncIndex
matchIndex
;
}
SyncAppendEntriesReply
;
SyncAppendEntriesReply
*
syncAppendEntriesReplyBuild
(
int32_t
vgId
);
void
syncAppendEntriesReplyDestroy
(
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplySerialize
(
const
SyncAppendEntriesReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncAppendEntriesReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncAppendEntriesReply
*
pMsg
);
char
*
syncAppendEntriesReplySerialize2
(
const
SyncAppendEntriesReply
*
pMsg
,
uint32_t
*
len
);
SyncAppendEntriesReply
*
syncAppendEntriesReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncAppendEntriesReply2RpcMsg
(
const
SyncAppendEntriesReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncAppendEntriesReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncAppendEntriesReply
*
pMsg
);
SyncAppendEntriesReply
*
syncAppendEntriesReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncAppendEntriesReply2Json
(
const
SyncAppendEntriesReply
*
pMsg
);
char
*
syncAppendEntriesReply2Str
(
const
SyncAppendEntriesReply
*
pMsg
);
// for debug ----------------------
void
syncAppendEntriesReplyPrint
(
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyPrint2
(
char
*
s
,
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyLog
(
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyLog2
(
char
*
s
,
const
SyncAppendEntriesReply
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncApplyMsg
{
uint32_t
bytes
;
int32_t
vgId
;
uint32_t
msgType
;
// user SyncApplyMsg msgType
uint32_t
originalRpcType
;
// user RpcMsg msgType
SFsmCbMeta
fsmMeta
;
uint32_t
dataLen
;
// user RpcMsg.contLen
char
data
[];
// user RpcMsg.pCont
}
SyncApplyMsg
;
SyncApplyMsg
*
syncApplyMsgBuild
(
uint32_t
dataLen
);
SyncApplyMsg
*
syncApplyMsgBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
int32_t
vgId
,
SFsmCbMeta
*
pMeta
);
void
syncApplyMsgDestroy
(
SyncApplyMsg
*
pMsg
);
void
syncApplyMsgSerialize
(
const
SyncApplyMsg
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncApplyMsgDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncApplyMsg
*
pMsg
);
char
*
syncApplyMsgSerialize2
(
const
SyncApplyMsg
*
pMsg
,
uint32_t
*
len
);
SyncApplyMsg
*
syncApplyMsgDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncApplyMsg2RpcMsg
(
const
SyncApplyMsg
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
// SyncApplyMsg to SRpcMsg, put it into ApplyQ
void
syncApplyMsgFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncApplyMsg
*
pMsg
);
// get SRpcMsg from ApplyQ, to SyncApplyMsg
SyncApplyMsg
*
syncApplyMsgFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
void
syncApplyMsg2OriginalRpcMsg
(
const
SyncApplyMsg
*
pMsg
,
SRpcMsg
*
pOriginalRpcMsg
);
// SyncApplyMsg to OriginalRpcMsg
cJSON
*
syncApplyMsg2Json
(
const
SyncApplyMsg
*
pMsg
);
char
*
syncApplyMsg2Str
(
const
SyncApplyMsg
*
pMsg
);
// for debug ----------------------
void
syncApplyMsgPrint
(
const
SyncApplyMsg
*
pMsg
);
void
syncApplyMsgPrint2
(
char
*
s
,
const
SyncApplyMsg
*
pMsg
);
void
syncApplyMsgLog
(
const
SyncApplyMsg
*
pMsg
);
void
syncApplyMsgLog2
(
char
*
s
,
const
SyncApplyMsg
*
pMsg
);
// on message ----------------------
int32_t
syncNodeOnPingCb
(
SSyncNode
*
ths
,
SyncPing
*
pMsg
);
int32_t
syncNodeOnPingReplyCb
(
SSyncNode
*
ths
,
SyncPingReply
*
pMsg
);
int32_t
syncNodeOnTimeoutCb
(
SSyncNode
*
ths
,
SyncTimeout
*
pMsg
);
int32_t
syncNodeOnClientRequestCb
(
SSyncNode
*
ths
,
SyncClientRequest
*
pMsg
);
int32_t
syncNodeOnRequestVoteCb
(
SSyncNode
*
ths
,
SyncRequestVote
*
pMsg
);
int32_t
syncNodeOnRequestVoteReplyCb
(
SSyncNode
*
ths
,
SyncRequestVoteReply
*
pMsg
);
int32_t
syncNodeOnAppendEntriesCb
(
SSyncNode
*
ths
,
SyncAppendEntries
*
pMsg
);
int32_t
syncNodeOnAppendEntriesReplyCb
(
SSyncNode
*
ths
,
SyncAppendEntriesReply
*
pMsg
);
// ---------------------------------------------
#ifdef __cplusplus
}
#endif
#endif
/*_TD_LIBS_SYNC_TOOLS_H*/
include/libs/transport/trpc.h
浏览文件 @
126801c8
...
...
@@ -38,11 +38,11 @@ typedef struct SRpcConnInfo {
typedef
struct
SRpcMsg
{
tmsg_t
msgType
;
void
*
pCont
;
void
*
pCont
;
int
contLen
;
int32_t
code
;
void
*
handle
;
// rpc handle returned to app
void
*
ahandle
;
// app handle set by client
void
*
handle
;
// rpc handle returned to app
void
*
ahandle
;
// app handle set by client
int
noResp
;
// has response or not(default 0, 0: resp, 1: no resp);
int
persistHandle
;
// persist handle or not
...
...
@@ -54,8 +54,8 @@ typedef struct {
uint16_t
clientPort
;
SRpcMsg
rpcMsg
;
int32_t
rspLen
;
void
*
pRsp
;
void
*
pNode
;
void
*
pRsp
;
void
*
pNode
;
}
SNodeMsg
;
typedef
void
(
*
RpcCfp
)(
void
*
parent
,
SRpcMsg
*
,
SEpSet
*
);
...
...
@@ -64,7 +64,7 @@ typedef int (*RpcRfp)(void *parent, SRpcMsg *, SEpSet *);
typedef
struct
SRpcInit
{
uint16_t
localPort
;
// local port
char
*
label
;
// for debug purpose
char
*
label
;
// for debug purpose
int
numOfThreads
;
// number of threads to handle connections
int
sessions
;
// number of sessions allowed
int8_t
connType
;
// TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
...
...
@@ -97,23 +97,23 @@ typedef struct {
typedef
struct
{
int32_t
msgType
;
void
*
val
;
void
*
val
;
int32_t
(
*
clone
)(
void
*
src
,
void
**
dst
);
void
(
*
freeFunc
)(
const
void
*
arg
);
}
SRpcBrokenlinkVal
;
typedef
struct
{
SHashObj
*
args
;
SHashObj
*
args
;
SRpcBrokenlinkVal
brokenVal
;
}
SRpcCtx
;
int32_t
rpcInit
();
void
rpcCleanup
();
void
*
rpcOpen
(
const
SRpcInit
*
pRpc
);
void
*
rpcOpen
(
const
SRpcInit
*
pRpc
);
void
rpcClose
(
void
*
);
void
*
rpcMallocCont
(
int
contLen
);
void
*
rpcMallocCont
(
int
contLen
);
void
rpcFreeCont
(
void
*
pCont
);
void
*
rpcReallocCont
(
void
*
ptr
,
int
contLen
);
void
*
rpcReallocCont
(
void
*
ptr
,
int
contLen
);
// Because taosd supports multi-process mode
// These functions should not be used on the server side
...
...
include/util/taoserror.h
浏览文件 @
126801c8
...
...
@@ -411,6 +411,10 @@ int32_t* taosGetErrno();
#define TSDB_CODE_SYN_INVALID_MSGLEN TAOS_DEF_ERROR_CODE(0, 0x0909)
#define TSDB_CODE_SYN_INVALID_MSGTYPE TAOS_DEF_ERROR_CODE(0, 0x090A)
// sync integration
#define TSDB_CODE_SYN_NOT_LEADER TAOS_DEF_ERROR_CODE(0, 0x0910)
#define TSDB_CODE_SYN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x09FF)
// tq
#define TSDB_CODE_TQ_INVALID_CONFIG TAOS_DEF_ERROR_CODE(0, 0x0A00)
#define TSDB_CODE_TQ_INIT_FAILED TAOS_DEF_ERROR_CODE(0, 0x0A01)
...
...
source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
浏览文件 @
126801c8
...
...
@@ -105,6 +105,7 @@ void vmStopWorker(SVnodesMgmt *pMgmt);
int32_t
vmAllocQueue
(
SVnodesMgmt
*
pMgmt
,
SVnodeObj
*
pVnode
);
void
vmFreeQueue
(
SVnodesMgmt
*
pMgmt
,
SVnodeObj
*
pVnode
);
int32_t
vmPutMsgToSyncQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pRpc
);
// sync integration
int32_t
vmPutMsgToQueryQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pMsg
);
int32_t
vmPutMsgToFetchQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pMsg
);
int32_t
vmPutMsgToApplyQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pMsg
);
...
...
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
浏览文件 @
126801c8
...
...
@@ -121,6 +121,16 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
pCfg
->
hashBegin
=
pCreate
->
hashBegin
;
pCfg
->
hashEnd
=
pCreate
->
hashEnd
;
pCfg
->
hashMethod
=
pCreate
->
hashMethod
;
// sync integration
pCfg
->
syncCfg
.
myIndex
=
pCreate
->
selfIndex
;
pCfg
->
syncCfg
.
replicaNum
=
pCreate
->
replica
;
memset
(
&
(
pCfg
->
syncCfg
.
nodeInfo
),
0
,
sizeof
(
pCfg
->
syncCfg
.
nodeInfo
));
for
(
int
i
=
0
;
i
<
pCreate
->
replica
;
++
i
)
{
(
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodePort
=
(
pCreate
->
replicas
)[
i
].
port
;
snprintf
((
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodeFqdn
,
sizeof
((
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodeFqdn
),
"%s"
,
(
pCreate
->
replicas
)[
i
].
fqdn
);
}
}
static
void
vmGenerateWrapperCfg
(
SVnodesMgmt
*
pMgmt
,
SCreateVnodeReq
*
pCreate
,
SWrapperCfg
*
pCfg
)
{
...
...
@@ -172,6 +182,7 @@ int32_t vmProcessCreateVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pMsg) {
msgCb
.
queueFps
[
QUERY_QUEUE
]
=
vmPutMsgToQueryQueue
;
msgCb
.
queueFps
[
FETCH_QUEUE
]
=
vmPutMsgToFetchQueue
;
msgCb
.
queueFps
[
APPLY_QUEUE
]
=
vmPutMsgToApplyQueue
;
msgCb
.
queueFps
[
SYNC_QUEUE
]
=
vmPutMsgToSyncQueue
;
// sync integration
msgCb
.
qsizeFp
=
vmGetQueueSize
;
SVnode
*
pImpl
=
vnodeOpen
(
path
,
pMgmt
->
pTfs
,
msgCb
);
...
...
@@ -252,7 +263,7 @@ void vmInitMsgHandle(SMgmtWrapper *pWrapper) {
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_MQ_QUERY
,
vmProcessQueryMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_MQ_CONNECT
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_MQ_DISCONNECT
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
//dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, vmProcessWriteMsg, DEFAULT_HANDLE);
//
dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, vmProcessWriteMsg, DEFAULT_HANDLE);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_RES_READY
,
vmProcessFetchMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_TASKS_STATUS
,
vmProcessFetchMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_CANCEL_TASK
,
vmProcessFetchMsg
,
DEFAULT_HANDLE
);
...
...
@@ -265,10 +276,10 @@ void vmInitMsgHandle(SMgmtWrapper *pWrapper) {
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_CREATE_SMA
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_CANCEL_SMA
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_DROP_SMA
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
//dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CONN, vmProcessWriteMsg, DEFAULT_HANDLE);
//dmSetMsgHandle(pWrapper, TDMT_VND_MQ_REB, vmProcessWriteMsg, DEFAULT_HANDLE);
//dmSetMsgHandle(pWrapper, TDMT_VND_MQ_CANCEL_CONN, vmProcessWriteMsg, DEFAULT_HANDLE);
//dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, vmProcessFetchMsg, DEFAULT_HANDLE);
//
dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CONN, vmProcessWriteMsg, DEFAULT_HANDLE);
//
dmSetMsgHandle(pWrapper, TDMT_VND_MQ_REB, vmProcessWriteMsg, DEFAULT_HANDLE);
//
dmSetMsgHandle(pWrapper, TDMT_VND_MQ_CANCEL_CONN, vmProcessWriteMsg, DEFAULT_HANDLE);
//
dmSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, vmProcessFetchMsg, DEFAULT_HANDLE);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_MQ_VG_CHANGE
,
(
NodeMsgFp
)
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_CONSUME
,
vmProcessFetchMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_TASK_DEPLOY
,
vmProcessWriteMsg
,
DEFAULT_HANDLE
);
...
...
@@ -283,4 +294,17 @@ void vmInitMsgHandle(SMgmtWrapper *pWrapper) {
dmSetMsgHandle
(
pWrapper
,
TDMT_DND_CREATE_VNODE
,
vmProcessMgmtMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_DND_DROP_VNODE
,
vmProcessMgmtMsg
,
DEFAULT_HANDLE
);
// dmSetMsgHandle(pWrapper, TDMT_DND_SYNC_VNODE, vmProcessMgmtMsg, DEFAULT_HANDLE);
// dmSetMsgHandle(pWrapper, TDMT_DND_COMPACT_VNODE, vmProcessMgmtMsg, DEFAULT_HANDLE);
// sync integration
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_TIMEOUT
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_PING
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_PING_REPLY
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_CLIENT_REQUEST
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_CLIENT_REQUEST_REPLY
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_REQUEST_VOTE
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_REQUEST_VOTE_REPLY
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_APPEND_ENTRIES
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_VND_SYNC_APPEND_ENTRIES_REPLY
,
(
NodeMsgFp
)
vmProcessSyncMsg
,
DEFAULT_HANDLE
);
}
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
浏览文件 @
126801c8
...
...
@@ -73,6 +73,12 @@ int32_t vmOpenVnode(SVnodesMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl) {
return
-
1
;
}
// sync integration
vnodeSyncSetQ
(
pImpl
,
NULL
);
vnodeSyncSetRpc
(
pImpl
,
NULL
);
int32_t
ret
=
vnodeSyncStart
(
pImpl
);
assert
(
ret
==
0
);
taosWLockLatch
(
&
pMgmt
->
latch
);
int32_t
code
=
taosHashPut
(
pMgmt
->
hash
,
&
pVnode
->
vgId
,
sizeof
(
int32_t
),
&
pVnode
,
sizeof
(
SVnodeObj
*
));
taosWUnLockLatch
(
&
pMgmt
->
latch
);
...
...
@@ -137,6 +143,7 @@ static void *vmOpenVnodeFunc(void *param) {
msgCb
.
queueFps
[
QUERY_QUEUE
]
=
vmPutMsgToQueryQueue
;
msgCb
.
queueFps
[
FETCH_QUEUE
]
=
vmPutMsgToFetchQueue
;
msgCb
.
queueFps
[
APPLY_QUEUE
]
=
vmPutMsgToApplyQueue
;
msgCb
.
queueFps
[
SYNC_QUEUE
]
=
vmPutMsgToSyncQueue
;
// sync integration
msgCb
.
qsizeFp
=
vmGetQueueSize
;
snprintf
(
path
,
TSDB_FILENAME_LEN
,
"vnode%svnode%d"
,
TD_DIRSEP
,
pCfg
->
vgId
);
SVnode
*
pImpl
=
vnodeOpen
(
path
,
pMgmt
->
pTfs
,
msgCb
);
...
...
@@ -266,6 +273,9 @@ static void vmCleanup(SMgmtWrapper *pWrapper) {
// walCleanUp();
taosMemoryFree
(
pMgmt
);
pWrapper
->
pMgmt
=
NULL
;
syncCleanUp
();
dInfo
(
"vnode-mgmt is cleaned up"
);
}
...
...
@@ -306,6 +316,12 @@ static int32_t vmInit(SMgmtWrapper *pWrapper) {
}
dmReportStartup
(
pDnode
,
"vnode-wal"
,
"initialized"
);
// sync integration
if
(
syncInit
()
!=
0
)
{
dError
(
"failed to open sync since %s"
,
terrstr
());
return
-
1
;
}
if
(
vnodeInit
(
tsNumOfCommitThreads
)
!=
0
)
{
dError
(
"failed to init vnode since %s"
,
terrstr
());
goto
_OVER
;
...
...
source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
浏览文件 @
126801c8
...
...
@@ -14,8 +14,12 @@
*/
#define _DEFAULT_SOURCE
#include "vmInt.h"
#include "sync.h"
#include "syncTools.h"
static
inline
void
vmSendRsp
(
SMgmtWrapper
*
pWrapper
,
SNodeMsg
*
pMsg
,
int32_t
code
)
{
SRpcMsg
rsp
=
{.
handle
=
pMsg
->
rpcMsg
.
handle
,
.
ahandle
=
pMsg
->
rpcMsg
.
ahandle
,
...
...
@@ -88,7 +92,7 @@ static void vmProcessFetchQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
static
void
vmProcessWriteQueue
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
)
{
SVnodeObj
*
pVnode
=
pInfo
->
ahandle
;
int64_t
version
;
SRpcMsg
rsp
;
SArray
*
pArray
=
taosArrayInit
(
numOfMsgs
,
sizeof
(
SNodeMsg
*
));
if
(
pArray
==
NULL
)
{
...
...
@@ -107,13 +111,15 @@ static void vmProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numO
}
}
#if 0
int64_t version;
vnodePreprocessWriteReqs(pVnode->pImpl, pArray, &version);
numOfMsgs = taosArrayGetSize(pArray);
for (int32_t i = 0; i < numOfMsgs; i++) {
SNodeMsg *pMsg = *(SNodeMsg **)taosArrayGet(pArray, i);
SRpcMsg *pRpc = &pMsg->rpcMsg;
SRpcMsg
rsp
;
rsp.pCont = NULL;
rsp.contLen = 0;
...
...
@@ -123,17 +129,36 @@ static void vmProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numO
int32_t code = vnodeProcessWriteReq(pVnode->pImpl, pRpc, version++, &rsp);
tmsgSendRsp(&rsp);
}
#else
// sync integration response
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
pArray
);
i
++
)
{
SNodeMsg
*
pMsg
;
SRpcMsg
*
pRpc
;
#if 0
if (pRsp != NULL) {
pRsp->ahandle = pRpc->ahandle;
taosMemoryFree(pRsp);
pMsg
=
*
(
SNodeMsg
**
)
taosArrayGet
(
pArray
,
i
);
pRpc
=
&
pMsg
->
rpcMsg
;
rsp
.
ahandle
=
pRpc
->
ahandle
;
rsp
.
handle
=
pRpc
->
handle
;
rsp
.
pCont
=
NULL
;
rsp
.
contLen
=
0
;
int32_t
ret
=
syncPropose
(
vnodeGetSyncHandle
(
pVnode
->
pImpl
),
pRpc
,
false
);
if
(
ret
==
TAOS_SYNC_PROPOSE_NOT_LEADER
)
{
rsp
.
code
=
TSDB_CODE_SYN_NOT_LEADER
;
tmsgSendRsp
(
&
rsp
);
}
else
if
(
ret
==
TAOS_SYNC_PROPOSE_OTHER_ERROR
)
{
rsp
.
code
=
TSDB_CODE_SYN_INTERNAL_ERROR
;
tmsgSendRsp
(
&
rsp
);
}
else
if
(
ret
==
TAOS_SYNC_PROPOSE_SUCCESS
)
{
// ok
// send response in applyQ
}
else
{
if (code != 0 && terrno != 0) code = terrno;
vmSendRsp(pVnode->pWrapper, pMsg, code);
assert
(
0
);
}
#endif
}
#endif
for
(
int32_t
i
=
0
;
i
<
numOfMsgs
;
i
++
)
{
SNodeMsg
*
pMsg
=
*
(
SNodeMsg
**
)
taosArrayGet
(
pArray
,
i
);
...
...
@@ -148,13 +173,44 @@ static void vmProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numO
static
void
vmProcessApplyQueue
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
)
{
SVnodeObj
*
pVnode
=
pInfo
->
ahandle
;
SNodeMsg
*
pMsg
=
NULL
;
SRpcMsg
rsp
;
// static int64_t version = 0;
for
(
int32_t
i
=
0
;
i
<
numOfMsgs
;
++
i
)
{
#if 1
// sync integration
taosGetQitem
(
qall
,
(
void
**
)
&
pMsg
);
// todo
SRpcMsg
*
pRsp
=
NULL
;
// (void)vnodeProcessWriteReq(pVnode->pImpl, &pMsg->rpcMsg, &pRsp);
// init response rpc msg
rsp
.
code
=
0
;
rsp
.
pCont
=
NULL
;
rsp
.
contLen
=
0
;
// get original rpc msg
assert
(
pMsg
->
rpcMsg
.
msgType
==
TDMT_VND_SYNC_APPLY_MSG
);
SyncApplyMsg
*
pSyncApplyMsg
=
syncApplyMsgFromRpcMsg2
(
&
pMsg
->
rpcMsg
);
syncApplyMsgLog2
(
"==vmProcessApplyQueue=="
,
pSyncApplyMsg
);
SRpcMsg
originalRpcMsg
;
syncApplyMsg2OriginalRpcMsg
(
pSyncApplyMsg
,
&
originalRpcMsg
);
// apply data into tsdb
if
(
vnodeProcessWriteReq
(
pVnode
->
pImpl
,
&
originalRpcMsg
,
pSyncApplyMsg
->
fsmMeta
.
index
,
&
rsp
)
<
0
)
{
rsp
.
code
=
terrno
;
dTrace
(
"vnodeProcessWriteReq error, code:%d"
,
terrno
);
}
syncApplyMsgDestroy
(
pSyncApplyMsg
);
rpcFreeCont
(
originalRpcMsg
.
pCont
);
// if leader, send response
if
(
pMsg
->
rpcMsg
.
handle
!=
NULL
&&
pMsg
->
rpcMsg
.
ahandle
!=
NULL
)
{
rsp
.
ahandle
=
pMsg
->
rpcMsg
.
ahandle
;
rsp
.
handle
=
pMsg
->
rpcMsg
.
handle
;
tmsgSendRsp
(
&
rsp
);
}
#endif
}
}
...
...
@@ -307,6 +363,10 @@ static int32_t vmPutRpcMsgToQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc, EQueueT
dTrace
(
"msg:%p, will be put into vnode-merge queue"
,
pMsg
);
taosWriteQitem
(
pVnode
->
pMergeQ
,
pMsg
);
break
;
case
SYNC_QUEUE
:
// sync integration
dTrace
(
"msg:%p, will be put into vnode-sync queue"
,
pMsg
);
taosWriteQitem
(
pVnode
->
pSyncQ
,
pMsg
);
break
;
default:
code
=
-
1
;
terrno
=
TSDB_CODE_INVALID_PARA
;
...
...
@@ -333,6 +393,11 @@ int32_t vmPutMsgToMergeQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc) {
return
vmPutRpcMsgToQueue
(
pWrapper
,
pRpc
,
MERGE_QUEUE
);
}
// sync integration
int32_t
vmPutMsgToSyncQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pRpc
)
{
return
vmPutRpcMsgToQueue
(
pWrapper
,
pRpc
,
SYNC_QUEUE
);
}
int32_t
vmGetQueueSize
(
SMgmtWrapper
*
pWrapper
,
int32_t
vgId
,
EQueueType
qtype
)
{
int32_t
size
=
-
1
;
SVnodeObj
*
pVnode
=
vmAcquireVnode
(
pWrapper
->
pMgmt
,
vgId
);
...
...
source/dnode/mnode/impl/src/mndDnode.c
浏览文件 @
126801c8
...
...
@@ -52,9 +52,9 @@ static int32_t mndProcessConfigDnodeReq(SNodeMsg *pReq);
static
int32_t
mndProcessConfigDnodeRsp
(
SNodeMsg
*
pRsp
);
static
int32_t
mndProcessStatusReq
(
SNodeMsg
*
pReq
);
static
int32_t
mndRetrieveConfigs
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
static
int32_t
mndRetrieveConfigs
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
static
void
mndCancelGetNextConfig
(
SMnode
*
pMnode
,
void
*
pIter
);
static
int32_t
mndRetrieveDnodes
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
static
int32_t
mndRetrieveDnodes
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
static
void
mndCancelGetNextDnode
(
SMnode
*
pMnode
,
void
*
pIter
);
int32_t
mndInitDnode
(
SMnode
*
pMnode
)
{
...
...
@@ -335,11 +335,14 @@ static int32_t mndProcessStatusReq(SNodeMsg *pReq) {
}
bool
roleChanged
=
false
;
for
(
int32_t
vg
=
0
;
vg
<
pVgroup
->
replica
;
++
vg
)
{
// sync integration
if
(
pVgroup
->
vnodeGid
[
vg
].
dnodeId
==
statusReq
.
dnodeId
)
{
if
(
pVgroup
->
vnodeGid
[
vg
].
role
!=
pVload
->
syncState
)
{
roleChanged
=
true
;
}
pVgroup
->
vnodeGid
[
vg
].
role
=
pVload
->
syncState
;
}
}
if
(
roleChanged
)
{
// notify scheduler role has changed
}
...
...
@@ -634,7 +637,7 @@ static int32_t mndProcessConfigDnodeRsp(SNodeMsg *pRsp) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mndRetrieveConfigs
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
)
{
static
int32_t
mndRetrieveConfigs
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
)
{
SMnode
*
pMnode
=
pReq
->
pNode
;
int32_t
totalRows
=
0
;
int32_t
numOfRows
=
0
;
...
...
@@ -667,12 +670,12 @@ static int32_t mndRetrieveConfigs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock*
STR_WITH_MAXSIZE_TO_VARSTR
(
buf
,
cfgOpts
[
i
],
TSDB_CONFIG_OPTION_LEN
);
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
buf
,
false
);
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
buf
,
false
);
STR_WITH_MAXSIZE_TO_VARSTR
(
bufVal
,
cfgVals
[
i
],
TSDB_CONIIG_VALUE_LEN
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
bufVal
,
false
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
bufVal
,
false
);
numOfRows
++
;
}
...
...
@@ -683,7 +686,7 @@ static int32_t mndRetrieveConfigs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock*
static
void
mndCancelGetNextConfig
(
SMnode
*
pMnode
,
void
*
pIter
)
{}
static
int32_t
mndRetrieveDnodes
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
)
{
static
int32_t
mndRetrieveDnodes
(
SNodeMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
)
{
SMnode
*
pMnode
=
pReq
->
pNode
;
SSdb
*
pSdb
=
pMnode
->
pSdb
;
int32_t
numOfRows
=
0
;
...
...
@@ -698,8 +701,8 @@ static int32_t mndRetrieveDnodes(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock* p
cols
=
0
;
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pDnode
->
id
,
false
);
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pDnode
->
id
,
false
);
char
buf
[
tListLen
(
pDnode
->
ep
)
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_WITH_MAXSIZE_TO_VARSTR
(
buf
,
pDnode
->
ep
,
pShow
->
bytes
[
cols
]);
...
...
@@ -709,19 +712,19 @@ static int32_t mndRetrieveDnodes(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock* p
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
int16_t
id
=
mndGetVnodesNum
(
pMnode
,
pDnode
->
id
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
id
,
false
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
id
,
false
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pDnode
->
numOfSupportVnodes
,
false
);
char
b1
[
9
]
=
{
0
};
STR_TO_VARSTR
(
b1
,
online
?
"ready"
:
"offline"
);
STR_TO_VARSTR
(
b1
,
online
?
"ready"
:
"offline"
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
b1
,
false
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pDnode
->
createdTime
,
false
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pDnode
->
createdTime
,
false
);
char
b
[
tListLen
(
offlineReason
)
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
b
,
online
?
""
:
offlineReason
[
pDnode
->
offlineReason
]);
...
...
source/dnode/vnode/CMakeLists.txt
浏览文件 @
126801c8
...
...
@@ -15,6 +15,7 @@ target_sources(
"src/vnd/vnodeStateMgr.c"
"src/vnd/vnodeModule.c"
"src/vnd/vnodeSvr.c"
"src/vnd/vnodeSync.c"
# meta
"src/meta/metaOpen.c"
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
126801c8
...
...
@@ -21,6 +21,7 @@
#include "tqueue.h"
#include "trpc.h"
#include "sync.h"
#include "tarray.h"
#include "tfs.h"
#include "wal.h"
...
...
@@ -60,6 +61,9 @@ int32_t vnodeSync(SVnode *pVnode);
int32_t
vnodeGetLoad
(
SVnode
*
pVnode
,
SVnodeLoad
*
pLoad
);
int
vnodeValidateTableHash
(
SVnodeCfg
*
pVnodeOptions
,
char
*
tableFName
);
int64_t
vnodeGetSyncHandle
(
SVnode
*
pVnode
);
void
vnodeGetSnapshot
(
SVnode
*
pVnode
,
SSnapshot
*
pSnapshot
);
// meta
typedef
struct
SMeta
SMeta
;
// todo: remove
typedef
struct
SMTbCursor
SMTbCursor
;
...
...
@@ -147,6 +151,7 @@ struct SVnodeCfg {
bool
isWeak
;
STsdbCfg
tsdbCfg
;
SWalCfg
walCfg
;
SSyncCfg
syncCfg
;
// sync integration
uint32_t
hashBegin
;
uint32_t
hashEnd
;
int8_t
hashMethod
;
...
...
@@ -166,6 +171,11 @@ typedef struct {
uint64_t
uid
;
}
STableKeyInfo
;
// sync integration
void
vnodeSyncSetQ
(
SVnode
*
pVnode
,
void
*
qHandle
);
void
vnodeSyncSetRpc
(
SVnode
*
pVnode
,
void
*
rpcHandle
);
int32_t
vnodeSyncStart
(
SVnode
*
pVnode
);
#ifdef __cplusplus
}
#endif
...
...
source/dnode/vnode/src/inc/vnodeInt.h
浏览文件 @
126801c8
...
...
@@ -68,13 +68,13 @@ typedef struct {
}
SStreamSinkInfo
;
typedef
struct
{
SVnode
*
pVnode
;
SHashObj
*
pHash
;
// streamId -> SStreamSinkInfo
SVnode
*
pVnode
;
SHashObj
*
pHash
;
// streamId -> SStreamSinkInfo
}
SSink
;
// SVState
struct
SVState
{
int64_t
processed
;
//
int64_t processed;
int64_t
committed
;
int64_t
applied
;
};
...
...
@@ -85,25 +85,26 @@ struct SVnodeInfo {
};
struct
SVnode
{
char
*
path
;
char
*
path
;
SVnodeCfg
config
;
SVState
state
;
STfs
*
pTfs
;
STfs
*
pTfs
;
SMsgCb
msgCb
;
SVBufPool
*
pBufPool
;
SMeta
*
pMeta
;
STsdb
*
pTsdb
;
SWal
*
pWal
;
STQ
*
pTq
;
SSink
*
pSink
;
SVBufPool
*
pBufPool
;
SMeta
*
pMeta
;
STsdb
*
pTsdb
;
SWal
*
pWal
;
STQ
*
pTq
;
SSink
*
pSink
;
int64_t
sync
;
// sync integration
tsem_t
canCommit
;
SQHandle
*
pQuery
;
SQHandle
*
pQuery
;
};
#define TD_VID(PVNODE) (PVNODE)->config.vgId
// sma
void
smaHandleRes
(
void
*
pVnode
,
int64_t
smaId
,
const
SArray
*
data
);
void
smaHandleRes
(
void
*
pVnode
,
int64_t
smaId
,
const
SArray
*
data
);
#include "vnd.h"
...
...
@@ -113,6 +114,8 @@ void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
#include "tq.h"
#include "vnodeSync.h"
#ifdef __cplusplus
}
#endif
...
...
source/dnode/vnode/src/inc/vnodeSync.h
0 → 100644
浏览文件 @
126801c8
/*
* 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_VNODE_SYNC_H_
#define _TD_VNODE_SYNC_H_
#ifdef __cplusplus
extern
"C"
{
#endif
int32_t
vnodeSyncOpen
(
SVnode
*
pVnode
,
char
*
path
);
int32_t
vnodeSyncStart
(
SVnode
*
pVnode
);
void
vnodeSyncClose
(
SVnode
*
pVnode
);
void
vnodeSyncSetQ
(
SVnode
*
pVnode
,
void
*
qHandle
);
void
vnodeSyncSetRpc
(
SVnode
*
pVnode
,
void
*
rpcHandle
);
int32_t
vnodeSyncEqMsg
(
void
*
qHandle
,
SRpcMsg
*
pMsg
);
int32_t
vnodeSendMsg
(
void
*
rpcHandle
,
const
SEpSet
*
pEpSet
,
SRpcMsg
*
pMsg
);
void
vnodeSyncCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
);
void
vnodeSyncPreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
);
void
vnodeSyncRollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
);
int32_t
vnodeSyncGetSnapshotCb
(
struct
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
);
SSyncFSM
*
syncVnodeMakeFsm
();
#ifdef __cplusplus
}
#endif
#endif
/*_TD_VNODE_SYNC_H_*/
source/dnode/vnode/src/vnd/vnodeCfg.c
浏览文件 @
126801c8
...
...
@@ -82,6 +82,18 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) {
if
(
tjsonAddIntegerToObject
(
pJson
,
"hashEnd"
,
pCfg
->
hashEnd
)
<
0
)
return
-
1
;
if
(
tjsonAddIntegerToObject
(
pJson
,
"hashMethod"
,
pCfg
->
hashMethod
)
<
0
)
return
-
1
;
// sync integration
if
(
tjsonAddIntegerToObject
(
pJson
,
"syncCfg.replicaNum"
,
pCfg
->
syncCfg
.
replicaNum
)
<
0
)
return
-
1
;
if
(
tjsonAddIntegerToObject
(
pJson
,
"syncCfg.myIndex"
,
pCfg
->
syncCfg
.
myIndex
)
<
0
)
return
-
1
;
SJson
*
pNodeInfoArr
=
tjsonCreateArray
();
tjsonAddItemToObject
(
pJson
,
"syncCfg.nodeInfo"
,
pNodeInfoArr
);
for
(
int
i
=
0
;
i
<
pCfg
->
syncCfg
.
replicaNum
;
++
i
)
{
SJson
*
pNodeInfo
=
tjsonCreateObject
();
tjsonAddIntegerToObject
(
pNodeInfo
,
"nodePort"
,
(
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodePort
);
tjsonAddStringToObject
(
pNodeInfo
,
"nodeFqdn"
,
(
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodeFqdn
);
tjsonAddItemToArray
(
pNodeInfoArr
,
pNodeInfo
);
}
return
0
;
}
...
...
@@ -120,6 +132,21 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
if
(
tjsonGetNumberValue
(
pJson
,
"hashEnd"
,
pCfg
->
hashEnd
)
<
0
)
return
-
1
;
if
(
tjsonGetNumberValue
(
pJson
,
"hashMethod"
,
pCfg
->
hashMethod
)
<
0
)
return
-
1
;
// sync integration
if
(
tjsonGetNumberValue
(
pJson
,
"syncCfg.replicaNum"
,
pCfg
->
syncCfg
.
replicaNum
)
<
0
)
return
-
1
;
if
(
tjsonGetNumberValue
(
pJson
,
"syncCfg.myIndex"
,
pCfg
->
syncCfg
.
myIndex
)
<
0
)
return
-
1
;
SJson
*
pNodeInfoArr
=
tjsonGetObjectItem
(
pJson
,
"syncCfg.nodeInfo"
);
int
arraySize
=
tjsonGetArraySize
(
pNodeInfoArr
);
assert
(
arraySize
==
pCfg
->
syncCfg
.
replicaNum
);
for
(
int
i
=
0
;
i
<
arraySize
;
++
i
)
{
SJson
*
pNodeInfo
=
tjsonGetArrayItem
(
pNodeInfoArr
,
i
);
assert
(
pNodeInfo
!=
NULL
);
tjsonGetNumberValue
(
pNodeInfo
,
"nodePort"
,
(
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodePort
);
tjsonGetStringValue
(
pNodeInfo
,
"nodeFqdn"
,
(
pCfg
->
syncCfg
.
nodeInfo
)[
i
].
nodeFqdn
);
}
return
0
;
}
...
...
source/dnode/vnode/src/vnd/vnodeCommit.c
浏览文件 @
126801c8
...
...
@@ -159,11 +159,22 @@ int vnodeSyncCommit(SVnode *pVnode) {
static
int
vnodeCommit
(
void
*
arg
)
{
SVnode
*
pVnode
=
(
SVnode
*
)
arg
;
char
dir
[
TSDB_FILENAME_LEN
];
SVnodeInfo
info
=
{
0
};
snprintf
(
dir
,
TSDB_FILENAME_LEN
,
"%s%s%s"
,
tfsGetPrimaryPath
(
pVnode
->
pTfs
),
TD_DIRSEP
,
pVnode
->
path
);
info
.
config
=
pVnode
->
config
;
info
.
state
.
committed
=
pVnode
->
state
.
applied
;
info
.
state
.
applied
=
pVnode
->
state
.
applied
;
vnodeSaveInfo
(
dir
,
&
info
);
// metaCommit(pVnode->pMeta);
tqCommit
(
pVnode
->
pTq
);
tsdbCommit
(
pVnode
->
pTsdb
);
vnodeCommitInfo
(
dir
,
&
info
);
vnodeBufPoolRecycle
(
pVnode
);
tsem_post
(
&
(
pVnode
->
canCommit
));
return
0
;
...
...
@@ -185,6 +196,7 @@ static int vnodeEncodeState(const void *pObj, SJson *pJson) {
const
SVState
*
pState
=
(
SVState
*
)
pObj
;
if
(
tjsonAddIntegerToObject
(
pJson
,
"commit version"
,
pState
->
committed
)
<
0
)
return
-
1
;
if
(
tjsonAddIntegerToObject
(
pJson
,
"applied version"
,
pState
->
applied
)
<
0
)
return
-
1
;
return
0
;
}
...
...
@@ -193,6 +205,7 @@ static int vnodeDecodeState(const SJson *pJson, void *pObj) {
SVState
*
pState
=
(
SVState
*
)
pObj
;
if
(
tjsonGetNumberValue
(
pJson
,
"commit version"
,
pState
->
committed
)
<
0
)
return
-
1
;
if
(
tjsonGetNumberValue
(
pJson
,
"applied version"
,
pState
->
applied
)
<
0
)
return
-
1
;
return
0
;
}
...
...
source/dnode/vnode/src/vnd/vnodeOpen.c
浏览文件 @
126801c8
...
...
@@ -35,6 +35,8 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) {
snprintf
(
dir
,
TSDB_FILENAME_LEN
,
"%s%s%s"
,
tfsGetPrimaryPath
(
pTfs
),
TD_DIRSEP
,
path
);
info
.
config
=
*
pCfg
;
info
.
state
.
committed
=
-
1
;
info
.
state
.
applied
=
-
1
;
if
(
vnodeSaveInfo
(
dir
,
&
info
)
<
0
||
vnodeCommitInfo
(
dir
,
&
info
)
<
0
)
{
vError
(
"vgId: %d failed to save vnode config since %s"
,
pCfg
->
vgId
,
tstrerror
(
terrno
));
...
...
@@ -75,8 +77,7 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
pVnode
->
path
=
(
char
*
)
&
pVnode
[
1
];
strcpy
(
pVnode
->
path
,
path
);
pVnode
->
config
=
info
.
config
;
pVnode
->
state
.
committed
=
info
.
state
.
committed
;
pVnode
->
state
.
processed
=
pVnode
->
state
.
applied
=
pVnode
->
state
.
committed
;
pVnode
->
state
=
info
.
state
;
pVnode
->
pTfs
=
pTfs
;
pVnode
->
msgCb
=
msgCb
;
...
...
@@ -124,6 +125,12 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
goto
_err
;
}
// sync integration
// open sync
if
(
vnodeSyncOpen
(
pVnode
,
dir
))
{
goto
_err
;
}
#if 0
if (vnodeBegin() < 0) {
goto _err;
...
...
@@ -149,6 +156,10 @@ void vnodeClose(SVnode *pVnode) {
vnodeSyncCommit
(
pVnode
);
// close vnode
vnodeQueryClose
(
pVnode
);
// sync integration
vnodeSyncClose
(
pVnode
);
walClose
(
pVnode
->
pWal
);
tqClose
(
pVnode
->
pTq
);
tsdbClose
(
pVnode
->
pTsdb
);
...
...
@@ -159,3 +170,7 @@ void vnodeClose(SVnode *pVnode) {
taosMemoryFree
(
pVnode
);
}
}
int64_t
vnodeGetSyncHandle
(
SVnode
*
pVnode
)
{
return
pVnode
->
sync
;
}
void
vnodeGetSnapshot
(
SVnode
*
pVnode
,
SSnapshot
*
pSnapshot
)
{
pSnapshot
->
lastApplyIndex
=
pVnode
->
state
.
committed
;
}
\ No newline at end of file
source/dnode/vnode/src/vnd/vnodeSvr.c
浏览文件 @
126801c8
...
...
@@ -13,6 +13,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "sync.h"
#include "syncTools.h"
#include "vnodeInt.h"
static
int
vnodeProcessCreateStbReq
(
SVnode
*
pVnode
,
void
*
pReq
);
...
...
@@ -21,6 +23,7 @@ static int vnodeProcessAlterStbReq(SVnode *pVnode, void *pReq);
static
int
vnodeProcessSubmitReq
(
SVnode
*
pVnode
,
SSubmitReq
*
pSubmitReq
,
SRpcMsg
*
pRsp
);
int
vnodePreprocessWriteReqs
(
SVnode
*
pVnode
,
SArray
*
pMsgs
,
int64_t
*
version
)
{
#if 0
SNodeMsg *pMsg;
SRpcMsg *pRpc;
...
...
@@ -38,6 +41,7 @@ int vnodePreprocessWriteReqs(SVnode *pVnode, SArray *pMsgs, int64_t *version) {
walFsync(pVnode->pWal, false);
#endif
return
0
;
}
...
...
@@ -202,8 +206,86 @@ void smaHandleRes(void *pVnode, int64_t smaId, const SArray *data) {
tsdbInsertTSmaData
(((
SVnode
*
)
pVnode
)
->
pTsdb
,
smaId
,
(
const
char
*
)
data
);
}
// sync integration
int
vnodeProcessSyncReq
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SRpcMsg
**
pRsp
)
{
/*vInfo("sync message is processed");*/
SSyncNode
*
pSyncNode
=
syncNodeAcquire
(
pVnode
->
sync
);
assert
(
pSyncNode
!=
NULL
);
ESyncState
state
=
syncGetMyRole
(
pVnode
->
sync
);
SyncTerm
currentTerm
=
syncGetMyTerm
(
pVnode
->
sync
);
SMsgHead
*
pHead
=
pMsg
->
pCont
;
char
logBuf
[
512
];
char
*
syncNodeStr
=
sync2SimpleStr
(
pVnode
->
sync
);
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==vnodeProcessSyncReq== msgType:%d, syncNode: %s"
,
pMsg
->
msgType
,
syncNodeStr
);
syncRpcMsgLog2
(
logBuf
,
pMsg
);
taosMemoryFree
(
syncNodeStr
);
SRpcMsg
*
pRpcMsg
=
pMsg
;
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_TIMEOUT
)
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnTimeoutCb
(
pSyncNode
,
pSyncMsg
);
syncTimeoutDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_PING
)
{
SyncPing
*
pSyncMsg
=
syncPingFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnPingCb
(
pSyncNode
,
pSyncMsg
);
syncPingDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_PING_REPLY
)
{
SyncPingReply
*
pSyncMsg
=
syncPingReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnPingReplyCb
(
pSyncNode
,
pSyncMsg
);
syncPingReplyDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_CLIENT_REQUEST
)
{
SyncClientRequest
*
pSyncMsg
=
syncClientRequestFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnClientRequestCb
(
pSyncNode
,
pSyncMsg
);
syncClientRequestDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_REQUEST_VOTE
)
{
SyncRequestVote
*
pSyncMsg
=
syncRequestVoteFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnRequestVoteCb
(
pSyncNode
,
pSyncMsg
);
syncRequestVoteDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_REQUEST_VOTE_REPLY
)
{
SyncRequestVoteReply
*
pSyncMsg
=
syncRequestVoteReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnRequestVoteReplyCb
(
pSyncNode
,
pSyncMsg
);
syncRequestVoteReplyDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_APPEND_ENTRIES
)
{
SyncAppendEntries
*
pSyncMsg
=
syncAppendEntriesFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnAppendEntriesCb
(
pSyncNode
,
pSyncMsg
);
syncAppendEntriesDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_APPEND_ENTRIES_REPLY
)
{
SyncAppendEntriesReply
*
pSyncMsg
=
syncAppendEntriesReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
syncNodeOnAppendEntriesReplyCb
(
pSyncNode
,
pSyncMsg
);
syncAppendEntriesReplyDestroy
(
pSyncMsg
);
}
else
{
vError
(
"==vnodeProcessSyncReq== error msg type:%d"
,
pRpcMsg
->
msgType
);
}
syncNodeRelease
(
pSyncNode
);
return
0
;
}
...
...
source/dnode/vnode/src/vnd/vnodeSync.c
0 → 100644
浏览文件 @
126801c8
/*
* 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/>.
*/
#include "sync.h"
#include "syncTools.h"
#include "tmsgcb.h"
#include "vnodeInt.h"
// sync integration
int32_t
vnodeSyncOpen
(
SVnode
*
pVnode
,
char
*
path
)
{
SSyncInfo
syncInfo
;
syncInfo
.
vgId
=
pVnode
->
config
.
vgId
;
SSyncCfg
*
pCfg
=
&
(
syncInfo
.
syncCfg
);
pCfg
->
replicaNum
=
pVnode
->
config
.
syncCfg
.
replicaNum
;
pCfg
->
myIndex
=
pVnode
->
config
.
syncCfg
.
myIndex
;
memcpy
(
pCfg
->
nodeInfo
,
pVnode
->
config
.
syncCfg
.
nodeInfo
,
sizeof
(
pCfg
->
nodeInfo
));
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s/sync"
,
path
);
syncInfo
.
pWal
=
pVnode
->
pWal
;
syncInfo
.
pFsm
=
syncVnodeMakeFsm
(
pVnode
);
syncInfo
.
rpcClient
=
NULL
;
syncInfo
.
FpSendMsg
=
vnodeSendMsg
;
syncInfo
.
queue
=
NULL
;
syncInfo
.
FpEqMsg
=
vnodeSyncEqMsg
;
pVnode
->
sync
=
syncOpen
(
&
syncInfo
);
assert
(
pVnode
->
sync
>
0
);
// for test
setPingTimerMS
(
pVnode
->
sync
,
3000
);
setElectTimerMS
(
pVnode
->
sync
,
500
);
setHeartbeatTimerMS
(
pVnode
->
sync
,
100
);
return
0
;
}
int32_t
vnodeSyncStart
(
SVnode
*
pVnode
)
{
syncStart
(
pVnode
->
sync
);
return
0
;
}
void
vnodeSyncClose
(
SVnode
*
pVnode
)
{
// stop by ref id
syncStop
(
pVnode
->
sync
);
}
void
vnodeSyncSetQ
(
SVnode
*
pVnode
,
void
*
qHandle
)
{
syncSetQ
(
pVnode
->
sync
,
(
void
*
)(
&
(
pVnode
->
msgCb
)));
}
void
vnodeSyncSetRpc
(
SVnode
*
pVnode
,
void
*
rpcHandle
)
{
syncSetRpc
(
pVnode
->
sync
,
(
void
*
)(
&
(
pVnode
->
msgCb
)));
}
int32_t
vnodeSyncEqMsg
(
void
*
qHandle
,
SRpcMsg
*
pMsg
)
{
int32_t
ret
=
0
;
SMsgCb
*
pMsgCb
=
qHandle
;
if
(
pMsgCb
->
queueFps
[
SYNC_QUEUE
]
!=
NULL
)
{
tmsgPutToQueue
(
qHandle
,
SYNC_QUEUE
,
pMsg
);
}
else
{
vError
(
"vnodeSyncEqMsg queue is NULL, SYNC_QUEUE:%d"
,
SYNC_QUEUE
);
}
return
ret
;
}
int32_t
vnodeSendMsg
(
void
*
rpcHandle
,
const
SEpSet
*
pEpSet
,
SRpcMsg
*
pMsg
)
{
int32_t
ret
=
0
;
SMsgCb
*
pMsgCb
=
rpcHandle
;
if
(
pMsgCb
->
queueFps
[
SYNC_QUEUE
]
!=
NULL
)
{
tmsgSendReq
(
rpcHandle
,
pEpSet
,
pMsg
);
}
else
{
vError
(
"vnodeSendMsg queue is NULL, SYNC_QUEUE:%d"
,
SYNC_QUEUE
);
}
return
ret
;
}
int32_t
vnodeSyncGetSnapshotCb
(
struct
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
)
{
SVnode
*
pVnode
=
(
SVnode
*
)(
pFsm
->
data
);
vnodeGetSnapshot
(
pVnode
,
pSnapshot
);
/*
pSnapshot->data = NULL;
pSnapshot->lastApplyIndex = 0;
pSnapshot->lastApplyTerm = 0;
*/
return
0
;
}
void
vnodeSyncCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
SyncIndex
beginIndex
=
SYNC_INDEX_INVALID
;
if
(
pFsm
->
FpGetSnapshot
!=
NULL
)
{
SSnapshot
snapshot
;
pFsm
->
FpGetSnapshot
(
pFsm
,
&
snapshot
);
beginIndex
=
snapshot
.
lastApplyIndex
;
}
if
(
cbMeta
.
index
>
beginIndex
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== execute, pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s, beginIndex :%ld
\n
"
,
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
),
beginIndex
);
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
SVnode
*
pVnode
=
(
SVnode
*
)(
pFsm
->
data
);
SyncApplyMsg
*
pSyncApplyMsg
=
syncApplyMsgBuild2
(
pMsg
,
pVnode
->
config
.
vgId
,
&
cbMeta
);
SRpcMsg
applyMsg
;
syncApplyMsg2RpcMsg
(
pSyncApplyMsg
,
&
applyMsg
);
syncApplyMsgDestroy
(
pSyncApplyMsg
);
/*
SRpcMsg applyMsg;
applyMsg = *pMsg;
applyMsg.pCont = rpcMallocCont(applyMsg.contLen);
assert(applyMsg.contLen == pMsg->contLen);
memcpy(applyMsg.pCont, pMsg->pCont, applyMsg.contLen);
*/
// recover handle for response
SRpcMsg
saveRpcMsg
;
int32_t
ret
=
syncGetAndDelRespRpc
(
pVnode
->
sync
,
cbMeta
.
seqNum
,
&
saveRpcMsg
);
if
(
ret
==
1
&&
cbMeta
.
state
==
TAOS_SYNC_STATE_LEADER
)
{
applyMsg
.
handle
=
saveRpcMsg
.
handle
;
applyMsg
.
ahandle
=
saveRpcMsg
.
ahandle
;
}
else
{
applyMsg
.
handle
=
NULL
;
applyMsg
.
ahandle
=
NULL
;
}
// put to applyQ
tmsgPutToQueue
(
&
(
pVnode
->
msgCb
),
APPLY_QUEUE
,
&
applyMsg
);
}
else
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== do not execute, pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s, "
"beginIndex :%ld
\n
"
,
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
),
beginIndex
);
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
}
void
vnodeSyncPreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
vnodeSyncRollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
SSyncFSM
*
syncVnodeMakeFsm
(
SVnode
*
pVnode
)
{
SSyncFSM
*
pFsm
=
(
SSyncFSM
*
)
taosMemoryMalloc
(
sizeof
(
SSyncFSM
));
pFsm
->
data
=
pVnode
;
pFsm
->
FpCommitCb
=
vnodeSyncCommitCb
;
pFsm
->
FpPreCommitCb
=
vnodeSyncPreCommitCb
;
pFsm
->
FpRollBackCb
=
vnodeSyncRollBackCb
;
pFsm
->
FpGetSnapshot
=
vnodeSyncGetSnapshotCb
;
return
pFsm
;
}
source/libs/sync/CMakeLists.txt
浏览文件 @
126801c8
...
...
@@ -11,7 +11,7 @@ target_link_libraries(
target_include_directories
(
sync
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
PUBLIC
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
PRIVATE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/inc"
)
...
...
source/libs/sync/inc/syncEnv.h
浏览文件 @
126801c8
...
...
@@ -31,10 +31,10 @@ extern "C" {
#define TIMER_MAX_MS 0x7FFFFFFF
#define ENV_TICK_TIMER_MS 1000
#define PING_TIMER_MS 1000
#define ELECT_TIMER_MS_MIN
15
0
#define ELECT_TIMER_MS_MIN
50
0
#define ELECT_TIMER_MS_MAX (ELECT_TIMER_MS_MIN * 2)
#define ELECT_TIMER_MS_RANGE (ELECT_TIMER_MS_MAX - ELECT_TIMER_MS_MIN)
#define HEARTBEAT_TIMER_MS
3
0
#define HEARTBEAT_TIMER_MS
10
0
#define EMPTY_RAFT_ID ((SRaftId){.addr = 0, .vgId = 0})
...
...
source/libs/sync/inc/syncInt.h
浏览文件 @
126801c8
...
...
@@ -25,6 +25,7 @@ extern "C" {
#include <stdlib.h>
#include "cJSON.h"
#include "sync.h"
#include "syncTools.h"
#include "taosdef.h"
#include "tglobal.h"
#include "tlog.h"
...
...
@@ -67,6 +68,43 @@ extern "C" {
} \
}
#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__); \
} \
}
struct
SyncTimeout
;
typedef
struct
SyncTimeout
SyncTimeout
;
...
...
@@ -106,17 +144,19 @@ typedef struct SVotesRespond SVotesRespond;
struct
SSyncIndexMgr
;
typedef
struct
SSyncIndexMgr
SSyncIndexMgr
;
typedef
struct
SRaftId
{
SyncNodeId
addr
;
// typedef uint64_t SyncNodeId;
SyncGroupId
vgId
;
// typedef int32_t SyncGroupId;
}
SRaftId
;
struct
SRaftCfg
;
typedef
struct
SRaftCfg
SRaftCfg
;
struct
SSyncRespMgr
;
typedef
struct
SSyncRespMgr
SSyncRespMgr
;
typedef
struct
SSyncNode
{
// init by SSyncInfo
SyncGroupId
vgId
;
S
SyncCfg
sync
Cfg
;
S
RaftCfg
*
pRaft
Cfg
;
char
path
[
TSDB_FILENAME_LEN
];
char
raftStorePath
[
TSDB_FILENAME_LEN
*
2
];
char
configPath
[
TSDB_FILENAME_LEN
*
2
];
// sync io
SWal
*
pWal
;
...
...
@@ -199,10 +239,14 @@ typedef struct SSyncNode {
int32_t
(
*
FpOnAppendEntriesReply
)(
SSyncNode
*
ths
,
SyncAppendEntriesReply
*
pMsg
);
int32_t
(
*
FpOnTimeout
)(
SSyncNode
*
pSyncNode
,
SyncTimeout
*
pMsg
);
// tools
SSyncRespMgr
*
pSyncRespMgr
;
}
SSyncNode
;
// open/close --------------
SSyncNode
*
syncNodeOpen
(
const
SSyncInfo
*
pSyncInfo
);
void
syncNodeStart
(
SSyncNode
*
pSyncNode
);
void
syncNodeClose
(
SSyncNode
*
pSyncNode
);
// ping --------------
...
...
@@ -226,6 +270,8 @@ int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode,
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
);
SSyncNode
*
syncNodeAcquire
(
int64_t
rid
);
void
syncNodeRelease
(
SSyncNode
*
pNode
);
...
...
source/libs/sync/inc/syncMessage.h
浏览文件 @
126801c8
...
...
@@ -27,22 +27,6 @@ extern "C" {
#include "syncInt.h"
#include "taosdef.h"
// encode as uint32
typedef
enum
ESyncMessageType
{
SYNC_UNKNOWN
=
9999
,
SYNC_TIMEOUT
=
99
,
SYNC_PING
=
101
,
SYNC_PING_REPLY
=
103
,
SYNC_CLIENT_REQUEST
=
105
,
SYNC_CLIENT_REQUEST_REPLY
=
107
,
SYNC_REQUEST_VOTE
=
109
,
SYNC_REQUEST_VOTE_REPLY
=
111
,
SYNC_APPEND_ENTRIES
=
113
,
SYNC_APPEND_ENTRIES_REPLY
=
115
,
SYNC_RESPONSE
=
119
,
}
ESyncMessageType
;
// ---------------------------------------------
cJSON
*
syncRpcMsg2Json
(
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncRpcUnknownMsg2Json
();
...
...
@@ -53,263 +37,7 @@ void syncRpcMsgPrint(SRpcMsg* pMsg);
void
syncRpcMsgPrint2
(
char
*
s
,
SRpcMsg
*
pMsg
);
void
syncRpcMsgLog
(
SRpcMsg
*
pMsg
);
void
syncRpcMsgLog2
(
char
*
s
,
SRpcMsg
*
pMsg
);
// ---------------------------------------------
typedef
enum
ESyncTimeoutType
{
SYNC_TIMEOUT_PING
=
100
,
SYNC_TIMEOUT_ELECTION
,
SYNC_TIMEOUT_HEARTBEAT
,
}
ESyncTimeoutType
;
typedef
struct
SyncTimeout
{
uint32_t
bytes
;
uint32_t
msgType
;
ESyncTimeoutType
timeoutType
;
uint64_t
logicClock
;
int32_t
timerMS
;
void
*
data
;
// need optimized
}
SyncTimeout
;
SyncTimeout
*
syncTimeoutBuild
();
SyncTimeout
*
syncTimeoutBuild2
(
ESyncTimeoutType
timeoutType
,
uint64_t
logicClock
,
int32_t
timerMS
,
void
*
data
);
void
syncTimeoutDestroy
(
SyncTimeout
*
pMsg
);
void
syncTimeoutSerialize
(
const
SyncTimeout
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncTimeoutDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncTimeout
*
pMsg
);
char
*
syncTimeoutSerialize2
(
const
SyncTimeout
*
pMsg
,
uint32_t
*
len
);
//
SyncTimeout
*
syncTimeoutDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
//
void
syncTimeout2RpcMsg
(
const
SyncTimeout
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncTimeoutFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncTimeout
*
pMsg
);
SyncTimeout
*
syncTimeoutFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
//
cJSON
*
syncTimeout2Json
(
const
SyncTimeout
*
pMsg
);
char
*
syncTimeout2Str
(
const
SyncTimeout
*
pMsg
);
//
// for debug ----------------------
void
syncTimeoutPrint
(
const
SyncTimeout
*
pMsg
);
void
syncTimeoutPrint2
(
char
*
s
,
const
SyncTimeout
*
pMsg
);
void
syncTimeoutLog
(
const
SyncTimeout
*
pMsg
);
void
syncTimeoutLog2
(
char
*
s
,
const
SyncTimeout
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncPing
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
uint32_t
dataLen
;
char
data
[];
}
SyncPing
;
SyncPing
*
syncPingBuild
(
uint32_t
dataLen
);
SyncPing
*
syncPingBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
const
char
*
str
);
SyncPing
*
syncPingBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
);
void
syncPingDestroy
(
SyncPing
*
pMsg
);
void
syncPingSerialize
(
const
SyncPing
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncPingDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncPing
*
pMsg
);
char
*
syncPingSerialize2
(
const
SyncPing
*
pMsg
,
uint32_t
*
len
);
SyncPing
*
syncPingDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncPing2RpcMsg
(
const
SyncPing
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncPingFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncPing
*
pMsg
);
SyncPing
*
syncPingFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncPing2Json
(
const
SyncPing
*
pMsg
);
char
*
syncPing2Str
(
const
SyncPing
*
pMsg
);
// for debug ----------------------
void
syncPingPrint
(
const
SyncPing
*
pMsg
);
void
syncPingPrint2
(
char
*
s
,
const
SyncPing
*
pMsg
);
void
syncPingLog
(
const
SyncPing
*
pMsg
);
void
syncPingLog2
(
char
*
s
,
const
SyncPing
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncPingReply
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
uint32_t
dataLen
;
char
data
[];
}
SyncPingReply
;
SyncPingReply
*
syncPingReplyBuild
(
uint32_t
dataLen
);
SyncPingReply
*
syncPingReplyBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
const
char
*
str
);
SyncPingReply
*
syncPingReplyBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
);
void
syncPingReplyDestroy
(
SyncPingReply
*
pMsg
);
void
syncPingReplySerialize
(
const
SyncPingReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncPingReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncPingReply
*
pMsg
);
char
*
syncPingReplySerialize2
(
const
SyncPingReply
*
pMsg
,
uint32_t
*
len
);
//
SyncPingReply
*
syncPingReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
//
void
syncPingReply2RpcMsg
(
const
SyncPingReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncPingReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncPingReply
*
pMsg
);
SyncPingReply
*
syncPingReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
//
cJSON
*
syncPingReply2Json
(
const
SyncPingReply
*
pMsg
);
char
*
syncPingReply2Str
(
const
SyncPingReply
*
pMsg
);
//
// for debug ----------------------
void
syncPingReplyPrint
(
const
SyncPingReply
*
pMsg
);
void
syncPingReplyPrint2
(
char
*
s
,
const
SyncPingReply
*
pMsg
);
void
syncPingReplyLog
(
const
SyncPingReply
*
pMsg
);
void
syncPingReplyLog2
(
char
*
s
,
const
SyncPingReply
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncClientRequest
{
uint32_t
bytes
;
uint32_t
msgType
;
uint32_t
originalRpcType
;
uint64_t
seqNum
;
bool
isWeak
;
uint32_t
dataLen
;
char
data
[];
}
SyncClientRequest
;
SyncClientRequest
*
syncClientRequestBuild
(
uint32_t
dataLen
);
SyncClientRequest
*
syncClientRequestBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
uint64_t
seqNum
,
bool
isWeak
);
// step 1
void
syncClientRequestDestroy
(
SyncClientRequest
*
pMsg
);
void
syncClientRequestSerialize
(
const
SyncClientRequest
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncClientRequestDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncClientRequest
*
pMsg
);
char
*
syncClientRequestSerialize2
(
const
SyncClientRequest
*
pMsg
,
uint32_t
*
len
);
SyncClientRequest
*
syncClientRequestDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncClientRequest2RpcMsg
(
const
SyncClientRequest
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
// step 2
void
syncClientRequestFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncClientRequest
*
pMsg
);
SyncClientRequest
*
syncClientRequestFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
// step 3
cJSON
*
syncClientRequest2Json
(
const
SyncClientRequest
*
pMsg
);
char
*
syncClientRequest2Str
(
const
SyncClientRequest
*
pMsg
);
// for debug ----------------------
void
syncClientRequestPrint
(
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestPrint2
(
char
*
s
,
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestLog
(
const
SyncClientRequest
*
pMsg
);
void
syncClientRequestLog2
(
char
*
s
,
const
SyncClientRequest
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncClientRequestReply
{
uint32_t
bytes
;
uint32_t
msgType
;
int32_t
errCode
;
SRaftId
leaderHint
;
}
SyncClientRequestReply
;
// ---------------------------------------------
typedef
struct
SyncRequestVote
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
SyncIndex
lastLogIndex
;
SyncTerm
lastLogTerm
;
}
SyncRequestVote
;
SyncRequestVote
*
syncRequestVoteBuild
();
void
syncRequestVoteDestroy
(
SyncRequestVote
*
pMsg
);
void
syncRequestVoteSerialize
(
const
SyncRequestVote
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncRequestVoteDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncRequestVote
*
pMsg
);
char
*
syncRequestVoteSerialize2
(
const
SyncRequestVote
*
pMsg
,
uint32_t
*
len
);
SyncRequestVote
*
syncRequestVoteDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncRequestVote2RpcMsg
(
const
SyncRequestVote
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncRequestVoteFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncRequestVote
*
pMsg
);
SyncRequestVote
*
syncRequestVoteFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncRequestVote2Json
(
const
SyncRequestVote
*
pMsg
);
char
*
syncRequestVote2Str
(
const
SyncRequestVote
*
pMsg
);
// for debug ----------------------
void
syncRequestVotePrint
(
const
SyncRequestVote
*
pMsg
);
void
syncRequestVotePrint2
(
char
*
s
,
const
SyncRequestVote
*
pMsg
);
void
syncRequestVoteLog
(
const
SyncRequestVote
*
pMsg
);
void
syncRequestVoteLog2
(
char
*
s
,
const
SyncRequestVote
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncRequestVoteReply
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
bool
voteGranted
;
}
SyncRequestVoteReply
;
SyncRequestVoteReply
*
syncRequestVoteReplyBuild
();
void
syncRequestVoteReplyDestroy
(
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplySerialize
(
const
SyncRequestVoteReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncRequestVoteReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncRequestVoteReply
*
pMsg
);
char
*
syncRequestVoteReplySerialize2
(
const
SyncRequestVoteReply
*
pMsg
,
uint32_t
*
len
);
SyncRequestVoteReply
*
syncRequestVoteReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncRequestVoteReply2RpcMsg
(
const
SyncRequestVoteReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncRequestVoteReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncRequestVoteReply
*
pMsg
);
SyncRequestVoteReply
*
syncRequestVoteReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncRequestVoteReply2Json
(
const
SyncRequestVoteReply
*
pMsg
);
char
*
syncRequestVoteReply2Str
(
const
SyncRequestVoteReply
*
pMsg
);
// for debug ----------------------
void
syncRequestVoteReplyPrint
(
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyPrint2
(
char
*
s
,
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyLog
(
const
SyncRequestVoteReply
*
pMsg
);
void
syncRequestVoteReplyLog2
(
char
*
s
,
const
SyncRequestVoteReply
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncAppendEntries
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
SyncIndex
prevLogIndex
;
SyncTerm
prevLogTerm
;
SyncIndex
commitIndex
;
uint32_t
dataLen
;
char
data
[];
}
SyncAppendEntries
;
SyncAppendEntries
*
syncAppendEntriesBuild
(
uint32_t
dataLen
);
void
syncAppendEntriesDestroy
(
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesSerialize
(
const
SyncAppendEntries
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncAppendEntriesDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncAppendEntries
*
pMsg
);
char
*
syncAppendEntriesSerialize2
(
const
SyncAppendEntries
*
pMsg
,
uint32_t
*
len
);
SyncAppendEntries
*
syncAppendEntriesDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncAppendEntries2RpcMsg
(
const
SyncAppendEntries
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncAppendEntriesFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncAppendEntries
*
pMsg
);
SyncAppendEntries
*
syncAppendEntriesFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncAppendEntries2Json
(
const
SyncAppendEntries
*
pMsg
);
char
*
syncAppendEntries2Str
(
const
SyncAppendEntries
*
pMsg
);
// for debug ----------------------
void
syncAppendEntriesPrint
(
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesPrint2
(
char
*
s
,
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesLog
(
const
SyncAppendEntries
*
pMsg
);
void
syncAppendEntriesLog2
(
char
*
s
,
const
SyncAppendEntries
*
pMsg
);
// ---------------------------------------------
typedef
struct
SyncAppendEntriesReply
{
uint32_t
bytes
;
uint32_t
msgType
;
SRaftId
srcId
;
SRaftId
destId
;
// private data
SyncTerm
term
;
bool
success
;
SyncIndex
matchIndex
;
}
SyncAppendEntriesReply
;
SyncAppendEntriesReply
*
syncAppendEntriesReplyBuild
();
void
syncAppendEntriesReplyDestroy
(
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplySerialize
(
const
SyncAppendEntriesReply
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
);
void
syncAppendEntriesReplyDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncAppendEntriesReply
*
pMsg
);
char
*
syncAppendEntriesReplySerialize2
(
const
SyncAppendEntriesReply
*
pMsg
,
uint32_t
*
len
);
SyncAppendEntriesReply
*
syncAppendEntriesReplyDeserialize2
(
const
char
*
buf
,
uint32_t
len
);
void
syncAppendEntriesReply2RpcMsg
(
const
SyncAppendEntriesReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
);
void
syncAppendEntriesReplyFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncAppendEntriesReply
*
pMsg
);
SyncAppendEntriesReply
*
syncAppendEntriesReplyFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
);
cJSON
*
syncAppendEntriesReply2Json
(
const
SyncAppendEntriesReply
*
pMsg
);
char
*
syncAppendEntriesReply2Str
(
const
SyncAppendEntriesReply
*
pMsg
);
// for debug ----------------------
void
syncAppendEntriesReplyPrint
(
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyPrint2
(
char
*
s
,
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyLog
(
const
SyncAppendEntriesReply
*
pMsg
);
void
syncAppendEntriesReplyLog2
(
char
*
s
,
const
SyncAppendEntriesReply
*
pMsg
);
#ifdef __cplusplus
}
...
...
source/libs/sync/inc/syncRaftCfg.h
0 → 100644
浏览文件 @
126801c8
/*
* 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_RAFT_CFG_H
#define _TD_LIBS_SYNC_RAFT_CFG_H
#ifdef __cplusplus
extern
"C"
{
#endif
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "syncInt.h"
#include "taosdef.h"
typedef
struct
SRaftCfg
{
SSyncCfg
cfg
;
TdFilePtr
pFile
;
char
path
[
TSDB_FILENAME_LEN
*
2
];
}
SRaftCfg
;
SRaftCfg
*
raftCfgOpen
(
const
char
*
path
);
int32_t
raftCfgClose
(
SRaftCfg
*
pRaftCfg
);
int32_t
raftCfgPersist
(
SRaftCfg
*
pRaftCfg
);
cJSON
*
syncCfg2Json
(
SSyncCfg
*
pSyncCfg
);
char
*
syncCfg2Str
(
SSyncCfg
*
pSyncCfg
);
int32_t
syncCfgFromJson
(
const
cJSON
*
pRoot
,
SSyncCfg
*
pSyncCfg
);
int32_t
syncCfgFromStr
(
const
char
*
s
,
SSyncCfg
*
pSyncCfg
);
cJSON
*
raftCfg2Json
(
SRaftCfg
*
pRaftCfg
);
char
*
raftCfg2Str
(
SRaftCfg
*
pRaftCfg
);
int32_t
syncCfgCreateFile
(
SSyncCfg
*
pCfg
,
const
char
*
path
);
// for debug ----------------------
void
syncCfgPrint
(
SSyncCfg
*
pCfg
);
void
syncCfgPrint2
(
char
*
s
,
SSyncCfg
*
pCfg
);
void
syncCfgLog
(
SSyncCfg
*
pCfg
);
void
syncCfgLog2
(
char
*
s
,
SSyncCfg
*
pCfg
);
void
raftCfgPrint
(
SRaftCfg
*
pCfg
);
void
raftCfgPrint2
(
char
*
s
,
SRaftCfg
*
pCfg
);
void
raftCfgLog
(
SRaftCfg
*
pCfg
);
void
raftCfgLog2
(
char
*
s
,
SRaftCfg
*
pCfg
);
#ifdef __cplusplus
}
#endif
#endif
/*_TD_LIBS_SYNC_RAFT_CFG_H*/
source/libs/sync/inc/syncRaftEntry.h
浏览文件 @
126801c8
...
...
@@ -27,29 +27,22 @@ extern "C" {
#include "syncMessage.h"
#include "taosdef.h"
typedef
enum
EntryType
{
SYNC_RAFT_ENTRY_NOOP
=
0
,
SYNC_RAFT_ENTRY_DATA
=
1
,
SYNC_RAFT_ENTRY_CONFIG
=
2
,
}
EntryType
;
typedef
struct
SSyncRaftEntry
{
uint32_t
bytes
;
uint32_t
msgType
;
uint32_t
originalRpcType
;
uint32_t
msgType
;
// SyncClientRequest msgType
uint32_t
originalRpcType
;
// user RpcMsg msgType
uint64_t
seqNum
;
bool
isWeak
;
SyncTerm
term
;
SyncIndex
index
;
EntryType
entryType
;
uint32_t
dataLen
;
char
data
[];
uint32_t
dataLen
;
// user RpcMsg.contLen
char
data
[];
// user RpcMsg.pCont
}
SSyncRaftEntry
;
SSyncRaftEntry
*
syncEntryBuild
(
uint32_t
dataLen
);
SSyncRaftEntry
*
syncEntryBuild2
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
);
// step 4
SSyncRaftEntry
*
syncEntryBuild3
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
,
EntryType
entryType
);
SSyncRaftEntry
*
syncEntryBuildNoop
(
SyncTerm
term
,
SyncIndex
index
);
SSyncRaftEntry
*
syncEntryBuild3
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
);
SSyncRaftEntry
*
syncEntryBuildNoop
(
SyncTerm
term
,
SyncIndex
index
,
int32_t
vgId
);
void
syncEntryDestory
(
SSyncRaftEntry
*
pEntry
);
char
*
syncEntrySerialize
(
const
SSyncRaftEntry
*
pEntry
,
uint32_t
*
len
);
// step 5
SSyncRaftEntry
*
syncEntryDeserialize
(
const
char
*
buf
,
uint32_t
len
);
// step 6
...
...
source/libs/sync/inc/syncRaftLog.h
浏览文件 @
126801c8
...
...
@@ -27,9 +27,6 @@ extern "C" {
#include "syncRaftEntry.h"
#include "taosdef.h"
#define SYNC_INDEX_BEGIN 0
#define SYNC_INDEX_INVALID -1
typedef
struct
SSyncLogStoreData
{
SSyncNode
*
pSyncNode
;
SWal
*
pWal
;
...
...
source/libs/sync/inc/syncRaftStore.h
浏览文件 @
126801c8
...
...
@@ -28,7 +28,7 @@ extern "C" {
#include "taosdef.h"
#define RAFT_STORE_BLOCK_SIZE 512
#define RAFT_STORE_PATH_LEN
128
#define RAFT_STORE_PATH_LEN
(TSDB_FILENAME_LEN * 2)
typedef
struct
SRaftStore
{
SyncTerm
currentTerm
;
...
...
source/libs/sync/inc/syncRespMgr.h
0 → 100644
浏览文件 @
126801c8
/*
* 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_RESP_MGR_H
#define _TD_LIBS_SYNC_RESP_MGR_H
#ifdef __cplusplus
extern
"C"
{
#endif
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "syncInt.h"
#include "taosdef.h"
typedef
struct
SRespStub
{
SRpcMsg
rpcMsg
;
int64_t
createTime
;
}
SRespStub
;
typedef
struct
SSyncRespMgr
{
SHashObj
*
pRespHash
;
int64_t
ttl
;
void
*
data
;
TdThreadMutex
mutex
;
uint64_t
seqNum
;
}
SSyncRespMgr
;
SSyncRespMgr
*
syncRespMgrCreate
(
void
*
data
,
int64_t
ttl
);
void
syncRespMgrDestroy
(
SSyncRespMgr
*
pObj
);
int64_t
syncRespMgrAdd
(
SSyncRespMgr
*
pObj
,
SRespStub
*
pStub
);
int32_t
syncRespMgrDel
(
SSyncRespMgr
*
pObj
,
uint64_t
index
);
int32_t
syncRespMgrGet
(
SSyncRespMgr
*
pObj
,
uint64_t
index
,
SRespStub
*
pStub
);
int32_t
syncRespMgrGetAndDel
(
SSyncRespMgr
*
pObj
,
uint64_t
index
,
SRespStub
*
pStub
);
void
syncRespClean
(
SSyncRespMgr
*
pObj
);
void
syncRespCleanByTTL
(
SSyncRespMgr
*
pObj
,
int64_t
ttl
);
#ifdef __cplusplus
}
#endif
#endif
/*_TD_LIBS_SYNC_RESP_MGR_H*/
source/libs/sync/inc/syncSnapshot.h
浏览文件 @
126801c8
...
...
@@ -27,7 +27,6 @@ extern "C" {
#include "taosdef.h"
int32_t
takeSnapshot
(
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
);
int32_t
restoreSnapshot
(
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
);
#ifdef __cplusplus
...
...
source/libs/sync/inc/syncUtil.h
浏览文件 @
126801c8
...
...
@@ -55,6 +55,8 @@ char* syncUtilprintBin(char* ptr, uint32_t len);
char
*
syncUtilprintBin2
(
char
*
ptr
,
uint32_t
len
);
SyncIndex
syncUtilMinIndex
(
SyncIndex
a
,
SyncIndex
b
);
SyncIndex
syncUtilMaxIndex
(
SyncIndex
a
,
SyncIndex
b
);
void
syncUtilMsgHtoN
(
void
*
msg
);
void
syncUtilMsgNtoH
(
void
*
msg
);
#ifdef __cplusplus
}
...
...
source/libs/sync/src/syncAppendEntries.c
浏览文件 @
126801c8
...
...
@@ -125,7 +125,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
"logOK:%d"
,
pMsg
->
term
,
ths
->
pRaftStore
->
currentTerm
,
ths
->
state
,
logOK
);
SyncAppendEntriesReply
*
pReply
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pReply
=
syncAppendEntriesReplyBuild
(
ths
->
vgId
);
pReply
->
srcId
=
ths
->
myRaftId
;
pReply
->
destId
=
pMsg
->
srcId
;
pReply
->
term
=
ths
->
pRaftStore
->
currentTerm
;
...
...
@@ -199,13 +199,20 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
SSyncRaftEntry
*
pRollBackEntry
=
logStoreGetEntry
(
ths
->
pLogStore
,
index
);
assert
(
pRollBackEntry
!=
NULL
);
// maybe is a NOOP ENTRY
// assert(pRollBackEntry->entryType == SYNC_RAFT_ENTRY_DATA);
if
(
pRollBackEntry
->
msgType
!=
TDMT_VND_SYNC_NOOP
)
{
SRpcMsg
rpcMsg
;
syncEntry2OriginalRpc
(
pRollBackEntry
,
&
rpcMsg
);
ths
->
pFsm
->
FpRollBackCb
(
ths
->
pFsm
,
&
rpcMsg
,
pRollBackEntry
->
index
,
pRollBackEntry
->
isWeak
,
0
,
ths
->
state
);
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pRollBackEntry
->
index
;
cbMeta
.
isWeak
=
pRollBackEntry
->
isWeak
;
cbMeta
.
code
=
0
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pRollBackEntry
->
seqNum
;
ths
->
pFsm
->
FpRollBackCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
rpcFreeCont
(
rpcMsg
.
pCont
);
}
syncEntryDestory
(
pRollBackEntry
);
}
}
...
...
@@ -220,8 +227,14 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
SRpcMsg
rpcMsg
;
syncEntry2OriginalRpc
(
pAppendEntry
,
&
rpcMsg
);
if
(
ths
->
pFsm
!=
NULL
)
{
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pAppendEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
pAppendEntry
->
index
,
pAppendEntry
->
isWeak
,
2
,
ths
->
state
);
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pAppendEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pAppendEntry
->
index
;
cbMeta
.
isWeak
=
pAppendEntry
->
isWeak
;
cbMeta
.
code
=
2
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pAppendEntry
->
seqNum
;
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
@@ -245,8 +258,14 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
SRpcMsg
rpcMsg
;
syncEntry2OriginalRpc
(
pAppendEntry
,
&
rpcMsg
);
if
(
ths
->
pFsm
!=
NULL
)
{
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pAppendEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
pAppendEntry
->
index
,
pAppendEntry
->
isWeak
,
3
,
ths
->
state
);
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pAppendEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pAppendEntry
->
index
;
cbMeta
.
isWeak
=
pAppendEntry
->
isWeak
;
cbMeta
.
code
=
3
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pAppendEntry
->
seqNum
;
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
@@ -261,7 +280,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
assert
(
0
);
}
SyncAppendEntriesReply
*
pReply
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pReply
=
syncAppendEntriesReplyBuild
(
ths
->
vgId
);
pReply
->
srcId
=
ths
->
myRaftId
;
pReply
->
destId
=
pMsg
->
srcId
;
pReply
->
term
=
ths
->
pRaftStore
->
currentTerm
;
...
...
@@ -301,8 +320,14 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
SRpcMsg
rpcMsg
;
syncEntry2OriginalRpc
(
pEntry
,
&
rpcMsg
);
if
(
ths
->
pFsm
->
FpCommitCb
!=
NULL
&&
pEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
ths
->
pFsm
->
FpCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
pEntry
->
index
,
pEntry
->
isWeak
,
0
,
ths
->
state
);
if
(
ths
->
pFsm
->
FpCommitCb
!=
NULL
&&
pEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pEntry
->
index
;
cbMeta
.
isWeak
=
pEntry
->
isWeak
;
cbMeta
.
code
=
0
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pEntry
->
seqNum
;
ths
->
pFsm
->
FpCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
source/libs/sync/src/syncAppendEntriesReply.c
浏览文件 @
126801c8
...
...
@@ -56,6 +56,15 @@ int32_t syncNodeOnAppendEntriesReplyCb(SSyncNode* ths, SyncAppendEntriesReply* p
// syncNodeUpdateTerm(ths, pMsg->term);
// }
if
(
pMsg
->
term
>
ths
->
pRaftStore
->
currentTerm
)
{
char
logBuf
[
128
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"syncNodeOnAppendEntriesReplyCb error term, receive:%lu current:%lu"
,
pMsg
->
term
,
ths
->
pRaftStore
->
currentTerm
);
syncNodeLog2
(
logBuf
,
ths
);
sError
(
"%s"
,
logBuf
);
return
ret
;
}
assert
(
pMsg
->
term
==
ths
->
pRaftStore
->
currentTerm
);
if
(
pMsg
->
success
)
{
...
...
source/libs/sync/src/syncCommit.c
浏览文件 @
126801c8
...
...
@@ -97,8 +97,14 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
SRpcMsg
rpcMsg
;
syncEntry2OriginalRpc
(
pEntry
,
&
rpcMsg
);
if
(
pSyncNode
->
pFsm
->
FpCommitCb
!=
NULL
&&
pEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
pSyncNode
->
pFsm
->
FpCommitCb
(
pSyncNode
->
pFsm
,
&
rpcMsg
,
pEntry
->
index
,
pEntry
->
isWeak
,
0
,
pSyncNode
->
state
);
if
(
pSyncNode
->
pFsm
->
FpCommitCb
!=
NULL
&&
pEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pEntry
->
index
;
cbMeta
.
isWeak
=
pEntry
->
isWeak
;
cbMeta
.
code
=
0
;
cbMeta
.
state
=
pSyncNode
->
state
;
cbMeta
.
seqNum
=
pEntry
->
seqNum
;
pSyncNode
->
pFsm
->
FpCommitCb
(
pSyncNode
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
source/libs/sync/src/syncElection.c
浏览文件 @
126801c8
...
...
@@ -35,7 +35,7 @@ int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
int32_t
ret
=
0
;
for
(
int
i
=
0
;
i
<
pSyncNode
->
peersNum
;
++
i
)
{
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
();
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
(
pSyncNode
->
vgId
);
pMsg
->
srcId
=
pSyncNode
->
myRaftId
;
pMsg
->
destId
=
pSyncNode
->
peersId
[
i
];
pMsg
->
term
=
pSyncNode
->
pRaftStore
->
currentTerm
;
...
...
source/libs/sync/src/syncEnv.c
浏览文件 @
126801c8
...
...
@@ -31,6 +31,7 @@ int32_t syncEnvStart() {
taosSeedRand
(
taosGetTimestampSec
());
gSyncEnv
=
doSyncEnvStart
(
gSyncEnv
);
assert
(
gSyncEnv
!=
NULL
);
sTrace
(
"syncEnvStart ok!"
);
return
ret
;
}
...
...
@@ -91,6 +92,7 @@ static SSyncEnv *doSyncEnvStart() {
static
int32_t
doSyncEnvStop
(
SSyncEnv
*
pSyncEnv
)
{
taosTmrCleanUp
(
pSyncEnv
->
pTimerManager
);
taosMemoryFree
(
pSyncEnv
);
return
0
;
}
...
...
source/libs/sync/src/syncIO.c
浏览文件 @
126801c8
...
...
@@ -29,7 +29,7 @@ static int32_t syncIODestroy(SSyncIO *io);
static
int32_t
syncIOStartInternal
(
SSyncIO
*
io
);
static
int32_t
syncIOStopInternal
(
SSyncIO
*
io
);
static
void
*
syncIOConsumerFunc
(
void
*
param
);
static
void
*
syncIOConsumerFunc
(
void
*
param
);
static
void
syncIOProcessRequest
(
void
*
pParent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
);
static
void
syncIOProcessReply
(
void
*
pParent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
);
static
int32_t
syncIOAuth
(
void
*
parent
,
char
*
meterId
,
char
*
spi
,
char
*
encrypt
,
char
*
secret
,
char
*
ckey
);
...
...
@@ -70,9 +70,15 @@ int32_t syncIOSendMsg(void *clientRpc, const SEpSet *pEpSet, SRpcMsg *pMsg) {
assert
(
pEpSet
->
numOfEps
==
1
);
int32_t
ret
=
0
;
{
syncUtilMsgNtoH
(
pMsg
->
pCont
);
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==syncIOSendMsg== %s:%d"
,
pEpSet
->
eps
[
0
].
fqdn
,
pEpSet
->
eps
[
0
].
port
);
syncRpcMsgPrint2
(
logBuf
,
pMsg
);
syncRpcMsgLog2
(
logBuf
,
pMsg
);
syncUtilMsgHtoN
(
pMsg
->
pCont
);
}
pMsg
->
handle
=
NULL
;
pMsg
->
noResp
=
1
;
...
...
@@ -83,7 +89,7 @@ int32_t syncIOSendMsg(void *clientRpc, const SEpSet *pEpSet, SRpcMsg *pMsg) {
int32_t
syncIOEqMsg
(
void
*
queue
,
SRpcMsg
*
pMsg
)
{
int32_t
ret
=
0
;
char
logBuf
[
128
];
syncRpcMsg
Print
2
((
char
*
)
"==syncIOEqMsg=="
,
pMsg
);
syncRpcMsg
Log
2
((
char
*
)
"==syncIOEqMsg=="
,
pMsg
);
SRpcMsg
*
pTemp
;
pTemp
=
taosAllocateQitem
(
sizeof
(
SRpcMsg
));
...
...
@@ -235,9 +241,9 @@ static int32_t syncIOStopInternal(SSyncIO *io) {
}
static
void
*
syncIOConsumerFunc
(
void
*
param
)
{
SSyncIO
*
io
=
param
;
SSyncIO
*
io
=
param
;
STaosQall
*
qall
;
SRpcMsg
*
pRpcMsg
,
rpcMsg
;
SRpcMsg
*
pRpcMsg
,
rpcMsg
;
qall
=
taosAllocateQall
();
while
(
1
)
{
...
...
@@ -252,7 +258,7 @@ static void *syncIOConsumerFunc(void *param) {
syncRpcMsgLog2
((
char
*
)
"==syncIOConsumerFunc=="
,
pRpcMsg
);
// use switch case instead of if else
if
(
pRpcMsg
->
msgType
==
SYNC_PING
)
{
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_PING
)
{
if
(
io
->
FpOnSyncPing
!=
NULL
)
{
SyncPing
*
pSyncMsg
=
syncPingFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -260,7 +266,7 @@ static void *syncIOConsumerFunc(void *param) {
syncPingDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_PING_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_PING_REPLY
)
{
if
(
io
->
FpOnSyncPingReply
!=
NULL
)
{
SyncPingReply
*
pSyncMsg
=
syncPingReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -268,7 +274,7 @@ static void *syncIOConsumerFunc(void *param) {
syncPingReplyDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_CLIENT_REQUEST
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_CLIENT_REQUEST
)
{
if
(
io
->
FpOnSyncClientRequest
!=
NULL
)
{
SyncClientRequest
*
pSyncMsg
=
syncClientRequestFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -276,7 +282,7 @@ static void *syncIOConsumerFunc(void *param) {
syncClientRequestDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_REQUEST_VOTE
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_REQUEST_VOTE
)
{
if
(
io
->
FpOnSyncRequestVote
!=
NULL
)
{
SyncRequestVote
*
pSyncMsg
=
syncRequestVoteFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -284,7 +290,7 @@ static void *syncIOConsumerFunc(void *param) {
syncRequestVoteDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_REQUEST_VOTE_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_REQUEST_VOTE_REPLY
)
{
if
(
io
->
FpOnSyncRequestVoteReply
!=
NULL
)
{
SyncRequestVoteReply
*
pSyncMsg
=
syncRequestVoteReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -292,7 +298,7 @@ static void *syncIOConsumerFunc(void *param) {
syncRequestVoteReplyDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_APPEND_ENTRIES
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_APPEND_ENTRIES
)
{
if
(
io
->
FpOnSyncAppendEntries
!=
NULL
)
{
SyncAppendEntries
*
pSyncMsg
=
syncAppendEntriesFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -300,7 +306,7 @@ static void *syncIOConsumerFunc(void *param) {
syncAppendEntriesDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_APPEND_ENTRIES_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_APPEND_ENTRIES_REPLY
)
{
if
(
io
->
FpOnSyncAppendEntriesReply
!=
NULL
)
{
SyncAppendEntriesReply
*
pSyncMsg
=
syncAppendEntriesReplyFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -308,7 +314,7 @@ static void *syncIOConsumerFunc(void *param) {
syncAppendEntriesReplyDestroy
(
pSyncMsg
);
}
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_TIMEOUT
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_TIMEOUT
)
{
if
(
io
->
FpOnSyncTimeout
!=
NULL
)
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutFromRpcMsg2
(
pRpcMsg
);
assert
(
pSyncMsg
!=
NULL
);
...
...
@@ -336,7 +342,7 @@ static void *syncIOConsumerFunc(void *param) {
rpcMsg.handle = pRpcMsg->handle;
rpcMsg.code = 0;
syncRpcMsg
Print
2((char *)"syncIOConsumerFunc rpcSendResponse --> ", &rpcMsg);
syncRpcMsg
Log
2((char *)"syncIOConsumerFunc rpcSendResponse --> ", &rpcMsg);
rpcSendResponse(&rpcMsg);
}
*/
...
...
@@ -350,7 +356,9 @@ static void *syncIOConsumerFunc(void *param) {
}
static
void
syncIOProcessRequest
(
void
*
pParent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
)
{
syncRpcMsgPrint2
((
char
*
)
"==syncIOProcessRequest=="
,
pMsg
);
syncUtilMsgNtoH
(
pMsg
->
pCont
);
syncRpcMsgLog2
((
char
*
)
"==syncIOProcessRequest=="
,
pMsg
);
SSyncIO
*
io
=
pParent
;
SRpcMsg
*
pTemp
;
pTemp
=
taosAllocateQitem
(
sizeof
(
SRpcMsg
));
...
...
@@ -359,10 +367,10 @@ static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) {
}
static
void
syncIOProcessReply
(
void
*
pParent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
)
{
if
(
pMsg
->
msgType
==
SYNC
_RESPONSE
)
{
if
(
pMsg
->
msgType
==
TDMT_VND_SYNC_COMMON
_RESPONSE
)
{
sTrace
(
"==syncIOProcessReply=="
);
}
else
{
syncRpcMsg
Print
2
((
char
*
)
"==syncIOProcessReply=="
,
pMsg
);
syncRpcMsg
Log
2
((
char
*
)
"==syncIOProcessReply=="
,
pMsg
);
}
rpcFreeCont
(
pMsg
->
pCont
);
}
...
...
@@ -408,14 +416,14 @@ static void syncIOTickQ(void *param, void *tmrId) {
srcId
.
vgId
=
-
1
;
destId
.
addr
=
syncUtilAddr2U64
(
io
->
myAddr
.
eps
[
0
].
fqdn
,
io
->
myAddr
.
eps
[
0
].
port
);
destId
.
vgId
=
-
1
;
SyncPingReply
*
pMsg
=
syncPingReplyBuild2
(
&
srcId
,
&
destId
,
"syncIOTickQ"
);
SyncPingReply
*
pMsg
=
syncPingReplyBuild2
(
&
srcId
,
&
destId
,
-
1
,
"syncIOTickQ"
);
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SRpcMsg
*
pTemp
;
pTemp
=
taosAllocateQitem
(
sizeof
(
SRpcMsg
));
memcpy
(
pTemp
,
&
rpcMsg
,
sizeof
(
SRpcMsg
));
syncRpcMsg
Print
2
((
char
*
)
"==syncIOTickQ=="
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"==syncIOTickQ=="
,
&
rpcMsg
);
taosWriteQitem
(
io
->
pMsgQ
,
pTemp
);
syncPingReplyDestroy
(
pMsg
);
...
...
@@ -430,12 +438,12 @@ static void syncIOTickPing(void *param, void *tmrId) {
srcId
.
vgId
=
-
1
;
destId
.
addr
=
syncUtilAddr2U64
(
io
->
myAddr
.
eps
[
0
].
fqdn
,
io
->
myAddr
.
eps
[
0
].
port
);
destId
.
vgId
=
-
1
;
SyncPing
*
pMsg
=
syncPingBuild2
(
&
srcId
,
&
destId
,
"syncIOTickPing"
);
SyncPing
*
pMsg
=
syncPingBuild2
(
&
srcId
,
&
destId
,
-
1
,
"syncIOTickPing"
);
// SyncPing *pMsg = syncPingBuild3(&srcId, &destId);
SRpcMsg
rpcMsg
;
syncPing2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"==syncIOTickPing=="
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"==syncIOTickPing=="
,
&
rpcMsg
);
rpcSendRequest
(
io
->
clientRpc
,
&
io
->
myAddr
,
&
rpcMsg
,
NULL
);
syncPingDestroy
(
pMsg
);
...
...
source/libs/sync/src/syncMain.c
浏览文件 @
126801c8
...
...
@@ -23,11 +23,13 @@
#include "syncIndexMgr.h"
#include "syncInt.h"
#include "syncMessage.h"
#include "syncRaftCfg.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncReplication.h"
#include "syncRequestVote.h"
#include "syncRequestVoteReply.h"
#include "syncRespMgr.h"
#include "syncTimeout.h"
#include "syncUtil.h"
#include "syncVoteMgr.h"
...
...
@@ -44,9 +46,9 @@ static int32_t syncNodeEqNoop(SSyncNode* ths);
static
int32_t
syncNodeAppendNoop
(
SSyncNode
*
ths
);
// process message ----
static
int32_t
syncNodeOnPingCb
(
SSyncNode
*
ths
,
SyncPing
*
pMsg
);
static
int32_t
syncNodeOnPingReplyCb
(
SSyncNode
*
ths
,
SyncPingReply
*
pMsg
);
static
int32_t
syncNodeOnClientRequestCb
(
SSyncNode
*
ths
,
SyncClientRequest
*
pMsg
);
int32_t
syncNodeOnPingCb
(
SSyncNode
*
ths
,
SyncPing
*
pMsg
);
int32_t
syncNodeOnPingReplyCb
(
SSyncNode
*
ths
,
SyncPingReply
*
pMsg
);
int32_t
syncNodeOnClientRequestCb
(
SSyncNode
*
ths
,
SyncClientRequest
*
pMsg
);
// life cycle
static
void
syncFreeNode
(
void
*
param
);
...
...
@@ -76,10 +78,12 @@ void syncCleanUp() {
}
}
int64_t
sync
Start
(
const
SSyncInfo
*
pSyncInfo
)
{
int64_t
sync
Open
(
const
SSyncInfo
*
pSyncInfo
)
{
SSyncNode
*
pSyncNode
=
syncNodeOpen
(
pSyncInfo
);
assert
(
pSyncNode
!=
NULL
);
syncNodeLog2
(
"syncNodeOpen open success"
,
pSyncNode
);
pSyncNode
->
rid
=
taosAddRef
(
tsNodeRefId
,
pSyncNode
);
if
(
pSyncNode
->
rid
<
0
)
{
syncFreeNode
(
pSyncNode
);
...
...
@@ -89,6 +93,16 @@ int64_t syncStart(const SSyncInfo* pSyncInfo) {
return
pSyncNode
->
rid
;
}
void
syncStart
(
int64_t
rid
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
;
}
syncNodeStart
(
pSyncNode
);
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
void
syncStop
(
int64_t
rid
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
...
...
@@ -105,11 +119,6 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg) {
return
ret
;
}
int32_t
syncPropose
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
)
{
int32_t
ret
=
syncPropose2
(
rid
,
pMsg
,
isWeak
,
0
);
return
ret
;
}
int32_t
syncForwardToPeer
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
)
{
int32_t
ret
=
syncPropose
(
rid
,
pMsg
,
isWeak
);
return
ret
;
...
...
@@ -121,28 +130,163 @@ ESyncState syncGetMyRole(int64_t rid) {
return
TAOS_SYNC_STATE_ERROR
;
}
assert
(
rid
==
pSyncNode
->
rid
);
return
pSyncNode
->
state
;
ESyncState
state
=
pSyncNode
->
state
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
return
state
;
}
int32_t
syncPropose2
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
,
uint64_t
seqNum
)
{
int32_t
ret
=
0
;
const
char
*
syncGetMyRoleStr
(
int64_t
rid
)
{
const
char
*
s
=
syncUtilState2String
(
syncGetMyRole
(
rid
));
return
s
;
}
SyncTerm
syncGetMyTerm
(
int64_t
rid
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
-
1
;
return
TAOS_SYNC_STATE_ERROR
;
}
assert
(
rid
==
pSyncNode
->
rid
);
SyncTerm
term
=
pSyncNode
->
pRaftStore
->
currentTerm
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
return
term
;
}
int32_t
syncGetRespRpc
(
int64_t
rid
,
uint64_t
index
,
SRpcMsg
*
msg
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
TAOS_SYNC_STATE_ERROR
;
}
assert
(
rid
==
pSyncNode
->
rid
);
SRespStub
stub
;
int32_t
ret
=
syncRespMgrGet
(
pSyncNode
->
pSyncRespMgr
,
index
,
&
stub
);
if
(
ret
==
1
)
{
memcpy
(
msg
,
&
(
stub
.
rpcMsg
),
sizeof
(
SRpcMsg
));
}
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
return
ret
;
}
int32_t
syncGetAndDelRespRpc
(
int64_t
rid
,
uint64_t
index
,
SRpcMsg
*
msg
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
TAOS_SYNC_STATE_ERROR
;
}
assert
(
rid
==
pSyncNode
->
rid
);
SRespStub
stub
;
int32_t
ret
=
syncRespMgrGetAndDel
(
pSyncNode
->
pSyncRespMgr
,
index
,
&
stub
);
if
(
ret
==
1
)
{
memcpy
(
msg
,
&
(
stub
.
rpcMsg
),
sizeof
(
SRpcMsg
));
}
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
return
ret
;
}
void
syncSetQ
(
int64_t
rid
,
void
*
queue
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
sTrace
(
"syncSetQ get pSyncNode is NULL, rid:%ld"
,
rid
);
return
;
}
assert
(
rid
==
pSyncNode
->
rid
);
pSyncNode
->
queue
=
queue
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
void
syncSetRpc
(
int64_t
rid
,
void
*
rpcHandle
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
sTrace
(
"syncSetRpc get pSyncNode is NULL, rid:%ld"
,
rid
);
return
;
}
assert
(
rid
==
pSyncNode
->
rid
);
pSyncNode
->
rpcClient
=
rpcHandle
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
char
*
sync2SimpleStr
(
int64_t
rid
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
sTrace
(
"syncSetRpc get pSyncNode is NULL, rid:%ld"
,
rid
);
return
NULL
;
}
assert
(
rid
==
pSyncNode
->
rid
);
char
*
s
=
syncNode2SimpleStr
(
pSyncNode
);
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
return
s
;
}
void
setPingTimerMS
(
int64_t
rid
,
int32_t
pingTimerMS
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
;
}
assert
(
rid
==
pSyncNode
->
rid
);
pSyncNode
->
pingBaseLine
=
pingTimerMS
;
pSyncNode
->
pingTimerMS
=
pingTimerMS
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
void
setElectTimerMS
(
int64_t
rid
,
int32_t
electTimerMS
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
;
}
assert
(
rid
==
pSyncNode
->
rid
);
pSyncNode
->
electBaseLine
=
electTimerMS
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
void
setHeartbeatTimerMS
(
int64_t
rid
,
int32_t
hbTimerMS
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
;
}
assert
(
rid
==
pSyncNode
->
rid
);
pSyncNode
->
hbBaseLine
=
hbTimerMS
;
pSyncNode
->
heartbeatTimerMS
=
hbTimerMS
;
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
}
int32_t
syncPropose
(
int64_t
rid
,
const
SRpcMsg
*
pMsg
,
bool
isWeak
)
{
int32_t
ret
=
TAOS_SYNC_PROPOSE_SUCCESS
;
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pSyncNode
==
NULL
)
{
return
TAOS_SYNC_PROPOSE_OTHER_ERROR
;
}
assert
(
rid
==
pSyncNode
->
rid
);
if
(
pSyncNode
->
state
==
TAOS_SYNC_STATE_LEADER
)
{
SyncClientRequest
*
pSyncMsg
=
syncClientRequestBuild2
(
pMsg
,
seqNum
,
isWeak
);
SRespStub
stub
;
stub
.
createTime
=
taosGetTimestampMs
();
stub
.
rpcMsg
=
*
pMsg
;
uint64_t
seqNum
=
syncRespMgrAdd
(
pSyncNode
->
pSyncRespMgr
,
&
stub
);
SyncClientRequest
*
pSyncMsg
=
syncClientRequestBuild2
(
pMsg
,
seqNum
,
isWeak
,
pSyncNode
->
vgId
);
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
if
(
pSyncNode
->
FpEqMsg
!=
NULL
)
{
pSyncNode
->
FpEqMsg
(
pSyncNode
->
queue
,
&
rpcMsg
);
}
else
{
sTrace
(
"syncPropose pSyncNode->FpEqMsg is NULL"
);
}
syncClientRequestDestroy
(
pSyncMsg
);
ret
=
0
;
ret
=
TAOS_SYNC_PROPOSE_SUCCESS
;
}
else
{
sTrace
(
"syncPropose not leader, %s"
,
syncUtilState2String
(
pSyncNode
->
state
));
ret
=
-
1
;
// todo : need define err code !!
ret
=
TAOS_SYNC_PROPOSE_NOT_LEADER
;
}
taosReleaseRef
(
tsNodeRefId
,
pSyncNode
->
rid
);
...
...
@@ -155,49 +299,62 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) {
assert
(
pSyncNode
!=
NULL
);
memset
(
pSyncNode
,
0
,
sizeof
(
SSyncNode
));
int32_t
ret
=
0
;
if
(
!
taosDirExist
((
char
*
)(
pSyncInfo
->
path
)))
{
if
(
taosMkDir
(
pSyncInfo
->
path
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
sError
(
"failed to create dir:%s since %s"
,
pSyncInfo
->
path
,
terrstr
());
return
NULL
;
}
// create raft config file
snprintf
(
pSyncNode
->
configPath
,
sizeof
(
pSyncNode
->
configPath
),
"%s/raft_config.json"
,
pSyncInfo
->
path
);
ret
=
syncCfgCreateFile
((
SSyncCfg
*
)
&
(
pSyncInfo
->
syncCfg
),
pSyncNode
->
configPath
);
assert
(
ret
==
0
);
}
// init by SSyncInfo
pSyncNode
->
vgId
=
pSyncInfo
->
vgId
;
pSyncNode
->
syncCfg
=
pSyncInfo
->
syncCfg
;
memcpy
(
pSyncNode
->
path
,
pSyncInfo
->
path
,
sizeof
(
pSyncNode
->
path
));
snprintf
(
pSyncNode
->
raftStorePath
,
sizeof
(
pSyncNode
->
raftStorePath
),
"%s/raft_store.json"
,
pSyncInfo
->
path
);
snprintf
(
pSyncNode
->
configPath
,
sizeof
(
pSyncNode
->
configPath
),
"%s/raft_config.json"
,
pSyncInfo
->
path
);
pSyncNode
->
pWal
=
pSyncInfo
->
pWal
;
pSyncNode
->
rpcClient
=
pSyncInfo
->
rpcClient
;
pSyncNode
->
FpSendMsg
=
pSyncInfo
->
FpSendMsg
;
pSyncNode
->
queue
=
pSyncInfo
->
queue
;
pSyncNode
->
FpEqMsg
=
pSyncInfo
->
FpEqMsg
;
// init raft config
pSyncNode
->
pRaftCfg
=
raftCfgOpen
(
pSyncNode
->
configPath
);
assert
(
pSyncNode
->
pRaftCfg
!=
NULL
);
// init internal
pSyncNode
->
myNodeInfo
=
pSync
Info
->
syncCfg
.
nodeInfo
[
pSyncInfo
->
syncC
fg
.
myIndex
];
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
myNodeInfo
,
pSync
Info
->
vgId
,
&
pSyncNode
->
myRaftId
);
pSyncNode
->
myNodeInfo
=
pSync
Node
->
pRaftCfg
->
cfg
.
nodeInfo
[
pSyncNode
->
pRaftCfg
->
c
fg
.
myIndex
];
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
myNodeInfo
,
pSync
Node
->
vgId
,
&
pSyncNode
->
myRaftId
);
// init peersNum, peers, peersId
pSyncNode
->
peersNum
=
pSync
Info
->
syncC
fg
.
replicaNum
-
1
;
pSyncNode
->
peersNum
=
pSync
Node
->
pRaftCfg
->
c
fg
.
replicaNum
-
1
;
int
j
=
0
;
for
(
int
i
=
0
;
i
<
pSync
Info
->
syncC
fg
.
replicaNum
;
++
i
)
{
if
(
i
!=
pSync
Info
->
syncC
fg
.
myIndex
)
{
pSyncNode
->
peersNodeInfo
[
j
]
=
pSync
Info
->
syncC
fg
.
nodeInfo
[
i
];
for
(
int
i
=
0
;
i
<
pSync
Node
->
pRaftCfg
->
c
fg
.
replicaNum
;
++
i
)
{
if
(
i
!=
pSync
Node
->
pRaftCfg
->
c
fg
.
myIndex
)
{
pSyncNode
->
peersNodeInfo
[
j
]
=
pSync
Node
->
pRaftCfg
->
c
fg
.
nodeInfo
[
i
];
j
++
;
}
}
for
(
int
i
=
0
;
i
<
pSyncNode
->
peersNum
;
++
i
)
{
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
peersNodeInfo
[
i
],
pSync
Info
->
vgId
,
&
pSyncNode
->
peersId
[
i
]);
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
peersNodeInfo
[
i
],
pSync
Node
->
vgId
,
&
pSyncNode
->
peersId
[
i
]);
}
// init replicaNum, replicasId
pSyncNode
->
replicaNum
=
pSync
Info
->
syncC
fg
.
replicaNum
;
for
(
int
i
=
0
;
i
<
pSync
Info
->
syncC
fg
.
replicaNum
;
++
i
)
{
syncUtilnodeInfo2raftId
(
&
pSync
Info
->
syncCfg
.
nodeInfo
[
i
],
pSyncInfo
->
vgId
,
&
pSyncNode
->
replicasId
[
i
]);
pSyncNode
->
replicaNum
=
pSync
Node
->
pRaftCfg
->
c
fg
.
replicaNum
;
for
(
int
i
=
0
;
i
<
pSync
Node
->
pRaftCfg
->
c
fg
.
replicaNum
;
++
i
)
{
syncUtilnodeInfo2raftId
(
&
pSync
Node
->
pRaftCfg
->
cfg
.
nodeInfo
[
i
],
pSyncNode
->
vgId
,
&
pSyncNode
->
replicasId
[
i
]);
}
// init raft algorithm
pSyncNode
->
pFsm
=
pSyncInfo
->
pFsm
;
pSyncNode
->
quorum
=
syncUtilQuorum
(
pSync
Info
->
syncC
fg
.
replicaNum
);
pSyncNode
->
quorum
=
syncUtilQuorum
(
pSync
Node
->
pRaftCfg
->
c
fg
.
replicaNum
);
pSyncNode
->
leaderCache
=
EMPTY_RAFT_ID
;
// init life cycle outside
...
...
@@ -287,12 +444,27 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) {
pSyncNode
->
FpOnAppendEntriesReply
=
syncNodeOnAppendEntriesReplyCb
;
pSyncNode
->
FpOnTimeout
=
syncNodeOnTimeoutCb
;
// tools
pSyncNode
->
pSyncRespMgr
=
syncRespMgrCreate
(
NULL
,
0
);
assert
(
pSyncNode
->
pSyncRespMgr
!=
NULL
);
// start in syncNodeStart
// start raft
syncNodeBecomeFollower
(
pSyncNode
);
//
syncNodeBecomeFollower(pSyncNode);
return
pSyncNode
;
}
void
syncNodeStart
(
SSyncNode
*
pSyncNode
)
{
// start raft
syncNodeBecomeFollower
(
pSyncNode
);
// for test
int32_t
ret
=
0
;
// ret = syncNodeStartPingTimer(pSyncNode);
assert
(
ret
==
0
);
}
void
syncNodeClose
(
SSyncNode
*
pSyncNode
)
{
int32_t
ret
;
assert
(
pSyncNode
!=
NULL
);
...
...
@@ -305,12 +477,18 @@ void syncNodeClose(SSyncNode* pSyncNode) {
syncIndexMgrDestroy
(
pSyncNode
->
pNextIndex
);
syncIndexMgrDestroy
(
pSyncNode
->
pMatchIndex
);
logStoreDestory
(
pSyncNode
->
pLogStore
);
raftCfgClose
(
pSyncNode
->
pRaftCfg
);
syncNodeStopPingTimer
(
pSyncNode
);
syncNodeStopElectTimer
(
pSyncNode
);
syncNodeStopHeartbeatTimer
(
pSyncNode
);
taosMemoryFree
(
pSyncNode
);
if
(
pSyncNode
->
pFsm
!=
NULL
)
{
taosMemoryFree
(
pSyncNode
->
pFsm
);
}
// free memory in syncFreeNode
// taosMemoryFree(pSyncNode);
}
// ping --------------
...
...
@@ -328,7 +506,7 @@ int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing*
int32_t
syncNodePingSelf
(
SSyncNode
*
pSyncNode
)
{
int32_t
ret
=
0
;
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
,
pSyncNode
->
vgId
);
ret
=
syncNodePing
(
pSyncNode
,
&
pMsg
->
destId
,
pMsg
);
assert
(
ret
==
0
);
...
...
@@ -339,10 +517,9 @@ int32_t syncNodePingSelf(SSyncNode* pSyncNode) {
int32_t
syncNodePingPeers
(
SSyncNode
*
pSyncNode
)
{
int32_t
ret
=
0
;
for
(
int
i
=
0
;
i
<
pSyncNode
->
peersNum
;
++
i
)
{
SRaftId
destId
;
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
peersNodeInfo
[
i
],
pSyncNode
->
vgId
,
&
destId
);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
&
destId
);
ret
=
syncNodePing
(
pSyncNode
,
&
destId
,
pMsg
);
SRaftId
*
destId
=
&
(
pSyncNode
->
peersId
[
i
]);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
destId
,
pSyncNode
->
vgId
);
ret
=
syncNodePing
(
pSyncNode
,
destId
,
pMsg
);
assert
(
ret
==
0
);
syncPingDestroy
(
pMsg
);
}
...
...
@@ -351,11 +528,10 @@ int32_t syncNodePingPeers(SSyncNode* pSyncNode) {
int32_t
syncNodePingAll
(
SSyncNode
*
pSyncNode
)
{
int32_t
ret
=
0
;
for
(
int
i
=
0
;
i
<
pSyncNode
->
syncCfg
.
replicaNum
;
++
i
)
{
SRaftId
destId
;
syncUtilnodeInfo2raftId
(
&
pSyncNode
->
syncCfg
.
nodeInfo
[
i
],
pSyncNode
->
vgId
,
&
destId
);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
&
destId
);
ret
=
syncNodePing
(
pSyncNode
,
&
destId
,
pMsg
);
for
(
int
i
=
0
;
i
<
pSyncNode
->
pRaftCfg
->
cfg
.
replicaNum
;
++
i
)
{
SRaftId
*
destId
=
&
(
pSyncNode
->
replicasId
[
i
]);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
pSyncNode
->
myRaftId
,
destId
,
pSyncNode
->
vgId
);
ret
=
syncNodePing
(
pSyncNode
,
destId
,
pMsg
);
assert
(
ret
==
0
);
syncPingDestroy
(
pMsg
);
}
...
...
@@ -430,14 +606,30 @@ int32_t syncNodeStopHeartbeatTimer(SSyncNode* pSyncNode) {
int32_t
syncNodeSendMsgById
(
const
SRaftId
*
destRaftId
,
SSyncNode
*
pSyncNode
,
SRpcMsg
*
pMsg
)
{
SEpSet
epSet
;
syncUtilraftId2EpSet
(
destRaftId
,
&
epSet
);
if
(
pSyncNode
->
FpSendMsg
!=
NULL
)
{
pMsg
->
noResp
=
1
;
// htonl
syncUtilMsgHtoN
(
pMsg
->
pCont
);
pSyncNode
->
FpSendMsg
(
pSyncNode
->
rpcClient
,
&
epSet
,
pMsg
);
}
else
{
sTrace
(
"syncNodeSendMsgById pSyncNode->FpSendMsg is NULL"
);
}
return
0
;
}
int32_t
syncNodeSendMsgByInfo
(
const
SNodeInfo
*
nodeInfo
,
SSyncNode
*
pSyncNode
,
SRpcMsg
*
pMsg
)
{
SEpSet
epSet
;
syncUtilnodeInfo2EpSet
(
nodeInfo
,
&
epSet
);
if
(
pSyncNode
->
FpSendMsg
!=
NULL
)
{
pMsg
->
noResp
=
1
;
// htonl
syncUtilMsgHtoN
(
pMsg
->
pCont
);
pSyncNode
->
FpSendMsg
(
pSyncNode
->
rpcClient
,
&
epSet
,
pMsg
);
}
else
{
sTrace
(
"syncNodeSendMsgByInfo pSyncNode->FpSendMsg is NULL"
);
}
return
0
;
}
...
...
@@ -448,7 +640,11 @@ cJSON* syncNode2Json(const SSyncNode* pSyncNode) {
if
(
pSyncNode
!=
NULL
)
{
// init by SSyncInfo
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pSyncNode
->
vgId
);
cJSON_AddItemToObject
(
pRoot
,
"SRaftCfg"
,
raftCfg2Json
(
pSyncNode
->
pRaftCfg
));
cJSON_AddStringToObject
(
pRoot
,
"path"
,
pSyncNode
->
path
);
cJSON_AddStringToObject
(
pRoot
,
"raftStorePath"
,
pSyncNode
->
raftStorePath
);
cJSON_AddStringToObject
(
pRoot
,
"configPath"
,
pSyncNode
->
configPath
);
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%p"
,
pSyncNode
->
pWal
);
cJSON_AddStringToObject
(
pRoot
,
"pWal"
,
u64buf
);
...
...
@@ -501,9 +697,7 @@ cJSON* syncNode2Json(const SSyncNode* pSyncNode) {
// tla+ server vars
cJSON_AddNumberToObject
(
pRoot
,
"state"
,
pSyncNode
->
state
);
cJSON_AddStringToObject
(
pRoot
,
"state_str"
,
syncUtilState2String
(
pSyncNode
->
state
));
char
tmpBuf
[
RAFT_STORE_BLOCK_SIZE
];
raftStoreSerialize
(
pSyncNode
->
pRaftStore
,
tmpBuf
,
sizeof
(
tmpBuf
));
cJSON_AddStringToObject
(
pRoot
,
"pRaftStore"
,
tmpBuf
);
cJSON_AddItemToObject
(
pRoot
,
"pRaftStore"
,
raftStore2Json
(
pSyncNode
->
pRaftStore
));
// tla+ candidate vars
cJSON_AddItemToObject
(
pRoot
,
"pVotesGranted"
,
voteGranted2Json
(
pSyncNode
->
pVotesGranted
));
...
...
@@ -518,6 +712,11 @@ cJSON* syncNode2Json(const SSyncNode* pSyncNode) {
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%"
PRId64
""
,
pSyncNode
->
commitIndex
);
cJSON_AddStringToObject
(
pRoot
,
"commitIndex"
,
u64buf
);
// timer ms init
cJSON_AddNumberToObject
(
pRoot
,
"pingBaseLine"
,
pSyncNode
->
pingBaseLine
);
cJSON_AddNumberToObject
(
pRoot
,
"electBaseLine"
,
pSyncNode
->
electBaseLine
);
cJSON_AddNumberToObject
(
pRoot
,
"hbBaseLine"
,
pSyncNode
->
hbBaseLine
);
// ping timer
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%p"
,
pSyncNode
->
pPingTimer
);
cJSON_AddStringToObject
(
pRoot
,
"pPingTimer"
,
u64buf
);
...
...
@@ -586,6 +785,19 @@ char* syncNode2Str(const SSyncNode* pSyncNode) {
return
serialized
;
}
char
*
syncNode2SimpleStr
(
const
SSyncNode
*
pSyncNode
)
{
int
len
=
256
;
char
*
s
=
(
char
*
)
taosMemoryMalloc
(
len
);
snprintf
(
s
,
len
,
"syncNode2SimpleStr vgId:%d currentTerm:%lu, commitIndex:%ld, state:%d %s, electTimerLogicClock:%lu, "
"electTimerLogicClockUser:%lu, "
"electTimerMS:%d"
,
pSyncNode
->
vgId
,
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
commitIndex
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
);
return
s
;
}
SSyncNode
*
syncNodeAcquire
(
int64_t
rid
)
{
SSyncNode
*
pNode
=
taosAcquireRef
(
tsNodeRefId
,
rid
);
if
(
pNode
==
NULL
)
{
...
...
@@ -672,24 +884,37 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
assert
(
voteGrantedMajority
(
pSyncNode
->
pVotesGranted
));
syncNodeBecomeLeader
(
pSyncNode
);
syncNodeLog2
(
"==state change syncNodeCandidate2Leader=="
,
pSyncNode
);
// Raft 3.6.2 Committing entries from previous terms
// use this now
syncNodeAppendNoop
(
pSyncNode
);
syncMaybeAdvanceCommitIndex
(
pSyncNode
);
// maybe only one replica
// do not use this
// syncNodeEqNoop(pSyncNode);
}
void
syncNodeFollower2Candidate
(
SSyncNode
*
pSyncNode
)
{
assert
(
pSyncNode
->
state
==
TAOS_SYNC_STATE_FOLLOWER
);
pSyncNode
->
state
=
TAOS_SYNC_STATE_CANDIDATE
;
syncNodeLog2
(
"==state change syncNodeFollower2Candidate=="
,
pSyncNode
);
}
void
syncNodeLeader2Follower
(
SSyncNode
*
pSyncNode
)
{
assert
(
pSyncNode
->
state
==
TAOS_SYNC_STATE_LEADER
);
syncNodeBecomeFollower
(
pSyncNode
);
syncNodeLog2
(
"==state change syncNodeLeader2Follower=="
,
pSyncNode
);
}
void
syncNodeCandidate2Follower
(
SSyncNode
*
pSyncNode
)
{
assert
(
pSyncNode
->
state
==
TAOS_SYNC_STATE_CANDIDATE
);
syncNodeBecomeFollower
(
pSyncNode
);
syncNodeLog2
(
"==state change syncNodeCandidate2Follower=="
,
pSyncNode
);
}
// raft vote --------------
...
...
@@ -707,7 +932,7 @@ void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId)
void
syncNodeVoteForSelf
(
SSyncNode
*
pSyncNode
)
{
syncNodeVoteForTerm
(
pSyncNode
,
pSyncNode
->
pRaftStore
->
currentTerm
,
&
(
pSyncNode
->
myRaftId
));
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
(
pSyncNode
->
vgId
);
pMsg
->
srcId
=
pSyncNode
->
myRaftId
;
pMsg
->
destId
=
pSyncNode
->
myRaftId
;
pMsg
->
term
=
pSyncNode
->
pRaftStore
->
currentTerm
;
...
...
@@ -735,13 +960,13 @@ void syncNodePrint2(char* s, SSyncNode* pObj) {
void
syncNodeLog
(
SSyncNode
*
pObj
)
{
char
*
serialized
=
syncNode2Str
(
pObj
);
sTrace
(
"syncNodeLog | len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
sTrace
Long
(
"syncNodeLog | len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
taosMemoryFree
(
serialized
);
}
void
syncNodeLog2
(
char
*
s
,
SSyncNode
*
pObj
)
{
char
*
serialized
=
syncNode2Str
(
pObj
);
sTrace
(
"syncNodeLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
sTrace
Long
(
"syncNodeLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
...
...
@@ -751,11 +976,15 @@ static void syncNodeEqPingTimer(void* param, void* tmrId) {
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
param
;
if
(
atomic_load_64
(
&
pSyncNode
->
pingTimerLogicClockUser
)
<=
atomic_load_64
(
&
pSyncNode
->
pingTimerLogicClock
))
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_PING
,
atomic_load_64
(
&
pSyncNode
->
pingTimerLogicClock
),
pSyncNode
->
pingTimerMS
,
pSyncNode
);
pSyncNode
->
pingTimerMS
,
pSyncNode
->
vgId
,
pSyncNode
);
SRpcMsg
rpcMsg
;
syncTimeout2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
syncRpcMsgLog2
((
char
*
)
"==syncNodeEqPingTimer=="
,
&
rpcMsg
);
if
(
pSyncNode
->
FpEqMsg
!=
NULL
)
{
pSyncNode
->
FpEqMsg
(
pSyncNode
->
queue
,
&
rpcMsg
);
}
else
{
sTrace
(
"syncNodeEqPingTimer pSyncNode->FpEqMsg is NULL"
);
}
syncTimeoutDestroy
(
pSyncMsg
);
taosTmrReset
(
syncNodeEqPingTimer
,
pSyncNode
->
pingTimerMS
,
pSyncNode
,
gSyncEnv
->
pTimerManager
,
...
...
@@ -770,17 +999,21 @@ static void syncNodeEqElectTimer(void* param, void* tmrId) {
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
param
;
if
(
atomic_load_64
(
&
pSyncNode
->
electTimerLogicClockUser
)
<=
atomic_load_64
(
&
pSyncNode
->
electTimerLogicClock
))
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_ELECTION
,
atomic_load_64
(
&
pSyncNode
->
electTimerLogicClock
),
pSyncNode
->
electTimerMS
,
pSyncNode
);
pSyncNode
->
electTimerMS
,
pSyncNode
->
vgId
,
pSyncNode
);
SRpcMsg
rpcMsg
;
syncTimeout2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
syncRpcMsgLog2
((
char
*
)
"==syncNodeEqElectTimer=="
,
&
rpcMsg
);
if
(
pSyncNode
->
FpEqMsg
!=
NULL
)
{
pSyncNode
->
FpEqMsg
(
pSyncNode
->
queue
,
&
rpcMsg
);
}
else
{
sTrace
(
"syncNodeEqElectTimer pSyncNode->FpEqMsg is NULL"
);
}
syncTimeoutDestroy
(
pSyncMsg
);
// reset timer ms
pSyncNode
->
electTimerMS
=
syncUtilElectRandomMS
(
pSyncNode
->
electBaseLine
,
2
*
pSyncNode
->
electBaseLine
);
taosTmrReset
(
syncNodeEq
PingTimer
,
pSyncNode
->
ping
TimerMS
,
pSyncNode
,
gSyncEnv
->
pTimerManager
,
&
pSyncNode
->
p
Ping
Timer
);
taosTmrReset
(
syncNodeEq
ElectTimer
,
pSyncNode
->
elect
TimerMS
,
pSyncNode
,
gSyncEnv
->
pTimerManager
,
&
pSyncNode
->
p
Elect
Timer
);
}
else
{
sTrace
(
"==syncNodeEqElectTimer== electTimerLogicClock:%"
PRIu64
", electTimerLogicClockUser:%"
PRIu64
""
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
);
...
...
@@ -793,11 +1026,15 @@ static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
atomic_load_64
(
&
pSyncNode
->
heartbeatTimerLogicClock
))
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_HEARTBEAT
,
atomic_load_64
(
&
pSyncNode
->
heartbeatTimerLogicClock
),
pSyncNode
->
heartbeatTimerMS
,
pSyncNode
);
pSyncNode
->
heartbeatTimerMS
,
pSyncNode
->
vgId
,
pSyncNode
);
SRpcMsg
rpcMsg
;
syncTimeout2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
syncRpcMsgLog2
((
char
*
)
"==syncNodeEqHeartbeatTimer=="
,
&
rpcMsg
);
if
(
pSyncNode
->
FpEqMsg
!=
NULL
)
{
pSyncNode
->
FpEqMsg
(
pSyncNode
->
queue
,
&
rpcMsg
);
}
else
{
sTrace
(
"syncNodeEqHeartbeatTimer pSyncNode->FpEqMsg is NULL"
);
}
syncTimeoutDestroy
(
pSyncMsg
);
taosTmrReset
(
syncNodeEqHeartbeatTimer
,
pSyncNode
->
heartbeatTimerMS
,
pSyncNode
,
gSyncEnv
->
pTimerManager
,
...
...
@@ -815,7 +1052,7 @@ static int32_t syncNodeEqNoop(SSyncNode* ths) {
SyncIndex
index
=
ths
->
pLogStore
->
getLastIndex
(
ths
->
pLogStore
)
+
1
;
SyncTerm
term
=
ths
->
pRaftStore
->
currentTerm
;
SSyncRaftEntry
*
pEntry
=
syncEntryBuildNoop
(
term
,
index
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuildNoop
(
term
,
index
,
ths
->
vgId
);
assert
(
pEntry
!=
NULL
);
uint32_t
entryLen
;
...
...
@@ -826,7 +1063,11 @@ static int32_t syncNodeEqNoop(SSyncNode* ths) {
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
if
(
ths
->
FpEqMsg
!=
NULL
)
{
ths
->
FpEqMsg
(
ths
->
queue
,
&
rpcMsg
);
}
else
{
sTrace
(
"syncNodeEqNoop pSyncNode->FpEqMsg is NULL"
);
}
taosMemoryFree
(
serialized
);
syncClientRequestDestroy
(
pSyncMsg
);
...
...
@@ -839,7 +1080,7 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
SyncIndex
index
=
ths
->
pLogStore
->
getLastIndex
(
ths
->
pLogStore
)
+
1
;
SyncTerm
term
=
ths
->
pRaftStore
->
currentTerm
;
SSyncRaftEntry
*
pEntry
=
syncEntryBuildNoop
(
term
,
index
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuildNoop
(
term
,
index
,
ths
->
vgId
);
assert
(
pEntry
!=
NULL
);
if
(
ths
->
state
==
TAOS_SYNC_STATE_LEADER
)
{
...
...
@@ -851,18 +1092,34 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
}
// on message ----
static
int32_t
syncNodeOnPingCb
(
SSyncNode
*
ths
,
SyncPing
*
pMsg
)
{
int32_t
syncNodeOnPingCb
(
SSyncNode
*
ths
,
SyncPing
*
pMsg
)
{
// log state
char
logBuf
[
1024
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==syncNodeOnPingCb== vgId:%d, state: %d, %s, term:%lu electTimerLogicClock:%lu, "
"electTimerLogicClockUser:%lu, electTimerMS:%d"
,
ths
->
vgId
,
ths
->
state
,
syncUtilState2String
(
ths
->
state
),
ths
->
pRaftStore
->
currentTerm
,
ths
->
electTimerLogicClock
,
ths
->
electTimerLogicClockUser
,
ths
->
electTimerMS
);
int32_t
ret
=
0
;
syncPingLog2
(
"==syncNodeOnPingCb=="
,
pMsg
);
SyncPingReply
*
pMsgReply
=
syncPingReplyBuild3
(
&
ths
->
myRaftId
,
&
pMsg
->
srcId
);
syncPingLog2
(
logBuf
,
pMsg
);
SyncPingReply
*
pMsgReply
=
syncPingReplyBuild3
(
&
ths
->
myRaftId
,
&
pMsg
->
srcId
,
ths
->
vgId
);
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pMsgReply
,
&
rpcMsg
);
/*
// htonl
SMsgHead* pHead = rpcMsg.pCont;
pHead->contLen = htonl(pHead->contLen);
pHead->vgId = htonl(pHead->vgId);
*/
syncNodeSendMsgById
(
&
pMsgReply
->
destId
,
ths
,
&
rpcMsg
);
return
ret
;
}
static
int32_t
syncNodeOnPingReplyCb
(
SSyncNode
*
ths
,
SyncPingReply
*
pMsg
)
{
int32_t
syncNodeOnPingReplyCb
(
SSyncNode
*
ths
,
SyncPingReply
*
pMsg
)
{
int32_t
ret
=
0
;
syncPingReplyLog2
(
"==syncNodeOnPingReplyCb=="
,
pMsg
);
return
ret
;
...
...
@@ -878,7 +1135,7 @@ static int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) {
// /\ UNCHANGED <<messages, serverVars, candidateVars,
// leaderVars, commitIndex>>
//
static
int32_t
syncNodeOnClientRequestCb
(
SSyncNode
*
ths
,
SyncClientRequest
*
pMsg
)
{
int32_t
syncNodeOnClientRequestCb
(
SSyncNode
*
ths
,
SyncClientRequest
*
pMsg
)
{
int32_t
ret
=
0
;
syncClientRequestLog2
(
"==syncNodeOnClientRequestCb=="
,
pMsg
);
...
...
@@ -898,8 +1155,14 @@ static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg
syncEntry2OriginalRpc
(
pEntry
,
&
rpcMsg
);
if
(
ths
->
pFsm
!=
NULL
)
{
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
pEntry
->
index
,
pEntry
->
isWeak
,
0
,
ths
->
state
);
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pEntry
->
index
;
cbMeta
.
isWeak
=
pEntry
->
isWeak
;
cbMeta
.
code
=
0
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pEntry
->
seqNum
;
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
@@ -913,8 +1176,14 @@ static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg
syncEntry2OriginalRpc
(
pEntry
,
&
rpcMsg
);
if
(
ths
->
pFsm
!=
NULL
)
{
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pEntry
->
entryType
==
SYNC_RAFT_ENTRY_DATA
)
{
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
pEntry
->
index
,
pEntry
->
isWeak
,
1
,
ths
->
state
);
if
(
ths
->
pFsm
->
FpPreCommitCb
!=
NULL
&&
pEntry
->
originalRpcType
!=
TDMT_VND_SYNC_NOOP
)
{
SFsmCbMeta
cbMeta
;
cbMeta
.
index
=
pEntry
->
index
;
cbMeta
.
isWeak
=
pEntry
->
isWeak
;
cbMeta
.
code
=
1
;
cbMeta
.
state
=
ths
->
state
;
cbMeta
.
seqNum
=
pEntry
->
seqNum
;
ths
->
pFsm
->
FpPreCommitCb
(
ths
->
pFsm
,
&
rpcMsg
,
cbMeta
);
}
}
rpcFreeCont
(
rpcMsg
.
pCont
);
...
...
@@ -926,7 +1195,8 @@ static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg
static
void
syncFreeNode
(
void
*
param
)
{
SSyncNode
*
pNode
=
param
;
syncNodePrint2
((
char
*
)
"==syncFreeNode=="
,
pNode
);
// inner object already free
// syncNodePrint2((char*)"==syncFreeNode==", pNode);
taosMemoryFree
(
pNode
);
}
...
...
source/libs/sync/src/syncMessage.c
浏览文件 @
126801c8
...
...
@@ -22,50 +22,50 @@ cJSON* syncRpcMsg2Json(SRpcMsg* pRpcMsg) {
cJSON
*
pRoot
;
// in compiler optimization, switch case = if else constants
if
(
pRpcMsg
->
msgType
==
SYNC_TIMEOUT
)
{
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_TIMEOUT
)
{
SyncTimeout
*
pSyncMsg
=
syncTimeoutDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncTimeout2Json
(
pSyncMsg
);
syncTimeoutDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_PING
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_PING
)
{
SyncPing
*
pSyncMsg
=
syncPingDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncPing2Json
(
pSyncMsg
);
syncPingDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_PING_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_PING_REPLY
)
{
SyncPingReply
*
pSyncMsg
=
syncPingReplyDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncPingReply2Json
(
pSyncMsg
);
syncPingReplyDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_CLIENT_REQUEST
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_CLIENT_REQUEST
)
{
SyncClientRequest
*
pSyncMsg
=
syncClientRequestDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncClientRequest2Json
(
pSyncMsg
);
syncClientRequestDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_CLIENT_REQUEST_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_CLIENT_REQUEST_REPLY
)
{
pRoot
=
syncRpcUnknownMsg2Json
();
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_REQUEST_VOTE
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_REQUEST_VOTE
)
{
SyncRequestVote
*
pSyncMsg
=
syncRequestVoteDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncRequestVote2Json
(
pSyncMsg
);
syncRequestVoteDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_REQUEST_VOTE_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_REQUEST_VOTE_REPLY
)
{
SyncRequestVoteReply
*
pSyncMsg
=
syncRequestVoteReplyDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncRequestVoteReply2Json
(
pSyncMsg
);
syncRequestVoteReplyDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_APPEND_ENTRIES
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_APPEND_ENTRIES
)
{
SyncAppendEntries
*
pSyncMsg
=
syncAppendEntriesDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncAppendEntries2Json
(
pSyncMsg
);
syncAppendEntriesDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC_APPEND_ENTRIES_REPLY
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_
SYNC_APPEND_ENTRIES_REPLY
)
{
SyncAppendEntriesReply
*
pSyncMsg
=
syncAppendEntriesReplyDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
pRoot
=
syncAppendEntriesReply2Json
(
pSyncMsg
);
syncAppendEntriesReplyDestroy
(
pSyncMsg
);
}
else
if
(
pRpcMsg
->
msgType
==
SYNC
_RESPONSE
)
{
}
else
if
(
pRpcMsg
->
msgType
==
TDMT_VND_SYNC_COMMON
_RESPONSE
)
{
pRoot
=
cJSON_CreateObject
();
char
*
s
;
s
=
syncUtilprintBin
((
char
*
)(
pRpcMsg
->
pCont
),
pRpcMsg
->
contLen
);
...
...
@@ -98,7 +98,7 @@ cJSON* syncRpcMsg2Json(SRpcMsg* pRpcMsg) {
cJSON
*
syncRpcUnknownMsg2Json
()
{
cJSON
*
pRoot
=
cJSON_CreateObject
();
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
SYNC_UNKNOWN
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
TDMT_VND_
SYNC_UNKNOWN
);
cJSON_AddStringToObject
(
pRoot
,
"data"
,
"unknown message"
);
cJSON
*
pJson
=
cJSON_CreateObject
();
...
...
@@ -146,12 +146,14 @@ SyncTimeout* syncTimeoutBuild() {
SyncTimeout
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_TIMEOUT
;
pMsg
->
msgType
=
TDMT_VND_
SYNC_TIMEOUT
;
return
pMsg
;
}
SyncTimeout
*
syncTimeoutBuild2
(
ESyncTimeoutType
timeoutType
,
uint64_t
logicClock
,
int32_t
timerMS
,
void
*
data
)
{
SyncTimeout
*
syncTimeoutBuild2
(
ESyncTimeoutType
timeoutType
,
uint64_t
logicClock
,
int32_t
timerMS
,
int32_t
vgId
,
void
*
data
)
{
SyncTimeout
*
pMsg
=
syncTimeoutBuild
();
pMsg
->
vgId
=
vgId
;
pMsg
->
timeoutType
=
timeoutType
;
pMsg
->
logicClock
=
logicClock
;
pMsg
->
timerMS
=
timerMS
;
...
...
@@ -217,6 +219,7 @@ cJSON* syncTimeout2Json(const SyncTimeout* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON_AddNumberToObject
(
pRoot
,
"timeoutType"
,
pMsg
->
timeoutType
);
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%lu"
,
pMsg
->
logicClock
);
...
...
@@ -271,22 +274,23 @@ SyncPing* syncPingBuild(uint32_t dataLen) {
SyncPing
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_PING
;
pMsg
->
msgType
=
TDMT_VND_
SYNC_PING
;
pMsg
->
dataLen
=
dataLen
;
return
pMsg
;
}
SyncPing
*
syncPingBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
const
char
*
str
)
{
SyncPing
*
syncPingBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
,
const
char
*
str
)
{
uint32_t
dataLen
=
strlen
(
str
)
+
1
;
SyncPing
*
pMsg
=
syncPingBuild
(
dataLen
);
pMsg
->
vgId
=
vgId
;
pMsg
->
srcId
=
*
srcId
;
pMsg
->
destId
=
*
destId
;
snprintf
(
pMsg
->
data
,
pMsg
->
dataLen
,
"%s"
,
str
);
return
pMsg
;
}
SyncPing
*
syncPingBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
)
{
SyncPing
*
pMsg
=
syncPingBuild2
(
srcId
,
destId
,
"ping"
);
SyncPing
*
syncPingBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
)
{
SyncPing
*
pMsg
=
syncPingBuild2
(
srcId
,
destId
,
vgId
,
"ping"
);
return
pMsg
;
}
...
...
@@ -326,6 +330,98 @@ SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
return
pMsg
;
}
int32_t
syncPingSerialize3
(
const
SyncPing
*
pMsg
,
char
*
buf
,
int32_t
bufLen
)
{
SCoder
encoder
=
{
0
};
tCoderInit
(
&
encoder
,
TD_LITTLE_ENDIAN
,
buf
,
bufLen
,
TD_ENCODER
);
if
(
tStartEncode
(
&
encoder
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
bytes
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
msgType
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU64
(
&
encoder
,
pMsg
->
srcId
.
addr
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
srcId
.
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU64
(
&
encoder
,
pMsg
->
destId
.
addr
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
destId
.
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
dataLen
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeBinary
(
&
encoder
,
pMsg
->
data
,
pMsg
->
dataLen
))
{
return
-
1
;
}
tEndEncode
(
&
encoder
);
int32_t
tlen
=
encoder
.
pos
;
tCoderClear
(
&
encoder
);
return
tlen
;
}
SyncPing
*
syncPingDeserialize3
(
void
*
buf
,
int32_t
bufLen
)
{
SCoder
decoder
=
{
0
};
tCoderInit
(
&
decoder
,
TD_LITTLE_ENDIAN
,
buf
,
bufLen
,
TD_DECODER
);
if
(
tStartDecode
(
&
decoder
)
<
0
)
{
return
NULL
;
}
SyncPing
*
pMsg
=
NULL
;
uint32_t
bytes
;
if
(
tDecodeU32
(
&
decoder
,
&
bytes
)
<
0
)
{
return
NULL
;
}
pMsg
=
taosMemoryMalloc
(
bytes
);
assert
(
pMsg
!=
NULL
);
pMsg
->
bytes
=
bytes
;
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU32
(
&
decoder
,
&
pMsg
->
msgType
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU64
(
&
decoder
,
&
pMsg
->
srcId
.
addr
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
srcId
.
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU64
(
&
decoder
,
&
pMsg
->
destId
.
addr
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
destId
.
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU32
(
&
decoder
,
&
pMsg
->
dataLen
)
<
0
)
{
return
NULL
;
}
uint64_t
len
;
char
*
data
=
NULL
;
if
(
tDecodeBinary
(
&
decoder
,
(
const
void
**
)(
&
data
),
&
len
)
<
0
)
{
return
NULL
;
}
assert
(
len
=
pMsg
->
dataLen
);
memcpy
(
pMsg
->
data
,
data
,
len
);
tEndDecode
(
&
decoder
);
tCoderClear
(
&
decoder
);
return
pMsg
;
}
void
syncPing2RpcMsg
(
const
SyncPing
*
pMsg
,
SRpcMsg
*
pRpcMsg
)
{
memset
(
pRpcMsg
,
0
,
sizeof
(
*
pRpcMsg
));
pRpcMsg
->
msgType
=
pMsg
->
msgType
;
...
...
@@ -349,6 +445,7 @@ cJSON* syncPing2Json(const SyncPing* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -436,22 +533,23 @@ SyncPingReply* syncPingReplyBuild(uint32_t dataLen) {
SyncPingReply
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_PING_REPLY
;
pMsg
->
msgType
=
TDMT_VND_
SYNC_PING_REPLY
;
pMsg
->
dataLen
=
dataLen
;
return
pMsg
;
}
SyncPingReply
*
syncPingReplyBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
const
char
*
str
)
{
SyncPingReply
*
syncPingReplyBuild2
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
,
const
char
*
str
)
{
uint32_t
dataLen
=
strlen
(
str
)
+
1
;
SyncPingReply
*
pMsg
=
syncPingReplyBuild
(
dataLen
);
pMsg
->
vgId
=
vgId
;
pMsg
->
srcId
=
*
srcId
;
pMsg
->
destId
=
*
destId
;
snprintf
(
pMsg
->
data
,
pMsg
->
dataLen
,
"%s"
,
str
);
return
pMsg
;
}
SyncPingReply
*
syncPingReplyBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
)
{
SyncPingReply
*
pMsg
=
syncPingReplyBuild2
(
srcId
,
destId
,
"pang"
);
SyncPingReply
*
syncPingReplyBuild3
(
const
SRaftId
*
srcId
,
const
SRaftId
*
destId
,
int32_t
vgId
)
{
SyncPingReply
*
pMsg
=
syncPingReplyBuild2
(
srcId
,
destId
,
vgId
,
"pang"
);
return
pMsg
;
}
...
...
@@ -491,6 +589,98 @@ SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
return
pMsg
;
}
int32_t
syncPingReplySerialize3
(
const
SyncPingReply
*
pMsg
,
char
*
buf
,
int32_t
bufLen
)
{
SCoder
encoder
=
{
0
};
tCoderInit
(
&
encoder
,
TD_LITTLE_ENDIAN
,
buf
,
bufLen
,
TD_ENCODER
);
if
(
tStartEncode
(
&
encoder
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
bytes
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
msgType
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU64
(
&
encoder
,
pMsg
->
srcId
.
addr
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
srcId
.
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU64
(
&
encoder
,
pMsg
->
destId
.
addr
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeI32
(
&
encoder
,
pMsg
->
destId
.
vgId
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeU32
(
&
encoder
,
pMsg
->
dataLen
)
<
0
)
{
return
-
1
;
}
if
(
tEncodeBinary
(
&
encoder
,
pMsg
->
data
,
pMsg
->
dataLen
))
{
return
-
1
;
}
tEndEncode
(
&
encoder
);
int32_t
tlen
=
encoder
.
pos
;
tCoderClear
(
&
encoder
);
return
tlen
;
}
SyncPingReply
*
syncPingReplyDeserialize3
(
void
*
buf
,
int32_t
bufLen
)
{
SCoder
decoder
=
{
0
};
tCoderInit
(
&
decoder
,
TD_LITTLE_ENDIAN
,
buf
,
bufLen
,
TD_DECODER
);
if
(
tStartDecode
(
&
decoder
)
<
0
)
{
return
NULL
;
}
SyncPingReply
*
pMsg
=
NULL
;
uint32_t
bytes
;
if
(
tDecodeU32
(
&
decoder
,
&
bytes
)
<
0
)
{
return
NULL
;
}
pMsg
=
taosMemoryMalloc
(
bytes
);
assert
(
pMsg
!=
NULL
);
pMsg
->
bytes
=
bytes
;
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU32
(
&
decoder
,
&
pMsg
->
msgType
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU64
(
&
decoder
,
&
pMsg
->
srcId
.
addr
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
srcId
.
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU64
(
&
decoder
,
&
pMsg
->
destId
.
addr
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeI32
(
&
decoder
,
&
pMsg
->
destId
.
vgId
)
<
0
)
{
return
NULL
;
}
if
(
tDecodeU32
(
&
decoder
,
&
pMsg
->
dataLen
)
<
0
)
{
return
NULL
;
}
uint64_t
len
;
char
*
data
=
NULL
;
if
(
tDecodeBinary
(
&
decoder
,
(
const
void
**
)(
&
data
),
&
len
)
<
0
)
{
return
NULL
;
}
assert
(
len
=
pMsg
->
dataLen
);
memcpy
(
pMsg
->
data
,
data
,
len
);
tEndDecode
(
&
decoder
);
tCoderClear
(
&
decoder
);
return
pMsg
;
}
void
syncPingReply2RpcMsg
(
const
SyncPingReply
*
pMsg
,
SRpcMsg
*
pRpcMsg
)
{
memset
(
pRpcMsg
,
0
,
sizeof
(
*
pRpcMsg
));
pRpcMsg
->
msgType
=
pMsg
->
msgType
;
...
...
@@ -514,6 +704,7 @@ cJSON* syncPingReply2Json(const SyncPingReply* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -601,7 +792,7 @@ SyncClientRequest* syncClientRequestBuild(uint32_t dataLen) {
SyncClientRequest
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_CLIENT_REQUEST
;
pMsg
->
msgType
=
TDMT_VND_
SYNC_CLIENT_REQUEST
;
pMsg
->
seqNum
=
0
;
pMsg
->
isWeak
=
false
;
pMsg
->
dataLen
=
dataLen
;
...
...
@@ -609,8 +800,9 @@ SyncClientRequest* syncClientRequestBuild(uint32_t dataLen) {
}
// step 1. original SRpcMsg => SyncClientRequest, add seqNum, isWeak
SyncClientRequest
*
syncClientRequestBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
uint64_t
seqNum
,
bool
isWeak
)
{
SyncClientRequest
*
syncClientRequestBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
uint64_t
seqNum
,
bool
isWeak
,
int32_t
vgId
)
{
SyncClientRequest
*
pMsg
=
syncClientRequestBuild
(
pOriginalRpcMsg
->
contLen
);
pMsg
->
vgId
=
vgId
;
pMsg
->
originalRpcType
=
pOriginalRpcMsg
->
msgType
;
pMsg
->
seqNum
=
seqNum
;
pMsg
->
isWeak
=
isWeak
;
...
...
@@ -678,6 +870,7 @@ cJSON* syncClientRequest2Json(const SyncClientRequest* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON_AddNumberToObject
(
pRoot
,
"originalRpcType"
,
pMsg
->
originalRpcType
);
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%lu"
,
pMsg
->
seqNum
);
...
...
@@ -734,12 +927,13 @@ void syncClientRequestLog2(char* s, const SyncClientRequest* pMsg) {
}
// ---- message process SyncRequestVote----
SyncRequestVote
*
syncRequestVoteBuild
()
{
SyncRequestVote
*
syncRequestVoteBuild
(
int32_t
vgId
)
{
uint32_t
bytes
=
sizeof
(
SyncRequestVote
);
SyncRequestVote
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_REQUEST_VOTE
;
pMsg
->
vgId
=
vgId
;
pMsg
->
msgType
=
TDMT_VND_SYNC_REQUEST_VOTE
;
return
pMsg
;
}
...
...
@@ -801,6 +995,7 @@ cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -880,12 +1075,13 @@ void syncRequestVoteLog2(char* s, const SyncRequestVote* pMsg) {
}
// ---- message process SyncRequestVoteReply----
SyncRequestVoteReply
*
syncRequestVoteReplyBuild
()
{
SyncRequestVoteReply
*
syncRequestVoteReplyBuild
(
int32_t
vgId
)
{
uint32_t
bytes
=
sizeof
(
SyncRequestVoteReply
);
SyncRequestVoteReply
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_REQUEST_VOTE_REPLY
;
pMsg
->
vgId
=
vgId
;
pMsg
->
msgType
=
TDMT_VND_SYNC_REQUEST_VOTE_REPLY
;
return
pMsg
;
}
...
...
@@ -947,6 +1143,7 @@ cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -1023,12 +1220,13 @@ void syncRequestVoteReplyLog2(char* s, const SyncRequestVoteReply* pMsg) {
}
// ---- message process SyncAppendEntries----
SyncAppendEntries
*
syncAppendEntriesBuild
(
uint32_t
dataLen
)
{
SyncAppendEntries
*
syncAppendEntriesBuild
(
uint32_t
dataLen
,
int32_t
vgId
)
{
uint32_t
bytes
=
sizeof
(
SyncAppendEntries
)
+
dataLen
;
SyncAppendEntries
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_APPEND_ENTRIES
;
pMsg
->
vgId
=
vgId
;
pMsg
->
msgType
=
TDMT_VND_SYNC_APPEND_ENTRIES
;
pMsg
->
dataLen
=
dataLen
;
return
pMsg
;
}
...
...
@@ -1092,6 +1290,7 @@ cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -1186,12 +1385,13 @@ void syncAppendEntriesLog2(char* s, const SyncAppendEntries* pMsg) {
}
// ---- message process SyncAppendEntriesReply----
SyncAppendEntriesReply
*
syncAppendEntriesReplyBuild
()
{
SyncAppendEntriesReply
*
syncAppendEntriesReplyBuild
(
int32_t
vgId
)
{
uint32_t
bytes
=
sizeof
(
SyncAppendEntriesReply
);
SyncAppendEntriesReply
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
SYNC_APPEND_ENTRIES_REPLY
;
pMsg
->
vgId
=
vgId
;
pMsg
->
msgType
=
TDMT_VND_SYNC_APPEND_ENTRIES_REPLY
;
return
pMsg
;
}
...
...
@@ -1253,6 +1453,7 @@ cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg) {
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON
*
pSrcId
=
cJSON_CreateObject
();
...
...
@@ -1330,3 +1531,154 @@ void syncAppendEntriesReplyLog2(char* s, const SyncAppendEntriesReply* pMsg) {
sTrace
(
"syncAppendEntriesReplyLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
// ---- message process SyncApplyMsg----
SyncApplyMsg
*
syncApplyMsgBuild
(
uint32_t
dataLen
)
{
uint32_t
bytes
=
sizeof
(
SyncApplyMsg
)
+
dataLen
;
SyncApplyMsg
*
pMsg
=
taosMemoryMalloc
(
bytes
);
memset
(
pMsg
,
0
,
bytes
);
pMsg
->
bytes
=
bytes
;
pMsg
->
msgType
=
TDMT_VND_SYNC_APPLY_MSG
;
pMsg
->
dataLen
=
dataLen
;
return
pMsg
;
}
SyncApplyMsg
*
syncApplyMsgBuild2
(
const
SRpcMsg
*
pOriginalRpcMsg
,
int32_t
vgId
,
SFsmCbMeta
*
pMeta
)
{
SyncApplyMsg
*
pMsg
=
syncApplyMsgBuild
(
pOriginalRpcMsg
->
contLen
);
pMsg
->
vgId
=
vgId
;
pMsg
->
originalRpcType
=
pOriginalRpcMsg
->
msgType
;
pMsg
->
fsmMeta
=
*
pMeta
;
memcpy
(
pMsg
->
data
,
pOriginalRpcMsg
->
pCont
,
pOriginalRpcMsg
->
contLen
);
return
pMsg
;
}
void
syncApplyMsgDestroy
(
SyncApplyMsg
*
pMsg
)
{
if
(
pMsg
!=
NULL
)
{
taosMemoryFree
(
pMsg
);
}
}
void
syncApplyMsgSerialize
(
const
SyncApplyMsg
*
pMsg
,
char
*
buf
,
uint32_t
bufLen
)
{
assert
(
pMsg
->
bytes
<=
bufLen
);
memcpy
(
buf
,
pMsg
,
pMsg
->
bytes
);
}
void
syncApplyMsgDeserialize
(
const
char
*
buf
,
uint32_t
len
,
SyncApplyMsg
*
pMsg
)
{
memcpy
(
pMsg
,
buf
,
len
);
assert
(
len
==
pMsg
->
bytes
);
}
char
*
syncApplyMsgSerialize2
(
const
SyncApplyMsg
*
pMsg
,
uint32_t
*
len
)
{
char
*
buf
=
taosMemoryMalloc
(
pMsg
->
bytes
);
assert
(
buf
!=
NULL
);
syncApplyMsgSerialize
(
pMsg
,
buf
,
pMsg
->
bytes
);
if
(
len
!=
NULL
)
{
*
len
=
pMsg
->
bytes
;
}
return
buf
;
}
SyncApplyMsg
*
syncApplyMsgDeserialize2
(
const
char
*
buf
,
uint32_t
len
)
{
uint32_t
bytes
=
*
((
uint32_t
*
)
buf
);
SyncApplyMsg
*
pMsg
=
taosMemoryMalloc
(
bytes
);
assert
(
pMsg
!=
NULL
);
syncApplyMsgDeserialize
(
buf
,
len
,
pMsg
);
assert
(
len
==
pMsg
->
bytes
);
return
pMsg
;
}
// SyncApplyMsg to SRpcMsg, put it into ApplyQ
void
syncApplyMsg2RpcMsg
(
const
SyncApplyMsg
*
pMsg
,
SRpcMsg
*
pRpcMsg
)
{
memset
(
pRpcMsg
,
0
,
sizeof
(
*
pRpcMsg
));
pRpcMsg
->
msgType
=
pMsg
->
msgType
;
pRpcMsg
->
contLen
=
pMsg
->
bytes
;
pRpcMsg
->
pCont
=
rpcMallocCont
(
pRpcMsg
->
contLen
);
syncApplyMsgSerialize
(
pMsg
,
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
}
// get SRpcMsg from ApplyQ, to SyncApplyMsg
void
syncApplyMsgFromRpcMsg
(
const
SRpcMsg
*
pRpcMsg
,
SyncApplyMsg
*
pMsg
)
{
syncApplyMsgDeserialize
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
,
pMsg
);
}
SyncApplyMsg
*
syncApplyMsgFromRpcMsg2
(
const
SRpcMsg
*
pRpcMsg
)
{
SyncApplyMsg
*
pMsg
=
syncApplyMsgDeserialize2
(
pRpcMsg
->
pCont
,
pRpcMsg
->
contLen
);
return
pMsg
;
}
// SyncApplyMsg to OriginalRpcMsg
void
syncApplyMsg2OriginalRpcMsg
(
const
SyncApplyMsg
*
pMsg
,
SRpcMsg
*
pOriginalRpcMsg
)
{
memset
(
pOriginalRpcMsg
,
0
,
sizeof
(
*
pOriginalRpcMsg
));
pOriginalRpcMsg
->
msgType
=
pMsg
->
originalRpcType
;
pOriginalRpcMsg
->
contLen
=
pMsg
->
dataLen
;
pOriginalRpcMsg
->
pCont
=
rpcMallocCont
(
pOriginalRpcMsg
->
contLen
);
memcpy
(
pOriginalRpcMsg
->
pCont
,
pMsg
->
data
,
pOriginalRpcMsg
->
contLen
);
}
cJSON
*
syncApplyMsg2Json
(
const
SyncApplyMsg
*
pMsg
)
{
char
u64buf
[
128
];
cJSON
*
pRoot
=
cJSON_CreateObject
();
if
(
pMsg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"bytes"
,
pMsg
->
bytes
);
cJSON_AddNumberToObject
(
pRoot
,
"vgId"
,
pMsg
->
vgId
);
cJSON_AddNumberToObject
(
pRoot
,
"msgType"
,
pMsg
->
msgType
);
cJSON_AddNumberToObject
(
pRoot
,
"originalRpcType"
,
pMsg
->
originalRpcType
);
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%ld"
,
pMsg
->
fsmMeta
.
index
);
cJSON_AddStringToObject
(
pRoot
,
"fsmMeta.index"
,
u64buf
);
cJSON_AddNumberToObject
(
pRoot
,
"fsmMeta.isWeak"
,
pMsg
->
fsmMeta
.
isWeak
);
cJSON_AddNumberToObject
(
pRoot
,
"fsmMeta.code"
,
pMsg
->
fsmMeta
.
code
);
cJSON_AddNumberToObject
(
pRoot
,
"fsmMeta.state"
,
pMsg
->
fsmMeta
.
state
);
cJSON_AddStringToObject
(
pRoot
,
"fsmMeta.state.str"
,
syncUtilState2String
(
pMsg
->
fsmMeta
.
state
));
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%lu"
,
pMsg
->
fsmMeta
.
seqNum
);
cJSON_AddStringToObject
(
pRoot
,
"fsmMeta.seqNum"
,
u64buf
);
cJSON_AddNumberToObject
(
pRoot
,
"dataLen"
,
pMsg
->
dataLen
);
char
*
s
;
s
=
syncUtilprintBin
((
char
*
)(
pMsg
->
data
),
pMsg
->
dataLen
);
cJSON_AddStringToObject
(
pRoot
,
"data"
,
s
);
taosMemoryFree
(
s
);
s
=
syncUtilprintBin2
((
char
*
)(
pMsg
->
data
),
pMsg
->
dataLen
);
cJSON_AddStringToObject
(
pRoot
,
"data2"
,
s
);
taosMemoryFree
(
s
);
}
cJSON
*
pJson
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
pJson
,
"SyncApplyMsg"
,
pRoot
);
return
pJson
;
}
char
*
syncApplyMsg2Str
(
const
SyncApplyMsg
*
pMsg
)
{
cJSON
*
pJson
=
syncApplyMsg2Json
(
pMsg
);
char
*
serialized
=
cJSON_Print
(
pJson
);
cJSON_Delete
(
pJson
);
return
serialized
;
}
// for debug ----------------------
void
syncApplyMsgPrint
(
const
SyncApplyMsg
*
pMsg
)
{
char
*
serialized
=
syncApplyMsg2Str
(
pMsg
);
printf
(
"syncApplyMsgPrint | len:%lu | %s
\n
"
,
strlen
(
serialized
),
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
syncApplyMsgPrint2
(
char
*
s
,
const
SyncApplyMsg
*
pMsg
)
{
char
*
serialized
=
syncApplyMsg2Str
(
pMsg
);
printf
(
"syncApplyMsgPrint2 | len:%lu | %s | %s
\n
"
,
strlen
(
serialized
),
s
,
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
syncApplyMsgLog
(
const
SyncApplyMsg
*
pMsg
)
{
char
*
serialized
=
syncApplyMsg2Str
(
pMsg
);
sTrace
(
"ssyncApplyMsgLog | len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
taosMemoryFree
(
serialized
);
}
void
syncApplyMsgLog2
(
char
*
s
,
const
SyncApplyMsg
*
pMsg
)
{
char
*
serialized
=
syncApplyMsg2Str
(
pMsg
);
sTrace
(
"syncApplyMsgLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
source/libs/sync/src/syncRaftCfg.c
0 → 100644
浏览文件 @
126801c8
/*
* 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/>.
*/
#include "syncRaftCfg.h"
#include "cJSON.h"
#include "syncEnv.h"
#include "syncUtil.h"
// file must already exist!
SRaftCfg
*
raftCfgOpen
(
const
char
*
path
)
{
SRaftCfg
*
pCfg
=
taosMemoryMalloc
(
sizeof
(
SRaftCfg
));
snprintf
(
pCfg
->
path
,
sizeof
(
pCfg
->
path
),
"%s"
,
path
);
pCfg
->
pFile
=
taosOpenFile
(
pCfg
->
path
,
TD_FILE_READ
|
TD_FILE_WRITE
);
assert
(
pCfg
->
pFile
!=
NULL
);
taosLSeekFile
(
pCfg
->
pFile
,
0
,
SEEK_SET
);
char
buf
[
1024
];
int
len
=
taosReadFile
(
pCfg
->
pFile
,
buf
,
sizeof
(
buf
));
assert
(
len
>
0
);
int32_t
ret
=
syncCfgFromStr
(
buf
,
&
(
pCfg
->
cfg
));
assert
(
ret
==
0
);
return
pCfg
;
}
int32_t
raftCfgClose
(
SRaftCfg
*
pRaftCfg
)
{
int64_t
ret
=
taosCloseFile
(
&
(
pRaftCfg
->
pFile
));
assert
(
ret
==
0
);
taosMemoryFree
(
pRaftCfg
);
return
0
;
}
int32_t
raftCfgPersist
(
SRaftCfg
*
pRaftCfg
)
{
assert
(
pRaftCfg
!=
NULL
);
char
*
s
=
syncCfg2Str
(
&
(
pRaftCfg
->
cfg
));
taosLSeekFile
(
pRaftCfg
->
pFile
,
0
,
SEEK_SET
);
int64_t
ret
=
taosWriteFile
(
pRaftCfg
->
pFile
,
s
,
strlen
(
s
)
+
1
);
assert
(
ret
==
strlen
(
s
)
+
1
);
taosMemoryFree
(
s
);
taosFsyncFile
(
pRaftCfg
->
pFile
);
return
0
;
}
cJSON
*
syncCfg2Json
(
SSyncCfg
*
pSyncCfg
)
{
char
u64buf
[
128
];
cJSON
*
pRoot
=
cJSON_CreateObject
();
if
(
pSyncCfg
!=
NULL
)
{
cJSON_AddNumberToObject
(
pRoot
,
"replicaNum"
,
pSyncCfg
->
replicaNum
);
cJSON_AddNumberToObject
(
pRoot
,
"myIndex"
,
pSyncCfg
->
myIndex
);
cJSON
*
pNodeInfoArr
=
cJSON_CreateArray
();
cJSON_AddItemToObject
(
pRoot
,
"nodeInfo"
,
pNodeInfoArr
);
for
(
int
i
=
0
;
i
<
pSyncCfg
->
replicaNum
;
++
i
)
{
cJSON
*
pNodeInfo
=
cJSON_CreateObject
();
cJSON_AddNumberToObject
(
pNodeInfo
,
"nodePort"
,
((
pSyncCfg
->
nodeInfo
)[
i
]).
nodePort
);
cJSON_AddStringToObject
(
pNodeInfo
,
"nodeFqdn"
,
((
pSyncCfg
->
nodeInfo
)[
i
]).
nodeFqdn
);
cJSON_AddItemToArray
(
pNodeInfoArr
,
pNodeInfo
);
}
}
cJSON
*
pJson
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
pJson
,
"SSyncCfg"
,
pRoot
);
return
pJson
;
}
char
*
syncCfg2Str
(
SSyncCfg
*
pSyncCfg
)
{
cJSON
*
pJson
=
syncCfg2Json
(
pSyncCfg
);
char
*
serialized
=
cJSON_Print
(
pJson
);
cJSON_Delete
(
pJson
);
return
serialized
;
}
int32_t
syncCfgFromJson
(
const
cJSON
*
pRoot
,
SSyncCfg
*
pSyncCfg
)
{
memset
(
pSyncCfg
,
0
,
sizeof
(
SSyncCfg
));
cJSON
*
pJson
=
cJSON_GetObjectItem
(
pRoot
,
"SSyncCfg"
);
cJSON
*
pReplicaNum
=
cJSON_GetObjectItem
(
pJson
,
"replicaNum"
);
assert
(
cJSON_IsNumber
(
pReplicaNum
));
pSyncCfg
->
replicaNum
=
cJSON_GetNumberValue
(
pReplicaNum
);
cJSON
*
pMyIndex
=
cJSON_GetObjectItem
(
pJson
,
"myIndex"
);
assert
(
cJSON_IsNumber
(
pMyIndex
));
pSyncCfg
->
myIndex
=
cJSON_GetNumberValue
(
pMyIndex
);
cJSON
*
pNodeInfoArr
=
cJSON_GetObjectItem
(
pJson
,
"nodeInfo"
);
int
arraySize
=
cJSON_GetArraySize
(
pNodeInfoArr
);
assert
(
arraySize
==
pSyncCfg
->
replicaNum
);
for
(
int
i
=
0
;
i
<
arraySize
;
++
i
)
{
cJSON
*
pNodeInfo
=
cJSON_GetArrayItem
(
pNodeInfoArr
,
i
);
assert
(
pNodeInfo
!=
NULL
);
cJSON
*
pNodePort
=
cJSON_GetObjectItem
(
pNodeInfo
,
"nodePort"
);
assert
(
cJSON_IsNumber
(
pNodePort
));
((
pSyncCfg
->
nodeInfo
)[
i
]).
nodePort
=
cJSON_GetNumberValue
(
pNodePort
);
cJSON
*
pNodeFqdn
=
cJSON_GetObjectItem
(
pNodeInfo
,
"nodeFqdn"
);
assert
(
cJSON_IsString
(
pNodeFqdn
));
snprintf
(((
pSyncCfg
->
nodeInfo
)[
i
]).
nodeFqdn
,
sizeof
(((
pSyncCfg
->
nodeInfo
)[
i
]).
nodeFqdn
),
"%s"
,
pNodeFqdn
->
valuestring
);
}
return
0
;
}
int32_t
syncCfgFromStr
(
const
char
*
s
,
SSyncCfg
*
pSyncCfg
)
{
cJSON
*
pRoot
=
cJSON_Parse
(
s
);
assert
(
pRoot
!=
NULL
);
int32_t
ret
=
syncCfgFromJson
(
pRoot
,
pSyncCfg
);
assert
(
ret
==
0
);
cJSON_Delete
(
pRoot
);
return
0
;
}
cJSON
*
raftCfg2Json
(
SRaftCfg
*
pRaftCfg
)
{
cJSON
*
pJson
=
syncCfg2Json
(
&
(
pRaftCfg
->
cfg
));
return
pJson
;
}
char
*
raftCfg2Str
(
SRaftCfg
*
pRaftCfg
)
{
char
*
s
=
syncCfg2Str
(
&
(
pRaftCfg
->
cfg
));
return
s
;
}
int32_t
syncCfgCreateFile
(
SSyncCfg
*
pCfg
,
const
char
*
path
)
{
assert
(
pCfg
!=
NULL
);
TdFilePtr
pFile
=
taosOpenFile
(
path
,
TD_FILE_CREATE
|
TD_FILE_WRITE
);
assert
(
pFile
!=
NULL
);
char
*
s
=
syncCfg2Str
(
pCfg
);
int64_t
ret
=
taosWriteFile
(
pFile
,
s
,
strlen
(
s
)
+
1
);
assert
(
ret
==
strlen
(
s
)
+
1
);
taosMemoryFree
(
s
);
taosCloseFile
(
&
pFile
);
return
0
;
}
// for debug ----------------------
void
syncCfgPrint
(
SSyncCfg
*
pCfg
)
{
char
*
serialized
=
syncCfg2Str
(
pCfg
);
printf
(
"syncCfgPrint | len:%lu | %s
\n
"
,
strlen
(
serialized
),
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
syncCfgPrint2
(
char
*
s
,
SSyncCfg
*
pCfg
)
{
char
*
serialized
=
syncCfg2Str
(
pCfg
);
printf
(
"syncCfgPrint2 | len:%lu | %s | %s
\n
"
,
strlen
(
serialized
),
s
,
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
syncCfgLog
(
SSyncCfg
*
pCfg
)
{
char
*
serialized
=
syncCfg2Str
(
pCfg
);
sTrace
(
"syncCfgLog | len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
taosMemoryFree
(
serialized
);
}
void
syncCfgLog2
(
char
*
s
,
SSyncCfg
*
pCfg
)
{
char
*
serialized
=
syncCfg2Str
(
pCfg
);
sTrace
(
"syncCfgLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
void
raftCfgPrint
(
SRaftCfg
*
pCfg
)
{
char
*
serialized
=
raftCfg2Str
(
pCfg
);
printf
(
"raftCfgPrint | len:%lu | %s
\n
"
,
strlen
(
serialized
),
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
raftCfgPrint2
(
char
*
s
,
SRaftCfg
*
pCfg
)
{
char
*
serialized
=
raftCfg2Str
(
pCfg
);
printf
(
"raftCfgPrint2 | len:%lu | %s | %s
\n
"
,
strlen
(
serialized
),
s
,
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
raftCfgLog
(
SRaftCfg
*
pCfg
)
{
char
*
serialized
=
raftCfg2Str
(
pCfg
);
sTrace
(
"raftCfgLog | len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
taosMemoryFree
(
serialized
);
}
void
raftCfgLog2
(
char
*
s
,
SRaftCfg
*
pCfg
)
{
char
*
serialized
=
raftCfg2Str
(
pCfg
);
sTrace
(
"raftCfgLog2 | len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
source/libs/sync/src/syncRaftEntry.c
浏览文件 @
126801c8
...
...
@@ -28,13 +28,13 @@ SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
SSyncRaftEntry
*
syncEntryBuild2
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
)
{
SSyncRaftEntry
*
pEntry
=
syncEntryBuild3
(
pMsg
,
term
,
index
,
SYNC_RAFT_ENTRY_DATA
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuild3
(
pMsg
,
term
,
index
);
assert
(
pEntry
!=
NULL
);
return
pEntry
;
}
SSyncRaftEntry
*
syncEntryBuild3
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
,
EntryType
entryType
)
{
SSyncRaftEntry
*
syncEntryBuild3
(
SyncClientRequest
*
pMsg
,
SyncTerm
term
,
SyncIndex
index
)
{
SSyncRaftEntry
*
pEntry
=
syncEntryBuild
(
pMsg
->
dataLen
);
assert
(
pEntry
!=
NULL
);
...
...
@@ -44,19 +44,37 @@ SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncInde
pEntry
->
isWeak
=
pMsg
->
isWeak
;
pEntry
->
term
=
term
;
pEntry
->
index
=
index
;
pEntry
->
entryType
=
entryType
;
pEntry
->
dataLen
=
pMsg
->
dataLen
;
memcpy
(
pEntry
->
data
,
pMsg
->
data
,
pMsg
->
dataLen
);
return
pEntry
;
}
SSyncRaftEntry
*
syncEntryBuildNoop
(
SyncTerm
term
,
SyncIndex
index
)
{
SSyncRaftEntry
*
pEntry
=
syncEntryBuild
(
0
);
SSyncRaftEntry
*
syncEntryBuildNoop
(
SyncTerm
term
,
SyncIndex
index
,
int32_t
vgId
)
{
// init rpcMsg
SMsgHead
head
;
head
.
vgId
=
vgId
;
head
.
contLen
=
sizeof
(
SMsgHead
);
SRpcMsg
rpcMsg
;
memset
(
&
rpcMsg
,
0
,
sizeof
(
SRpcMsg
));
rpcMsg
.
contLen
=
head
.
contLen
;
rpcMsg
.
pCont
=
rpcMallocCont
(
rpcMsg
.
contLen
);
rpcMsg
.
msgType
=
TDMT_VND_SYNC_NOOP
;
memcpy
(
rpcMsg
.
pCont
,
&
head
,
sizeof
(
head
));
SSyncRaftEntry
*
pEntry
=
syncEntryBuild
(
rpcMsg
.
contLen
);
assert
(
pEntry
!=
NULL
);
pEntry
->
msgType
=
TDMT_VND_SYNC_CLIENT_REQUEST
;
pEntry
->
originalRpcType
=
TDMT_VND_SYNC_NOOP
;
pEntry
->
seqNum
=
0
;
pEntry
->
isWeak
=
0
;
pEntry
->
term
=
term
;
pEntry
->
index
=
index
;
pEntry
->
entryType
=
SYNC_RAFT_ENTRY_NOOP
;
assert
(
pEntry
->
dataLen
==
rpcMsg
.
contLen
);
memcpy
(
pEntry
->
data
,
rpcMsg
.
pCont
,
rpcMsg
.
contLen
);
rpcFreeCont
(
rpcMsg
.
pCont
);
return
pEntry
;
}
...
...
@@ -103,7 +121,6 @@ cJSON* syncEntry2Json(const SSyncRaftEntry* pEntry) {
cJSON_AddStringToObject
(
pRoot
,
"term"
,
u64buf
);
snprintf
(
u64buf
,
sizeof
(
u64buf
),
"%lu"
,
pEntry
->
index
);
cJSON_AddStringToObject
(
pRoot
,
"index"
,
u64buf
);
cJSON_AddNumberToObject
(
pRoot
,
"entryType"
,
pEntry
->
entryType
);
cJSON_AddNumberToObject
(
pRoot
,
"dataLen"
,
pEntry
->
dataLen
);
char
*
s
;
...
...
source/libs/sync/src/syncRaftLog.c
浏览文件 @
126801c8
...
...
@@ -50,38 +50,46 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
SyncIndex
lastIndex
=
logStoreLastIndex
(
pLogStore
);
assert
(
pEntry
->
index
==
lastIndex
+
1
);
uint32_t
len
;
char
*
serialized
=
syncEntrySerialize
(
pEntry
,
&
len
);
assert
(
serialized
!=
NULL
);
int
code
=
0
;
/*
code = walWrite(pWal, pEntry->index, pEntry->entryType, serialized, len);
SSyncLogMeta
syncMeta
;
syncMeta
.
isWeek
=
pEntry
->
isWeak
;
syncMeta
.
seqNum
=
pEntry
->
seqNum
;
syncMeta
.
term
=
pEntry
->
term
;
code
=
walWriteWithSyncInfo
(
pWal
,
pEntry
->
index
,
pEntry
->
originalRpcType
,
syncMeta
,
pEntry
->
data
,
pEntry
->
dataLen
);
assert
(
code
==
0
);
*/
assert
(
walWrite
(
pWal
,
pEntry
->
index
,
pEntry
->
entryType
,
serialized
,
len
)
==
0
);
walFsync
(
pWal
,
true
);
taosMemoryFree
(
serialized
);
return
code
;
}
SSyncRaftEntry
*
logStoreGetEntry
(
SSyncLogStore
*
pLogStore
,
SyncIndex
index
)
{
SSyncLogStoreData
*
pData
=
pLogStore
->
data
;
SWal
*
pWal
=
pData
->
pWal
;
SSyncRaftEntry
*
pEntry
=
NULL
;
if
(
index
>=
SYNC_INDEX_BEGIN
&&
index
<=
logStoreLastIndex
(
pLogStore
))
{
SWalReadHandle
*
pWalHandle
=
walOpenReadHandle
(
pWal
);
assert
(
walReadWithHandle
(
pWalHandle
,
index
)
==
0
);
pEntry
=
syncEntryDeserialize
(
pWalHandle
->
pHead
->
head
.
body
,
pWalHandle
->
pHead
->
head
.
len
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuild
(
pWalHandle
->
pHead
->
head
.
len
);
assert
(
pEntry
!=
NULL
);
pEntry
->
msgType
=
TDMT_VND_SYNC_CLIENT_REQUEST
;
pEntry
->
originalRpcType
=
pWalHandle
->
pHead
->
head
.
msgType
;
pEntry
->
seqNum
=
pWalHandle
->
pHead
->
head
.
syncMeta
.
seqNum
;
pEntry
->
isWeak
=
pWalHandle
->
pHead
->
head
.
syncMeta
.
isWeek
;
pEntry
->
term
=
pWalHandle
->
pHead
->
head
.
syncMeta
.
term
;
pEntry
->
index
=
index
;
assert
(
pEntry
->
dataLen
==
pWalHandle
->
pHead
->
head
.
len
);
memcpy
(
pEntry
->
data
,
pWalHandle
->
pHead
->
head
.
body
,
pWalHandle
->
pHead
->
head
.
len
);
// need to hold, do not new every time!!
walCloseReadHandle
(
pWalHandle
);
}
return
pEntry
;
}
else
{
return
NULL
;
}
}
int32_t
logStoreTruncate
(
SSyncLogStore
*
pLogStore
,
SyncIndex
fromIndex
)
{
...
...
@@ -207,20 +215,20 @@ void logStorePrint(SSyncLogStore* pLogStore) {
void
logStorePrint2
(
char
*
s
,
SSyncLogStore
*
pLogStore
)
{
char
*
serialized
=
logStore2Str
(
pLogStore
);
printf
(
"logStorePrint | len:%lu | %s | %s
\n
"
,
strlen
(
serialized
),
s
,
serialized
);
printf
(
"logStorePrint
2
| len:%lu | %s | %s
\n
"
,
strlen
(
serialized
),
s
,
serialized
);
fflush
(
NULL
);
taosMemoryFree
(
serialized
);
}
void
logStoreLog
(
SSyncLogStore
*
pLogStore
)
{
char
*
serialized
=
logStore2Str
(
pLogStore
);
sTrace
(
"logStorePrint
| len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
sTrace
Long
(
"logStoreLog
| len:%lu | %s"
,
strlen
(
serialized
),
serialized
);
taosMemoryFree
(
serialized
);
}
void
logStoreLog2
(
char
*
s
,
SSyncLogStore
*
pLogStore
)
{
char
*
serialized
=
logStore2Str
(
pLogStore
);
sTrace
(
"logStorePrint
| len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
sTrace
Long
(
"logStoreLog2
| len:%lu | %s | %s"
,
strlen
(
serialized
),
s
,
serialized
);
taosMemoryFree
(
serialized
);
}
...
...
source/libs/sync/src/syncReplication.c
浏览文件 @
126801c8
...
...
@@ -77,7 +77,7 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
SyncAppendEntries
*
pMsg
=
NULL
;
SSyncRaftEntry
*
pEntry
=
logStoreGetEntry
(
pSyncNode
->
pLogStore
,
nextIndex
);
if
(
pEntry
!=
NULL
)
{
pMsg
=
syncAppendEntriesBuild
(
pEntry
->
bytes
);
pMsg
=
syncAppendEntriesBuild
(
pEntry
->
bytes
,
pSyncNode
->
vgId
);
assert
(
pMsg
!=
NULL
);
// add pEntry into msg
...
...
@@ -91,7 +91,7 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
}
else
{
// maybe overflow, send empty record
pMsg
=
syncAppendEntriesBuild
(
0
);
pMsg
=
syncAppendEntriesBuild
(
0
,
pSyncNode
->
vgId
);
assert
(
pMsg
!=
NULL
);
}
...
...
source/libs/sync/src/syncRequestVote.c
浏览文件 @
126801c8
...
...
@@ -64,7 +64,7 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) {
raftStoreVote
(
ths
->
pRaftStore
,
&
(
pMsg
->
srcId
));
}
SyncRequestVoteReply
*
pReply
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pReply
=
syncRequestVoteReplyBuild
(
ths
->
vgId
);
pReply
->
srcId
=
ths
->
myRaftId
;
pReply
->
destId
=
pMsg
->
srcId
;
pReply
->
term
=
ths
->
pRaftStore
->
currentTerm
;
...
...
source/libs/sync/src/syncRequestVoteReply.c
浏览文件 @
126801c8
...
...
@@ -49,12 +49,21 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
return
ret
;
}
assert
(
!
(
pMsg
->
term
>
ths
->
pRaftStore
->
currentTerm
));
//
assert(!(pMsg->term > ths->pRaftStore->currentTerm));
// no need this code, because if I receive reply.term, then I must have sent for that term.
// if (pMsg->term > ths->pRaftStore->currentTerm) {
// syncNodeUpdateTerm(ths, pMsg->term);
// }
if
(
pMsg
->
term
>
ths
->
pRaftStore
->
currentTerm
)
{
char
logBuf
[
128
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"syncNodeOnRequestVoteReplyCb error term, receive:%lu current:%lu"
,
pMsg
->
term
,
ths
->
pRaftStore
->
currentTerm
);
syncNodePrint2
(
logBuf
,
ths
);
sError
(
"%s"
,
logBuf
);
return
ret
;
}
assert
(
pMsg
->
term
==
ths
->
pRaftStore
->
currentTerm
);
// This tallies votes even when the current state is not Candidate,
...
...
source/libs/sync/src/syncRespMgr.c
0 → 100644
浏览文件 @
126801c8
/*
* 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/>.
*/
#include "syncRespMgr.h"
SSyncRespMgr
*
syncRespMgrCreate
(
void
*
data
,
int64_t
ttl
)
{
SSyncRespMgr
*
pObj
=
(
SSyncRespMgr
*
)
taosMemoryMalloc
(
sizeof
(
SSyncRespMgr
));
memset
(
pObj
,
0
,
sizeof
(
SSyncRespMgr
));
pObj
->
pRespHash
=
taosHashInit
(
sizeof
(
uint64_t
),
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_NO_LOCK
);
assert
(
pObj
->
pRespHash
!=
NULL
);
pObj
->
ttl
=
ttl
;
pObj
->
data
=
data
;
pObj
->
seqNum
=
0
;
taosThreadMutexInit
(
&
(
pObj
->
mutex
),
NULL
);
return
pObj
;
}
void
syncRespMgrDestroy
(
SSyncRespMgr
*
pObj
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
taosHashCleanup
(
pObj
->
pRespHash
);
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
taosThreadMutexDestroy
(
&
(
pObj
->
mutex
));
taosMemoryFree
(
pObj
);
}
int64_t
syncRespMgrAdd
(
SSyncRespMgr
*
pObj
,
SRespStub
*
pStub
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
uint64_t
keyCode
=
++
(
pObj
->
seqNum
);
taosHashPut
(
pObj
->
pRespHash
,
&
keyCode
,
sizeof
(
keyCode
),
pStub
,
sizeof
(
SRespStub
));
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
return
keyCode
;
}
int32_t
syncRespMgrDel
(
SSyncRespMgr
*
pObj
,
uint64_t
index
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
taosHashRemove
(
pObj
->
pRespHash
,
&
index
,
sizeof
(
index
));
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
return
0
;
}
int32_t
syncRespMgrGet
(
SSyncRespMgr
*
pObj
,
uint64_t
index
,
SRespStub
*
pStub
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
void
*
pTmp
=
taosHashGet
(
pObj
->
pRespHash
,
&
index
,
sizeof
(
index
));
if
(
pTmp
!=
NULL
)
{
memcpy
(
pStub
,
pTmp
,
sizeof
(
SRespStub
));
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
return
1
;
// get one object
}
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
return
0
;
// get none object
}
int32_t
syncRespMgrGetAndDel
(
SSyncRespMgr
*
pObj
,
uint64_t
index
,
SRespStub
*
pStub
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
void
*
pTmp
=
taosHashGet
(
pObj
->
pRespHash
,
&
index
,
sizeof
(
index
));
if
(
pTmp
!=
NULL
)
{
memcpy
(
pStub
,
pTmp
,
sizeof
(
SRespStub
));
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
taosHashRemove
(
pObj
->
pRespHash
,
&
index
,
sizeof
(
index
));
return
1
;
// get one object
}
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
return
0
;
// get none object
}
void
syncRespClean
(
SSyncRespMgr
*
pObj
)
{
taosThreadMutexLock
(
&
(
pObj
->
mutex
));
syncRespCleanByTTL
(
pObj
,
pObj
->
ttl
);
taosThreadMutexUnlock
(
&
(
pObj
->
mutex
));
}
void
syncRespCleanByTTL
(
SSyncRespMgr
*
pObj
,
int64_t
ttl
)
{}
\ No newline at end of file
source/libs/sync/src/syncUtil.c
浏览文件 @
126801c8
...
...
@@ -16,6 +16,8 @@
#include "syncUtil.h"
#include "syncEnv.h"
void
addEpIntoEpSet
(
SEpSet
*
pEpSet
,
const
char
*
fqdn
,
uint16_t
port
);
// ---- encode / decode
uint64_t
syncUtilAddr2U64
(
const
char
*
host
,
uint16_t
port
)
{
uint64_t
u64
;
...
...
@@ -197,3 +199,17 @@ SyncIndex syncUtilMaxIndex(SyncIndex a, SyncIndex b) {
SyncIndex
r
=
a
>
b
?
a
:
b
;
return
r
;
}
void
syncUtilMsgHtoN
(
void
*
msg
)
{
// htonl
SMsgHead
*
pHead
=
msg
;
pHead
->
contLen
=
htonl
(
pHead
->
contLen
);
pHead
->
vgId
=
htonl
(
pHead
->
vgId
);
}
void
syncUtilMsgNtoH
(
void
*
msg
)
{
// ntohl
SMsgHead
*
pHead
=
msg
;
pHead
->
contLen
=
ntohl
(
pHead
->
contLen
);
pHead
->
vgId
=
ntohl
(
pHead
->
vgId
);
}
\ No newline at end of file
source/libs/sync/test/CMakeLists.txt
浏览文件 @
126801c8
...
...
@@ -28,16 +28,15 @@ add_executable(syncRpcMsgTest "")
add_executable
(
syncPingTimerTest2
""
)
add_executable
(
syncPingSelfTest
""
)
add_executable
(
syncElectTest
""
)
add_executable
(
syncElectTest2
""
)
add_executable
(
syncElectTest3
""
)
add_executable
(
syncEncodeTest
""
)
add_executable
(
syncWriteTest
""
)
add_executable
(
syncReplicateTest
""
)
add_executable
(
syncReplicateTest2
""
)
add_executable
(
syncReplicateTest3
""
)
add_executable
(
syncReplicateLoadTest
""
)
add_executable
(
syncRefTest
""
)
add_executable
(
syncLogStoreCheck
""
)
add_executable
(
syncRaftCfgTest
""
)
add_executable
(
syncRespMgrTest
""
)
add_executable
(
syncSnapshotTest
""
)
add_executable
(
syncApplyMsgTest
""
)
target_sources
(
syncTest
...
...
@@ -160,14 +159,6 @@ target_sources(syncElectTest
PRIVATE
"syncElectTest.cpp"
)
target_sources
(
syncElectTest2
PRIVATE
"syncElectTest2.cpp"
)
target_sources
(
syncElectTest3
PRIVATE
"syncElectTest3.cpp"
)
target_sources
(
syncEncodeTest
PRIVATE
"syncEncodeTest.cpp"
...
...
@@ -180,226 +171,225 @@ target_sources(syncReplicateTest
PRIVATE
"syncReplicateTest.cpp"
)
target_sources
(
syncRe
plicateTest2
target_sources
(
syncRe
fTest
PRIVATE
"syncRe
plicateTest2
.cpp"
"syncRe
fTest
.cpp"
)
target_sources
(
sync
ReplicateTest3
target_sources
(
sync
LogStoreCheck
PRIVATE
"sync
ReplicateTest3
.cpp"
"sync
LogStoreCheck
.cpp"
)
target_sources
(
syncR
eplicateLoad
Test
target_sources
(
syncR
aftCfg
Test
PRIVATE
"syncR
eplicateLoad
Test.cpp"
"syncR
aftCfg
Test.cpp"
)
target_sources
(
syncRe
f
Test
target_sources
(
syncRe
spMgr
Test
PRIVATE
"syncRe
f
Test.cpp"
"syncRe
spMgr
Test.cpp"
)
target_sources
(
sync
LogStoreCheck
target_sources
(
sync
SnapshotTest
PRIVATE
"syncLogStoreCheck.cpp"
"syncSnapshotTest.cpp"
)
target_sources
(
syncApplyMsgTest
PRIVATE
"syncApplyMsgTest.cpp"
)
target_include_directories
(
syncTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncEnvTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncPingTimerTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIOTickQTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIOTickPingTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIOSendMsgTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIOClientTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIOServerTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRaftStoreTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncEnqTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIndexTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncInitTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncUtilTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncVotesGrantedTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncVotesRespondTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncIndexMgrTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncLogStoreTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncEntryTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRequestVoteTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRequestVoteReplyTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncAppendEntriesTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncAppendEntriesReplyTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncClientRequestTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncTimeoutTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncPingTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncPingReplyTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRpcMsgTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncPingTimerTest2
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncPingSelfTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncElectTest
PUBLIC
"
${
TD_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncElectTest2
PUBLIC
"
${
TD_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncElectTest3
PUBLIC
"
${
TD_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncEncodeTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncWriteTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncReplicateTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRe
plicateTest2
target_include_directories
(
syncRe
fTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
sync
ReplicateTest3
target_include_directories
(
sync
LogStoreCheck
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncR
eplicateLoad
Test
target_include_directories
(
syncR
aftCfg
Test
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncRe
f
Test
target_include_directories
(
syncRe
spMgr
Test
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncLogStoreCheck
target_include_directories
(
syncSnapshotTest
PUBLIC
"
${
CMAKE_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
target_include_directories
(
syncApplyMsgTest
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/../inc"
)
...
...
@@ -524,14 +514,6 @@ target_link_libraries(syncElectTest
sync
gtest_main
)
target_link_libraries
(
syncElectTest2
sync
gtest_main
)
target_link_libraries
(
syncElectTest3
sync
gtest_main
)
target_link_libraries
(
syncEncodeTest
sync
gtest_main
...
...
@@ -544,23 +526,27 @@ target_link_libraries(syncReplicateTest
sync
gtest_main
)
target_link_libraries
(
syncReplicateTest2
target_link_libraries
(
syncRefTest
sync
gtest_main
)
target_link_libraries
(
syncLogStoreCheck
sync
gtest_main
)
target_link_libraries
(
syncR
eplicateTest3
target_link_libraries
(
syncR
aftCfgTest
sync
gtest_main
)
target_link_libraries
(
syncRe
plicateLoad
Test
target_link_libraries
(
syncRe
spMgr
Test
sync
gtest_main
)
target_link_libraries
(
sync
Ref
Test
target_link_libraries
(
sync
Snapshot
Test
sync
gtest_main
)
target_link_libraries
(
sync
LogStoreCheck
target_link_libraries
(
sync
ApplyMsgTest
sync
gtest_main
)
...
...
source/libs/sync/test/syncAppendEntriesReplyTest.cpp
浏览文件 @
126801c8
...
...
@@ -15,7 +15,7 @@ void logTest() {
}
SyncAppendEntriesReply
*
createMsg
()
{
SyncAppendEntriesReply
*
pMsg
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pMsg
=
syncAppendEntriesReplyBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -27,7 +27,7 @@ SyncAppendEntriesReply *createMsg() {
void
test1
()
{
SyncAppendEntriesReply
*
pMsg
=
createMsg
();
syncAppendEntriesReply
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncAppendEntriesReply
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncAppendEntriesReplyDestroy
(
pMsg
);
}
...
...
@@ -36,9 +36,9 @@ void test2() {
uint32_t
len
=
pMsg
->
bytes
;
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
len
);
syncAppendEntriesReplySerialize
(
pMsg
,
serialized
,
len
);
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyBuild
(
1000
);
syncAppendEntriesReplyDeserialize
(
serialized
,
len
,
pMsg2
);
syncAppendEntriesReply
Print
2
((
char
*
)
"test2: syncAppendEntriesReplySerialize -> syncAppendEntriesReplyDeserialize "
,
syncAppendEntriesReply
Log
2
((
char
*
)
"test2: syncAppendEntriesReplySerialize -> syncAppendEntriesReplyDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
...
...
@@ -51,7 +51,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncAppendEntriesReplySerialize2
(
pMsg
,
&
len
);
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyDeserialize2
(
serialized
,
len
);
syncAppendEntriesReply
Print
2
((
char
*
)
"test3: syncAppendEntriesReplySerialize3 -> syncAppendEntriesReplyDeserialize2 "
,
syncAppendEntriesReply
Log
2
((
char
*
)
"test3: syncAppendEntriesReplySerialize3 -> syncAppendEntriesReplyDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
...
...
@@ -63,11 +63,12 @@ void test4() {
SyncAppendEntriesReply
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncAppendEntriesReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyBuild
(
1000
);
syncAppendEntriesReplyFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncAppendEntriesReply
Print
2
((
char
*
)
"test4: syncAppendEntriesReply2RpcMsg -> syncAppendEntriesReplyFromRpcMsg "
,
syncAppendEntriesReply
Log
2
((
char
*
)
"test4: syncAppendEntriesReply2RpcMsg -> syncAppendEntriesReplyFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncAppendEntriesReplyDestroy
(
pMsg
);
syncAppendEntriesReplyDestroy
(
pMsg2
);
}
...
...
@@ -77,17 +78,17 @@ void test5() {
SRpcMsg
rpcMsg
;
syncAppendEntriesReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncAppendEntriesReply
*
pMsg2
=
syncAppendEntriesReplyFromRpcMsg2
(
&
rpcMsg
);
syncAppendEntriesReply
Print
2
((
char
*
)
"test5: syncAppendEntriesReply2RpcMsg -> syncAppendEntriesReplyFromRpcMsg2 "
,
syncAppendEntriesReply
Log
2
((
char
*
)
"test5: syncAppendEntriesReply2RpcMsg -> syncAppendEntriesReplyFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncAppendEntriesReplyDestroy
(
pMsg
);
syncAppendEntriesReplyDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncAppendEntriesTest.cpp
浏览文件 @
126801c8
...
...
@@ -15,7 +15,7 @@ void logTest() {
}
SyncAppendEntries
*
createMsg
()
{
SyncAppendEntries
*
pMsg
=
syncAppendEntriesBuild
(
20
);
SyncAppendEntries
*
pMsg
=
syncAppendEntriesBuild
(
20
,
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -29,7 +29,7 @@ SyncAppendEntries *createMsg() {
void
test1
()
{
SyncAppendEntries
*
pMsg
=
createMsg
();
syncAppendEntries
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncAppendEntries
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncAppendEntriesDestroy
(
pMsg
);
}
...
...
@@ -38,9 +38,9 @@ void test2() {
uint32_t
len
=
pMsg
->
bytes
;
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
len
);
syncAppendEntriesSerialize
(
pMsg
,
serialized
,
len
);
SyncAppendEntries
*
pMsg2
=
syncAppendEntriesBuild
(
pMsg
->
dataLen
);
SyncAppendEntries
*
pMsg2
=
syncAppendEntriesBuild
(
pMsg
->
dataLen
,
1000
);
syncAppendEntriesDeserialize
(
serialized
,
len
,
pMsg2
);
syncAppendEntries
Print
2
((
char
*
)
"test2: syncAppendEntriesSerialize -> syncAppendEntriesDeserialize "
,
pMsg2
);
syncAppendEntries
Log
2
((
char
*
)
"test2: syncAppendEntriesSerialize -> syncAppendEntriesDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncAppendEntriesDestroy
(
pMsg
);
...
...
@@ -52,7 +52,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncAppendEntriesSerialize2
(
pMsg
,
&
len
);
SyncAppendEntries
*
pMsg2
=
syncAppendEntriesDeserialize2
(
serialized
,
len
);
syncAppendEntries
Print
2
((
char
*
)
"test3: syncAppendEntriesSerialize3 -> syncAppendEntriesDeserialize2 "
,
pMsg2
);
syncAppendEntries
Log
2
((
char
*
)
"test3: syncAppendEntriesSerialize3 -> syncAppendEntriesDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncAppendEntriesDestroy
(
pMsg
);
...
...
@@ -65,8 +65,9 @@ void test4() {
syncAppendEntries2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncAppendEntries
*
pMsg2
=
(
SyncAppendEntries
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncAppendEntriesFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncAppendEntries
Print
2
((
char
*
)
"test4: syncAppendEntries2RpcMsg -> syncAppendEntriesFromRpcMsg "
,
pMsg2
);
syncAppendEntries
Log
2
((
char
*
)
"test4: syncAppendEntries2RpcMsg -> syncAppendEntriesFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncAppendEntriesDestroy
(
pMsg
);
syncAppendEntriesDestroy
(
pMsg2
);
}
...
...
@@ -76,16 +77,16 @@ void test5() {
SRpcMsg
rpcMsg
;
syncAppendEntries2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncAppendEntries
*
pMsg2
=
syncAppendEntriesFromRpcMsg2
(
&
rpcMsg
);
syncAppendEntries
Print
2
((
char
*
)
"test5: syncAppendEntries2RpcMsg -> syncAppendEntriesFromRpcMsg2 "
,
pMsg2
);
syncAppendEntries
Log
2
((
char
*
)
"test5: syncAppendEntries2RpcMsg -> syncAppendEntriesFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncAppendEntriesDestroy
(
pMsg
);
syncAppendEntriesDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncApplyMsgTest.cpp
0 → 100644
浏览文件 @
126801c8
#include <gtest/gtest.h>
#include <stdio.h>
#include "syncIO.h"
#include "syncInt.h"
#include "syncMessage.h"
#include "syncUtil.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
SyncApplyMsg
*
createMsg
()
{
SRpcMsg
rpcMsg
;
memset
(
&
rpcMsg
,
0
,
sizeof
(
rpcMsg
));
rpcMsg
.
msgType
=
12345
;
rpcMsg
.
contLen
=
20
;
rpcMsg
.
pCont
=
rpcMallocCont
(
rpcMsg
.
contLen
);
strcpy
((
char
*
)
rpcMsg
.
pCont
,
"hello rpc"
);
SFsmCbMeta
meta
;
meta
.
code
=
11
;
meta
.
index
=
22
;
meta
.
isWeak
=
1
;
meta
.
seqNum
=
33
;
meta
.
state
=
TAOS_SYNC_STATE_LEADER
;
SyncApplyMsg
*
pMsg
=
syncApplyMsgBuild2
(
&
rpcMsg
,
123
,
&
meta
);
rpcFreeCont
(
rpcMsg
.
pCont
);
return
pMsg
;
}
void
test1
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
syncApplyMsgLog2
((
char
*
)
"test1:"
,
pMsg
);
syncApplyMsgDestroy
(
pMsg
);
}
void
test2
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
uint32_t
len
=
pMsg
->
bytes
;
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
len
);
syncApplyMsgSerialize
(
pMsg
,
serialized
,
len
);
SyncApplyMsg
*
pMsg2
=
syncApplyMsgBuild
(
pMsg
->
dataLen
);
syncApplyMsgDeserialize
(
serialized
,
len
,
pMsg2
);
syncApplyMsgLog2
((
char
*
)
"test2: syncApplyMsgSerialize -> syncApplyMsgDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncApplyMsgDestroy
(
pMsg
);
syncApplyMsgDestroy
(
pMsg2
);
}
void
test3
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
uint32_t
len
;
char
*
serialized
=
syncApplyMsgSerialize2
(
pMsg
,
&
len
);
SyncApplyMsg
*
pMsg2
=
syncApplyMsgDeserialize2
(
serialized
,
len
);
syncApplyMsgLog2
((
char
*
)
"test3: syncApplyMsgSerialize2 -> syncApplyMsgDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncApplyMsgDestroy
(
pMsg
);
syncApplyMsgDestroy
(
pMsg2
);
}
void
test4
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncApplyMsg2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncApplyMsg
*
pMsg2
=
(
SyncApplyMsg
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncApplyMsgFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncApplyMsgLog2
((
char
*
)
"test4: syncApplyMsg2RpcMsg -> syncApplyMsgFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncApplyMsgDestroy
(
pMsg
);
syncApplyMsgDestroy
(
pMsg2
);
}
void
test5
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncApplyMsg2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncApplyMsg
*
pMsg2
=
syncApplyMsgFromRpcMsg2
(
&
rpcMsg
);
syncApplyMsgLog2
((
char
*
)
"test5: syncClientRequest2RpcMsg -> syncApplyMsgFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncApplyMsgDestroy
(
pMsg
);
syncApplyMsgDestroy
(
pMsg2
);
}
void
test6
()
{
SyncApplyMsg
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncApplyMsg2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncApplyMsg
*
pMsg2
=
syncApplyMsgFromRpcMsg2
(
&
rpcMsg
);
SRpcMsg
originalRpcMsg
;
syncApplyMsg2OriginalRpcMsg
(
pMsg2
,
&
originalRpcMsg
);
syncRpcMsgLog2
((
char
*
)
"test6"
,
&
originalRpcMsg
);
rpcFreeCont
(
originalRpcMsg
.
pCont
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncApplyMsgDestroy
(
pMsg
);
syncApplyMsgDestroy
(
pMsg2
);
}
int
main
()
{
tsAsyncLog
=
0
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
test2
();
test3
();
test4
();
test5
();
test6
();
return
0
;
}
source/libs/sync/test/syncClientRequestTest.cpp
浏览文件 @
126801c8
...
...
@@ -21,13 +21,14 @@ SyncClientRequest *createMsg() {
rpcMsg
.
contLen
=
20
;
rpcMsg
.
pCont
=
rpcMallocCont
(
rpcMsg
.
contLen
);
strcpy
((
char
*
)
rpcMsg
.
pCont
,
"hello rpc"
);
SyncClientRequest
*
pMsg
=
syncClientRequestBuild2
(
&
rpcMsg
,
123
,
true
);
SyncClientRequest
*
pMsg
=
syncClientRequestBuild2
(
&
rpcMsg
,
123
,
true
,
1000
);
rpcFreeCont
(
rpcMsg
.
pCont
);
return
pMsg
;
}
void
test1
()
{
SyncClientRequest
*
pMsg
=
createMsg
();
syncClientRequest
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncClientRequest
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncClientRequestDestroy
(
pMsg
);
}
...
...
@@ -38,7 +39,7 @@ void test2() {
syncClientRequestSerialize
(
pMsg
,
serialized
,
len
);
SyncClientRequest
*
pMsg2
=
syncClientRequestBuild
(
pMsg
->
dataLen
);
syncClientRequestDeserialize
(
serialized
,
len
,
pMsg2
);
syncClientRequest
Print
2
((
char
*
)
"test2: syncClientRequestSerialize -> syncClientRequestDeserialize "
,
pMsg2
);
syncClientRequest
Log
2
((
char
*
)
"test2: syncClientRequestSerialize -> syncClientRequestDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncClientRequestDestroy
(
pMsg
);
...
...
@@ -50,7 +51,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncClientRequestSerialize2
(
pMsg
,
&
len
);
SyncClientRequest
*
pMsg2
=
syncClientRequestDeserialize2
(
serialized
,
len
);
syncClientRequest
Print
2
((
char
*
)
"test3: syncClientRequestSerialize3 -> syncClientRequestDeserialize2 "
,
pMsg2
);
syncClientRequest
Log
2
((
char
*
)
"test3: syncClientRequestSerialize3 -> syncClientRequestDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncClientRequestDestroy
(
pMsg
);
...
...
@@ -63,8 +64,9 @@ void test4() {
syncClientRequest2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncClientRequest
*
pMsg2
=
(
SyncClientRequest
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncClientRequestFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncClientRequest
Print
2
((
char
*
)
"test4: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg "
,
pMsg2
);
syncClientRequest
Log
2
((
char
*
)
"test4: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncClientRequestDestroy
(
pMsg
);
syncClientRequestDestroy
(
pMsg2
);
}
...
...
@@ -74,16 +76,16 @@ void test5() {
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncClientRequest
*
pMsg2
=
syncClientRequestFromRpcMsg2
(
&
rpcMsg
);
syncClientRequest
Print
2
((
char
*
)
"test5: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg2 "
,
pMsg2
);
syncClientRequest
Log
2
((
char
*
)
"test5: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncClientRequestDestroy
(
pMsg
);
syncClientRequestDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncElectTest.cpp
浏览文件 @
126801c8
...
...
@@ -3,9 +3,8 @@
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -16,42 +15,41 @@ void logTest() {
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
SSyncNode
*
gSyncNode
;
SSyncNode
*
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./elect_test_%d"
,
myIndex
);
uint16_t
gPorts
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
const
char
*
gDir
=
"./syncElectTest"
;
int32_t
gVgId
=
1234
;
void
init
()
{
int
code
=
walInit
();
assert
(
code
==
0
);
}
void
cleanup
()
{
walCleanUp
();
}
SWal
*
createWal
(
char
*
path
,
int32_t
vgId
)
{
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
vgId
=
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./elect_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
SWal
*
pWal
=
walOpen
(
path
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
return
pWal
;
}
SSyncNode
*
createSyncNode
(
int32_t
replicaNum
,
int32_t
myIndex
,
int32_t
vgId
,
SWal
*
pWal
,
char
*
path
)
{
SSyncInfo
syncInfo
;
syncInfo
.
vgId
=
vgId
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
NULL
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s_sync_replica%d_index%d"
,
path
,
replicaNum
,
myIndex
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
...
...
@@ -59,9 +57,9 @@ SSyncNode* syncNodeInit() {
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
p
orts
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
//
taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn
);
pCfg
->
nodeInfo
[
i
].
nodePort
=
gP
orts
[
i
];
taosGetFqdn
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
);
//
snprintf(pCfg->nodeInfo[i].nodeFqdn, sizeof(pCfg->nodeInfo[i].nodeFqdn), "%s", "127.0.0.1"
);
}
SSyncNode
*
pSyncNode
=
syncNodeOpen
(
&
syncInfo
);
...
...
@@ -78,50 +76,51 @@ SSyncNode* syncNodeInit() {
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeStart
(
pSyncNode
);
return
pSyncNode
;
}
SSyncNode
*
syncInitTest
()
{
return
syncNodeInit
();
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
void
usage
(
char
*
exe
)
{
printf
(
"usage: %s replicaNum myIndex
\n
"
,
exe
);
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
if
(
argc
!=
3
)
{
usage
(
argv
[
0
]);
exit
(
-
1
);
}
int32_t
replicaNum
=
atoi
(
argv
[
1
]);
int32_t
myIndex
=
atoi
(
argv
[
2
]);
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]
);
assert
(
ret
==
0
);
assert
(
replicaNum
>=
1
&&
replicaNum
<=
5
);
assert
(
myIndex
>=
0
&&
myIndex
<
replicaNum
);
init
();
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
gPorts
[
myIndex
]);
assert
(
ret
==
0
);
ret
=
syncEnvStart
();
assert
(
ret
==
0
);
gSyncNode
=
syncInitTest
()
;
assert
(
gSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
gSyncNode
);
char
walPath
[
128
]
;
snprintf
(
walPath
,
sizeof
(
walPath
),
"%s_wal_replica%d_index%d"
,
gDir
,
replicaNum
,
myIndex
);
SWal
*
pWal
=
createWal
(
walPath
,
gVgId
);
initRaftId
(
gSyncNode
);
SSyncNode
*
pSyncNode
=
createSyncNode
(
replicaNum
,
myIndex
,
gVgId
,
pWal
,
(
char
*
)
gDir
);
assert
(
pSyncNode
!=
NULL
);
syncNodeLog2
((
char
*
)
"==syncElectTest=="
,
pSyncNode
);
//---------------------------
while
(
1
)
{
sTrace
(
"elect sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, electTimerMS:%d"
,
gSyncNode
->
state
,
syncUtilState2String
(
gSyncNode
->
state
),
gSyncNode
->
pRaftStore
->
currentTerm
,
gSyncNode
->
electTimerLogicClock
,
gSyncNode
->
electTimerLogicClockUser
,
gSyncNode
->
electTimerMS
);
char
*
s
=
syncNode2SimpleStr
(
pSyncNode
);
sTrace
(
"%s"
,
s
);
taosMemoryFree
(
s
);
taosMsleep
(
1000
);
}
syncNodeClose
(
pSyncNode
);
walClose
(
pWal
);
syncIOStop
();
cleanup
();
return
0
;
}
source/libs/sync/test/syncElectTest2.cpp
已删除
100644 → 0
浏览文件 @
d83ce404
#include <gtest/gtest.h>
#include <stdio.h>
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "tref.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
int64_t
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./elect2_test_%d"
,
myIndex
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./elect2_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
int64_t
rid
=
syncStart
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeRelease
(
pSyncNode
);
return
rid
;
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
ret
=
syncInit
();
assert
(
ret
==
0
);
int64_t
rid
=
syncNodeInit
();
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
//---------------------------
while
(
1
)
{
sTrace
(
"elect sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, electTimerMS:%d"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
);
taosMsleep
(
1000
);
}
syncNodeRelease
(
pSyncNode
);
return
0
;
}
source/libs/sync/test/syncElectTest3.cpp
已删除
100644 → 0
浏览文件 @
d83ce404
#include <gtest/gtest.h>
#include <stdio.h>
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "tref.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
int64_t
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./elect3_test_%d"
,
myIndex
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./elect3_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
int64_t
rid
=
syncStart
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
pSyncNode
->
hbBaseLine
=
500
;
pSyncNode
->
electBaseLine
=
1500
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeRelease
(
pSyncNode
);
return
rid
;
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
ret
=
syncInit
();
assert
(
ret
==
0
);
int64_t
rid
=
syncNodeInit
();
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
//---------------------------
while
(
1
)
{
sTrace
(
"elect sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, electTimerMS:%d"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
);
taosMsleep
(
1000
);
}
syncNodeRelease
(
pSyncNode
);
return
0
;
}
source/libs/sync/test/syncEncodeTest.cpp
浏览文件 @
126801c8
...
...
@@ -8,6 +8,7 @@
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -102,7 +103,7 @@ SRpcMsg *step0() {
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
,
1000
);
return
pRetMsg
;
}
...
...
@@ -159,23 +160,23 @@ int main(int argc, char **argv) {
// step0
SRpcMsg
*
pMsg0
=
step0
();
syncRpcMsg
Print
2
((
char
*
)
"==step0=="
,
pMsg0
);
syncRpcMsg
Log
2
((
char
*
)
"==step0=="
,
pMsg0
);
// step1
SyncClientRequest
*
pMsg1
=
step1
(
pMsg0
);
syncClientRequest
Print
2
((
char
*
)
"==step1=="
,
pMsg1
);
syncClientRequest
Log
2
((
char
*
)
"==step1=="
,
pMsg1
);
// step2
SRpcMsg
*
pMsg2
=
step2
(
pMsg1
);
syncRpcMsg
Print
2
((
char
*
)
"==step2=="
,
pMsg2
);
syncRpcMsg
Log
2
((
char
*
)
"==step2=="
,
pMsg2
);
// step3
SyncClientRequest
*
pMsg3
=
step3
(
pMsg2
);
syncClientRequest
Print
2
((
char
*
)
"==step3=="
,
pMsg3
);
syncClientRequest
Log
2
((
char
*
)
"==step3=="
,
pMsg3
);
// step4
SSyncRaftEntry
*
pMsg4
=
step4
(
pMsg3
);
syncEntry
Print
2
((
char
*
)
"==step4=="
,
pMsg4
);
syncEntry
Log
2
((
char
*
)
"==step4=="
,
pMsg4
);
// log, relog
SSyncNode
*
pSyncNode
=
syncNodeInit
();
...
...
@@ -183,7 +184,7 @@ int main(int argc, char **argv) {
SSyncRaftEntry
*
pEntry
=
pMsg4
;
pSyncNode
->
pLogStore
->
appendEntry
(
pSyncNode
->
pLogStore
,
pEntry
);
SSyncRaftEntry
*
pEntry2
=
pSyncNode
->
pLogStore
->
getEntry
(
pSyncNode
->
pLogStore
,
pEntry
->
index
);
syncEntry
Print
2
((
char
*
)
"==pEntry2=="
,
pEntry2
);
syncEntry
Log
2
((
char
*
)
"==pEntry2=="
,
pEntry2
);
// step5
uint32_t
len
;
...
...
@@ -194,11 +195,11 @@ int main(int argc, char **argv) {
// step6
SSyncRaftEntry
*
pMsg6
=
step6
(
pMsg5
,
len
);
syncEntry
Print
2
((
char
*
)
"==step6=="
,
pMsg6
);
syncEntry
Log
2
((
char
*
)
"==step6=="
,
pMsg6
);
// step7
SRpcMsg
*
pMsg7
=
step7
(
pMsg6
);
syncRpcMsg
Print
2
((
char
*
)
"==step7=="
,
pMsg7
);
syncRpcMsg
Log
2
((
char
*
)
"==step7=="
,
pMsg7
);
return
0
;
}
source/libs/sync/test/syncEnqTest.cpp
浏览文件 @
126801c8
...
...
@@ -89,14 +89,14 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
initRaftId
(
pSyncNode
);
//--------------------------------------------------------------
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
,
"syncEnqTest"
);
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
,
1000
,
"syncEnqTest"
);
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
pSyncNode
->
FpEqMsg
(
pSyncNode
->
queue
,
&
rpcMsg
);
...
...
source/libs/sync/test/syncEntryTest.cpp
浏览文件 @
126801c8
...
...
@@ -52,7 +52,7 @@ void test3() {
pSyncMsg
->
isWeak
=
1
;
strcpy
(
pSyncMsg
->
data
,
"test3"
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuild3
(
pSyncMsg
,
100
,
200
,
SYNC_RAFT_ENTRY_NOOP
);
SSyncRaftEntry
*
pEntry
=
syncEntryBuild3
(
pSyncMsg
,
100
,
200
);
syncEntryPrint
(
pEntry
);
syncClientRequestDestroy
(
pSyncMsg
);
...
...
@@ -68,7 +68,6 @@ void test4() {
pEntry
->
isWeak
=
true
;
pEntry
->
term
=
44
;
pEntry
->
index
=
55
;
pEntry
->
entryType
=
SYNC_RAFT_ENTRY_CONFIG
;
strcpy
(
pEntry
->
data
,
"test4"
);
syncEntryPrint
(
pEntry
);
...
...
@@ -84,9 +83,8 @@ void test4() {
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
test1
();
test2
();
...
...
source/libs/sync/test/syncIOClientTest.cpp
浏览文件 @
126801c8
...
...
@@ -4,6 +4,7 @@
#include "syncInt.h"
#include "syncMessage.h"
#include "syncUtil.h"
#include "tdatablock.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -38,7 +39,7 @@ int main() {
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
destId
.
vgId
=
100
;
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
srcId
,
&
destId
,
"syncIOClientTest"
);
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
srcId
,
&
destId
,
1000
,
"syncIOClientTest"
);
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
...
...
source/libs/sync/test/syncIOSendMsgTest.cpp
浏览文件 @
126801c8
...
...
@@ -89,14 +89,15 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
initRaftId
(
pSyncNode
);
//--------------------------------------------------------------
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
,
"syncIOSendMsgTest"
);
SyncPingReply
*
pSyncMsg
=
syncPingReplyBuild2
(
&
pSyncNode
->
myRaftId
,
&
pSyncNode
->
myRaftId
,
1000
,
"syncIOSendMsgTest"
);
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pSyncMsg
,
&
rpcMsg
);
...
...
source/libs/sync/test/syncIndexMgrTest.cpp
浏览文件 @
126801c8
...
...
@@ -73,9 +73,8 @@ void initRaftId(SSyncNode* pSyncNode) {
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
...
...
source/libs/sync/test/syncInitTest.cpp
浏览文件 @
126801c8
...
...
@@ -30,7 +30,7 @@ SSyncNode* syncNodeInit() {
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
"./"
);
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
"./
sync_init_test
"
);
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
...
...
@@ -64,15 +64,15 @@ void initRaftId(SSyncNode* pSyncNode) {
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
sTrace
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"
syncTest.log", 100000, 1
0);
// taosInitLog((char *)"
tmp/syncInitTest.log", 10
0);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
...
...
@@ -88,11 +88,13 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
syncNodeLog2
((
char
*
)
"syncInitTest"
,
pSyncNode
);
initRaftId
(
pSyncNode
);
//--------------------------------------------------------------
syncNodeClose
(
pSyncNode
);
syncEnvStop
();
// syncIOStop();
// taosCloseLog();
return
0
;
}
\ No newline at end of file
source/libs/sync/test/syncLogStoreCheck.cpp
浏览文件 @
126801c8
...
...
@@ -6,6 +6,7 @@
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -16,90 +17,60 @@ void logTest() {
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
1
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
SSyncNode
*
pSyncNode
;
SSyncNode
*
syncNodeInit
(
const
char
*
path
)
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
"./log_check"
);
void
init
()
{
int
code
=
walInit
();
assert
(
code
==
0
);
}
void
cleanup
()
{
walCleanUp
();
}
SWal
*
createWal
(
char
*
path
,
int32_t
vgId
)
{
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
vgId
=
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
pWal
=
walOpen
(
path
,
&
walCfg
);
SWal
*
pWal
=
walOpen
(
path
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
return
pWal
;
}
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
pSyncNode
=
syncNodeOpen
(
&
syncInfo
);
assert
(
pSyncNode
!=
NULL
);
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
SSyncNode
*
createSyncNode
(
SWal
*
pWal
)
{
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
taosMemoryMalloc
(
sizeof
(
SSyncNode
));
memset
(
pSyncNode
,
0
,
sizeof
(
SSyncNode
));
pSyncNode
->
pWal
=
pWal
;
return
pSyncNode
;
}
SSyncNode
*
logStoreCheck
(
const
char
*
path
)
{
return
syncNodeInit
(
path
);
}
void
usage
(
char
*
exe
)
{
printf
(
"usage: %s path vgId
\n
"
,
exe
);
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
if
(
argc
!=
3
)
{
usage
(
argv
[
0
]);
exit
(
-
1
);
}
char
*
path
=
argv
[
1
];
int32_t
vgId
=
atoi
(
argv
[
2
]);
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
init
();
SWal
*
pWal
=
createWal
(
path
,
vgId
);
assert
(
pWal
!=
NULL
);
SSyncNode
*
pSyncNode
=
createSyncNode
(
pWal
);
assert
(
pSyncNode
!=
NULL
);
ret
=
syncEnvStart
(
);
assert
(
ret
==
0
);
SSyncLogStore
*
pLog
=
logStoreCreate
(
pSyncNode
);
assert
(
pLog
!=
NULL
);
pSyncNode
=
logStoreCheck
(
argv
[
1
]);
assert
(
pSyncNode
!=
NULL
);
logStorePrint2
((
char
*
)
"==syncLogStoreCheck=="
,
pLog
);
logStorePrint2
((
char
*
)
"logStoreCheck"
,
pSyncNode
->
pLogStore
);
walClose
(
pWal
);
logStoreDestory
(
pLog
);
taosMemoryFree
(
pSyncNode
);
cleanup
();
return
0
;
}
source/libs/sync/test/syncLogStoreTest.cpp
浏览文件 @
126801c8
...
...
@@ -6,6 +6,7 @@
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -16,74 +17,44 @@ void logTest() {
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
1
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
SSyncNode
*
pSyncNode
;
SWal
*
pWal
;
SSyncLogStore
*
pLogStore
;
const
char
*
pWalPath
=
"./syncLogStoreTest_wal"
;
void
init
()
{
walInit
();
taosRemoveDir
(
pWalPath
);
SSyncNode
*
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
"./"
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
vgId
=
1000
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
pWal
=
walOpen
(
"./wal_test"
,
&
walCfg
);
pWal
=
walOpen
(
pWalPath
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
pSyncNode
=
syncNodeOpen
(
&
syncInfo
);
assert
(
pSyncNode
!=
NULL
);
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
return
pSyncNode
;
pSyncNode
=
(
SSyncNode
*
)
taosMemoryMalloc
(
sizeof
(
SSyncNode
));
memset
(
pSyncNode
,
0
,
sizeof
(
SSyncNode
));
pSyncNode
->
pWal
=
pWal
;
}
SSyncNode
*
syncInitTest
()
{
return
syncNodeInit
();
}
void
cleanup
()
{
walClose
(
pWal
);
walCleanUp
();
taosMemoryFree
(
pSyncNode
);
}
void
logStoreTest
()
{
logStorePrint2
((
char
*
)
"logStoreTest"
,
pSyncNode
->
pLogStore
);
pLogStore
=
logStoreCreate
(
pSyncNode
);
assert
(
pLogStore
);
assert
(
pLogStore
->
getLastIndex
(
pLogStore
)
==
SYNC_INDEX_INVALID
);
assert
(
pSyncNode
->
pLogStore
->
getLastIndex
(
pSyncNode
->
pLogStore
)
==
SYNC_INDEX_INVALID
);
logStoreLog2
((
char
*
)
"logStoreTest"
,
pLogStore
);
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
int32_t
dataLen
=
10
;
...
...
@@ -93,58 +64,35 @@ void logStoreTest() {
pEntry
->
originalRpcType
=
2
;
pEntry
->
seqNum
=
3
;
pEntry
->
isWeak
=
true
;
pEntry
->
term
=
100
;
pEntry
->
index
=
p
SyncNode
->
pLogStore
->
getLastIndex
(
pSyncNode
->
pLogStore
)
+
1
;
pEntry
->
term
=
100
+
i
;
pEntry
->
index
=
p
LogStore
->
getLastIndex
(
pLogStore
)
+
1
;
snprintf
(
pEntry
->
data
,
dataLen
,
"value%d"
,
i
);
// syncEntryPrint2((char*)"write entry
:", pEntry);
p
SyncNode
->
pLogStore
->
appendEntry
(
pSyncNode
->
pLogStore
,
pEntry
);
syncEntryLog2
((
char
*
)
"==write entry==
:"
,
pEntry
);
p
LogStore
->
appendEntry
(
pLogStore
,
pEntry
);
syncEntryDestory
(
pEntry
);
if
(
i
==
0
)
{
assert
(
p
SyncNode
->
pLogStore
->
getLastIndex
(
pSyncNode
->
pLogStore
)
==
SYNC_INDEX_BEGIN
);
assert
(
p
LogStore
->
getLastIndex
(
pLogStore
)
==
SYNC_INDEX_BEGIN
);
}
}
logStore
Print2
((
char
*
)
"after appendEntry"
,
pSyncNode
->
pLogStore
);
logStore
Log2
((
char
*
)
"after appendEntry"
,
pLogStore
);
pSyncNode
->
pLogStore
->
truncate
(
pSyncNode
->
pLogStore
,
3
);
logStorePrint2
((
char
*
)
"after truncate 3"
,
pSyncNode
->
pLogStore
);
}
pLogStore
->
truncate
(
pLogStore
,
3
);
logStoreLog2
((
char
*
)
"after truncate 3"
,
pLogStore
);
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
logStoreDestory
(
pLogStore
);
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
ret
=
syncEnvStart
();
assert
(
ret
==
0
);
taosRemoveDir
(
"./wal_test"
);
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
// syncNodePrint((char*)"syncLogStoreTest", pSyncNode);
// initRaftId(pSyncNode);
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
init
();
logStoreTest
();
taosMsleep
(
2000
);
cleanup
();
return
0
;
}
source/libs/sync/test/syncPingReplyTest.cpp
浏览文件 @
126801c8
...
...
@@ -20,13 +20,13 @@ SyncPingReply *createMsg() {
srcId
.
vgId
=
100
;
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
destId
.
vgId
=
100
;
SyncPingReply
*
pMsg
=
syncPingReplyBuild3
(
&
srcId
,
&
destId
);
SyncPingReply
*
pMsg
=
syncPingReplyBuild3
(
&
srcId
,
&
destId
,
1000
);
return
pMsg
;
}
void
test1
()
{
SyncPingReply
*
pMsg
=
createMsg
();
syncPingReply
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncPingReply
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncPingReplyDestroy
(
pMsg
);
}
...
...
@@ -37,7 +37,7 @@ void test2() {
syncPingReplySerialize
(
pMsg
,
serialized
,
len
);
SyncPingReply
*
pMsg2
=
syncPingReplyBuild
(
pMsg
->
dataLen
);
syncPingReplyDeserialize
(
serialized
,
len
,
pMsg2
);
syncPingReply
Print
2
((
char
*
)
"test2: syncPingReplySerialize -> syncPingReplyDeserialize "
,
pMsg2
);
syncPingReply
Log
2
((
char
*
)
"test2: syncPingReplySerialize -> syncPingReplyDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingReplyDestroy
(
pMsg
);
...
...
@@ -49,7 +49,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncPingReplySerialize2
(
pMsg
,
&
len
);
SyncPingReply
*
pMsg2
=
syncPingReplyDeserialize2
(
serialized
,
len
);
syncPingReply
Print2
((
char
*
)
"test3: syncPingReplySerialize3
-> syncPingReplyDeserialize2 "
,
pMsg2
);
syncPingReply
Log2
((
char
*
)
"test3: syncPingReplySerialize2
-> syncPingReplyDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingReplyDestroy
(
pMsg
);
...
...
@@ -62,8 +62,9 @@ void test4() {
syncPingReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncPingReply
*
pMsg2
=
(
SyncPingReply
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncPingReplyFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncPingReply
Print
2
((
char
*
)
"test4: syncPingReply2RpcMsg -> syncPingReplyFromRpcMsg "
,
pMsg2
);
syncPingReply
Log
2
((
char
*
)
"test4: syncPingReply2RpcMsg -> syncPingReplyFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncPingReplyDestroy
(
pMsg
);
syncPingReplyDestroy
(
pMsg2
);
}
...
...
@@ -73,16 +74,30 @@ void test5() {
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncPingReply
*
pMsg2
=
syncPingReplyFromRpcMsg2
(
&
rpcMsg
);
syncPingReply
Print
2
((
char
*
)
"test5: syncPingReply2RpcMsg -> syncPingReplyFromRpcMsg2 "
,
pMsg2
);
syncPingReply
Log
2
((
char
*
)
"test5: syncPingReply2RpcMsg -> syncPingReplyFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncPingReplyDestroy
(
pMsg
);
syncPingReplyDestroy
(
pMsg2
);
}
void
test6
()
{
SyncPingReply
*
pMsg
=
createMsg
();
int32_t
bufLen
=
syncPingReplySerialize3
(
pMsg
,
NULL
,
0
);
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
bufLen
);
syncPingReplySerialize3
(
pMsg
,
serialized
,
bufLen
);
SyncPingReply
*
pMsg2
=
syncPingReplyDeserialize3
(
serialized
,
bufLen
);
assert
(
pMsg2
!=
NULL
);
syncPingReplyLog2
((
char
*
)
"test6: syncPingReplySerialize3 -> syncPingReplyDeserialize3 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingReplyDestroy
(
pMsg
);
syncPingReplyDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
@@ -90,6 +105,7 @@ int main() {
test3
();
test4
();
test5
();
test6
();
return
0
;
}
source/libs/sync/test/syncPingSelfTest.cpp
浏览文件 @
126801c8
...
...
@@ -87,7 +87,7 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
""
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
...
...
source/libs/sync/test/syncPingTest.cpp
浏览文件 @
126801c8
...
...
@@ -20,13 +20,13 @@ SyncPing *createMsg() {
srcId
.
vgId
=
100
;
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
destId
.
vgId
=
100
;
SyncPing
*
pMsg
=
syncPingBuild3
(
&
srcId
,
&
destId
);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
srcId
,
&
destId
,
1000
);
return
pMsg
;
}
void
test1
()
{
SyncPing
*
pMsg
=
createMsg
();
syncPing
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncPing
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncPingDestroy
(
pMsg
);
}
...
...
@@ -37,7 +37,7 @@ void test2() {
syncPingSerialize
(
pMsg
,
serialized
,
len
);
SyncPing
*
pMsg2
=
syncPingBuild
(
pMsg
->
dataLen
);
syncPingDeserialize
(
serialized
,
len
,
pMsg2
);
syncPing
Print
2
((
char
*
)
"test2: syncPingSerialize -> syncPingDeserialize "
,
pMsg2
);
syncPing
Log
2
((
char
*
)
"test2: syncPingSerialize -> syncPingDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingDestroy
(
pMsg
);
...
...
@@ -49,7 +49,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncPingSerialize2
(
pMsg
,
&
len
);
SyncPing
*
pMsg2
=
syncPingDeserialize2
(
serialized
,
len
);
syncPing
Print2
((
char
*
)
"test3: syncPingSerialize3
-> syncPingDeserialize2 "
,
pMsg2
);
syncPing
Log2
((
char
*
)
"test3: syncPingSerialize2
-> syncPingDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingDestroy
(
pMsg
);
...
...
@@ -62,10 +62,11 @@ void test4() {
syncPing2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncPing
*
pMsg2
=
(
SyncPing
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncPingFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncPing
Print
2
((
char
*
)
"test4: syncPing2RpcMsg -> syncPingFromRpcMsg "
,
pMsg2
);
syncPing
Log
2
((
char
*
)
"test4: syncPing2RpcMsg -> syncPingFromRpcMsg "
,
pMsg2
);
syncPingDestroy
(
pMsg
);
syncPingDestroy
(
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
}
void
test5
()
{
...
...
@@ -73,16 +74,30 @@ void test5() {
SRpcMsg
rpcMsg
;
syncPing2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncPing
*
pMsg2
=
syncPingFromRpcMsg2
(
&
rpcMsg
);
syncPing
Print
2
((
char
*
)
"test5: syncPing2RpcMsg -> syncPingFromRpcMsg2 "
,
pMsg2
);
syncPing
Log
2
((
char
*
)
"test5: syncPing2RpcMsg -> syncPingFromRpcMsg2 "
,
pMsg2
);
syncPingDestroy
(
pMsg
);
syncPingDestroy
(
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
}
void
test6
()
{
SyncPing
*
pMsg
=
createMsg
();
int32_t
bufLen
=
syncPingSerialize3
(
pMsg
,
NULL
,
0
);
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
bufLen
);
syncPingSerialize3
(
pMsg
,
serialized
,
bufLen
);
SyncPing
*
pMsg2
=
syncPingDeserialize3
(
serialized
,
bufLen
);
assert
(
pMsg2
!=
NULL
);
syncPingLog2
((
char
*
)
"test6: syncPingSerialize3 -> syncPingDeserialize3 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncPingDestroy
(
pMsg
);
syncPingDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
@@ -90,6 +105,7 @@ int main() {
test3
();
test4
();
test5
();
test6
();
return
0
;
}
source/libs/sync/test/syncPingTimerTest.cpp
浏览文件 @
126801c8
...
...
@@ -87,7 +87,7 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
"----1"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"----1"
,
pSyncNode
);
initRaftId
(
pSyncNode
);
...
...
@@ -96,7 +96,7 @@ int main(int argc, char** argv) {
sTrace
(
"syncNodeStartPingTimer ..."
);
ret
=
syncNodeStartPingTimer
(
pSyncNode
);
assert
(
ret
==
0
);
syncNode
Print
2
((
char
*
)
"----2"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"----2"
,
pSyncNode
);
sTrace
(
"sleep ..."
);
taosMsleep
(
10000
);
...
...
@@ -104,7 +104,7 @@ int main(int argc, char** argv) {
sTrace
(
"syncNodeStopPingTimer ..."
);
ret
=
syncNodeStopPingTimer
(
pSyncNode
);
assert
(
ret
==
0
);
syncNode
Print
2
((
char
*
)
"----3"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"----3"
,
pSyncNode
);
sTrace
(
"sleep ..."
);
taosMsleep
(
5000
);
...
...
@@ -112,7 +112,7 @@ int main(int argc, char** argv) {
sTrace
(
"syncNodeStartPingTimer ..."
);
ret
=
syncNodeStartPingTimer
(
pSyncNode
);
assert
(
ret
==
0
);
syncNode
Print
2
((
char
*
)
"----4"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"----4"
,
pSyncNode
);
sTrace
(
"sleep ..."
);
taosMsleep
(
10000
);
...
...
@@ -120,7 +120,7 @@ int main(int argc, char** argv) {
sTrace
(
"syncNodeStopPingTimer ..."
);
ret
=
syncNodeStopPingTimer
(
pSyncNode
);
assert
(
ret
==
0
);
syncNode
Print
2
((
char
*
)
"----5"
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
"----5"
,
pSyncNode
);
while
(
1
)
{
sTrace
(
"while 1 sleep ..."
);
...
...
source/libs/sync/test/syncPingTimerTest2.cpp
浏览文件 @
126801c8
...
...
@@ -87,7 +87,7 @@ int main(int argc, char** argv) {
SSyncNode
*
pSyncNode
=
syncInitTest
();
assert
(
pSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
""
,
pSyncNode
);
syncNode
Log
2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
...
...
source/libs/sync/test/syncRaftCfgTest.cpp
0 → 100644
浏览文件 @
126801c8
#include "syncRaftStore.h"
//#include <gtest/gtest.h>
#include <stdio.h>
#include "syncIO.h"
#include "syncInt.h"
#include "syncRaftCfg.h"
#include "syncUtil.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
SSyncCfg
*
createSyncCfg
()
{
SSyncCfg
*
pCfg
=
(
SSyncCfg
*
)
taosMemoryMalloc
(
sizeof
(
SSyncCfg
));
memset
(
pCfg
,
0
,
sizeof
(
SSyncCfg
));
pCfg
->
replicaNum
=
3
;
pCfg
->
myIndex
=
1
;
for
(
int
i
=
0
;
i
<
pCfg
->
replicaNum
;
++
i
)
{
((
pCfg
->
nodeInfo
)[
i
]).
nodePort
=
i
*
100
;
snprintf
(((
pCfg
->
nodeInfo
)[
i
]).
nodeFqdn
,
sizeof
(((
pCfg
->
nodeInfo
)[
i
]).
nodeFqdn
),
"100.200.300.%d"
,
i
);
}
return
pCfg
;
}
void
test1
()
{
SSyncCfg
*
pCfg
=
createSyncCfg
();
syncCfgLog2
((
char
*
)
__FUNCTION__
,
pCfg
);
taosMemoryFree
(
pCfg
);
}
void
test2
()
{
SSyncCfg
*
pCfg
=
createSyncCfg
();
char
*
s
=
syncCfg2Str
(
pCfg
);
SSyncCfg
*
pCfg2
=
(
SSyncCfg
*
)
taosMemoryMalloc
(
sizeof
(
SSyncCfg
));
int32_t
ret
=
syncCfgFromStr
(
s
,
pCfg2
);
assert
(
ret
==
0
);
syncCfgLog2
((
char
*
)
__FUNCTION__
,
pCfg2
);
taosMemoryFree
(
pCfg
);
taosMemoryFree
(
s
);
taosMemoryFree
(
pCfg2
);
}
void
test3
()
{
SSyncCfg
*
pCfg
=
createSyncCfg
();
char
*
s
=
(
char
*
)
"./test3_raft_cfg.json"
;
if
(
taosCheckExistFile
(
s
))
{
printf
(
"%s file: %s already exist!
\n
"
,
(
char
*
)
__FUNCTION__
,
s
);
}
else
{
syncCfgCreateFile
(
pCfg
,
s
);
printf
(
"%s create json file: %s
\n
"
,
(
char
*
)
__FUNCTION__
,
s
);
}
taosMemoryFree
(
pCfg
);
}
void
test4
()
{
SRaftCfg
*
pCfg
=
raftCfgOpen
(
"./test3_raft_cfg.json"
);
assert
(
pCfg
!=
NULL
);
raftCfgLog2
((
char
*
)
__FUNCTION__
,
pCfg
);
int32_t
ret
=
raftCfgClose
(
pCfg
);
assert
(
ret
==
0
);
}
void
test5
()
{
SRaftCfg
*
pCfg
=
raftCfgOpen
(
"./test3_raft_cfg.json"
);
assert
(
pCfg
!=
NULL
);
pCfg
->
cfg
.
myIndex
=
taosGetTimestampSec
();
raftCfgPersist
(
pCfg
);
printf
(
"%s update json file: %s myIndex->%d
\n
"
,
(
char
*
)
__FUNCTION__
,
"./test3_raft_cfg.json"
,
pCfg
->
cfg
.
myIndex
);
int32_t
ret
=
raftCfgClose
(
pCfg
);
assert
(
ret
==
0
);
}
int
main
()
{
tsAsyncLog
=
0
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
test2
();
test3
();
test4
();
test5
();
return
0
;
}
source/libs/sync/test/syncRaftStoreTest.cpp
浏览文件 @
126801c8
...
...
@@ -30,9 +30,8 @@ void initRaftId() {
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
...
...
@@ -40,31 +39,33 @@ int main() {
SRaftStore
*
pRaftStore
=
raftStoreOpen
(
"./test_raft_store.json"
);
assert
(
pRaftStore
!=
NULL
);
raftStore
Print
2
((
char
*
)
"==raftStoreOpen=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreOpen=="
,
pRaftStore
);
raftStoreSetTerm
(
pRaftStore
,
100
);
raftStore
Print
2
((
char
*
)
"==raftStoreSetTerm=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreSetTerm=="
,
pRaftStore
);
raftStoreVote
(
pRaftStore
,
&
ids
[
0
]);
raftStore
Print
2
((
char
*
)
"==raftStoreVote=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreVote=="
,
pRaftStore
);
raftStoreClearVote
(
pRaftStore
);
raftStore
Print
2
((
char
*
)
"==raftStoreClearVote=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreClearVote=="
,
pRaftStore
);
raftStoreVote
(
pRaftStore
,
&
ids
[
1
]);
raftStore
Print
2
((
char
*
)
"==raftStoreVote=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreVote=="
,
pRaftStore
);
raftStoreNextTerm
(
pRaftStore
);
raftStore
Print
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStoreNextTerm
(
pRaftStore
);
raftStore
Print
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStoreNextTerm
(
pRaftStore
);
raftStore
Print
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStore
Log
2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStoreNextTerm
(
pRaftStore
);
raftStorePrint2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStoreLog2
((
char
*
)
"==raftStoreNextTerm=="
,
pRaftStore
);
raftStoreClose
(
pRaftStore
);
return
0
;
}
source/libs/sync/test/syncReplicateLoadTest.cpp
已删除
100644 → 0
浏览文件 @
d83ce404
#include <gtest/gtest.h>
#include <stdio.h>
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncMessage.h"
#include "syncRaftEntry.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
initFsm
()
{
pFsm
=
(
SSyncFSM
*
)
taosMemoryMalloc
(
sizeof
(
SSyncFSM
));
pFsm
->
FpCommitCb
=
CommitCb
;
pFsm
->
FpPreCommitCb
=
PreCommitCb
;
pFsm
->
FpRollBackCb
=
RollBackCb
;
}
int64_t
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./replicate2_test_%d"
,
myIndex
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./replicate2_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
int64_t
rid
=
syncStart
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
// pSyncNode->hbBaseLine = 500;
// pSyncNode->electBaseLine = 1500;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeRelease
(
pSyncNode
);
return
rid
;
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
SRpcMsg
*
step0
(
int
i
)
{
SRpcMsg
*
pMsg
=
(
SRpcMsg
*
)
taosMemoryMalloc
(
sizeof
(
SRpcMsg
));
memset
(
pMsg
,
0
,
sizeof
(
SRpcMsg
));
pMsg
->
msgType
=
9999
;
pMsg
->
contLen
=
128
;
pMsg
->
pCont
=
taosMemoryMalloc
(
pMsg
->
contLen
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"value-%u-%d"
,
ports
[
myIndex
],
i
);
return
pMsg
;
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
return
pRetMsg
;
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
void
logTest
();
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
initFsm
();
ret
=
syncInit
();
assert
(
ret
==
0
);
int64_t
rid
=
syncNodeInit
();
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
// only load ...
while
(
1
)
{
sTrace
(
"replicate sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
,
pSyncNode
->
commitIndex
);
taosMsleep
(
1000
);
}
return
0
;
}
source/libs/sync/test/syncReplicateTest.cpp
浏览文件 @
126801c8
...
...
@@ -3,11 +3,8 @@
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncMessage.h"
#include "syncRaftEntry.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -18,187 +15,203 @@ void logTest() {
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
uint16_t
gPorts
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
const
char
*
gDir
=
"./syncReplicateTest"
;
int32_t
gVgId
=
1234
;
SyncIndex
gSnapshotLastApplyIndex
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
SSyncNode
*
gSyncNode
;
void
init
()
{
int
code
=
walInit
();
assert
(
code
==
0
);
code
=
syncInit
();
assert
(
code
==
0
);
}
void
cleanup
()
{
walCleanUp
();
}
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
SyncIndex
beginIndex
=
SYNC_INDEX_INVALID
;
if
(
pFsm
->
FpGetSnapshot
!=
NULL
)
{
SSnapshot
snapshot
;
pFsm
->
FpGetSnapshot
(
pFsm
,
&
snapshot
);
beginIndex
=
snapshot
.
lastApplyIndex
;
}
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
if
(
cbMeta
.
index
>
beginIndex
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
else
{
sTrace
(
"==callback== ==CommitCb== do not apply again %ld"
,
cbMeta
.
index
);
}
}
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
c
ode
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
cbMeta
.
index
,
c
bMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
initFsm
()
{
pFsm
=
(
SSyncFSM
*
)
taosMemoryMalloc
(
sizeof
(
SSyncFSM
));
int32_t
GetSnapshotCb
(
struct
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
)
{
pSnapshot
->
data
=
NULL
;
pSnapshot
->
lastApplyIndex
=
gSnapshotLastApplyIndex
;
pSnapshot
->
lastApplyTerm
=
100
;
return
0
;
}
SSyncFSM
*
createFsm
()
{
SSyncFSM
*
pFsm
=
(
SSyncFSM
*
)
taosMemoryMalloc
(
sizeof
(
SSyncFSM
));
pFsm
->
FpCommitCb
=
CommitCb
;
pFsm
->
FpPreCommitCb
=
PreCommitCb
;
pFsm
->
FpRollBackCb
=
RollBackCb
;
pFsm
->
FpGetSnapshot
=
GetSnapshotCb
;
return
pFsm
;
}
SSyncNode
*
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./replicate_test_%d"
,
myIndex
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWal
*
createWal
(
char
*
path
,
int32_t
vgId
)
{
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
vgId
=
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./replicate_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
SWal
*
pWal
=
walOpen
(
path
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
return
pWal
;
}
int64_t
createSyncNode
(
int32_t
replicaNum
,
int32_t
myIndex
,
int32_t
vgId
,
SWal
*
pWal
,
char
*
path
)
{
SSyncInfo
syncInfo
;
syncInfo
.
vgId
=
vgId
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
createFsm
();
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s_sync_replica%d_index%d"
,
path
,
replicaNum
,
myIndex
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
p
orts
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
//
taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn
);
pCfg
->
nodeInfo
[
i
].
nodePort
=
gP
orts
[
i
];
taosGetFqdn
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
);
//
snprintf(pCfg->nodeInfo[i].nodeFqdn, sizeof(pCfg->nodeInfo[i].nodeFqdn), "%s", "127.0.0.1"
);
}
SSyncNode
*
pSyncNode
=
syncNode
Open
(
&
syncInfo
);
assert
(
pSyncNode
!=
NULL
);
int64_t
rid
=
sync
Open
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeRelease
(
pSyncNode
);
return
pSyncNode
;
return
rid
;
}
SSyncNode
*
syncInitTest
()
{
return
syncNodeInit
(
);
}
void
usage
(
char
*
exe
)
{
printf
(
"usage: %s replicaNum myIndex lastApplyIndex writeRecordNum
\n
"
,
exe
);
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
SRpcMsg
*
step0
(
int
i
)
{
SRpcMsg
*
pMsg
=
(
SRpcMsg
*
)
taosMemoryMalloc
(
sizeof
(
SRpcMsg
));
SRpcMsg
*
createRpcMsg
(
int
i
,
int
count
,
int
myIndex
)
{
SRpcMsg
*
pMsg
=
(
SRpcMsg
*
)
taosMemoryMalloc
(
sizeof
(
SRpcMsg
));
memset
(
pMsg
,
0
,
sizeof
(
SRpcMsg
));
pMsg
->
msgType
=
9999
;
pMsg
->
contLen
=
128
;
pMsg
->
pCont
=
taosMemoryMalloc
(
pMsg
->
contLen
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"value-%u-%d"
,
ports
[
myIndex
],
i
);
pMsg
->
contLen
=
256
;
pMsg
->
pCont
=
rpcMallocCont
(
pMsg
->
contLen
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"value-myIndex:%u-%d-%d-%ld"
,
myIndex
,
i
,
count
,
taosGetTimestampMs
()
);
return
pMsg
;
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
return
pRetMsg
;
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
int
main
(
int
argc
,
char
**
argv
)
{
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
void
logTest
();
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
if
(
argc
!=
5
)
{
usage
(
argv
[
0
]);
exit
(
-
1
);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
int32_t
replicaNum
=
atoi
(
argv
[
1
]);
int32_t
myIndex
=
atoi
(
argv
[
2
]);
int32_t
lastApplyIndex
=
atoi
(
argv
[
3
]);
int32_t
writeRecordNum
=
atoi
(
argv
[
4
]);
gSnapshotLastApplyIndex
=
lastApplyIndex
;
assert
(
replicaNum
>=
1
&&
replicaNum
<=
5
);
assert
(
myIndex
>=
0
&&
myIndex
<
replicaNum
);
assert
(
lastApplyIndex
>=
-
1
);
assert
(
writeRecordNum
>=
0
);
init
();
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
gPorts
[
myIndex
]);
assert
(
ret
==
0
);
ret
=
syncEnvStart
();
assert
(
ret
==
0
);
taosRemoveDir
(
"./wal_test"
);
initFsm
();
gSyncNode
=
syncInitTest
();
assert
(
gSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
gSyncNode
);
char
walPath
[
128
];
snprintf
(
walPath
,
sizeof
(
walPath
),
"%s_wal_replica%d_index%d"
,
gDir
,
replicaNum
,
myIndex
);
SWal
*
pWal
=
createWal
(
walPath
,
gVgId
);
initRaftId
(
gSyncNode
);
int64_t
rid
=
createSyncNode
(
replicaNum
,
myIndex
,
gVgId
,
pWal
,
(
char
*
)
gDir
);
assert
(
rid
>
0
);
syncStart
(
rid
);
for
(
int
i
=
0
;
i
<
30
;
++
i
)
{
// step0
SRpcMsg
*
pMsg0
=
step0
(
i
);
syncRpcMsgPrint2
((
char
*
)
"==step0=="
,
pMsg0
);
// step1
SyncClientRequest
*
pMsg1
=
step1
(
pMsg0
);
syncClientRequestPrint2
((
char
*
)
"==step1=="
,
pMsg1
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
SyncClientRequest
*
pSyncClientRequest
=
pMsg1
;
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pSyncClientRequest
,
&
rpcMsg
);
gSyncNode
->
FpEqMsg
(
gSyncNode
->
queue
,
&
rpcMsg
);
//---------------------------
int32_t
alreadySend
=
0
;
while
(
1
)
{
char
*
s
=
syncNode2SimpleStr
(
pSyncNode
);
if
(
alreadySend
<
writeRecordNum
)
{
SRpcMsg
*
pRpcMsg
=
createRpcMsg
(
alreadySend
,
writeRecordNum
,
myIndex
);
int32_t
ret
=
syncPropose
(
rid
,
pRpcMsg
,
false
);
if
(
ret
==
TAOS_SYNC_PROPOSE_NOT_LEADER
)
{
sTrace
(
"%s value%d write not leader"
,
s
,
alreadySend
);
}
else
{
assert
(
ret
==
0
);
sTrace
(
"%s value%d write ok"
,
s
,
alreadySend
);
}
alreadySend
++
;
taosMsleep
(
1000
);
sTrace
(
"syncPropose sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
gSyncNode
->
state
,
syncUtilState2String
(
gSyncNode
->
state
),
gSyncNode
->
pRaftStore
->
currentTerm
,
gSyncNode
->
electTimerLogicClock
,
gSyncNode
->
electTimerLogicClockUser
,
gSyncNode
->
electTimerMS
,
gSyncNode
->
commitIndex
);
rpcFreeCont
(
pRpcMsg
->
pCont
);
taosMemoryFree
(
pRpcMsg
);
}
else
{
sTrace
(
"%s"
,
s
);
}
while
(
1
)
{
sTrace
(
"replicate sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
gSyncNode
->
state
,
syncUtilState2String
(
gSyncNode
->
state
),
gSyncNode
->
pRaftStore
->
currentTerm
,
gSyncNode
->
electTimerLogicClock
,
gSyncNode
->
electTimerLogicClockUser
,
gSyncNode
->
electTimerMS
,
gSyncNode
->
commitIndex
);
taosMsleep
(
1000
);
taosMemoryFree
(
s
);
taosMsleep
(
1000
);
}
syncNodeRelease
(
pSyncNode
);
syncStop
(
rid
);
walClose
(
pWal
);
syncIOStop
();
cleanup
();
return
0
;
}
source/libs/sync/test/syncReplicateTest3.cpp
已删除
100644 → 0
浏览文件 @
d83ce404
#define ALLOW_FORBID_FUNC
#include <gtest/gtest.h>
#include <stdio.h>
#include "syncEnv.h"
#include "syncIO.h"
#include "syncInt.h"
#include "syncMessage.h"
#include "syncRaftEntry.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
initFsm
()
{
pFsm
=
(
SSyncFSM
*
)
taosMemoryMalloc
(
sizeof
(
SSyncFSM
));
pFsm
->
FpCommitCb
=
CommitCb
;
pFsm
->
FpPreCommitCb
=
PreCommitCb
;
pFsm
->
FpRollBackCb
=
RollBackCb
;
}
int64_t
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"./replicate2_test_%d"
,
myIndex
);
int
code
=
walInit
();
assert
(
code
==
0
);
SWalCfg
walCfg
;
memset
(
&
walCfg
,
0
,
sizeof
(
SWalCfg
));
walCfg
.
vgId
=
syncInfo
.
vgId
;
walCfg
.
fsyncPeriod
=
1000
;
walCfg
.
retentionPeriod
=
1000
;
walCfg
.
rollPeriod
=
1000
;
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./replicate2_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
SSyncCfg
*
pCfg
=
&
syncInfo
.
syncCfg
;
pCfg
->
myIndex
=
myIndex
;
pCfg
->
replicaNum
=
replicaNum
;
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
}
int64_t
rid
=
syncStart
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
// pSyncNode->hbBaseLine = 500;
// pSyncNode->electBaseLine = 1500;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeRelease
(
pSyncNode
);
return
rid
;
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
char
*
s
=
syncUtilRaftId2Str
(
&
ids
[
i
]);
printf
(
"raftId[%d] : %s
\n
"
,
i
,
s
);
taosMemoryFree
(
s
);
}
}
SRpcMsg
*
step0
(
int
i
)
{
SRpcMsg
*
pMsg
=
(
SRpcMsg
*
)
taosMemoryMalloc
(
sizeof
(
SRpcMsg
));
memset
(
pMsg
,
0
,
sizeof
(
SRpcMsg
));
pMsg
->
msgType
=
9999
;
pMsg
->
contLen
=
128
;
pMsg
->
pCont
=
taosMemoryMalloc
(
pMsg
->
contLen
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"value-%u-%d"
,
ports
[
myIndex
],
i
);
return
pMsg
;
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
return
pRetMsg
;
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
void
logTest
();
myIndex
=
0
;
if
(
argc
>=
2
)
{
myIndex
=
atoi
(
argv
[
1
]);
}
int
recordCount
=
100
;
if
(
argc
>=
3
)
{
recordCount
=
atoi
(
argv
[
2
]);
}
int
sleepMS
=
10
;
if
(
argc
>=
4
)
{
sleepMS
=
atoi
(
argv
[
3
]);
}
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
initFsm
();
ret
=
syncInit
();
assert
(
ret
==
0
);
int64_t
rid
=
syncNodeInit
();
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
syncNodePrint2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
for
(
int
i
=
0
;
i
<
recordCount
;
++
i
)
{
// step0
SRpcMsg
*
pMsg0
=
step0
(
i
);
syncRpcMsgPrint2
((
char
*
)
"==step0=="
,
pMsg0
);
syncPropose
(
rid
,
pMsg0
,
true
);
taosMsleep
(
sleepMS
);
taosMemoryFree
(
pMsg0
);
sTrace
(
"syncPropose sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
,
pSyncNode
->
commitIndex
);
}
while
(
1
)
{
sTrace
(
"replicate sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
,
pSyncNode
->
commitIndex
);
taosMsleep
(
1000
);
}
return
0
;
}
source/libs/sync/test/syncRequestVoteReplyTest.cpp
浏览文件 @
126801c8
...
...
@@ -15,7 +15,7 @@ void logTest() {
}
SyncRequestVoteReply
*
createMsg
()
{
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -27,7 +27,7 @@ SyncRequestVoteReply *createMsg() {
void
test1
()
{
SyncRequestVoteReply
*
pMsg
=
createMsg
();
syncRequestVoteReply
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncRequestVoteReply
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncRequestVoteReplyDestroy
(
pMsg
);
}
...
...
@@ -36,9 +36,9 @@ void test2() {
uint32_t
len
=
pMsg
->
bytes
;
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
len
);
syncRequestVoteReplySerialize
(
pMsg
,
serialized
,
len
);
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyBuild
(
1000
);
syncRequestVoteReplyDeserialize
(
serialized
,
len
,
pMsg2
);
syncRequestVoteReply
Print
2
((
char
*
)
"test2: syncRequestVoteReplySerialize -> syncRequestVoteReplyDeserialize "
,
pMsg2
);
syncRequestVoteReply
Log
2
((
char
*
)
"test2: syncRequestVoteReplySerialize -> syncRequestVoteReplyDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncRequestVoteReplyDestroy
(
pMsg
);
...
...
@@ -50,8 +50,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncRequestVoteReplySerialize2
(
pMsg
,
&
len
);
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyDeserialize2
(
serialized
,
len
);
syncRequestVoteReplyPrint2
((
char
*
)
"test3: syncRequestVoteReplySerialize3 -> syncRequestVoteReplyDeserialize2 "
,
pMsg2
);
syncRequestVoteReplyLog2
((
char
*
)
"test3: syncRequestVoteReplySerialize3 -> syncRequestVoteReplyDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncRequestVoteReplyDestroy
(
pMsg
);
...
...
@@ -62,10 +61,11 @@ void test4() {
SyncRequestVoteReply
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncRequestVoteReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyBuild
(
1000
);
syncRequestVoteReplyFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncRequestVoteReply
Print
2
((
char
*
)
"test4: syncRequestVoteReply2RpcMsg -> syncRequestVoteReplyFromRpcMsg "
,
pMsg2
);
syncRequestVoteReply
Log
2
((
char
*
)
"test4: syncRequestVoteReply2RpcMsg -> syncRequestVoteReplyFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncRequestVoteReplyDestroy
(
pMsg
);
syncRequestVoteReplyDestroy
(
pMsg2
);
}
...
...
@@ -75,16 +75,16 @@ void test5() {
SRpcMsg
rpcMsg
;
syncRequestVoteReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncRequestVoteReply
*
pMsg2
=
syncRequestVoteReplyFromRpcMsg2
(
&
rpcMsg
);
syncRequestVoteReply
Print
2
((
char
*
)
"test5: syncRequestVoteReply2RpcMsg -> syncRequestVoteReplyFromRpcMsg2 "
,
pMsg2
);
syncRequestVoteReply
Log
2
((
char
*
)
"test5: syncRequestVoteReply2RpcMsg -> syncRequestVoteReplyFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncRequestVoteReplyDestroy
(
pMsg
);
syncRequestVoteReplyDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncRequestVoteTest.cpp
浏览文件 @
126801c8
...
...
@@ -15,7 +15,7 @@ void logTest() {
}
SyncRequestVote
*
createMsg
()
{
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
();
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -28,7 +28,7 @@ SyncRequestVote *createMsg() {
void
test1
()
{
SyncRequestVote
*
pMsg
=
createMsg
();
syncRequestVote
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncRequestVote
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncRequestVoteDestroy
(
pMsg
);
}
...
...
@@ -37,9 +37,9 @@ void test2() {
uint32_t
len
=
pMsg
->
bytes
;
char
*
serialized
=
(
char
*
)
taosMemoryMalloc
(
len
);
syncRequestVoteSerialize
(
pMsg
,
serialized
,
len
);
SyncRequestVote
*
pMsg2
=
syncRequestVoteBuild
();
SyncRequestVote
*
pMsg2
=
syncRequestVoteBuild
(
1000
);
syncRequestVoteDeserialize
(
serialized
,
len
,
pMsg2
);
syncRequestVote
Print
2
((
char
*
)
"test2: syncRequestVoteSerialize -> syncRequestVoteDeserialize "
,
pMsg2
);
syncRequestVote
Log
2
((
char
*
)
"test2: syncRequestVoteSerialize -> syncRequestVoteDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncRequestVoteDestroy
(
pMsg
);
...
...
@@ -51,7 +51,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncRequestVoteSerialize2
(
pMsg
,
&
len
);
SyncRequestVote
*
pMsg2
=
syncRequestVoteDeserialize2
(
serialized
,
len
);
syncRequestVote
Print
2
((
char
*
)
"test3: syncRequestVoteSerialize3 -> syncRequestVoteDeserialize2 "
,
pMsg2
);
syncRequestVote
Log
2
((
char
*
)
"test3: syncRequestVoteSerialize3 -> syncRequestVoteDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncRequestVoteDestroy
(
pMsg
);
...
...
@@ -62,10 +62,11 @@ void test4() {
SyncRequestVote
*
pMsg
=
createMsg
();
SRpcMsg
rpcMsg
;
syncRequestVote2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncRequestVote
*
pMsg2
=
syncRequestVoteBuild
();
SyncRequestVote
*
pMsg2
=
syncRequestVoteBuild
(
1000
);
syncRequestVoteFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncRequestVote
Print
2
((
char
*
)
"test4: syncRequestVote2RpcMsg -> syncRequestVoteFromRpcMsg "
,
pMsg2
);
syncRequestVote
Log
2
((
char
*
)
"test4: syncRequestVote2RpcMsg -> syncRequestVoteFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncRequestVoteDestroy
(
pMsg
);
syncRequestVoteDestroy
(
pMsg2
);
}
...
...
@@ -75,16 +76,16 @@ void test5() {
SRpcMsg
rpcMsg
;
syncRequestVote2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncRequestVote
*
pMsg2
=
syncRequestVoteFromRpcMsg2
(
&
rpcMsg
);
syncRequestVote
Print
2
((
char
*
)
"test5: syncRequestVote2RpcMsg -> syncRequestVoteFromRpcMsg2 "
,
pMsg2
);
syncRequestVote
Log
2
((
char
*
)
"test5: syncRequestVote2RpcMsg -> syncRequestVoteFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncRequestVoteDestroy
(
pMsg
);
syncRequestVoteDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncRespMgrTest.cpp
0 → 100644
浏览文件 @
126801c8
#include "syncRespMgr.h"
//#include <gtest/gtest.h>
#include <stdio.h>
#include "syncIO.h"
#include "syncInt.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
}
SSyncRespMgr
*
pMgr
=
NULL
;
void
syncRespMgrInsert
(
uint64_t
count
)
{
for
(
uint64_t
i
=
0
;
i
<
count
;
++
i
)
{
SRespStub
stub
;
memset
(
&
stub
,
0
,
sizeof
(
SRespStub
));
stub
.
createTime
=
taosGetTimestampMs
();
stub
.
rpcMsg
.
code
=
(
pMgr
->
seqNum
+
1
);
stub
.
rpcMsg
.
ahandle
=
(
void
*
)(
200
+
i
);
stub
.
rpcMsg
.
handle
=
(
void
*
)(
300
+
i
);
uint64_t
ret
=
syncRespMgrAdd
(
pMgr
,
&
stub
);
printf
(
"insert %lu
\n
"
,
ret
);
}
}
void
syncRespMgrDelTest
(
uint64_t
begin
,
uint64_t
end
)
{
for
(
uint64_t
i
=
begin
;
i
<=
end
;
++
i
)
{
int32_t
ret
=
syncRespMgrDel
(
pMgr
,
i
);
assert
(
ret
==
0
);
}
}
void
printStub
(
SRespStub
*
p
)
{
printf
(
"createTime:%ld, rpcMsg.code:%d rpcMsg.ahandle:%ld rpcMsg.handle:%ld
\n
"
,
p
->
createTime
,
p
->
rpcMsg
.
code
,
(
int64_t
)(
p
->
rpcMsg
.
ahandle
),
(
int64_t
)(
p
->
rpcMsg
.
handle
));
}
void
syncRespMgrPrint
()
{
printf
(
"
\n
----------------syncRespMgrPrint--------------
\n
"
);
taosThreadMutexLock
(
&
(
pMgr
->
mutex
));
SRespStub
*
p
=
(
SRespStub
*
)
taosHashIterate
(
pMgr
->
pRespHash
,
NULL
);
while
(
p
)
{
printStub
(
p
);
p
=
(
SRespStub
*
)
taosHashIterate
(
pMgr
->
pRespHash
,
p
);
}
taosThreadMutexUnlock
(
&
(
pMgr
->
mutex
));
}
void
syncRespMgrGetTest
(
uint64_t
i
)
{
printf
(
"------syncRespMgrGetTest------- %lu --
\n
"
,
i
);
SRespStub
stub
;
int32_t
ret
=
syncRespMgrGet
(
pMgr
,
i
,
&
stub
);
if
(
ret
==
1
)
{
printStub
(
&
stub
);
}
else
if
(
ret
==
0
)
{
printf
(
"%ld notFound
\n
"
,
i
);
}
}
void
syncRespMgrGetAndDelTest
(
uint64_t
i
)
{
printf
(
"------syncRespMgrGetAndDelTest-------%lu--
\n
"
,
i
);
SRespStub
stub
;
int32_t
ret
=
syncRespMgrGetAndDel
(
pMgr
,
i
,
&
stub
);
if
(
ret
==
1
)
{
printStub
(
&
stub
);
}
else
if
(
ret
==
0
)
{
printf
(
"%ld notFound
\n
"
,
i
);
}
}
void
test1
()
{
printf
(
"------- test1 ---------
\n
"
);
pMgr
=
syncRespMgrCreate
(
NULL
,
0
);
assert
(
pMgr
!=
NULL
);
syncRespMgrInsert
(
10
);
syncRespMgrPrint
();
printf
(
"====== get print
\n
"
);
for
(
uint64_t
i
=
1
;
i
<=
10
;
++
i
)
{
syncRespMgrGetTest
(
i
);
}
printf
(
"===== delete 5 - 7
\n
"
);
syncRespMgrDelTest
(
5
,
7
);
syncRespMgrPrint
();
printf
(
"====== get print
\n
"
);
for
(
uint64_t
i
=
1
;
i
<=
10
;
++
i
)
{
syncRespMgrGetTest
(
i
);
}
syncRespMgrDestroy
(
pMgr
);
}
void
test2
()
{
printf
(
"------- test2 ---------
\n
"
);
pMgr
=
syncRespMgrCreate
(
NULL
,
0
);
assert
(
pMgr
!=
NULL
);
syncRespMgrInsert
(
10
);
syncRespMgrPrint
();
printf
(
"====== get and delete 3 - 7
\n
"
);
for
(
uint64_t
i
=
3
;
i
<=
7
;
++
i
)
{
syncRespMgrGetAndDelTest
(
i
);
}
syncRespMgrPrint
();
syncRespMgrDestroy
(
pMgr
);
}
void
test3
()
{
printf
(
"------- test3 ---------
\n
"
);
pMgr
=
syncRespMgrCreate
(
NULL
,
0
);
assert
(
pMgr
!=
NULL
);
syncRespMgrInsert
(
10
);
syncRespMgrPrint
();
printf
(
"====== get and delete 0 - 20
\n
"
);
for
(
uint64_t
i
=
0
;
i
<=
20
;
++
i
)
{
syncRespMgrGetAndDelTest
(
i
);
}
syncRespMgrPrint
();
syncRespMgrDestroy
(
pMgr
);
}
int
main
()
{
tsAsyncLog
=
0
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
test2
();
test3
();
return
0
;
}
source/libs/sync/test/syncRpcMsgTest.cpp
浏览文件 @
126801c8
...
...
@@ -16,7 +16,7 @@ void logTest() {
int
gg
=
0
;
SyncTimeout
*
createSyncTimeout
()
{
SyncTimeout
*
pMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_PING
,
999
,
333
,
&
gg
);
SyncTimeout
*
pMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_PING
,
999
,
333
,
1000
,
&
gg
);
return
pMsg
;
}
...
...
@@ -26,7 +26,7 @@ SyncPing *createSyncPing() {
srcId
.
vgId
=
100
;
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
destId
.
vgId
=
100
;
SyncPing
*
pMsg
=
syncPingBuild3
(
&
srcId
,
&
destId
);
SyncPing
*
pMsg
=
syncPingBuild3
(
&
srcId
,
&
destId
,
1000
);
return
pMsg
;
}
...
...
@@ -36,7 +36,7 @@ SyncPingReply *createSyncPingReply() {
srcId
.
vgId
=
100
;
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
destId
.
vgId
=
100
;
SyncPingReply
*
pMsg
=
syncPingReplyBuild3
(
&
srcId
,
&
destId
);
SyncPingReply
*
pMsg
=
syncPingReplyBuild3
(
&
srcId
,
&
destId
,
1000
);
return
pMsg
;
}
...
...
@@ -47,12 +47,12 @@ SyncClientRequest *createSyncClientRequest() {
rpcMsg
.
contLen
=
20
;
rpcMsg
.
pCont
=
rpcMallocCont
(
rpcMsg
.
contLen
);
strcpy
((
char
*
)
rpcMsg
.
pCont
,
"hello rpc"
);
SyncClientRequest
*
pMsg
=
syncClientRequestBuild2
(
&
rpcMsg
,
123
,
true
);
SyncClientRequest
*
pMsg
=
syncClientRequestBuild2
(
&
rpcMsg
,
123
,
true
,
1000
);
return
pMsg
;
}
SyncRequestVote
*
createSyncRequestVote
()
{
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
();
SyncRequestVote
*
pMsg
=
syncRequestVoteBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -64,7 +64,7 @@ SyncRequestVote *createSyncRequestVote() {
}
SyncRequestVoteReply
*
createSyncRequestVoteReply
()
{
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
pMsg
=
syncRequestVoteReplyBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -75,7 +75,7 @@ SyncRequestVoteReply *createSyncRequestVoteReply() {
}
SyncAppendEntries
*
createSyncAppendEntries
()
{
SyncAppendEntries
*
pMsg
=
syncAppendEntriesBuild
(
20
);
SyncAppendEntries
*
pMsg
=
syncAppendEntriesBuild
(
20
,
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -88,7 +88,7 @@ SyncAppendEntries *createSyncAppendEntries() {
}
SyncAppendEntriesReply
*
createSyncAppendEntriesReply
()
{
SyncAppendEntriesReply
*
pMsg
=
syncAppendEntriesReplyBuild
();
SyncAppendEntriesReply
*
pMsg
=
syncAppendEntriesReplyBuild
(
1000
);
pMsg
->
srcId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
1234
);
pMsg
->
srcId
.
vgId
=
100
;
pMsg
->
destId
.
addr
=
syncUtilAddr2U64
(
"127.0.0.1"
,
5678
);
...
...
@@ -102,7 +102,7 @@ void test1() {
SyncTimeout
*
pMsg
=
createSyncTimeout
();
SRpcMsg
rpcMsg
;
syncTimeout2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test1"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test1"
,
&
rpcMsg
);
syncTimeoutDestroy
(
pMsg
);
}
...
...
@@ -110,7 +110,7 @@ void test2() {
SyncPing
*
pMsg
=
createSyncPing
();
SRpcMsg
rpcMsg
;
syncPing2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test2"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test2"
,
&
rpcMsg
);
syncPingDestroy
(
pMsg
);
}
...
...
@@ -118,7 +118,7 @@ void test3() {
SyncPingReply
*
pMsg
=
createSyncPingReply
();
SRpcMsg
rpcMsg
;
syncPingReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test3"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test3"
,
&
rpcMsg
);
syncPingReplyDestroy
(
pMsg
);
}
...
...
@@ -126,7 +126,7 @@ void test4() {
SyncRequestVote
*
pMsg
=
createSyncRequestVote
();
SRpcMsg
rpcMsg
;
syncRequestVote2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test4"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test4"
,
&
rpcMsg
);
syncRequestVoteDestroy
(
pMsg
);
}
...
...
@@ -134,7 +134,7 @@ void test5() {
SyncRequestVoteReply
*
pMsg
=
createSyncRequestVoteReply
();
SRpcMsg
rpcMsg
;
syncRequestVoteReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test5"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test5"
,
&
rpcMsg
);
syncRequestVoteReplyDestroy
(
pMsg
);
}
...
...
@@ -142,7 +142,7 @@ void test6() {
SyncAppendEntries
*
pMsg
=
createSyncAppendEntries
();
SRpcMsg
rpcMsg
;
syncAppendEntries2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test6"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test6"
,
&
rpcMsg
);
syncAppendEntriesDestroy
(
pMsg
);
}
...
...
@@ -150,7 +150,7 @@ void test7() {
SyncAppendEntriesReply
*
pMsg
=
createSyncAppendEntriesReply
();
SRpcMsg
rpcMsg
;
syncAppendEntriesReply2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test7"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test7"
,
&
rpcMsg
);
syncAppendEntriesReplyDestroy
(
pMsg
);
}
...
...
@@ -158,14 +158,13 @@ void test8() {
SyncClientRequest
*
pMsg
=
createSyncClientRequest
();
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pMsg
,
&
rpcMsg
);
syncRpcMsg
Print
2
((
char
*
)
"test8"
,
&
rpcMsg
);
syncRpcMsg
Log
2
((
char
*
)
"test8"
,
&
rpcMsg
);
syncClientRequestDestroy
(
pMsg
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/sync
ReplicateTest2
.cpp
→
source/libs/sync/test/sync
SnapshotTest
.cpp
浏览文件 @
126801c8
...
...
@@ -8,6 +8,7 @@
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -19,37 +20,57 @@ void logTest() {
}
uint16_t
ports
[]
=
{
7010
,
7110
,
7210
,
7310
,
7410
};
int32_t
replicaNum
=
3
;
int32_t
replicaNum
=
1
;
int32_t
myIndex
=
0
;
SRaftId
ids
[
TSDB_MAX_REPLICA
];
SSyncInfo
syncInfo
;
SSyncFSM
*
pFsm
;
SSyncFSM
*
pFsm
;
SWal
*
pWal
;
SSyncNode
*
gSyncNode
;
SyncIndex
snapshotLastApplyIndex
=
SYNC_INDEX_INVALID
;
const
char
*
pDir
=
"./syncSnapshotTest"
;
const
char
*
pWalDir
=
"./syncSnapshotTest_wal"
;
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
SyncIndex
beginIndex
=
SYNC_INDEX_INVALID
;
if
(
pFsm
->
FpGetSnapshot
!=
NULL
)
{
SSnapshot
snapshot
;
pFsm
->
FpGetSnapshot
(
pFsm
,
&
snapshot
);
beginIndex
=
snapshot
.
lastApplyIndex
;
}
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
if
(
cbMeta
.
index
>
beginIndex
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
else
{
sTrace
(
"==callback== ==CommitCb== do not apply again %ld"
,
cbMeta
.
index
);
}
}
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
c
ode
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
cbMeta
.
index
,
c
bMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsgPrint2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsgLog2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
int32_t
GetSnapshotCb
(
struct
SSyncFSM
*
pFsm
,
SSnapshot
*
pSnapshot
)
{
pSnapshot
->
data
=
NULL
;
pSnapshot
->
lastApplyIndex
=
snapshotLastApplyIndex
;
pSnapshot
->
lastApplyTerm
=
100
;
return
0
;
}
void
initFsm
()
{
...
...
@@ -57,16 +78,17 @@ void initFsm() {
pFsm
->
FpCommitCb
=
CommitCb
;
pFsm
->
FpPreCommitCb
=
PreCommitCb
;
pFsm
->
FpRollBackCb
=
RollBackCb
;
pFsm
->
FpGetSnapshot
=
GetSnapshotCb
;
}
int64_t
syncNodeInit
()
{
SSyncNode
*
syncNodeInit
()
{
syncInfo
.
vgId
=
1234
;
syncInfo
.
rpcClient
=
gSyncIO
->
clientRpc
;
syncInfo
.
FpSendMsg
=
syncIOSendMsg
;
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"
./replicate2_test_%d"
,
myIndex
);
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"
%s"
,
pDir
);
int
code
=
walInit
();
assert
(
code
==
0
);
...
...
@@ -79,10 +101,7 @@ int64_t syncNodeInit() {
walCfg
.
retentionSize
=
1000
;
walCfg
.
segSize
=
1000
;
walCfg
.
level
=
TAOS_WAL_FSYNC
;
char
tmpdir
[
128
];
snprintf
(
tmpdir
,
sizeof
(
tmpdir
),
"./replicate2_test_wal_%d"
,
myIndex
);
pWal
=
walOpen
(
tmpdir
,
&
walCfg
);
pWal
=
walOpen
(
pWalDir
,
&
walCfg
);
assert
(
pWal
!=
NULL
);
syncInfo
.
pWal
=
pWal
;
...
...
@@ -94,33 +113,29 @@ int64_t syncNodeInit() {
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
pCfg
->
nodeInfo
[
i
].
nodePort
=
ports
[
i
];
snprintf
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
,
sizeof
(
pCfg
->
nodeInfo
[
i
].
nodeFqdn
),
"%s"
,
"127.0.0.1"
);
//
taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
taosGetFqdn
(
pCfg
->
nodeInfo
[
0
].
nodeFqdn
);
}
int64_t
rid
=
syncStart
(
&
syncInfo
);
assert
(
rid
>
0
);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
SSyncNode
*
pSyncNode
=
syncNodeOpen
(
&
syncInfo
);
assert
(
pSyncNode
!=
NULL
);
// pSyncNode->hbBaseLine = 500;
// pSyncNode->electBaseLine = 1500;
gSyncIO
->
FpOnSyncPing
=
pSyncNode
->
FpOnPing
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
FpOnSyncPingReply
=
pSyncNode
->
FpOnPingReply
;
gSyncIO
->
FpOnSyncRequestVote
=
pSyncNode
->
FpOnRequestVote
;
gSyncIO
->
FpOnSyncRequestVoteReply
=
pSyncNode
->
FpOnRequestVoteReply
;
gSyncIO
->
FpOnSyncAppendEntries
=
pSyncNode
->
FpOnAppendEntries
;
gSyncIO
->
FpOnSyncAppendEntriesReply
=
pSyncNode
->
FpOnAppendEntriesReply
;
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
FpOnSyncClientRequest
=
pSyncNode
->
FpOnClientRequest
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNode
Release
(
pSyncNode
);
syncNode
Start
(
pSyncNode
);
return
rid
;
return
pSyncNode
;
}
SSyncNode
*
syncInitTest
()
{
return
syncNodeInit
();
}
void
initRaftId
(
SSyncNode
*
pSyncNode
)
{
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
ids
[
i
]
=
pSyncNode
->
replicasId
[
i
];
...
...
@@ -130,18 +145,18 @@ void initRaftId(SSyncNode *pSyncNode) {
}
}
SRpcMsg
*
step0
(
int
i
)
{
SRpcMsg
*
step0
()
{
SRpcMsg
*
pMsg
=
(
SRpcMsg
*
)
taosMemoryMalloc
(
sizeof
(
SRpcMsg
));
memset
(
pMsg
,
0
,
sizeof
(
SRpcMsg
));
pMsg
->
msgType
=
9999
;
pMsg
->
contLen
=
128
;
pMsg
->
contLen
=
32
;
pMsg
->
pCont
=
taosMemoryMalloc
(
pMsg
->
contLen
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"
value-%u-%d"
,
ports
[
myIndex
],
i
);
snprintf
((
char
*
)(
pMsg
->
pCont
),
pMsg
->
contLen
,
"
hello, world"
);
return
pMsg
;
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
,
1000
);
return
pRetMsg
;
}
...
...
@@ -153,51 +168,45 @@ int main(int argc, char **argv) {
myIndex
=
0
;
if
(
argc
>=
2
)
{
m
yIndex
=
atoi
(
argv
[
1
]);
snapshotLastAppl
yIndex
=
atoi
(
argv
[
1
]);
}
sTrace
(
"--snapshotLastApplyIndex : %ld
\n
"
,
snapshotLastApplyIndex
);
int32_t
ret
=
syncIOStart
((
char
*
)
"127.0.0.1"
,
ports
[
myIndex
]);
assert
(
ret
==
0
);
initFsm
();
ret
=
syncInit
();
ret
=
syncEnvStart
();
assert
(
ret
==
0
);
int64_t
rid
=
syncNodeInit
();
assert
(
rid
>
0
);
// taosRemoveDir(pWalDir);
SSyncNode
*
pSyncNode
=
(
SSyncNode
*
)
syncNodeAcquire
(
rid
);
assert
(
pSyncNode
!=
NULL
);
initFsm
();
gSyncNode
=
syncInitTest
();
assert
(
gSyncNode
!=
NULL
);
syncNodeLog2
((
char
*
)
""
,
gSyncNode
);
syncNodePrint2
((
char
*
)
""
,
pSyncNode
);
initRaftId
(
pSyncNode
);
initRaftId
(
gSyncNode
);
for
(
int
i
=
0
;
i
<
30
;
++
i
)
{
// step0
SRpcMsg
*
pMsg0
=
step0
(
i
);
syncRpcMsgPrint
2
((
char
*
)
"==step0=="
,
pMsg0
);
SRpcMsg
*
pMsg0
=
step0
(
);
syncRpcMsgLog
2
((
char
*
)
"==step0=="
,
pMsg0
);
syncPropose
(
rid
,
pMsg0
,
true
);
taosMsleep
(
1000
);
// step1
SyncClientRequest
*
pMsg1
=
step1
(
pMsg0
);
syncClientRequestLog2
((
char
*
)
"==step1=="
,
pMsg1
);
taosMemoryFree
(
pMsg0
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
SyncClientRequest
*
pSyncClientRequest
=
pMsg1
;
SRpcMsg
rpcMsg
;
syncClientRequest2RpcMsg
(
pSyncClientRequest
,
&
rpcMsg
);
gSyncNode
->
FpEqMsg
(
gSyncNode
->
queue
,
&
rpcMsg
);
sTrace
(
"syncPropose sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
,
pSyncNode
->
commitIndex
);
taosMsleep
(
1000
);
}
while
(
1
)
{
sTrace
(
"replicate sleep, state: %d, %s, term:%lu electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, "
"electTimerMS:%d, commitIndex:%ld"
,
pSyncNode
->
state
,
syncUtilState2String
(
pSyncNode
->
state
),
pSyncNode
->
pRaftStore
->
currentTerm
,
pSyncNode
->
electTimerLogicClock
,
pSyncNode
->
electTimerLogicClockUser
,
pSyncNode
->
electTimerMS
,
pSyncNode
->
commitIndex
);
sTrace
(
"while 1 sleep"
);
taosMsleep
(
1000
);
}
...
...
source/libs/sync/test/syncTest.cpp
浏览文件 @
126801c8
...
...
@@ -2,22 +2,62 @@
#include <stdio.h>
#include "syncIO.h"
#include "syncInt.h"
#include "syncRaftStore.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
sDebug
(
"--- sync log test: debug"
);
sInfo
(
"--- sync log test: info"
);
sWarn
(
"--- sync log test: warn"
);
sError
(
"--- sync log test: error"
);
sFatal
(
"--- sync log test: fatal"
);
/*
typedef enum {
DEBUG_FATAL = 1,
DEBUG_ERROR = 1,
DEBUG_WARN = 2,
DEBUG_INFO = 2,
DEBUG_DEBUG = 4,
DEBUG_TRACE = 8,
DEBUG_DUMP = 16,
DEBUG_SCREEN = 64,
DEBUG_FILE = 128
} ELogLevel;
*/
void
logTest
(
char
*
s
)
{
sFatal
(
"==%s== sync log test: fatal"
,
s
);
sError
(
"==%s== sync log test: error"
,
s
);
sWarn
(
"==%s== sync log test: warn"
,
s
);
sInfo
(
"==%s== sync log test: info"
,
s
);
sDebug
(
"==%s== sync log test: debug"
,
s
);
sTrace
(
"==%s== sync log test: trace"
,
s
);
}
void
test1
()
{
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
((
char
*
)
__FUNCTION__
);
}
void
test2
()
{
sDebugFlag
=
DEBUG_DEBUG
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
((
char
*
)
__FUNCTION__
);
}
void
test3
()
{
sDebugFlag
=
DEBUG_INFO
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
((
char
*
)
__FUNCTION__
);
}
void
test4
()
{
sDebugFlag
=
DEBUG_ERROR
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
((
char
*
)
__FUNCTION__
);
}
int
main
()
{
// taosInitLog(
(char *)"syncTest.log", 100000, 1
0);
// taosInitLog(
"tmp/syncTest.log", 10
0);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
logTest
();
test1
();
test2
();
test3
();
test4
();
// taosCloseLog();
return
0
;
}
source/libs/sync/test/syncTimeoutTest.cpp
浏览文件 @
126801c8
...
...
@@ -17,13 +17,13 @@ void logTest() {
int
gg
=
0
;
SyncTimeout
*
createMsg
()
{
SyncTimeout
*
pMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_PING
,
999
,
333
,
&
gg
);
SyncTimeout
*
pMsg
=
syncTimeoutBuild2
(
SYNC_TIMEOUT_PING
,
999
,
333
,
1000
,
&
gg
);
return
pMsg
;
}
void
test1
()
{
SyncTimeout
*
pMsg
=
createMsg
();
syncTimeout
Print
2
((
char
*
)
"test1:"
,
pMsg
);
syncTimeout
Log
2
((
char
*
)
"test1:"
,
pMsg
);
syncTimeoutDestroy
(
pMsg
);
}
...
...
@@ -34,7 +34,7 @@ void test2() {
syncTimeoutSerialize
(
pMsg
,
serialized
,
len
);
SyncTimeout
*
pMsg2
=
syncTimeoutBuild
();
syncTimeoutDeserialize
(
serialized
,
len
,
pMsg2
);
syncTimeout
Print
2
((
char
*
)
"test2: syncTimeoutSerialize -> syncTimeoutDeserialize "
,
pMsg2
);
syncTimeout
Log
2
((
char
*
)
"test2: syncTimeoutSerialize -> syncTimeoutDeserialize "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncTimeoutDestroy
(
pMsg
);
...
...
@@ -46,7 +46,7 @@ void test3() {
uint32_t
len
;
char
*
serialized
=
syncTimeoutSerialize2
(
pMsg
,
&
len
);
SyncTimeout
*
pMsg2
=
syncTimeoutDeserialize2
(
serialized
,
len
);
syncTimeout
Print
2
((
char
*
)
"test3: syncTimeoutSerialize3 -> syncTimeoutDeserialize2 "
,
pMsg2
);
syncTimeout
Log
2
((
char
*
)
"test3: syncTimeoutSerialize3 -> syncTimeoutDeserialize2 "
,
pMsg2
);
taosMemoryFree
(
serialized
);
syncTimeoutDestroy
(
pMsg
);
...
...
@@ -59,8 +59,9 @@ void test4() {
syncTimeout2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncTimeout
*
pMsg2
=
(
SyncTimeout
*
)
taosMemoryMalloc
(
rpcMsg
.
contLen
);
syncTimeoutFromRpcMsg
(
&
rpcMsg
,
pMsg2
);
syncTimeout
Print
2
((
char
*
)
"test4: syncTimeout2RpcMsg -> syncTimeoutFromRpcMsg "
,
pMsg2
);
syncTimeout
Log
2
((
char
*
)
"test4: syncTimeout2RpcMsg -> syncTimeoutFromRpcMsg "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncTimeoutDestroy
(
pMsg
);
syncTimeoutDestroy
(
pMsg2
);
}
...
...
@@ -70,16 +71,16 @@ void test5() {
SRpcMsg
rpcMsg
;
syncTimeout2RpcMsg
(
pMsg
,
&
rpcMsg
);
SyncTimeout
*
pMsg2
=
syncTimeoutFromRpcMsg2
(
&
rpcMsg
);
syncTimeout
Print
2
((
char
*
)
"test5: syncTimeout2RpcMsg -> syncTimeoutFromRpcMsg2 "
,
pMsg2
);
syncTimeout
Log
2
((
char
*
)
"test5: syncTimeout2RpcMsg -> syncTimeoutFromRpcMsg2 "
,
pMsg2
);
rpcFreeCont
(
rpcMsg
.
pCont
);
syncTimeoutDestroy
(
pMsg
);
syncTimeoutDestroy
(
pMsg2
);
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
test1
();
...
...
source/libs/sync/test/syncUtilTest.cpp
浏览文件 @
126801c8
...
...
@@ -22,9 +22,8 @@ void electRandomMSTest() {
}
int
main
()
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
logTest
();
electRandomMSTest
();
...
...
source/libs/sync/test/syncVotesGrantedTest.cpp
浏览文件 @
126801c8
...
...
@@ -72,9 +72,8 @@ void initRaftId(SSyncNode* pSyncNode) {
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
...
...
@@ -118,7 +117,7 @@ int main(int argc, char** argv) {
}
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
SyncRequestVoteReply
*
reply
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
reply
=
syncRequestVoteReplyBuild
(
1000
);
reply
->
destId
=
pSyncNode
->
myRaftId
;
reply
->
srcId
=
ids
[
i
];
reply
->
term
=
term
;
...
...
source/libs/sync/test/syncVotesRespondTest.cpp
浏览文件 @
126801c8
...
...
@@ -72,9 +72,8 @@ void initRaftId(SSyncNode* pSyncNode) {
}
int
main
(
int
argc
,
char
**
argv
)
{
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog
=
0
;
sDebugFlag
=
143
+
64
;
sDebugFlag
=
DEBUG_TRACE
+
DEBUG_SCREEN
+
DEBUG_FILE
;
myIndex
=
0
;
if
(
argc
>=
2
)
{
...
...
@@ -118,7 +117,7 @@ int main(int argc, char** argv) {
}
for
(
int
i
=
0
;
i
<
replicaNum
;
++
i
)
{
SyncRequestVoteReply
*
reply
=
syncRequestVoteReplyBuild
();
SyncRequestVoteReply
*
reply
=
syncRequestVoteReplyBuild
(
1000
);
reply
->
destId
=
pSyncNode
->
myRaftId
;
reply
->
srcId
=
ids
[
i
];
reply
->
term
=
term
;
...
...
source/libs/sync/test/syncWriteTest.cpp
浏览文件 @
126801c8
...
...
@@ -8,6 +8,7 @@
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "wal.h"
void
logTest
()
{
sTrace
(
"--- sync log test: trace"
);
...
...
@@ -28,29 +29,28 @@ SSyncFSM * pFsm;
SWal
*
pWal
;
SSyncNode
*
gSyncNode
;
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
const
char
*
pDir
=
"./syncWriteTest"
;
void
CommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
PreCommitCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
c
ode
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
"==callback== ==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
cbMeta
.
index
,
c
bMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SyncIndex
index
,
bool
isWeak
,
int32_t
code
,
ESyncState
state
)
{
void
RollBackCb
(
struct
SSyncFSM
*
pFsm
,
const
SRpcMsg
*
pMsg
,
SFsmCbMeta
cbMeta
)
{
char
logBuf
[
256
];
snprintf
(
logBuf
,
sizeof
(
logBuf
),
"==callback== ==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d, state:%d %s
\n
"
,
pFsm
,
index
,
isWeak
,
code
,
state
,
syncUtilState2String
(
state
));
syncRpcMsg
Print
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
pFsm
,
cbMeta
.
index
,
cbMeta
.
isWeak
,
cbMeta
.
code
,
cbMeta
.
state
,
syncUtilState2String
(
cbMeta
.
state
));
syncRpcMsg
Log
2
(
logBuf
,
(
SRpcMsg
*
)
pMsg
);
}
void
initFsm
()
{
...
...
@@ -67,7 +67,7 @@ SSyncNode *syncNodeInit() {
syncInfo
.
queue
=
gSyncIO
->
pMsgQ
;
syncInfo
.
FpEqMsg
=
syncIOEqMsg
;
syncInfo
.
pFsm
=
pFsm
;
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
"./write_test"
);
snprintf
(
syncInfo
.
path
,
sizeof
(
syncInfo
.
path
),
"%s"
,
pDir
);
int
code
=
walInit
();
assert
(
code
==
0
);
...
...
@@ -108,6 +108,8 @@ SSyncNode *syncNodeInit() {
gSyncIO
->
FpOnSyncTimeout
=
pSyncNode
->
FpOnTimeout
;
gSyncIO
->
pSyncNode
=
pSyncNode
;
syncNodeStart
(
pSyncNode
);
return
pSyncNode
;
}
...
...
@@ -133,7 +135,7 @@ SRpcMsg *step0() {
}
SyncClientRequest
*
step1
(
const
SRpcMsg
*
pMsg
)
{
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
);
SyncClientRequest
*
pRetMsg
=
syncClientRequestBuild2
(
pMsg
,
123
,
true
,
1000
);
return
pRetMsg
;
}
...
...
@@ -160,17 +162,17 @@ int main(int argc, char **argv) {
gSyncNode
=
syncInitTest
();
assert
(
gSyncNode
!=
NULL
);
syncNode
Print
2
((
char
*
)
""
,
gSyncNode
);
syncNode
Log
2
((
char
*
)
""
,
gSyncNode
);
initRaftId
(
gSyncNode
);
// step0
SRpcMsg
*
pMsg0
=
step0
();
syncRpcMsg
Print
2
((
char
*
)
"==step0=="
,
pMsg0
);
syncRpcMsg
Log
2
((
char
*
)
"==step0=="
,
pMsg0
);
// step1
SyncClientRequest
*
pMsg1
=
step1
(
pMsg0
);
syncClientRequest
Print
2
((
char
*
)
"==step1=="
,
pMsg1
);
syncClientRequest
Log
2
((
char
*
)
"==step1=="
,
pMsg1
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
SyncClientRequest
*
pSyncClientRequest
=
pMsg1
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录