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); }
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); }