Skip to content

Commit 8d2a27a

Browse files
committed
Fix for compound messages containing >255 messages.
1 parent 619135c commit 8d2a27a

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
@@ -1200,9 +1200,9 @@ func TestMemberlist_UserData(t *testing.T) {
12001200

12011201
bindPort := m1.config.BindPort
12021202

1203-
bcasts := [][]byte{
1204-
[]byte("test"),
1205-
[]byte("foobar"),
1203+
bcasts := make([][]byte, 256)
1204+
for i := range bcasts {
1205+
bcasts[i] = []byte(fmt.Sprintf("%d", i))
12061206
}
12071207

12081208
// Create a second node

state.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,10 +606,12 @@ func (m *Memberlist) gossip() {
606606
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
607607
}
608608
} else {
609-
// Otherwise create and send a compound message
610-
compound := makeCompoundMessage(msgs)
611-
if err := m.rawSendMsgPacket(node.FullAddress(), &node, compound.Bytes()); err != nil {
612-
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
609+
// Otherwise create and send one or more compound messages
610+
compounds := makeCompoundMessages(msgs)
611+
for _, compound := range compounds {
612+
if err := m.rawSendMsgPacket(node.FullAddress(), &node, compound.Bytes()); err != nil {
613+
m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err)
614+
}
613615
}
614616
}
615617
}

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)