예제 #1
0
 private void HandleInitial(ClusterEvent.CurrentClusterState state)
 {
     TrackChanges(() =>
                  _membersByAge = state.Members
                                  .Where(m => m.Status == MemberStatus.Up && MatchingRole(m))
                                  .ToImmutableSortedSet(MemberAgeOrdering.Descending));
 }
예제 #2
0
 /// <summary>
 /// Updates the initial node ring for those nodes that are <see cref="MemberStatus"/> `Up`.
 /// </summary>
 private void ReceiveState(ClusterEvent.CurrentClusterState state)
 {
     _nodes = state.Members.Except(state.Unreachable)
              .Where(m => m.Status == MemberStatus.Up || m.Status == MemberStatus.WeaklyUp)
              .Select(m => m.Address)
              .ToImmutableSortedSet();
 }
예제 #3
0
        private void HandleClusterState(ClusterEvent.CurrentClusterState state)
        {
            var builder = ImmutableSortedSet <Member> .Empty.ToBuilder();

            builder.KeyComparer = AgeOrdering;
            var members = builder.ToImmutable()
                          .Union(state.Members.Where(m => m.Status == MemberStatus.Up && MatchingRole(m)));

            ChangeMembers(members);
        }
예제 #4
0
        private void HandleInitial(ClusterEvent.CurrentClusterState state)
        {
            _membersByAge = state.Members
                            .Where(m => (m.Status == MemberStatus.Up || m.Status == MemberStatus.Leaving) && MatchingRole(m))
                            .ToImmutableSortedSet(MemberAgeOrdering.Descending);

            var safeToBeOldest = !state.Members.Any(m => m.Status == MemberStatus.Down || m.Status == MemberStatus.Exiting);
            var initial        = new InitialOldestState(_membersByAge.FirstOrDefault()?.UniqueAddress, safeToBeOldest);

            _changes = _changes.Enqueue(initial);
        }
예제 #5
0
        public IEnumerable <Member> GetVictims(ClusterEvent.CurrentClusterState clusterState)
        {
            //Example configuration access
            var config         = this.system.Settings.Config.GetConfig($"akka.cluster.{MyDowningProvider.RootConfigElement}");
            var exampleSetting = config.GetInt("example-config-entry");

            this.system.Log.Info($"Example logging of example setting: {exampleSetting}");

            //Decide what do based off the the passed in current cluster state.
            //Whatever is returned, will be downed
            return(Enumerable.Empty <Member>());
        }
        private void Handle(ClusterEvent.CurrentClusterState msg)
        {
            _log.Info(">>> ClusterEvent.CurrentClusterState");
            var state = (ClusterEvent.CurrentClusterState)msg;

            foreach (var member in state.Members)
            {
                _log.Info($">>> ClusterEvent.CurrentClusterState : {member.Address}");

                if (member.Status == MemberStatus.Up)
                {
                    Register(member);
                }
            }
        }
        private void HandleInitial(ClusterEvent.CurrentClusterState state)
        {
            _membersByAge = state.Members
                            .Where(m => (m.Status == MemberStatus.Up) && MatchingRole(m))
                            .ToImmutableSortedSet(MemberAgeOrdering.Descending);
            // If there is some removal in progress of an older node it's not safe to immediately become oldest,
            // removal of younger nodes doesn't matter. Note that it can also be started via restart after
            // ClusterSingletonManagerIsStuck.

            int selfUpNumber = state.Members.Where(m => m.UniqueAddress == _cluster.SelfUniqueAddress).Select(m => (int?)m.UpNumber).FirstOrDefault() ?? int.MaxValue;

            var safeToBeOldest = !state.Members.Any(m => (m.UpNumber < selfUpNumber && MatchingRole(m)) && (m.Status == MemberStatus.Down || m.Status == MemberStatus.Exiting || m.Status == MemberStatus.Leaving));
            var initial        = new InitialOldestState(_membersByAge.FirstOrDefault()?.UniqueAddress, safeToBeOldest);

            _changes = _changes.Enqueue(initial);
        }
        public void PushClusterState(ClusterEvent.CurrentClusterState clusterState, Address currentClusterAddress)
        {
            // Push ClusterState x to subscribed client.
            // So if client A subscibes to ClusterState A then it should only get A and not B.
            // TODO:

            List <ClusterRoleLeader> clusterRoleLeaders = new List <ClusterRoleLeader>();

            foreach (var member in clusterState.Members)
            {
                var role    = member.Roles.First();
                var address = clusterState.RoleLeader(role);
                clusterRoleLeaders.Add(new ClusterRoleLeader(role, address));
            }

            var     context    = GlobalHost.ConnectionManager.GetHubContext <ClusterStateHub>();
            dynamic allClients = context.Clients.All.broadcastClusterState(clusterState, clusterRoleLeaders, currentClusterAddress);
        }
        public HttpResponseMessage Get(string id)
        {
            var t1 = Program.ClusterStatus.Ask(new ClusterStatus.GetClusterState(), TimeSpan.FromSeconds(2))
                     .ContinueWith(
                tr =>
            {
                ClusterState = (ClusterEvent.CurrentClusterState)tr.Result;
            }, TaskContinuationOptions.AttachedToParent & TaskContinuationOptions.ExecuteSynchronously);

            t1.Wait(TimeSpan.FromSeconds(2));


            var retval = Request.CreateResponse(HttpStatusCode.OK, new
            {
                clusterState = ClusterState
            });

            return(retval);
        }
예제 #10
0
 public CurrentClusterStatus(List <ClusterRoleLeader> clusterRoleLeaders, Address currentClusterAddress, ClusterEvent.CurrentClusterState clusterState)
 {
     ClusterRoleLeaders    = clusterRoleLeaders;
     CurrentClusterAddress = currentClusterAddress;
     ClusterState          = clusterState;
 }
예제 #11
0
        private void HandleClusterState(ClusterEvent.CurrentClusterState state)
        {
            var members = ImmutableSortedSet <Member> .Empty.WithComparer(AgeOrdering).Union(state.Members.Where(m => m.Status == MemberStatus.Up && MatchingRole(m)));

            ChangeMembers(members);
        }
예제 #12
0
 private void HandleCurrentClusterStateEvent(ClusterEvent.CurrentClusterState message)
 {
     _currentState = message;
 }
예제 #13
0
        private void Ready()
        {
            Receive <GetClusterState>(ic =>
            {
                List <ClusterRoleLeader> clusterRoleLeaders = new List <ClusterRoleLeader>();
                foreach (var member in _clusterState.Members)
                {
                    var role    = member.Roles.First();
                    var address = _clusterState.RoleLeader(role);
                    clusterRoleLeaders.Add(new ClusterRoleLeader(role, address));
                }

                var currentClusterStatus = new CurrentClusterStatus(clusterRoleLeaders, Cluster.SelfAddress,
                                                                    _clusterState);

                Sender.Tell(currentClusterStatus);
            });

            Receive <ClusterEvent.CurrentClusterState>(state =>
            {
                _clusterState = state;

                // Check Cluster Leader
                if (state.Leader == null)
                {
                    _logger.Warning("ClusterLeader is null");
                }
                else
                {
                    _logger.Debug("ClusterLeader : {0}", state.Leader.ToString());
                }

                // Check Role Leaders
                var roles = _clusterState.Members.Where(y => y.Status == MemberStatus.Up).Select(x => x.Roles.First()).Distinct().ToList();
                foreach (var role in roles)
                {
                    var address = state.RoleLeader(role);
                    if (address == null)
                    {
                        _logger.Warning("RoleLeader: {0}, No leader found!", role);
                    }
                    else
                    {
                        _logger.Debug("RoleLeader: {0}, Address:{1}", role, address);
                    }
                }

                // Check Unreachable Members?
                foreach (var member in state.Unreachable)
                {
                    _logger.Warning("Unreachable Member; Role: {0}, Status: {1}, Address: {2}, ", member.Roles.Join(";"), member.Status, member.Address.ToString());
                }

                // Check who I am seen by?
                foreach (var seenBy in state.SeenBy)
                {
                    if (_clusterState.Members.Any(x => x.Address == seenBy))
                    {
                        _logger.Debug("SeenBy Members; Role: {0}, Status: {1}, Address: {2}, ",
                                      _clusterState.Members.First(x => x.Address == seenBy).Roles.Join(";"),
                                      _clusterState.Members.First(x => x.Address == seenBy).Status,
                                      _clusterState.Members.First(x => x.Address == seenBy).Address.ToString());
                    }
                    else
                    {
                        _logger.Debug("SeenBy Members; Role: null, Status: null, Address: {0}, ",
                                      _clusterState.Members.First(x => x.Address == seenBy).Address.ToString());
                    }
                }
            });

            Receive <SendCurrentClusterState>(ic =>
            {
                Cluster.SendCurrentClusterState(Self);
            });

            Receive <ClusterEvent.MemberUp>(mem =>
            {
                _logger.Info("MemberUp: {0}, Role(s): {1}", mem.Member, mem.Member.Roles.Join(","));
            });

            Receive <ClusterEvent.UnreachableMember>(mem =>
            {
                _logger.Info("UnreachableMember: {0}, Role(s): {1}", mem.Member, mem.Member.Roles.Join(","));
            });

            Receive <ClusterEvent.ReachableMember>(mem =>
            {
                _logger.Info("ReachableMember: {0}, Role(s): {1}", mem.Member, mem.Member.Roles.Join(","));
            });

            Receive <ClusterEvent.MemberRemoved>(mem =>
            {
                _logger.Info("MemberRemoved: {0}, Role(s): {1}", mem.Member, mem.Member.Roles.Join(","));

                // Check to see if we have been removed?
                if (Cluster.SelfAddress.Equals(mem.Member.Address))
                {
                    ClusterNeedsToRestart(string.Format("This member has been removed from the cluster.  This system needs to be restarted. Address:{0} ", Cluster.SelfAddress));
                }
            });

            Receive <ClusterEvent.IMemberEvent>(mem =>
            {
                _logger.Info("IMemberEvent: {0}, Role(s): {1}", mem.Member, mem.Member.Roles.Join(","));
            });

            Receive <ClusterEvent.ClusterShuttingDown>(cluster =>
            {
                _logger.Warning("ClusterShuttingDown");
            });

            ReceiveAny(task =>
            {
                _logger.Error("{{EventId:999}} [x] Oh Snap! ClusterStatus.Ready.ReceiveAny: \r\n{0}", task);
            });
        }
