diff --git a/bitswap/client/internal/messagequeue/messagequeue.go b/bitswap/client/internal/messagequeue/messagequeue.go index f6b7a45e2..6fd6c3e40 100644 --- a/bitswap/client/internal/messagequeue/messagequeue.go +++ b/bitswap/client/internal/messagequeue/messagequeue.go @@ -481,7 +481,7 @@ func (mq *MessageQueue) runQueue() { if mq.events != nil { mq.events <- messageQueued } - mq.sendIfReady() + mq.sendMessage() hasWorkChan = nil scheduleWork.Reset(sendMessageDelay) @@ -520,12 +520,6 @@ func (mq *MessageQueue) signalWorkReady() { } } -func (mq *MessageQueue) sendIfReady() { - if mq.hasPendingWork() { - mq.sendMessage() - } -} - func (mq *MessageQueue) sendMessage() { sender, err := mq.initializeSender() if err != nil { @@ -547,6 +541,8 @@ func (mq *MessageQueue) sendMessage() { // After processing the message, clear out its fields to save memory defer mq.msg.Reset(false) + var wantlist []bsmsg.Entry + for { // Convert want lists to a Bitswap Message message, onSent := mq.extractOutgoingMessage(supportsHave) @@ -554,7 +550,7 @@ func (mq *MessageQueue) sendMessage() { return } - wantlist := message.Wantlist() + wantlist = message.FillWantlist(wantlist) mq.logOutgoingMessage(wantlist) if err = sender.SendMsg(mq.ctx, message); err != nil { diff --git a/bitswap/message/message.go b/bitswap/message/message.go index 86ba866ad..f673848dc 100644 --- a/bitswap/message/message.go +++ b/bitswap/message/message.go @@ -18,6 +18,7 @@ import ( // BitSwapMessage is the basic interface for interacting building, encoding, // and decoding messages sent on the BitSwap protocol. type BitSwapMessage interface { + FillWantlist([]Entry) []Entry // Wantlist returns a slice of unique keys that represent data wanted by // the sender. Wantlist() []Entry @@ -244,6 +245,18 @@ func (m *impl) Empty() bool { return len(m.blocks) == 0 && len(m.wantlist) == 0 && len(m.blockPresences) == 0 } +func (m *impl) FillWantlist(out []Entry) []Entry { + if cap(out) < len(m.wantlist) { + out = make([]Entry, len(m.wantlist)) + } + var i int + for _, e := range m.wantlist { + out[i] = *e + i++ + } + return out +} + func (m *impl) Wantlist() []Entry { out := make([]Entry, len(m.wantlist)) var i int