Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b74e0b07
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
未验证
提交
b74e0b07
编写于
12月 19, 2022
作者:
S
Shengliang Guan
提交者:
GitHub
12月 19, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19004 from taosdata/FIX/TD-21169-main
fix: allow to rollback sync log buffer beyond startIndex with refill
上级
6e64951c
a2181081
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
20 addition
and
4 deletion
+20
-4
source/libs/sync/src/syncPipeline.c
source/libs/sync/src/syncPipeline.c
+20
-4
未找到文件。
source/libs/sync/src/syncPipeline.c
浏览文件 @
b74e0b07
...
...
@@ -275,6 +275,8 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
SyncIndex
index
=
pEntry
->
index
;
SyncIndex
prevIndex
=
pEntry
->
index
-
1
;
SyncTerm
lastMatchTerm
=
syncLogBufferGetLastMatchTerm
(
pBuf
);
SSyncRaftEntry
*
pExist
=
NULL
;
bool
inBuf
=
true
;
if
(
index
<=
pBuf
->
commitIndex
)
{
sTrace
(
"vgId:%d, already committed. index: %"
PRId64
", term: %"
PRId64
". log buffer: [%"
PRId64
" %"
PRId64
...
...
@@ -306,10 +308,9 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
}
// check current in buffer
SSyncRaftEntry
*
pExist
=
pBuf
->
entries
[
index
%
pBuf
->
size
].
pItem
;
pExist
=
syncLogBufferGetOneEntry
(
pBuf
,
pNode
,
index
,
&
inBuf
)
;
if
(
pExist
!=
NULL
)
{
ASSERT
(
pEntry
->
index
==
pExist
->
index
);
if
(
pEntry
->
term
!=
pExist
->
term
)
{
(
void
)
syncLogBufferRollback
(
pBuf
,
pNode
,
index
);
}
else
{
...
...
@@ -317,14 +318,15 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
" %"
PRId64
" %"
PRId64
", %"
PRId64
")"
,
pNode
->
vgId
,
pEntry
->
index
,
pEntry
->
term
,
pBuf
->
startIndex
,
pBuf
->
commitIndex
,
pBuf
->
matchIndex
,
pBuf
->
endIndex
);
SyncTerm
existPrevTerm
=
pBuf
->
entries
[
index
%
pBuf
->
size
].
prevLogTerm
;
ASSERT
(
pEntry
->
term
==
pExist
->
term
&&
prevTerm
==
existPrevTerm
);
SyncTerm
existPrevTerm
=
syncLogReplMgrGetPrevLogTerm
(
NULL
,
pNode
,
index
)
;
ASSERT
(
pEntry
->
term
==
pExist
->
term
&&
(
pEntry
->
index
>
pBuf
->
matchIndex
||
prevTerm
==
existPrevTerm
)
);
ret
=
0
;
goto
_out
;
}
}
// update
ASSERT
(
pBuf
->
entries
[
index
%
pBuf
->
size
].
pItem
==
NULL
);
SSyncLogBufEntry
tmp
=
{.
pItem
=
pEntry
,
.
prevLogIndex
=
prevIndex
,
.
prevLogTerm
=
prevTerm
};
pEntry
=
NULL
;
pBuf
->
entries
[
index
%
pBuf
->
size
]
=
tmp
;
...
...
@@ -337,6 +339,10 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
_out:
syncEntryDestroy
(
pEntry
);
if
(
!
inBuf
)
{
syncEntryDestroy
(
pExist
);
pExist
=
NULL
;
}
syncLogBufferValidate
(
pBuf
);
taosThreadMutexUnlock
(
&
pBuf
->
mutex
);
return
ret
;
...
...
@@ -1008,6 +1014,16 @@ int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex
lastVer
=
pNode
->
pLogStore
->
syncLogLastIndex
(
pNode
->
pLogStore
);
ASSERT
(
toIndex
==
lastVer
+
1
);
// refill buffer on need
if
(
toIndex
<=
pBuf
->
startIndex
)
{
int32_t
ret
=
syncLogBufferInitWithoutLock
(
pBuf
,
pNode
);
if
(
ret
<
0
)
{
sError
(
"vgId:%d, failed to refill sync log buffer since %s"
,
pNode
->
vgId
,
terrstr
());
return
-
1
;
}
}
ASSERT
(
pBuf
->
endIndex
==
toIndex
);
syncLogBufferValidate
(
pBuf
);
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录