// Messages that will go into the Process List must match an Acknowledgement. // The code for this is the same for all such messages, so we put it here. // // Returns true if it finds a match, puts the message in holding, or invalidates the message func (s *State) FollowerExecuteMsg(m interfaces.IMsg) { s.Holding[m.GetMsgHash().Fixed()] = m ack, _ := s.Acks[m.GetMsgHash().Fixed()].(*messages.Ack) if ack != nil { m.SetLeaderChainID(ack.GetLeaderChainID()) m.SetMinute(ack.Minute) pl := s.ProcessLists.Get(ack.DBHeight) pl.AddToProcessList(ack, m) } }
func (s *State) LeaderExecute(m interfaces.IMsg) { _, ok := s.Replay.Valid(constants.INTERNAL_REPLAY, m.GetRepeatHash().Fixed(), m.GetTimestamp(), s.GetTimestamp()) if !ok { delete(s.Holding, m.GetRepeatHash().Fixed()) delete(s.Holding, m.GetMsgHash().Fixed()) return } ack := s.NewAck(m).(*messages.Ack) m.SetLeaderChainID(ack.GetLeaderChainID()) m.SetMinute(ack.Minute) s.ProcessLists.Get(ack.DBHeight).AddToProcessList(ack, m) }
func (s *State) FollowerExecuteRevealEntry(m interfaces.IMsg) { s.Holding[m.GetMsgHash().Fixed()] = m ack, _ := s.Acks[m.GetMsgHash().Fixed()].(*messages.Ack) if ack != nil { m.SetLeaderChainID(ack.GetLeaderChainID()) m.SetMinute(ack.Minute) pl := s.ProcessLists.Get(ack.DBHeight) pl.AddToProcessList(ack, m) // If we added the ack, then it will be cleared from the ack map. if s.Acks[m.GetMsgHash().Fixed()] == nil { msg := m.(*messages.RevealEntryMsg) delete(s.Commits, msg.Entry.GetHash().Fixed()) // Okay the Reveal has been recorded. Record this as an entry that cannot be duplicated. s.Replay.IsTSValid_(constants.REVEAL_REPLAY, msg.Entry.GetHash().Fixed(), msg.Timestamp, s.GetTimestamp()) } } }
func (s *State) LeaderExecuteRevealEntry(m interfaces.IMsg) { re := m.(*messages.RevealEntryMsg) eh := re.Entry.GetHash() commit, rtn := re.ValidateRTN(s) switch rtn { case 0: m.FollowerExecute(s) case -1: return } now := s.GetTimestamp() // If we have already recorded a Reveal Entry with this hash in this period, just ignore. if _, v := s.Replay.Valid(constants.REVEAL_REPLAY, eh.Fixed(), s.GetLeaderTimestamp(), now); !v { return } ack := s.NewAck(m).(*messages.Ack) m.SetLeaderChainID(ack.GetLeaderChainID()) m.SetMinute(ack.Minute) // Put the acknowledgement in the Acks so we can tell if AddToProcessList() adds it. s.Acks[m.GetMsgHash().Fixed()] = ack s.ProcessLists.Get(ack.DBHeight).AddToProcessList(ack, m) // If it was added, then get rid of the matching Commit. if s.Acks[m.GetMsgHash().Fixed()] != nil { m.FollowerExecute(s) s.PutCommit(eh, commit) } else { // Okay the Reveal has been recorded. Record this as an entry that cannot be duplicated. s.Replay.IsTSValid_(constants.REVEAL_REPLAY, eh.Fixed(), m.GetTimestamp(), now) delete(s.Commits, eh.Fixed()) } }