Пример #1
0
        public void Handle(GossipMessage.GossipSendFailed message)
        {
            var node = _cluster.Members.FirstOrDefault(x => x.Is(message.Recipient));

            if (node == null || !node.IsAlive)
            {
                return;
            }

            if (CurrentLeader != null && node.InstanceId == CurrentLeader.InstanceId)
            {
                Log.Information(
                    "Leader [{leaderEndPoint}, {instanceId:B}] appears to be DEAD (Gossip send failed); wait for TCP to decide.",
                    message.Recipient, node.InstanceId);
                return;
            }

            Log.Information("Looks like node [{nodeEndPoint}] is DEAD (Gossip send failed).", message.Recipient);

            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.Recipient)
                                        ? x.Updated(_timeProvider.UtcNow, isAlive: false)
                                        : x,
                                     _timeProvider, DeadMemberRemovalPeriod);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, $"gossip send failed to [{message.Recipient}]");
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #2
0
        public void Handle(GossipMessage.GossipSendFailed message)
        {
            var node = _cluster.Members.FirstOrDefault(x => x.Is(message.Recipient));

            if (node == null || !node.IsAlive)
            {
                return;
            }

            if (CurrentMaster != null && node.InstanceId == CurrentMaster.InstanceId)
            {
                Log.Trace("Looks like master [{0}, {1:B}] is DEAD (Gossip send failed), though we wait for TCP to decide.",
                          message.Recipient, node.InstanceId);
                return;
            }
            Log.Trace("Looks like node [{0}] is DEAD (Gossip send failed).", message.Recipient);

            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.Recipient) ? x.Updated(isAlive: false) : x);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, string.Format("gossip send failed to [{0}]", message.Recipient));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #3
0
        public void Handle(SystemMessage.VNodeConnectionEstablished message)
        {
            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.VNodeEndPoint) ? x.Updated(isAlive: true) : x);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, string.Format("TCP connection established to [{0}]", message.VNodeEndPoint));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #4
0
        public void Handle(ElectionMessage.ElectionsDone message)
        {
            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster,
                                     x => x.InstanceId == message.Master.InstanceId
                                        ? x.Updated(VNodeState.Master)
                                        : x.Updated(VNodeState.Unknown));
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, "Elections Done");
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #5
0
        public void Handle(ElectionMessage.ElectionsDone message)
        {
            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster,
                                     x => x.InstanceId == message.Leader.InstanceId
                                        ? x.Updated(_timeProvider.UtcNow, VNodeState.Leader)
                                        : x.Updated(_timeProvider.UtcNow, VNodeState.Unknown),
                                     _timeProvider, DeadMemberRemovalPeriod);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, "Elections Done");
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #6
0
        public void Handle(SystemMessage.VNodeConnectionEstablished message)
        {
            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.VNodeEndPoint)
                                        ? x.Updated(
                                         _timeProvider.UtcNow, isAlive: true)
                                        : x,
                                     _timeProvider, DeadMemberRemovalPeriod, CurrentRole);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster,
                                 string.Format("TCP connection established to [{0}]", message.VNodeEndPoint));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #7
0
        public void Handle(SystemMessage.VNodeConnectionLost message)
        {
            var node = _cluster.Members.FirstOrDefault(x => x.Is(message.VNodeEndPoint));

            if (node == null || !node.IsAlive)
            {
                return;
            }

            Log.Trace("Looks like node [{0}] is DEAD (TCP connection lost).", message.VNodeEndPoint);

            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.VNodeEndPoint) ? x.Updated(isAlive: false) : x);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, string.Format("TCP connection lost to [{0}]", message.VNodeEndPoint));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #8
0
        public void Handle(GossipMessage.GossipReceived message)
        {
            if (_state != GossipState.Working)
            {
                return;
            }

            var oldCluster = _cluster;

            _cluster = MergeClusters(_cluster,
                                     message.ClusterInfo,
                                     message.Server,
                                     x => x.InstanceId == NodeInfo.InstanceId ? GetUpdatedMe(x) : x);

            message.Envelope.ReplyWith(new GossipMessage.SendGossip(_cluster, NodeInfo.InternalHttp));

            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, string.Format("gossip received from [{0}]", message.Server));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #9
0
        public void Handle(GossipMessage.GetGossipReceived message)
        {
            if (_state != GossipState.Working)
            {
                return;
            }

            Log.Information("Gossip Received, The node [{nodeEndpoint}] is not DEAD.", message.Server);

            var oldCluster = _cluster;

            _cluster = MergeClusters(_cluster,
                                     message.ClusterInfo,
                                     message.Server,
                                     x => x.InstanceId == NodeInfo.InstanceId ? GetUpdatedMe(x) : x,
                                     _timeProvider.UtcNow, NodeInfo, CurrentLeader, AllowedTimeDifference, DeadMemberRemovalPeriod);

            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, string.Format("gossip received from [{0}]", message.Server));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #10
0
        public void Handle(GossipMessage.GossipReceived message)
        {
            if (_state != GossipState.Working)
            {
                return;
            }

            var oldCluster = _cluster;

            _cluster = MergeClusters(_cluster,
                                     message.ClusterInfo,
                                     message.Server,
                                     x => x.InstanceId == NodeInfo.InstanceId ? GetUpdatedMe(x) : x,
                                     _timeProvider.UtcNow, NodeInfo, CurrentLeader, AllowedTimeDifference, DeadMemberRemovalPeriod);

            message.Envelope.ReplyWith(new GossipMessage.SendGossip(_cluster, NodeInfo.InternalHttp));

            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster, $"gossip received from [{message.Server}]");
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }
Пример #11
0
        public void Handle(GossipMessage.GetGossipFailed message)
        {
            if (_state != GossipState.Working)
            {
                return;
            }

            Log.Information("Gossip Failed, The node [{nodeEndpoint}] is being marked as DEAD.",
                            message.Recipient);

            var oldCluster = _cluster;

            _cluster = UpdateCluster(_cluster, x => x.Is(message.Recipient)
                                        ? x.Updated(
                                         _timeProvider.UtcNow, isAlive: false)
                                        : x,
                                     _timeProvider, DeadMemberRemovalPeriod);
            if (_cluster.HasChangedSince(oldCluster))
            {
                LogClusterChange(oldCluster, _cluster,
                                 string.Format("TCP connection lost to [{0}]", message.Recipient));
            }
            _bus.Publish(new GossipMessage.GossipUpdated(_cluster));
        }