private void ProcessElections()
        {
            var gossipUpdate = new GossipMessage.GossipUpdated(_electionsUnit.ClusterInfo);

            _electionsUnit.Publish(gossipUpdate);

            _electionsUnit.Publish(new ElectionMessage.StartElections());

            _electionsUnit.RepublishFromPublisher();

            _electionsUnit.RepublishFromPublisher();
            Assert.That(
                _electionsUnit.Publisher.Messages.All(x => x is HttpMessage.SendOverHttp || x is TimerMessage.Schedule),
                Is.True,
                "Only OverHttp or Schedule messages are expected.");

            _electionsUnit.RepublishFromPublisher();

            _electionsUnit.RepublishFromPublisher();
            Assert.That(
                _electionsUnit.Publisher.Messages.All(x => x is HttpMessage.SendOverHttp || x is TimerMessage.Schedule),
                Is.True,
                "Only OverHttp or Schedule messages are expected.");

            _electionsUnit.RepublishFromPublisher();
        }
Exemple #2
0
 public void Handle(GossipMessage.GossipUpdated message)
 {
     _servers = message.ClusterInfo.Members.Where(x => x.State != VNodeState.Manager)
                .Where(x => x.IsAlive)
                .OrderByDescending(x => x.InternalHttpEndPoint, IPComparer)
                .ToArray();
 }
        public void Process(int iteration, RandTestQueueItem item)
        {
            var electionsDone = item.Message as ElectionMessage.ElectionsDone;

            if (electionsDone != null)
            {
                MemberInfo[] previousMembers;
                if (_previousGossip.TryGetValue(item.EndPoint, out previousMembers))
                {
                    var masterMemberIndex = Array.FindIndex(previousMembers,
                                                            x => x.Is(electionsDone.Master.InternalHttpEndPoint));
                    if (masterMemberIndex != -1)
                    {
                        var previousMasterInfo = previousMembers[masterMemberIndex];
                        var masterEndPoint     = previousMasterInfo.InternalHttpEndPoint;

                        previousMembers[masterMemberIndex] =
                            MemberInfo.ForVNode(previousMasterInfo.InstanceId, DateTime.UtcNow, VNodeState.Master,
                                                previousMasterInfo.IsAlive,
                                                masterEndPoint, null, masterEndPoint, null, masterEndPoint, masterEndPoint,
                                                -1, 0, 0, -1, -1, Guid.Empty, 0);
                    }
                }
            }

            var updatedGossip = _createUpdatedGossip(iteration, item, _instances, _initialGossip, _previousGossip);

            if (updatedGossip != null)
            {
                if (updatedGossip.Length > _instances.Length)
                {
                    throw new InvalidDataException(
                              "Gossip should not contain more items than there are servers in the cluster.");
                }

                _processedItems.Add(item);

                foreach (var memberInfo in updatedGossip)
                {
                    _sendOverHttpProcessor.RegisterEndpointToSkip(memberInfo.ExternalTcpEndPoint, !memberInfo.IsAlive);
                }

                var updateGossipMessage = new GossipMessage.GossipUpdated(new ClusterInfo(updatedGossip));

                _enqueue(item, updateGossipMessage);
                _previousGossip[item.EndPoint] = updatedGossip;

                var master =
                    updateGossipMessage.ClusterInfo.Members.FirstOrDefault(x =>
                                                                           x.IsAlive && x.State == VNodeState.Master);
                if (master == null)
                {
                    _enqueue(item, new ElectionMessage.StartElections());
                }
            }
        }
        protected virtual GossipMessage.GossipUpdated GetInitialGossipFor(ElectionsInstance instance,
                                                                          List <ElectionsInstance> allInstances)
        {
            var members = allInstances.Select(
                x => MemberInfo.ForVNode(x.InstanceId, DateTime.UtcNow, VNodeState.Unknown, true,
                                         x.EndPoint, null, x.EndPoint, null, x.EndPoint, x.EndPoint, -1, 0, 0, -1, -1, Guid.Empty, 0));
            var gossip = new GossipMessage.GossipUpdated(new ClusterInfo(members.ToArray()));

            return(gossip);
        }
        private void ProcessElections()
        {
            var gossipUpdate = new GossipMessage.GossipUpdated(_electionsUnit.ClusterInfo);

            _electionsUnit.Publish(gossipUpdate);

            _electionsUnit.Publish(new ElectionMessage.StartElections());

            _electionsUnit.RepublishFromPublisher();
        }
Exemple #6
0
        private void HandleAsMaster(GossipMessage.GossipUpdated message)
        {
            if (_master == null)
            {
                throw new Exception("_master == null");
            }
            if (message.ClusterInfo.Members.Count(x => x.IsAlive && x.State == VNodeState.Master) > 1)
            {
                Log.Debug("There are FEW MASTERS according to gossip, need to start elections. MASTER: [{0}].\nGOSSIP:\n{1}",
                          _master, message.ClusterInfo);
                _mainQueue.Publish(new ElectionMessage.StartElections());
            }

            _outputBus.Publish(message);
        }
        private void HandleAsNonMaster(GossipMessage.GossipUpdated message)
        {
            if (_master == null)
            {
                throw new Exception("_master == null");
            }
            var master = message.ClusterInfo.Members.FirstOrDefault(x => x.InstanceId == _master.InstanceId);

            if (master == null || !master.IsAlive)
            {
                Log.Debug("There is NO MASTER or MASTER is DEAD according to GOSSIP. Starting new elections. MASTER: [{0}].", _master);
                _mainQueue.Publish(new ElectionMessage.StartElections());
            }

            _outputBus.Publish(message);
        }