public RaftEngine(RaftEngineOptions raftEngineOptions) { _raftEngineOptions = raftEngineOptions; EngineStatistics = new RaftEngineStatistics(this); Debug.Assert(raftEngineOptions.Stopwatch != null); _log = LogManager.GetLogger(raftEngineOptions.Name + "." + GetType().FullName); _eventLoopCancellationTokenSource = new CancellationTokenSource(); Name = raftEngineOptions.Name; PersistentState = new PersistentState(raftEngineOptions.Name, raftEngineOptions.StorageOptions, _eventLoopCancellationTokenSource.Token) { CommandSerializer = new JsonCommandSerializer() }; _currentTopology = PersistentState.GetCurrentTopology(); //warm up to make sure that the serializer don't take too long and force election timeout PersistentState.CommandSerializer.Serialize(new NopCommand()); var thereAreOthersInTheCluster = CurrentTopology.QuorumSize > 1; if (thereAreOthersInTheCluster == false && CurrentTopology.IsVoter(Name)) { PersistentState.UpdateTermTo(this, PersistentState.CurrentTerm + 1);// restart means new term SetState(RaftEngineState.Leader); } else { SetState(RaftEngineState.Follower); } _eventLoopTask = Task.Factory.StartNew(EventLoop, TaskCreationOptions.LongRunning); }
public RaftEngine(RaftEngineOptions raftEngineOptions) { //#if DEBUG // Console.WriteLine("Press any key to continue loading Raft -> opportunity to attach debugger"); // Console.ReadLine(); //#endif _raftEngineOptions = raftEngineOptions; Debug.Assert(raftEngineOptions.Stopwatch != null); _log = LogManager.GetLogger(raftEngineOptions.Name + "." + GetType().FullName); _eventLoopCancellationTokenSource = new CancellationTokenSource(); Name = raftEngineOptions.Name; PersistentState = new PersistentState(raftEngineOptions.Name, raftEngineOptions.StorageOptions, _eventLoopCancellationTokenSource.Token) { CommandSerializer = new JsonCommandSerializer() }; _currentTopology = PersistentState.GetCurrentTopology(); //warm up to make sure that the serializer don't take too long and force election timeout PersistentState.CommandSerializer.Serialize(new NopCommand()); var thereAreOthersInTheCluster = CurrentTopology.QuorumSize > 1; if (thereAreOthersInTheCluster == false && CurrentTopology.IsVoter(Name)) { PersistentState.UpdateTermTo(this, PersistentState.CurrentTerm + 1); // restart means new term SetState(RaftEngineState.Leader); } else { SetState(RaftEngineState.Follower); } _commitIndex = StateMachine.LastAppliedIndex; _eventLoopTask = Task.Run(() => EventLoop()); }