TestOneSplit3B遇到request Timeout问题

经检查是因为网络分区,因其中一个分区一直在超时选举Term很大,合并时导致Leader退回Follow重新开始选举,而测试最后 req := NewRequest(left.GetId(), left.GetRegionEpoch(), []*raft_cmdpb.Request{NewGetCfCmd(engine_util.CfDefault, []byte(“k2”))}) 这个Request是紧接着分区合并就开始请求了,而此时因为集群还在选举会一直request Timeout,有小概率在请求timeout时间内Leader选举不出来导致最终resp为nil,出现错误 请问是不是应该加上preVote,或者有什么好的解决方法吗

我说一下我的解决方案: 首先由于分区的原因,如果 leader 在多的一个分区,合并的时候有可能因为 follower term 更大而导致重新选举,从而造成超时。 因此可以让 leader 在收到 resp 的时候,如果发现 follower 的 term 比自己大,不立刻退位,而是忽略这个消息。这样的结果就是: 1、follower 拥有最新的日志:那么 follower 就可能当选 leader,这样会短暂出现脑裂现象,但是在旧 leader 收到新 leader 的一个心跳之后,由于新 leader term 大于旧 leader,旧 leader 就会退位 2、follower 没有拥有最新的日志,那么我们让它在收到足够多的 reject 的时候更新自己的 term(有可能更新一次 term 之后还是更大,但是由于 reject 消息是超过多半发送的,所以迟早能更新到正确的 term) 这样子能保证分区之后能平滑过渡 leader 或者不进行 leader 更改,不知道有没有潜在的 corner case,如果存在的话请联系我一下