public static byte[] EncodeVote(Vote node) { return(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(node, Formatting.None))); }
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 }); } }
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))); } } }