protected ManualResetEventSlim WaitForStateChange(RaftEngine node, RaftEngineState requestedState) { var mre = new ManualResetEventSlim(); node.StateChanged += state => { if (state == requestedState) mre.Set(); }; return mre; }
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); }
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); }
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); } } }
protected ManualResetEventSlim CreateWaitForStateChangeEvent(RaftEngine node, RaftEngineState requestedState) { var mre = new ManualResetEventSlim(); node.StateChanged += state => { if (state == requestedState) { mre.Set(); } }; return(mre); }