Unverified Commit 00f93fb4 authored by Steven Allen's avatar Steven Allen Committed by GitHub

Merge pull request #356 from ipfs/feat/opt-mq-sort

feat: optimize entry sorting in MessageQueue
parents 9d9719e2 2fe1405b
...@@ -542,9 +542,28 @@ func (mq *MessageQueue) extractOutgoingMessage(supportsHave bool) bsmsg.BitSwapM ...@@ -542,9 +542,28 @@ func (mq *MessageQueue) extractOutgoingMessage(supportsHave bool) bsmsg.BitSwapM
mq.wllock.Lock() mq.wllock.Lock()
defer mq.wllock.Unlock() defer mq.wllock.Unlock()
// Get broadcast and regular wantlist entries // Get broadcast and regular wantlist entries.
bcstEntries := mq.bcstWants.pending.SortedEntries() // SortedEntries() slows down the MessageQueue a lot, and entries only need
peerEntries := mq.peerWants.pending.SortedEntries() // to be sorted if the number of wants will overflow the size of the
// message (to make sure that the highest priority wants are sent in the
// first message).
// We prioritize cancels, then regular wants, then broadcast wants.
var peerEntries []bswl.Entry
var bcstEntries []bswl.Entry
maxCancelsSize := mq.cancels.Len() * bsmsg.MaxEntrySize
maxPeerSize := mq.peerWants.pending.Len() * bsmsg.MaxEntrySize
maxBcstSize := mq.bcstWants.pending.Len() * bsmsg.MaxEntrySize
if maxCancelsSize+maxPeerSize < mq.maxMessageSize {
peerEntries = mq.peerWants.pending.Entries()
} else {
peerEntries = mq.peerWants.pending.SortedEntries()
}
if maxCancelsSize+maxPeerSize+maxBcstSize < mq.maxMessageSize {
bcstEntries = mq.bcstWants.pending.Entries()
} else {
bcstEntries = mq.bcstWants.pending.SortedEntries()
}
// Size of the message so far // Size of the message so far
msgSize := 0 msgSize := 0
......
...@@ -13,6 +13,7 @@ import ( ...@@ -13,6 +13,7 @@ import (
pool "github.com/libp2p/go-buffer-pool" pool "github.com/libp2p/go-buffer-pool"
msgio "github.com/libp2p/go-msgio" msgio "github.com/libp2p/go-msgio"
u "github.com/ipfs/go-ipfs-util"
"github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/network"
) )
...@@ -118,6 +119,24 @@ func (e *Entry) ToPB() pb.Message_Wantlist_Entry { ...@@ -118,6 +119,24 @@ func (e *Entry) ToPB() pb.Message_Wantlist_Entry {
} }
} }
var MaxEntrySize = maxEntrySize()
func maxEntrySize() int {
var maxInt32 int32 = (1 << 31) - 1
c := cid.NewCidV0(u.Hash([]byte("cid")))
e := Entry{
Entry: wantlist.Entry{
Cid: c,
Priority: maxInt32,
WantType: pb.Message_Wantlist_Have,
},
SendDontHave: true, // true takes up more space than false
Cancel: true,
}
return e.Size()
}
type impl struct { type impl struct {
full bool full bool
wantlist map[cid.Cid]*Entry wantlist map[cid.Cid]*Entry
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment