Example #1
0
		protected ManualResetEventSlim WaitForStateChange(RaftEngine node, RaftEngineState requestedState)
		{
			var mre = new ManualResetEventSlim();
			node.StateChanged += state =>
			{
				if (state == requestedState)
					mre.Set();
			};
			return mre;
		}
Example #2
0
        internal void SetState(RaftEngineState state)
        {
            if (state == State)
            {
                return;
            }

            if (State == RaftEngineState.Leader)
            {
                _leaderSelectedEvent.Reset();
            }

            var oldState = State;

            if (StateBehavior != null)
            {
                StateBehavior.Dispose();
            }
            switch (state)
            {
            case RaftEngineState.Follower:
            case RaftEngineState.FollowerAfterStepDown:
                StateBehavior = new FollowerStateBehavior(this, state == RaftEngineState.FollowerAfterStepDown);
                break;

            case RaftEngineState.CandidateByRequest:
                StateBehavior = new CandidateStateBehavior(this, true);
                //setting state before calling election because the state may change to leader before
                //we set it to CandidateByRequest
                AssertStateAndRaiseStateChanged(state, oldState);
                StateBehavior.HandleTimeout();
                return;

            case RaftEngineState.Candidate:
                StateBehavior = new CandidateStateBehavior(this, false);
                //setting state before calling election because the state may change to leader before
                //we set it to CandidateStateBehavior
                AssertStateAndRaiseStateChanged(state, oldState);
                StateBehavior.HandleTimeout();
                return;

            case RaftEngineState.SnapshotInstallation:
                StateBehavior = new SnapshotInstallationStateBehavior(this);
                break;

            case RaftEngineState.Leader:
                StateBehavior = new LeaderStateBehavior(this);
                CurrentLeader = Name;
                OnElectedAsLeader();
                break;

            case RaftEngineState.SteppingDown:
                StateBehavior = new SteppingDownStateBehavior(this);
                CurrentLeader = Name;
                break;

            default:
                throw new ArgumentOutOfRangeException(state.ToString());
            }

            AssertStateAndRaiseStateChanged(state, oldState);
        }
Example #3
0
		internal void SetState(RaftEngineState state)
		{
			if (state == State)
				return;

			if (State == RaftEngineState.Leader)
				_leaderSelectedEvent.Reset();

			var oldState = State;
			if (StateBehavior != null)
				StateBehavior.Dispose();
			switch (state)
			{
				case RaftEngineState.Follower:
				case RaftEngineState.FollowerAfterStepDown:
					StateBehavior = new FollowerStateBehavior(this, state == RaftEngineState.FollowerAfterStepDown);
					break;
				case RaftEngineState.CandidateByRequest:
				case RaftEngineState.Candidate:
					StateBehavior = new CandidateStateBehavior(this, state == RaftEngineState.CandidateByRequest);
					break;
				case RaftEngineState.SnapshotInstallation:
					StateBehavior = new SnapshotInstallationStateBehavior(this);
					break;
				case RaftEngineState.Leader:
					StateBehavior = new LeaderStateBehavior(this);
					CurrentLeader = Name;
					OnElectedAsLeader();
					break;
				case RaftEngineState.SteppingDown:
					StateBehavior = new SteppingDownStateBehavior(this);
					CurrentLeader = Name;
					break;
				default:
					throw new ArgumentOutOfRangeException(state.ToString());
			}

			Debug.Assert(StateBehavior != null, "StateBehavior != null");
			OnStateChanged(state);
			_log.Debug("{0} ==> {1}", oldState, state);
		}
Example #4
0
		protected virtual void OnStateChanged(RaftEngineState state)
		{
			var handler = StateChanged;
			if (handler != null)
			{
				try
				{
					handler(state);
				}
				catch (Exception e)
				{
					_log.Error("Error on raising StateChanged event" + e);
				}
			}
		}
Example #5
0
        protected ManualResetEventSlim CreateWaitForStateChangeEvent(RaftEngine node, RaftEngineState requestedState)
        {
            var mre = new ManualResetEventSlim();

            node.StateChanged += state =>
            {
                if (state == requestedState)
                {
                    mre.Set();
                }
            };
            return(mre);
        }