Skip to content

Commit 3902b1c

Browse files
authored
Merge pull request #239 from stevesg/compound-fix
Fix for compound messages containing >255 messages.
2 parents 3c0cdff + 8d2a27a commit 3902b1c

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

memberlist_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,9 +1285,9 @@ func TestMemberlist_UserData(t *testing.T) {
12851285

12861286
bindPort := m1.config.BindPort
12871287

1288-
bcasts := [][]byte{
1289-
[]byte("test"),
1290-
[]byte("foobar"),
1288+
bcasts := make([][]byte, 256)
1289+
for i := range bcasts {
1290+
bcasts[i] = []byte(fmt.Sprintf("%d", i))
12911291
}
12921292

12931293
// Create a second node

state.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,12 @@ func (m *Memberlist) gossip() {
615615
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
616616
}
617617
} else {
618-
// Otherwise create and send a compound message
619-
compound := makeCompoundMessage(msgs)
620-
if err := m.rawSendMsgPacket(node.FullAddress(), &node, compound.Bytes()); err != nil {
621-
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
618+
// Otherwise create and send one or more compound messages
619+
compounds := makeCompoundMessages(msgs)
620+
for _, compound := range compounds {
621+
if err := m.rawSendMsgPacket(node.FullAddress(), &node, compound.Bytes()); err != nil {
622+
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
623+
}
622624
}
623625
}
624626
}

util.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,23 @@ OUTER:
152152
return kNodes
153153
}
154154

155+
// makeCompoundMessages takes a list of messages and packs
156+
// them into one or multiple messages based on the limitations
157+
// of compound messages (255 messages each).
158+
func makeCompoundMessages(msgs [][]byte) []*bytes.Buffer {
159+
const maxMsgs = 255
160+
bufs := make([]*bytes.Buffer, 0, (len(msgs)+(maxMsgs-1))/maxMsgs)
161+
162+
for ; len(msgs) > maxMsgs; msgs = msgs[maxMsgs:] {
163+
bufs = append(bufs, makeCompoundMessage(msgs[:maxMsgs]))
164+
}
165+
if len(msgs) > 0 {
166+
bufs = append(bufs, makeCompoundMessage(msgs))
167+
}
168+
169+
return bufs
170+
}
171+
155172
// makeCompoundMessage takes a list of messages and generates
156173
// a single compound message containing all of them
157174
func makeCompoundMessage(msgs [][]byte) *bytes.Buffer {

0 commit comments

Comments
 (0)