Esempio n. 1
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);
                break;

            case RaftEngineState.Candidate:
                StateBehavior = new CandidateStateBehavior(this, false);
                StateBehavior.HandleTimeout();
                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);
        }
Esempio n. 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);
        }