Ejemplo n.º 1
0
 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)
     };
 }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 5
0
        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);
Ejemplo n.º 6
0
        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>());
        }
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
 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);
 }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
 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));
 }
Ejemplo n.º 11
0
        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));
        }