From fd5f484ef720792a5e19c664dac42e71d96f22cf Mon Sep 17 00:00:00 2001 From: guillaumemichel Date: Wed, 29 Jan 2025 17:58:48 +0100 Subject: [PATCH] bitswap: filter interests --- .../sessioninterestmanager.go | 23 +++++++++++++++++++ .../internal/sessionmanager/sessionmanager.go | 5 ++++ 2 files changed, 28 insertions(+) diff --git a/bitswap/client/internal/sessioninterestmanager/sessioninterestmanager.go b/bitswap/client/internal/sessioninterestmanager/sessioninterestmanager.go index e8c27937c..702c5ee27 100644 --- a/bitswap/client/internal/sessioninterestmanager/sessioninterestmanager.go +++ b/bitswap/client/internal/sessioninterestmanager/sessioninterestmanager.go @@ -177,3 +177,26 @@ func (sim *SessionInterestManager) InterestedSessions(keySets ...[]cid.Cid) []ui } return ses } + +// Filters only the keys that are wanted by at least one session +func (sim *SessionInterestManager) FilterInterests(keySets ...[]cid.Cid) [][]cid.Cid { + sim.lk.RLock() + defer sim.lk.RUnlock() + + result := make([][]cid.Cid, len(keySets)) + // For each set of keys + for i, ks := range keySets { + // The set of keys that at least one session is interested in + wanted := make([]cid.Cid, 0, len(ks)) + + // For each key in the set + for _, c := range ks { + // If there are any sessions interested in this key + if _, ok := sim.wants[c]; ok { + wanted = append(wanted, c) + } + } + result[i] = wanted + } + return result +} diff --git a/bitswap/client/internal/sessionmanager/sessionmanager.go b/bitswap/client/internal/sessionmanager/sessionmanager.go index 80eac9f2f..de9f6fb40 100644 --- a/bitswap/client/internal/sessionmanager/sessionmanager.go +++ b/bitswap/client/internal/sessionmanager/sessionmanager.go @@ -154,6 +154,11 @@ func (sm *SessionManager) GetNextSessionID() uint64 { // ReceiveFrom is called when a new message is received func (sm *SessionManager) ReceiveFrom(ctx context.Context, p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) { + // Keep only the keys that at least one session is interested in + keys := sm.sessionInterestManager.FilterInterests(blks, haves, dontHaves) + blks = keys[0] + haves = keys[1] + dontHaves = keys[2] // Record block presence for HAVE / DONT_HAVE sm.blockPresenceManager.ReceiveFrom(p, haves, dontHaves)