public bool CommitLogEntry(NodeRaftAddress address, uint majorityQuantity, StateLogEntryApplied applied) { //If we receive acceptance signals of already Committed entries, we just ignore them if (this.LastCommittedIndex < applied.StateLogEntryId && stateMachine.NodeTerm == applied.StateLogEntryTerm) //Setting LastCommittedId { var key = GetKey(applied.StateLogEntryTerm, applied.StateLogEntryId); var iter = db.NewIterator(); iter.Seek(key); int update = 0; while (iter.Valid()) { var entry = StateLogEntry.BiserDecode(iter.Value()); if (entry.IsCommitted) { break; } entry.IsCommitted = true; var value = entry.BiserEncode(); db.Put(key, value); update++; iter.Prev(); } this.LastCommittedIndex = applied.StateLogEntryId; this.LastCommittedIndexTerm = applied.StateLogEntryTerm; return(update > 0); } return(false); }
public StateLogEntrySuggestion GetNextStateLogEntrySuggestion(StateLogEntryRequest req) { StateLogEntrySuggestion le = new StateLogEntrySuggestion() { LeaderTerm = this.stateMachine.NodeTerm }; ulong prevId = 0; ulong prevTerm = 0; StateLogEntry entry = null; if (req.StateLogEntryId == 0) { //send first record to sync var key = GetKey(0, 0); Slice value; var iter = db.NewIterator(ReadOptions.Default); iter.Seek(key); iter.Next(); while (iter.Valid()) { entry = StateLogEntry.BiserDecode(value.ToArray()); if (entry.IsCommitted) { break; } iter.Next(); } } else { var key = GetKey(req.StateLogEntryTerm, req.StateLogEntryId); Slice value; var iter = db.NewIterator(ReadOptions.Default); iter.Seek(key); var lastOne = iter.Value(); iter.Next(); while (iter.Valid()) { entry = StateLogEntry.BiserDecode(value.ToArray()); if (entry.Index > req.StateLogEntryId) { var oldEntry = StateLogEntry.BiserDecode(lastOne.ToArray()); prevId = oldEntry.Index; prevTerm = oldEntry.Term; } } } if (entry != null) { le.StateLogEntry = entry; entry.PreviousStateLogId = prevId; entry.PreviousStateLogTerm = prevTerm; le.IsCommitted = entry.IsCommitted; return(le); } else { return(null); } }
public StateLogEntry GetEntryByIndexTerm(ulong logEntryId, ulong logEntryTerm) { var key = GetKey(logEntryTerm, logEntryId); Slice value; var find = db.TryGet(ReadOptions.Default, (Slice)key, out value); if (find) { var entry = StateLogEntry.BiserDecode(value.ToArray()); return(entry); } return(null); }
public SyncResult SyncCommitByHeartBeat(LeaderHeartbeat lhb) { if (GlobalConfig.Verbose) { Console.WriteLine($"leader info:{lhb.LastStateLogCommittedIndex} ,mine:{this.LastCommittedIndex}"); } if (this.LastCommittedIndex < lhb.LastStateLogCommittedIndex) { //find if this entry exist var key = GetKey(lhb.LastStateLogCommittedIndexTerm, lhb.StateLogLatestIndex); var value = db.Get(key); var find = value == null; if (find) { var entry = StateLogEntry.BiserDecode(value); if (!entry.IsCommitted) { entry.IsCommitted = true; value = entry.BiserEncode(); db.Put(key, value); this.LastCommittedIndex = lhb.LastStateLogCommittedIndex; return(new SyncResult() { HasCommit = true, Synced = true }); } else { return(new SyncResult() { HasCommit = false, Synced = true }); } } else { return(new SyncResult() { HasCommit = false, Synced = false }); } } else { return(new SyncResult() { HasCommit = false, Synced = true }); } }
public StateLogEntry GetEntryByIndexTerm(ulong logEntryId, ulong logEntryTerm) { var key = GetKey(logEntryTerm, logEntryId); var value = db.Get(key); var find = value == null; if (find) { var entry = StateLogEntry.BiserDecode(value); return(entry); } return(null); }
public void RollbackToLastestCommit() { if (LastCommittedIndex == 0 || LastCommittedIndexTerm == 0) { return; } var key = GetKey(0, 0); var iter = db.NewIterator(); iter.SeekToLast(); while (iter.Valid()) { var entry = StateLogEntry.BiserDecode(iter.Value()); if (entry.Term >= LastCommittedIndexTerm && entry.Index > LastCommittedIndex) { db.Remove(iter.Key()); } } }
public void RollbackToLastestCommit() { if (LastCommittedIndex == 0 || LastCommittedIndexTerm == 0) { return; } var key = GetKey(0, 0); Slice value; var iter = db.NewIterator(ReadOptions.Default); iter.SeekToLast(); while (iter.Valid()) { var entry = StateLogEntry.BiserDecode(iter.Value().ToArray()); if (entry.Term >= LastCommittedIndexTerm && entry.Index > LastCommittedIndex) { db.Delete(WriteOptions.Default, iter.Key()); } } }
public void AddLogEntry(StateLogEntrySuggestion suggestion) { PreviousStateLogId = suggestion.StateLogEntry.PreviousStateLogId; PreviousStateLogTerm = suggestion.StateLogEntry.PreviousStateLogTerm; StateLogId = suggestion.StateLogEntry.Index; StateLogTerm = suggestion.StateLogEntry.Term; var key = GetKey(suggestion.StateLogEntry.Term, suggestion.StateLogEntry.Index); var value = db.Get(key); var find = value != null; if (find) { var entry = StateLogEntry.BiserDecode(value); entry.IsCommitted = suggestion.IsCommitted; value = entry.BiserEncoder().Encode(); db.Put(key, value); } else { var data = suggestion.StateLogEntry.BiserEncode(); db.Put(key, data); } }
public void ReloadFromStorage() { //should load from log files var iter = db.NewIterator(); iter.SeekToLast(); while (iter.Valid()) { var entry = StateLogEntry.BiserDecode(iter.Value()); StateLogId = entry.Index; StateLogTerm = entry.Term; PreviousStateLogId = entry.PreviousStateLogId; PreviousStateLogTerm = entry.PreviousStateLogTerm; stateMachine.NodeTerm = entry.Term; if (entry.IsCommitted) { LastCommittedIndex = entry.Index; LastCommittedIndexTerm = entry.Term; LastBusinessLogicCommittedIndex = entry.Index; return; } } }
public void AddLogEntry(StateLogEntrySuggestion suggestion) { PreviousStateLogId = suggestion.StateLogEntry.PreviousStateLogId; PreviousStateLogTerm = suggestion.StateLogEntry.PreviousStateLogTerm; StateLogId = suggestion.StateLogEntry.Index; StateLogTerm = suggestion.StateLogEntry.Term; var key = GetKey(suggestion.StateLogEntry.Term, suggestion.StateLogEntry.Index); Slice value; var find = db.TryGet(ReadOptions.Default, (Slice)key, out value); if (find) { var entry = StateLogEntry.BiserDecode(value.ToArray()); entry.IsCommitted = suggestion.IsCommitted; value = (Slice)entry.BiserEncoder().Encode(); db.Put(WriteOptions.Default, key, value); } else { var data = suggestion.StateLogEntry.BiserEncode(); db.Put(WriteOptions.Default, key, (Slice)data); } }
static void t1() { /* * Start * Protobuf obj length: 22 * Biser Binary obj length: 17 * NetJson obj length: 129 * Biser Json obj length: 129 * * Protobuf encode: 1184 ms * Protobuf decode: 1569 ms * Biser Binary encode: 396 ms * Biser Binary decode: 209 ms * NetJson encode: 1350 ms * NetJson decode: 1902 ms * Biser Json encode: 2266 ms * Biser Json decode: 3659 ms * Press any key */ System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); // It's an operational class from https://github.com/hhblaze/Raft.Net/blob/master/Raft/StateMachine/StateLogEntry.cs StateLogEntry obj = new StateLogEntry() { Data = new byte[] { 1, 2, 3, 4, 5 }, Index = 458, IsCommitted = true, PreviousStateLogId = 4789, PreviousStateLogTerm = 447, RedirectId = 12, Term = 99 }; Console.WriteLine("t1----------------------------------"); //Protobuf. Warming up, getting length var pBt = obj.SerializeProtobuf(); Console.WriteLine($"Protobuf obj length: {pBt.Length}"); var pObj = pBt.DeserializeProtobuf <StateLogEntry>(); //Biser. Getting length var bBt = new Biser.Encoder().Add(obj).Encode(); Console.WriteLine($"Biser Binary obj length: {bBt.Length}"); var bObj = StateLogEntry.BiserDecode(bBt); //NetJson. Getting length var njss = NetJSON.NetJSON.Serialize(obj); Console.WriteLine($"NetJson obj length: {System.Text.Encoding.UTF8.GetBytes(njss).Length}"); var bnjss = NetJSON.NetJSON.Deserialize <StateLogEntry>(njss); //Biser Json. Getting length var bjss = new Biser.JsonEncoder(obj).GetJSON(); Console.WriteLine($"Biser Json obj length: {System.Text.Encoding.UTF8.GetBytes(bjss).Length}"); var bbjss = StateLogEntry.BiserJsonDecode(bjss); //Message Pack var mBt = MessagePackSerializer.Serialize(obj); Console.WriteLine($"Message Pack obj length: {mBt.Length}"); var mc2 = MessagePackSerializer.Deserialize <StateLogEntry>(mBt); Console.WriteLine(""); byte[] tbt = null; StateLogEntry tobj = null; sw.Start(); for (int i = 0; i < 1000000; i++) { tbt = obj.SerializeProtobuf(); } sw.Stop(); Console.WriteLine($"Protobuf encode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { tobj = pBt.DeserializeProtobuf <StateLogEntry>(); } sw.Stop(); Console.WriteLine($"Protobuf decode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { tbt = new Biser.Encoder().Add(obj).Encode(); } sw.Stop(); Console.WriteLine($"Biser Binary encode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { tobj = StateLogEntry.BiserDecode(bBt); } sw.Stop(); Console.WriteLine($"Biser Binary decode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { njss = NetJSON.NetJSON.Serialize(obj); } sw.Stop(); Console.WriteLine($"NetJson encode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { bnjss = NetJSON.NetJSON.Deserialize <StateLogEntry>(njss); } sw.Stop(); Console.WriteLine($"NetJson decode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { bjss = new Biser.JsonEncoder(obj).GetJSON(); } sw.Stop(); Console.WriteLine($"Biser Json encode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { bbjss = StateLogEntry.BiserJsonDecode(bjss); } sw.Stop(); Console.WriteLine($"Biser Json decode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { mBt = MessagePackSerializer.Serialize(obj); } sw.Stop(); Console.WriteLine($"MessagePack encode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 1000000; i++) { mc2 = MessagePackSerializer.Deserialize <StateLogEntry>(mBt); } sw.Stop(); Console.WriteLine($"MessagePack decode: {sw.ElapsedMilliseconds} ms"); sw.Reset(); }