Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
        }