コード例 #1
0
 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);
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 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
         });
     }
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        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());
                }
            }
        }
コード例 #7
0
        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());
                }
            }
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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;
                }
            }
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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();
        }