diff --git a/ipam/allocator.go b/ipam/allocator.go index 72ef3072..8b609b96 100644 --- a/ipam/allocator.go +++ b/ipam/allocator.go @@ -435,8 +435,8 @@ func (d *ipamGossipData) Merge(other router.GossipData) { // no-op } -func (d *ipamGossipData) Encode() []byte { - return d.alloc.Encode() +func (d *ipamGossipData) Encode() [][]byte { + return [][]byte{d.alloc.Encode()} } // Gossip returns a GossipData implementation, which in this case always diff --git a/ipam/testutils_test.go b/ipam/testutils_test.go index c685685b..6768a121 100644 --- a/ipam/testutils_test.go +++ b/ipam/testutils_test.go @@ -258,8 +258,10 @@ func (grouter *TestGossipRouter) connect(sender router.PeerName, gossiper router panic(fmt.Sprintf("Error doing gossip unicast to %s: %s", sender, err)) } } else { - if _, err := gossiper.OnGossipBroadcast(message.data.Encode()); err != nil { - panic(fmt.Sprintf("Error doing gossip broadcast to %s: %s", sender, err)) + for _, msg := range message.data.Encode() { + if _, err := gossiper.OnGossipBroadcast(msg); err != nil { + panic(fmt.Sprintf("Error doing gossip broadcast to %s: %s", sender, err)) + } } } case <-gossipTimer: diff --git a/router/gossip.go b/router/gossip.go index eba13174..d4293a4d 100644 --- a/router/gossip.go +++ b/router/gossip.go @@ -5,7 +5,7 @@ import ( ) type GossipData interface { - Encode() []byte + Encode() [][]byte Merge(GossipData) } diff --git a/router/gossip_channel.go b/router/gossip_channel.go index fdc7c5ed..0b1e808c 100644 --- a/router/gossip_channel.go +++ b/router/gossip_channel.go @@ -145,8 +145,10 @@ func (c *GossipChannel) sendDown(conn Connection, data GossipData) { sender, found := c.senders[conn] if !found { sender = NewGossipSender(func(pending GossipData) { - protocolMsg := ProtocolMsg{ProtocolGossip, GobEncode(c.name, c.ourself.Name, pending.Encode())} - conn.(ProtocolSender).SendProtocolMsg(protocolMsg) + for _, msg := range pending.Encode() { + protocolMsg := ProtocolMsg{ProtocolGossip, GobEncode(c.name, c.ourself.Name, msg)} + conn.(ProtocolSender).SendProtocolMsg(protocolMsg) + } }) c.senders[conn] = sender sender.Start() @@ -212,10 +214,13 @@ func (c *GossipChannel) sendBroadcast(srcName PeerName, update GossipData) { if len(nextHops) == 0 { return } - protocolMsg := ProtocolMsg{ProtocolGossipBroadcast, GobEncode(c.name, srcName, update.Encode())} - // FIXME a single blocked connection can stall us - for _, conn := range c.ourself.ConnectionsTo(nextHops) { - conn.(ProtocolSender).SendProtocolMsg(protocolMsg) + connections := c.ourself.ConnectionsTo(nextHops) + for _, msg := range update.Encode() { + protocolMsg := ProtocolMsg{ProtocolGossipBroadcast, GobEncode(c.name, srcName, msg)} + // FIXME a single blocked connection can stall us + for _, conn := range connections { + conn.(ProtocolSender).SendProtocolMsg(protocolMsg) + } } } diff --git a/router/router.go b/router/router.go index 3473b05d..ab671a0d 100644 --- a/router/router.go +++ b/router/router.go @@ -394,8 +394,8 @@ func (d *TopologyGossipData) Merge(other GossipData) { } } -func (d *TopologyGossipData) Encode() []byte { - return d.peers.EncodePeers(d.update) +func (d *TopologyGossipData) Encode() [][]byte { + return [][]byte{d.peers.EncodePeers(d.update)} } func (router *Router) OnGossipUnicast(sender PeerName, msg []byte) error {