diff --git a/comm.go b/comm.go index 182e992..fded9a8 100644 --- a/comm.go +++ b/comm.go @@ -122,3 +122,13 @@ func rpcWithControl(msgs []*pb.Message, }, } } + +func copyRPC(rpc *RPC) *RPC { + res := new(RPC) + *res = *rpc + if rpc.Control != nil { + res.Control = new(pb.ControlMessage) + *res.Control = *rpc.Control + } + return res +} diff --git a/gossipsub.go b/gossipsub.go index 700120b..563b94e 100644 --- a/gossipsub.go +++ b/gossipsub.go @@ -308,9 +308,14 @@ func (gs *GossipSubRouter) sendPrune(p peer.ID, topic string) { } func (gs *GossipSubRouter) sendRPC(p peer.ID, out *RPC) { + // do we own the RPC? + own := false + // piggyback cotrol message retries ctl, ok := gs.control[p] if ok { + out = copyRPC(out) + own = true gs.piggybackControl(p, out, ctl) delete(gs.control, p) } @@ -318,6 +323,10 @@ func (gs *GossipSubRouter) sendRPC(p peer.ID, out *RPC) { // piggyback gossip ihave, ok := gs.gossip[p] if ok { + if !own { + out = copyRPC(out) + own = true + } gs.piggybackGossip(p, out, ihave) delete(gs.gossip, p) }