public Cluster(ActorSystemImpl system) { System = system; _settings = new ClusterSettings(system.Settings.Config, system.Name); var provider = system.Provider as ClusterActorRefProvider; if (provider == null) { throw new ConfigurationException( String.Format("ActorSystem {0} needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses {1}", system, system.Provider.GetType().FullName)); } _selfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system)); _log = Logging.GetLogger(system, "Cluster"); LogInfo("Starting up..."); _failureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(_settings.FailureDetectorImplementationClass, _settings.FailureDetectorConfig, system)); _scheduler = CreateScheduler(system); //create supervisor for daemons under path "/system/cluster" _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(_settings)).WithDeploy(Deploy.Local), "cluster"); //TODO: Pretty sure this is bad and will at least throw aggregateexception possibly worse. _clusterCore = GetClusterCoreRef().Result; _readView = new ClusterReadView(this); }
/// <summary> /// Initializes a new instance of the <see cref="Cluster"/> class. /// </summary> /// <param name="system">The actor system that hosts the cluster.</param> /// <exception cref="ConfigurationException"> /// This exception is thrown if the <paramref name="system"/> does not have a <see cref="ClusterActorRefProvider"/> enabled in the configuration. /// </exception> public Cluster(ActorSystemImpl system) { System = system; Settings = new ClusterSettings(system.Settings.Config, system.Name); if (!(system.Provider is IClusterActorRefProvider provider)) { throw new ConfigurationException( $"ActorSystem {system} needs to have a 'IClusterActorRefProvider' enabled in the configuration, currently uses {system.Provider.GetType().FullName}"); } SelfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system)); _log = Logging.GetLogger(system, "Cluster"); CurrentInfoLogger = new InfoLogger(_log, Settings, SelfAddress); LogInfo("Starting up..."); var clusterCoreTaskSource = new TaskCompletionSource <IActorRef>(); _clusterCoreTask = clusterCoreTaskSource.Task; FailureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(Settings.FailureDetectorImplementationClass, Settings.FailureDetectorConfig, system)); Scheduler = CreateScheduler(system); // it has to be lazy - otherwise if downing provider will init a cluster itself, it will deadlock _downingProvider = new Lazy <IDowningProvider>(() => Akka.Cluster.DowningProvider.Load(Settings.DowningProviderType, system), LazyThreadSafetyMode.ExecutionAndPublication); //create supervisor for daemons under path "/system/cluster" _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(Settings)).WithDeploy(Deploy.Local), "cluster"); _readView = new ClusterReadView(this); // force the underlying system to start _ = Task.Run(async() => { try { _clusterCore = await _clusterDaemons.Ask <IActorRef>(new InternalClusterAction.GetClusterCoreRef(this), System.Settings.CreationTimeout).ConfigureAwait(false); clusterCoreTaskSource.SetResult(_clusterCore); system.RegisterOnTermination(Shutdown); LogInfo("Started up successfully"); } catch (Exception ex) { _log.Error(ex, "Failed to startup Cluster. You can try to increase 'akka.actor.creation-timeout'."); Shutdown(); System.DeadLetters.Tell(ex); //don't re-throw the error. Just log it. _clusterCore = System.DeadLetters; clusterCoreTaskSource.SetResult(_clusterCore); } }); }
public Cluster(ActorSystemImpl system) { System = system; Settings = new ClusterSettings(system.Settings.Config, system.Name); var provider = system.Provider as ClusterActorRefProvider; if (provider == null) { throw new ConfigurationException( String.Format("ActorSystem {0} needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses {1}", system, system.Provider.GetType().FullName)); } SelfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system)); _log = Logging.GetLogger(system, "Cluster"); LogInfo("Starting up..."); _failureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(Settings.FailureDetectorImplementationClass, Settings.FailureDetectorConfig, system)); _scheduler = CreateScheduler(system); // it has to be lazy - otherwise if downing provider will init a cluster itself, it will deadlock _downingProvider = new Lazy <IDowningProvider>(() => Akka.Cluster.DowningProvider.Load(Settings.DowningProviderType, system), LazyThreadSafetyMode.ExecutionAndPublication); //create supervisor for daemons under path "/system/cluster" _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(Settings)).WithDeploy(Deploy.Local), "cluster"); _readView = new ClusterReadView(this); // force the underlying system to start _clusterCore = GetClusterCoreRef().Result; system.RegisterOnTermination(Shutdown); LogInfo("Started up successfully"); }
public EventBusListener(Cluster cluster, ClusterReadView readView) { _cluster = cluster; _readView = readView; Receive<ClusterEvent.IClusterDomainEvent>(clusterDomainEvent => { clusterDomainEvent.Match() .With<ClusterEvent.SeenChanged>(changed => { State = State.Copy(seenBy: changed.SeenBy); }) .With<ClusterEvent.ReachabilityChanged>(changed => { _readView._reachability = changed.Reachability; }) .With<ClusterEvent.MemberRemoved>(removed => { State = State.Copy(members: State.Members.Remove(removed.Member), unreachable: State.Unreachable.Remove(removed.Member)); }) .With<ClusterEvent.UnreachableMember>(member => { // replace current member with new member (might have different status, only address is used in == comparison) State = State.Copy(unreachable: State.Unreachable.Remove(member.Member).Add(member.Member)); }) .With<ClusterEvent.ReachableMember>(member => { State = State.Copy(unreachable: State.Unreachable.Remove(member.Member)); }) .With<ClusterEvent.IMemberEvent>(memberEvent => { var newUnreachable = State.Unreachable; // replace current member with new member (might have different status, only address is used in == comparison) if (State.Unreachable.Contains(memberEvent.Member)) newUnreachable = State.Unreachable.Remove(memberEvent.Member).Add(memberEvent.Member); State = State.Copy( members: State.Members.Remove(memberEvent.Member).Add(memberEvent.Member), unreachable: newUnreachable); }) .With<ClusterEvent.LeaderChanged>(changed => { State = State.Copy(leader: changed.Leader); }) .With<ClusterEvent.RoleLeaderChanged>(changed => { State = State.Copy(roleLeaderMap: State.RoleLeaderMap.SetItem(changed.Role, changed.Leader)); }) .With<ClusterEvent.CurrentInternalStats>(stats => { readView._latestStats = stats; }) .With<ClusterEvent.ClusterMetricsChanged>(changed => { readView._clusterMetrics = changed.NodeMetrics; }) .With<ClusterEvent.ClusterShuttingDown>(_ => { }); }); Receive<ClusterEvent.CurrentClusterState>(state => { State = state; }); }
public EventBusListener(Cluster cluster, ClusterReadView readView) { _cluster = cluster; _readView = readView; Receive <ClusterEvent.IClusterDomainEvent>(clusterDomainEvent => { clusterDomainEvent.Match() .With <ClusterEvent.SeenChanged>(changed => { State = State.Copy(seenBy: changed.SeenBy); }) .With <ClusterEvent.ReachabilityChanged>(changed => { _readView._reachability = changed.Reachability; }) .With <ClusterEvent.MemberRemoved>(removed => { State = State.Copy(members: State.Members.Remove(removed.Member), unreachable: State.Unreachable.Remove(removed.Member)); }) .With <ClusterEvent.UnreachableMember>(member => { // replace current member with new member (might have different status, only address is used in == comparison) State = State.Copy(unreachable: State.Unreachable.Remove(member.Member).Add(member.Member)); }) .With <ClusterEvent.ReachableMember>(member => { State = State.Copy(unreachable: State.Unreachable.Remove(member.Member)); }) .With <ClusterEvent.IMemberEvent>(memberEvent => { var newUnreachable = State.Unreachable; // replace current member with new member (might have different status, only address is used in == comparison) if (State.Unreachable.Contains(memberEvent.Member)) { newUnreachable = State.Unreachable.Remove(memberEvent.Member).Add(memberEvent.Member); } State = State.Copy( members: State.Members.Remove(memberEvent.Member).Add(memberEvent.Member), unreachable: newUnreachable); }) .With <ClusterEvent.LeaderChanged>(changed => { State = State.Copy(leader: changed.Leader); }) .With <ClusterEvent.RoleLeaderChanged>(changed => { State = State.Copy(roleLeaderMap: State.RoleLeaderMap.SetItem(changed.Role, changed.Leader)); }) .With <ClusterEvent.CurrentInternalStats>(stats => { readView._latestStats = stats; }) .With <ClusterEvent.ClusterShuttingDown>(_ => { }); }); Receive <ClusterEvent.CurrentClusterState>(state => { State = state; }); }