forked from FactomProject/factomd
-
Notifications
You must be signed in to change notification settings - Fork 1
/
messagebuffer.go
91 lines (78 loc) · 2.55 KB
/
messagebuffer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package electionMsgTesting
import (
"fmt"
"github.com/FactomProject/factomd/common/interfaces"
"github.com/FactomProject/factomd/common/messages/electionMsgs"
)
// MessageBuffer will manage all messages in the message list
type MessageBuffer struct {
// A list of all messages, it's an ever growing set, trimming the front
// keeps the index the same by using the 'base' field.
Messages []interfaces.IMsg
Base int
// When looking for a message by someone, this helps searching
MessagesMap map[[32]byte][]int
}
func NewMessageBuffer() *MessageBuffer {
b := new(MessageBuffer)
b.MessagesMap = make(map[[32]byte][]int)
return b
}
func (b *MessageBuffer) Add(msg interfaces.IMsg) {
if msg == nil {
return
}
switch msg.(type) {
case *electionMsgs.FedVoteLevelMsg:
ll := msg.(*electionMsgs.FedVoteLevelMsg)
b.MessagesMap[ll.Signer.Fixed()] = append(b.MessagesMap[ll.Signer.Fixed()], len(b.Messages)+b.Base)
b.Messages = append(b.Messages, ll)
case *electionMsgs.FedVoteProposalMsg:
ll := msg.(*electionMsgs.FedVoteProposalMsg)
b.MessagesMap[ll.Signer.Fixed()] = append(b.MessagesMap[ll.Signer.Fixed()], len(b.Messages)+b.Base)
b.Messages = append(b.Messages, ll)
case *electionMsgs.FedVoteVolunteerMsg:
ll := msg.(*electionMsgs.FedVoteVolunteerMsg)
b.MessagesMap[ll.ServerID.Fixed()] = append(b.MessagesMap[ll.ServerID.Fixed()], len(b.Messages)+b.Base)
b.Messages = append(b.Messages, ll)
default:
fmt.Println("Message type not found")
}
}
func (b *MessageBuffer) RetrieveLeaderLevelMessageByLevel(leader interfaces.IHash, level int) interfaces.IMsg {
list := b.MessagesMap[leader.Fixed()]
for _, v := range list {
msg, _ := b.RetrieveIndex(v)
if msg != nil {
if ll, ok := msg.(*electionMsgs.FedVoteLevelMsg); ok {
if int(ll.Level) == level {
return msg
}
}
}
}
return nil
}
// RetrieveLeaderVoteMessage takes a vol too as multiple vote 0s can be sent out
func (b *MessageBuffer) RetrieveLeaderVoteMessage(leader interfaces.IHash, vol interfaces.IHash) interfaces.IMsg {
list := b.MessagesMap[leader.Fixed()]
for _, v := range list {
msg, _ := b.RetrieveIndex(v)
if msg != nil {
if v, ok := msg.(*electionMsgs.FedVoteProposalMsg); ok && v.Volunteer.ServerID.IsSameAs(vol) {
return msg
}
}
}
return nil
}
func (b *MessageBuffer) RetrieveIndex(index int) (interfaces.IMsg, error) {
i := index - b.Base
if i == -1 {
return nil, fmt.Errorf("index is no longer in set of messages")
}
if i >= len(b.Messages) {
return nil, fmt.Errorf("index outside the set of messages")
}
return b.Messages[i], nil
}