public void NewRbroadcastedMessage(Messages.Rbroadcast m) { if (faultyServers.Contains(Sender)) { return; } if (m.Round < currentRound) { return; } if (m.Round > currentRound) { Stash.Stash(); return; } if (stageMsg == null) { SendMyMessage(); } if (stageDeliveredMsgs.Add(m)) // not yet delivered { stageReceivedFrom.Add(Sender); foreach (var s in reliableSuccessors) { s.Forward(m); } trackingGraphs[Sender].Clear(); if (deploymentConfig.ThisServerNumber == 0) { SendTrackGraphLogMsg(); } if (stageNewMemberFlag && stageReceivedFrom.SetEquals(olds)) { SendLogMsg("Joining completed."); var p = Context.ActorSelection($"akka.tcp://{Program.SystemName}@{newMember.HostName}:{newMember.Port}/user/ack"); List <HostInfo> hConfig = new List <HostInfo>(); foreach (var h in deploymentConfig.Hosts) { hConfig.Add(h); } p.Tell(new Messages.MembershipResponse(hConfig.AsReadOnly(), currentRound)); stageNewMemberFlag = false; } } CheckTermination(); }
public void SendMyMessage() { timer.Restart(); Messages.Rbroadcast rbm; if (pendingMessages.Count == 0) { stageMsg = EMPTY_MSG; rbm = new Messages.Rbroadcast(stageMsg, currentRound); } else { var list = new List <Messages.Abroadcast>(); int c = ACTOR_CAP; if (pendingMessages.Count > ACTOR_CAP) { c *= 3; } for (int i = 0; i < c && i < pendingMessages.Count; i++) { list.Add(pendingMessages.Dequeue()); } stageMsg = new Messages.Abroadcast(list.AsReadOnly()); rbm = new Messages.Rbroadcast(stageMsg, currentRound); } foreach (var s in reliableSuccessors) { s.Tell(rbm); } stageDeliveredMsgs.Add(rbm); stageReceivedFrom.Add(Self); CheckTermination(); }