예제 #14
0
 private void ReceiveMessage(ClusterEvent.CurrentClusterState message)
 {
     Console.WriteLine($">>>>>>> {Self} : {message}");
 }
        private void Ready()
        {
            Receive <SubscribeToManager>(ic =>
            {
                if (!_clients.Contains(Sender))
                {
                    _clients.Add(this.Sender);
                    Sender.Tell(new ClusterMessage(string.Format("Subscribed to cluster events : {0}", Sender.ToString())));
                    return;
                }

                Sender.Tell(new ClusterMessage(string.Format("You have already subscribed to cluster events : {0}", Sender.ToString())));
            });

            Receive <UnSubscribeFromManager>(ic =>
            {
                if (_clients.Contains(Sender))
                {
                    _clients.Remove(this.Sender);
                    Sender.Tell(new ClusterMessage(string.Format("Unsubscribed to cluster events : {0}", Sender.ToString())));
                    return;
                }

                Sender.Tell(new ClusterMessage(string.Format("You must subscribe before you can unsubscribe : {0}", Sender.ToString())));
            });

            Receive <MemberDown>(ic =>
            {
                var message = string.Format("User {0} is forcing the following member down: {1}", ic.UserName, ic.Address.ToString());
                _logger.Warning(message);
                Sender.Tell(new ClusterMessage(message));
                Cluster.Down(ic.Address);

                Thread.Sleep(5000);
            });

            Receive <MemberLeave>(ic =>
            {
                var message = string.Format("User {0} is asking the following member to leave the cluster: {1}", ic.UserName, ic.Address.ToString());
                _logger.Warning(message);
                Sender.Tell(new ClusterMessage(message));
                Cluster.Leave(ic.Address);

                Thread.Sleep(5000);
            });

            Receive <ClusterEvent.CurrentClusterState>(state =>
            {
                _currentClusterState = state;
                foreach (var client in _clients)
                {
                    _logger.Info("Sending ClusterState to {0}", this.Sender.ToString());
                    client.Tell(_currentClusterState, Self);
                }
            });

            Receive <GetClusterState>(ic =>
            {
                _logger.Info("Sending ClusterState to {0}", this.Sender.ToString());
                Sender.Tell(_currentClusterState, Self);
            });

            Receive <ClusterEvent.IReachabilityEvent>(mem =>
            {
                foreach (var client in _clients)
                {
                    client.Tell(mem, Self);
                }
            });

            Receive <ClusterEvent.IMemberEvent>(mem =>
            {
                foreach (var client in _clients)
                {
                    client.Tell(mem, Self);
                }
            });

            Receive <SendCurrentClusterState>(ic =>
            {
                Cluster.SendCurrentClusterState(Self);
            });

            ReceiveAny(task =>
            {
                _logger.Error("Oh Snap! ClusterSender.Ready.ReceiveAny: \r\n{0}", task);
            });
        }