public override void OnHandshakeDone(AsyncSocket so) { base.OnHandshakeDone(so); // 没有判断是否和其他Raft-Node的连接。 if (Raft.IsLeader && Raft.LeaderReadyEvent.WaitOne(0)) { var r = new LeaderIs(); r.Argument.Term = Raft.LogSequence.Term; r.Argument.LeaderId = Raft.LeaderId; r.Send(so); // skip result } }
private void TrySendLeaderIs(AsyncSocket sender) { if (Raft.HasLeader) { // redirect var redirect = new LeaderIs(); redirect.Argument.Term = Raft.LogSequence.Term; redirect.Argument.LeaderId = Raft.LeaderId; redirect.Send(sender); // ignore response // DONOT process application request. return; } }
internal void SetLeaderReady() { if (IsLeader) { LeaderReadyEvent.Set(); Monitor.PulseAll(this); Server.Foreach( (allsocket) => { // 本来这个通告发给Agent(client)即可, // 但是现在没有区分是来自Raft的连接还是来自Agent, // 全部发送。 // 另外Raft之间有两个连接,会收到多次,Raft不处理这个通告。 // 由于Raft数量不多,不会造成大的浪费,不做处理了。 var r = new LeaderIs(); r.Argument.Term = LogSequence.Term; r.Argument.LeaderId = LeaderId; r.Send(allsocket); // skip response. }); } }