public FailureDetection(ISwimProtocolProvider swimProtocolProvider, IConfiguration configuration, ILogger <FailureDetection> logger)
        {
            _stateMachine         = new StateMachine <SwimFailureDetectionState, SwimFailureDetectionTrigger>(SwimFailureDetectionState.Idle);
            _swimProtocolProvider = swimProtocolProvider;
            _configuration        = configuration;
            _logger = logger;

            _nodeRepository = new NodeRepository(swimProtocolProvider.Node.Hostname);

            _protocolTimer           = new System.Timers.Timer(7000);
            _pingTimer               = new System.Timers.Timer(3500);
            _protocolTimer.AutoReset = false;
            _pingTimer.AutoReset     = false;
            _protocolTimer.Elapsed  += _protocolTimer_Elapsed;
            _pingTimer.Elapsed      += _pingTimer_Elapsed;

            _stateMachine.Configure(SwimFailureDetectionState.Idle)
            .Permit(SwimFailureDetectionTrigger.Ping, SwimFailureDetectionState.Pinged)
            .Ignore(SwimFailureDetectionTrigger.Reset)
            .OnEntry((entryAction) =>
            {
                Start();
            });

            _stateMachine.Configure(SwimFailureDetectionState.Pinged)
            .Permit(SwimFailureDetectionTrigger.PingExpireLive, SwimFailureDetectionState.Alive)
            .Permit(SwimFailureDetectionTrigger.PingExpireNoResponse, SwimFailureDetectionState.PrePingReq)
            .Permit(SwimFailureDetectionTrigger.ProtocolExpireDead, SwimFailureDetectionState.Expired);

            _stateMachine.Configure(SwimFailureDetectionState.Alive)
            .Permit(SwimFailureDetectionTrigger.ProtocolExpireLive, SwimFailureDetectionState.Expired);

            _stateMachine.Configure(SwimFailureDetectionState.PrePingReq)
            .Permit(SwimFailureDetectionTrigger.PingReq, SwimFailureDetectionState.PingReqed)
            .OnEntry(entryAction =>
            {
                _stateMachine.Fire(SwimFailureDetectionTrigger.PingReq);
                BroadcastPingReq();
            });

            _stateMachine.Configure(SwimFailureDetectionState.PingReqed)
            .Permit(SwimFailureDetectionTrigger.ProtocolExpireDead, SwimFailureDetectionState.Expired)
            .Permit(SwimFailureDetectionTrigger.ProtocolExpireLive, SwimFailureDetectionState.Expired);

            _stateMachine.Configure(SwimFailureDetectionState.Expired)
            .Permit(SwimFailureDetectionTrigger.Reset, SwimFailureDetectionState.Idle)
            .OnEntryFrom(SwimFailureDetectionTrigger.ProtocolExpireDead, entryAction =>
            {
                HandleSuspectNode();
            })
            .OnEntryFrom(SwimFailureDetectionTrigger.ProtocolExpireLive, entryAction =>
            {
                HandleAliveNode();
            });

            _swimProtocolProvider.ReceivedMessage += _swimProtocolProvider_ReceivedMessage;

            RestoreKnownNodes();
            AddBootstrapNodes();
        }
Ejemplo n.º 2
0
        public SwimClient(ISwimProtocolProvider protocolProvider, ILogger logger)
        {
            ProtocolProvider = protocolProvider;
            Logger           = logger;

            ProtocolProvider.ReceivedMessage += ProtocolProvider_ReceivedMessage;
            ProtocolTimer     = new Timer(ProtocolPeriod.TotalMilliseconds);
            PingTimer         = new Timer(MedianRTT.TotalMilliseconds * 2);
            PingCorrelationId = null;

            ProtocolTimer.Elapsed += ProtocolTimer_Elapsed;
            PingTimer.Elapsed     += PingTimer_Elapsed;
        }
 public SwimController(IHttpContext context, ISwimProtocolProvider swimProtocolProvider, ITestOutputHelper output) : base(context)
 {
     _swimProtocolProvider = swimProtocolProvider;
     _context = context;
     _output  = output;
 }
Ejemplo n.º 4
0
 public MembershipController(ISwimProtocolProvider swimProtocolProvider, ISwimProtocol swimProtocol, ILogger <MembershipController> logger)
 {
     _swimProtocolProvider = swimProtocolProvider;
     _swimProtocol         = swimProtocol;
     _logger = logger;
 }