-
Notifications
You must be signed in to change notification settings - Fork 886
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pipeline + NoCache 情况下,可能出现 Can't truncate logs before _applied_id=22, last_log_kept=0 #421
Comments
取消 rpc 为什么进入下面的分支? 应该是判断 braft/src/braft/replicator.cpp Lines 400 to 416 in 59c40e5
|
被取消的第一个rpc应该是进入了 感觉出问题的是先到达的第二个 rpc, cntl->Failed() 没有失败,但是由于 log gap存在,Cache 又未开启,所以 response->success() 是 false, response->last_log_index() + 1 又等于 r->_next_index ,就进入了 truncate log 分枝。 |
确实会存在这个问题,能否提个PR fix 这个问题呢 👍 ? |
这里还不能直接把条件改成 |
--- a/src/braft/replicator.cpp
+++ b/src/braft/replicator.cpp
@@ -450,9 +450,11 @@ void Replicator::_on_rpc_returned(ReplicatorId id, brpc::Controller* cntl,
// The peer contains logs from old term which should be truncated,
// decrease _last_log_at_peer by one to test the right index to keep
if (BAIDU_LIKELY(r->_next_index > 1)) {
- BRAFT_VLOG << "Group " << r->_options.group_id
- << " log_index=" << r->_next_index << " mismatch";
+ BRAFT_VLOG << "Group " << r->_options.group_id
+ << " log_index=" << r->_next_index << " mismatch";
+ if (request->prev_log_index() == r->_next_index - 1) {
--r->_next_index;
+ }
} else {
LOG(ERROR) << "Group " << r->_options.group_id
<< " peer=" << r->_options.peer_id 这样可行吗? 把相等判断放到下面,只有当 首先最小的请求一定会被处理,如果是 如果是 leader 安装快照的场景,这个条件就不会被触发,因为最小的 prev_log_index 一定能匹配 term。 其他情况也不会有影响,因为当前最小的请求的 term 不匹配,那么之后的请求也一定不匹配。 |
场景:
1. leader 给某个 peer 安装快照 [last_included_index=22],完成后 _next_index = 23
2. 然后leader 先后发送两个 append entries rpc , 分别复制log [23, 28] 和 [29,32]
如果网络原因导致第二个 append entries rpc 先到达。在 NoCache 情况下,会失败。 replicator 把 _next_index 重置并取消掉第一个 rpc。 下面的这个检查又进入到了 truncate log 的分枝。_next_index--,也就是设置为 22。但实际上peer上仅仅是缺少了日志,应该是第一个分支。
braft/src/braft/replicator.cpp
Lines 442 to 463 in 59c40e5
后续 append entries 的时候, prev_index = 21 , peer 上是没有的,仍然会失败。然后不停地减小 _next_index 重试,直到变成0触发了 peer 上的 truncate suffix。
The text was updated successfully, but these errors were encountered: