Esempio n. 1
0
 public static byte[] EncodeVote(Vote node)
 {
     return(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(node, Formatting.None)));
 }
Esempio n. 2
0
        private Response MakeResponse(ProcedureCallBatch requestBatch)
        {
            Dictionary <string, bool> response = new Dictionary <string, bool>();

            if (requestBatch.Sender == null)
            {
                foreach (Call request in requestBatch.Batch)
                {
                    if (request.Type == Call._Type.VALUE_RESPONSE)
                    {
                        ValueResponseBatch vr = Encoder.DecodeValueResponseBatch(request.Data);
                        if (CurrentState.Instance.IsLeader)
                        {
                            StateLog.Instance.Leader_AddActionCompleted(vr.UUID, Params.ID);
                        }
                        else
                        {
                            StateLog.Instance.Follower_MarkActionCompleted(vr.UUID);
                        }
                        StateLog.Instance.RemoveCurrentTask(vr.UUID);
                        if (Params.TEST_RECEIVER_HOST != string.Empty)
                        {
                            try
                            {
                                TestReceiverClient.Instance.AddEntry(vr.Responses);
                            } catch (Exception e)
                            {
                                Logger.Write(Logger.Tag.ERROR, "ADD_ENTRY: " + e.ToString());
                            }
                        }
                        response.Add(request.ID, true);
                    }
                    else
                    {
                        response.Add(request.ID, false);
                    }
                }
                return(new Response()
                {
                    Status = response
                });
            }
            else
            {
                CurrentState.Instance.SetCandidateResolve(false);
                HashSet <string> cpa = new HashSet <string>();
                if (requestBatch.Completed != null)
                {
                    cpa = new HashSet <string>(requestBatch.Completed);
                    foreach (string actionID in cpa)
                    {
                        StateLog.Instance.Follower_AddActionCompleted(actionID);
                    }
                }
                foreach (Call request in requestBatch.Batch)
                {
                    if (request.Type == Call._Type.VOTE)
                    {
                        Vote vote   = Encoder.DecodeVote(request.Data);
                        Vote myVote = vote;
                        int  count  = StateLog.Instance.LogCount;
                        if (vote.LogCount < count)
                        {
                            myVote = new Vote()
                            {
                                ID       = Params.ID,
                                LogCount = count
                            };
                        }
                        else if (Utils.IsCandidate(CurrentState.Instance.Get_State.State))
                        {
                            Params.OverwriteParameters(vote.Parameters);
                            CurrentState.Instance.CancelState();
                            CurrentState.Instance.Timer.Reset(((int)(Params.HEARTBEAT_MS / 2)));
                        }
                        else
                        {
                            CurrentState.Instance.Timer.Reset();
                        }
                        response.Add(request.ID, true);
                        Logger.Write(Logger.Tag.WARN, "Received VOTE (OVERWROTE PARAMETERS).");
                        return(new Response()
                        {
                            Status = response,
                            Data = Encoder.EncodeVote(myVote),
                            HIEVar = CurrentState.Instance.HIEVar
                        });
                    }
                    else if (request.Type == Call._Type.DATA_REQUEST)
                    {
                        DataRequest action = Encoder.DecodeDataRequest(request.Data);
                        // action.T1 = Utils.Micros.ToString();
                        bool b = true;
                        if (!cpa.Contains(action.ID))
                        {
                            b = StateLog.Instance.AppendAction(action);
                        }
                        CurrentState.Instance.CancelState();
                        response.Add(request.ID, b);
                    }
                    else if (request.Type == Call._Type.NODE_ADD)
                    {
                        Credentials node = Encoder.DecodeNode(request.Data);
                        StateLog.Instance.Nodes.AddNewNode(node);
                        // if (CurrentState.Instance.IsLeader)
                        // CurrentState.Instance.CancelState();
                        response.Add(request.ID, true);
                    }
                    else if (request.Type == Call._Type.NODE_DEL)
                    {
                        Credentials node = Encoder.DecodeNode(request.Data);
                        StateLog.Instance.ClearPeerLog(node.ID);
                        StateLog.Instance.Nodes.TryRemoveNode(node.ID);
                        CurrentState.Instance.CancelState();
                        response.Add(request.ID, true);
                    }
                    else
                    {
                        response.Add(request.ID, false);
                    }
                }

                if (requestBatch.Sender != null && requestBatch.Step > Params.STEP)
                {
                    Params.STEP = requestBatch.Step;
                }

                List <string> completed = null;

                if (requestBatch.Sender != null)
                {
                    completed = StateLog.Instance.Follower_GetCompletedActions();
                    CurrentState.Instance.Timer.Reset();
                }

                return(new Response()
                {
                    Status = response,
                    Completed = completed,
                    HIEVar = CurrentState.Instance.HIEVar
                });
            }
        }
Esempio n. 3
0
        public void OnResponse(string receiverID, ProcedureCallBatch sender, string response)
        {
            if (response == null)
            {
                return;
            }
            Response r0 = Encoder.DecodeResponse(response);

            if (r0 == null || r0.Status == null)
            {
                // Will never be leader (well, not until next term)
                return;
            }
            sender.Batch.ForEach((r) => {
                if (r0.Status.ContainsKey(r.ID))
                {
                    if (r0.Status[r.ID])
                    {
                        Vote v0 = Encoder.DecodeVote(r0.Data);
                        lock (_lock2)
                        {
                            votes.Add(v0.ID);
                        }
                    }
                    else
                    {
                        lock (_lock2)
                        {
                            votes.Add("*");
                        }
                    }
                }
            });
            lock (_lock2)
            {
                Node node;
                bool nb = StateLog.Instance.Nodes.TryGetNode(receiverID, out node);
                if (nb)
                {
                    node.HIEVar = r0.HIEVar;
                }
                // foreach(string s in votes) Console.WriteLine(s);
                // if (CurrentState.Instance.ReceviedVote)
                // {
                //     CurrentState.Instance.CancelState();
                //     CurrentState.Instance.Timer.Reset(((int)(Params.HEARTBEAT_MS/2)));
                //     StateMachine.SetElectionTerm(false);
                // }

                // if (votes.Count == Quorum && votes.Any((s) => s != Params.ID))
                HashSet <string> _votes = new HashSet <string>(votes);
                if (votes.Count == Quorum && _votes.Count == 1 && votes.Contains("*") && !CurrentState.Instance.CandidateResolve)
                {
                    CurrentState.Instance.ActAsSleeper();
                    CurrentState.Instance.SetCandidateResolve(true);
                }
                else if (votes.Count == Quorum && _votes.Count > 0 && votes.Contains(Params.ID) && Utils.IsCandidate(CurrentState.Instance.Get_State.State))
                {
                    CurrentState.Instance.SetStateAsLeader();
                    CurrentState.Instance.SetCandidateResolve(false);
                }
                else if (votes.Count == Quorum && !CurrentState.Instance.CandidateResolve)
                {
                    CurrentState.Instance.CancelState();
                    CurrentState.Instance.Timer.Reset(((int)(Params.HEARTBEAT_MS / 2)));
                }
            }
        }