diff --git a/router/gossip_channel.go b/router/gossip_channel.go index ccf4aa9b..11e8e8aa 100644 --- a/router/gossip_channel.go +++ b/router/gossip_channel.go @@ -148,11 +148,18 @@ func (c *GossipChannel) gcSenders(connections ConnectionSet) { } } +// We have seen a couple of failures which suggest a >128GB slice was encountered. +// 100MB should be enough for anyone. +const maxFeasibleMessageLen = 100 * 1024 * 1024 + func (c *GossipChannel) sendDown(conn Connection, data GossipData) { sender, found := c.senders[conn] if !found { sender = NewGossipSender(func(pending GossipData) { for _, msg := range pending.Encode() { + if len(msg) > maxFeasibleMessageLen { + panic(fmt.Sprintf("Gossip message too large: len=%d bytes; on channel '%s' from %+v", len(msg), c.name, pending)) + } protocolMsg := ProtocolMsg{ProtocolGossip, GobEncode(c.name, c.ourself.Name, msg)} conn.(ProtocolSender).SendProtocolMsg(protocolMsg) }