public ClusterManifestProvider( ILocalSiloDetails localSiloDetails, SiloManifestProvider siloManifestProvider, ClusterMembershipService clusterMembershipService, IFatalErrorHandler fatalErrorHandler, ILogger <ClusterManifestProvider> logger, IServiceProvider services) { _localSiloAddress = localSiloDetails.SiloAddress; _logger = logger; _services = services; _clusterMembershipService = clusterMembershipService; _fatalErrorHandler = fatalErrorHandler; this.LocalGrainManifest = siloManifestProvider.SiloManifest; _current = new ClusterManifest( MajorMinorVersion.Zero, ImmutableDictionary.CreateRange(new[] { new KeyValuePair <SiloAddress, GrainManifest>(localSiloDetails.SiloAddress, this.LocalGrainManifest) }), ImmutableArray.Create(this.LocalGrainManifest)); _updates = new AsyncEnumerable <ClusterManifest>( (previous, proposed) => previous.Version <= MajorMinorVersion.Zero || proposed.Version > previous.Version, _current) { OnPublished = update => Interlocked.Exchange(ref _current, update) }; }
public MembershipTableManager( ILocalSiloDetails localSiloDetails, IOptions <ClusterMembershipOptions> clusterMembershipOptions, IMembershipTable membershipTable, IFatalErrorHandler fatalErrorHandler, IMembershipGossiper gossiper, ILogger <MembershipTableManager> log, IAsyncTimerFactory timerFactory, ISiloLifecycle siloLifecycle) { this.localSiloDetails = localSiloDetails; this.membershipTableProvider = membershipTable; this.fatalErrorHandler = fatalErrorHandler; this.gossiper = gossiper; this.clusterMembershipOptions = clusterMembershipOptions.Value; this.myAddress = this.localSiloDetails.SiloAddress; this.log = log; this.siloLifecycle = siloLifecycle; this.snapshot = new MembershipTableSnapshot( this.CreateLocalSiloEntry(this.CurrentStatus), MembershipVersion.MinValue, ImmutableDictionary <SiloAddress, MembershipEntry> .Empty); this.updates = new AsyncEnumerable <MembershipTableSnapshot>( (previous, proposed) => proposed.Version > previous.Version, this.snapshot) { OnPublished = update => Interlocked.Exchange(ref this.snapshot, update) }; this.membershipUpdateTimer = timerFactory.Create( this.clusterMembershipOptions.TableRefreshTimeout, nameof(PeriodicallyRefreshMembershipTable)); }
public ClusterManifestProvider( ILocalSiloDetails localSiloDetails, SiloManifest localSiloManifest, IInternalGrainFactory grainFactory, ClusterMembershipService clusterMembershipService, IFatalErrorHandler fatalErrorHandler, ILogger <ClusterManifestProvider> logger, IOptions <TypeManagementOptions> options, IServiceProvider services) { _localSiloAddress = localSiloDetails.SiloAddress; _grainFactory = grainFactory; _logger = logger; _services = services; _clusterMembershipService = clusterMembershipService; _fatalErrorHandler = fatalErrorHandler; _options = options.Value; _current = new ClusterManifest( MajorMinorVersion.Zero, ImmutableDictionary.CreateRange(new[] { new KeyValuePair <SiloAddress, SiloManifest>(localSiloDetails.SiloAddress, localSiloManifest) })); _updates = new AsyncEnumerable <ClusterManifest>( (previous, proposed) => previous.Version <= MajorMinorVersion.Zero || proposed.Version > previous.Version, _current) { OnPublished = update => Interlocked.Exchange(ref _current, update) }; }
public SiloStatusListenerManager( MembershipTableManager membershipTableManager, ILogger <SiloStatusListenerManager> log, IFatalErrorHandler fatalErrorHandler) { this.membershipTableManager = membershipTableManager; this.log = log; this.fatalErrorHandler = fatalErrorHandler; }
public MembershipTableManagerTests(ITestOutputHelper output) { this.output = output; this.loggerFactory = new LoggerFactory(new[] { new XunitLoggerProvider(this.output) }); this.localSiloDetails = Substitute.For <ILocalSiloDetails>(); this.localSilo = Silo("127.0.0.1:100@100"); this.localSiloDetails.SiloAddress.Returns(this.localSilo); this.localSiloDetails.DnsHostName.Returns("MyServer11"); this.localSiloDetails.Name.Returns(Guid.NewGuid().ToString("N")); this.fatalErrorHandler = Substitute.For <IFatalErrorHandler>(); this.fatalErrorHandler.IsUnexpected(default).ReturnsForAnyArgs(true);
public MembershipTableManagerTests(ITestOutputHelper output) { this.output = output; this.loggerFactory = new LoggerFactory(new[] { new XunitLoggerProvider(this.output) }); this.localSiloDetails = Substitute.For <ILocalSiloDetails>(); this.localSilo = Silo("127.0.0.1:100@100"); this.localSiloDetails.SiloAddress.Returns(this.localSilo); this.localSiloDetails.DnsHostName.Returns("MyServer11"); this.localSiloDetails.Name.Returns(Guid.NewGuid().ToString("N")); this.fatalErrorHandler = Substitute.For <IFatalErrorHandler>(); this.membershipGossiper = Substitute.For <IMembershipGossiper>(); this.lifecycle = new SiloLifecycleSubject(this.loggerFactory.CreateLogger <SiloLifecycleSubject>()); }
public ClusterMembershipService( MembershipTableManager membershipTableManager, ILogger <ClusterMembershipService> log, IFatalErrorHandler fatalErrorHandler) { this.snapshot = membershipTableManager.MembershipTableSnapshot.CreateClusterMembershipSnapshot(); this.updates = new AsyncEnumerable <ClusterMembershipSnapshot>( (previous, proposed) => proposed.Version == MembershipVersion.MinValue || proposed.Version > previous.Version, this.snapshot) { OnPublished = update => Interlocked.Exchange(ref this.snapshot, update) }; this.membershipTableManager = membershipTableManager; this.log = log; this.fatalErrorHandler = fatalErrorHandler; }
public ClusterHealthMonitor( MembershipTableManager tableManager, ILogger <ClusterHealthMonitor> log, IOptions <ClusterMembershipOptions> clusterMembershipOptions, IFatalErrorHandler fatalErrorHandler, IServiceProvider serviceProvider, IAsyncTimerFactory timerFactory) { this.tableManager = tableManager; this.log = log; this.fatalErrorHandler = fatalErrorHandler; this.clusterMembershipOptions = clusterMembershipOptions.Value; this.monitorClusterHealthTimer = timerFactory.Create( this.clusterMembershipOptions.ProbeTimeout, nameof(MonitorClusterHealth)); this.createMonitor = silo => ActivatorUtilities.CreateInstance <SiloHealthMonitor>(serviceProvider, silo); }
public ClusterHealthMonitor( ILocalSiloDetails localSiloDetails, MembershipTableManager membershipService, ILogger <ClusterHealthMonitor> log, IOptionsMonitor <ClusterMembershipOptions> clusterMembershipOptions, IFatalErrorHandler fatalErrorHandler, IServiceProvider serviceProvider) { this.localSiloDetails = localSiloDetails; this.serviceProvider = serviceProvider; this.membershipService = membershipService; this.log = log; this.fatalErrorHandler = fatalErrorHandler; this.clusterMembershipOptions = clusterMembershipOptions; this.onProbeResult = this.OnProbeResultInternal; Func <SiloHealthMonitor, ProbeResult, Task> onProbeResultFunc = (siloHealthMonitor, probeResult) => this.onProbeResult(siloHealthMonitor, probeResult); this.createMonitor = silo => ActivatorUtilities.CreateInstance <SiloHealthMonitor>(serviceProvider, silo, onProbeResultFunc); }
public MembershipAgent( MembershipTableManager tableManager, ClusterHealthMonitor clusterHealthMonitor, ILocalSiloDetails localSilo, IFatalErrorHandler fatalErrorHandler, IOptions <ClusterMembershipOptions> options, ILogger <MembershipAgent> log, IAsyncTimerFactory timerFactory) { this.tableManager = tableManager; this.clusterHealthMonitor = clusterHealthMonitor; this.localSilo = localSilo; this.fatalErrorHandler = fatalErrorHandler; this.clusterMembershipOptions = options.Value; this.log = log; this.iAmAliveTimer = timerFactory.Create( this.clusterMembershipOptions.IAmAliveTablePublishTimeout, nameof(UpdateIAmAlive)); }
public MembershipTableManager( ILocalSiloDetails localSiloDetails, IOptions <ClusterMembershipOptions> clusterMembershipOptions, IMembershipTable membershipTable, IFatalErrorHandler fatalErrorHandler, IMembershipGossiper gossiper, ILogger <MembershipTableManager> log, IAsyncTimerFactory timerFactory) { this.localSiloDetails = localSiloDetails; this.membershipTableProvider = membershipTable; this.fatalErrorHandler = fatalErrorHandler; this.gossiper = gossiper; this.clusterMembershipOptions = clusterMembershipOptions.Value; this.myAddress = this.localSiloDetails.SiloAddress; this.log = log; var backOffMax = StandardExtensions.Max(EXP_BACKOFF_STEP.Multiply(this.clusterMembershipOptions.ExpectedClusterSize), SiloMessageSender.CONNECTION_RETRY_DELAY.Multiply(2)); this.EXP_BACKOFF_CONTENTION_MAX = backOffMax; this.EXP_BACKOFF_ERROR_MAX = backOffMax; this.snapshot = new MembershipTableSnapshot( this.CreateLocalSiloEntry(this.CurrentStatus), MembershipVersion.MinValue, ImmutableDictionary <SiloAddress, MembershipEntry> .Empty); this.updates = new AsyncEnumerable <MembershipTableSnapshot>( (previous, proposed) => proposed.Version > previous.Version, this.snapshot) { OnPublished = update => Interlocked.Exchange(ref this.snapshot, update) }; this.membershipUpdateTimer = timerFactory.Create( this.clusterMembershipOptions.TableRefreshTimeout, nameof(PeriodicallyRefreshMembershipTable)); }