From 932e2d60a5a8e84e441505c3e240167e236b0395 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 23 Apr 2020 16:34:31 -0400 Subject: [PATCH] refactor: remove WantManager --- bitswap.go | 23 ++-- docs/go-bitswap.png | Bin 84886 -> 81880 bytes docs/go-bitswap.puml | 14 +-- docs/how-bitswap-works.md | 13 +- internal/session/session.go | 59 +++++---- internal/session/session_test.go | 114 +++++++++-------- internal/session/sessionwantsender_test.go | 5 +- .../sessioninterestmanager.go | 2 +- internal/sessionmanager/sessionmanager.go | 10 +- .../sessionmanager/sessionmanager_test.go | 19 ++- internal/wantmanager/wantmanager.go | 103 --------------- internal/wantmanager/wantmanager_test.go | 117 ------------------ 12 files changed, 139 insertions(+), 340 deletions(-) delete mode 100644 internal/wantmanager/wantmanager.go delete mode 100644 internal/wantmanager/wantmanager_test.go diff --git a/bitswap.go b/bitswap.go index aab1429..f332096 100644 --- a/bitswap.go +++ b/bitswap.go @@ -22,7 +22,6 @@ import ( bssim "github.com/ipfs/go-bitswap/internal/sessioninterestmanager" bssm "github.com/ipfs/go-bitswap/internal/sessionmanager" bsspm "github.com/ipfs/go-bitswap/internal/sessionpeermanager" - bswm "github.com/ipfs/go-bitswap/internal/wantmanager" bsmsg "github.com/ipfs/go-bitswap/message" bsnet "github.com/ipfs/go-bitswap/network" blocks "github.com/ipfs/go-block-format" @@ -123,13 +122,13 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, return nil }) - var wm *bswm.WantManager // onDontHaveTimeout is called when a want-block is sent to a peer that // has an old version of Bitswap that doesn't support DONT_HAVE messages, // or when no response is received within a timeout. + var sm *bssm.SessionManager onDontHaveTimeout := func(p peer.ID, dontHaves []cid.Cid) { - // Simulate a DONT_HAVE message arriving to the WantManager - wm.ReceiveFrom(ctx, p, nil, nil, dontHaves) + // Simulate a message arriving with DONT_HAVEs + sm.ReceiveFrom(ctx, p, nil, nil, dontHaves) } peerQueueFactory := func(ctx context.Context, p peer.ID) bspm.PeerQueue { return bsmq.New(ctx, p, network, onDontHaveTimeout) @@ -138,7 +137,6 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, sim := bssim.New() bpm := bsbpm.New() pm := bspm.New(ctx, peerQueueFactory, network.Self()) - wm = bswm.New(ctx, pm, sim, bpm) pqm := bspqm.New(ctx, network) sessionFactory := func(ctx context.Context, id uint64, spm bssession.SessionPeerManager, @@ -149,14 +147,13 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, provSearchDelay time.Duration, rebroadcastDelay delay.D, self peer.ID) bssm.Session { - return bssession.New(ctx, id, wm, spm, pqm, sim, pm, bpm, notif, provSearchDelay, rebroadcastDelay, self) + return bssession.New(ctx, id, spm, pqm, sim, pm, bpm, notif, provSearchDelay, rebroadcastDelay, self) } sessionPeerManagerFactory := func(ctx context.Context, id uint64) bssession.SessionPeerManager { return bsspm.New(id, network.ConnectionManager()) } notif := notifications.New() - sm := bssm.New(ctx, sessionFactory, sim, sessionPeerManagerFactory, bpm, pm, notif, network.Self()) - wm.SetSessionManager(sm) + sm = bssm.New(ctx, sessionFactory, sim, sessionPeerManagerFactory, bpm, pm, notif, network.Self()) engine := decision.NewEngine(ctx, bstore, network.ConnectionManager(), network.Self()) bs := &Bitswap{ @@ -166,7 +163,6 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, process: px, newBlocks: make(chan cid.Cid, HasBlockBufferSize), provideKeys: make(chan cid.Cid, provideKeysBufferSize), - wm: wm, pm: pm, pqm: pqm, sm: sm, @@ -207,9 +203,6 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, // Bitswap instances implement the bitswap protocol. type Bitswap struct { - // the wantlist tracks global wants for bitswap - wm *bswm.WantManager - pm *bspm.PeerManager // the provider query manager manages requests to find providers @@ -357,7 +350,7 @@ func (bs *Bitswap) receiveBlocksFrom(ctx context.Context, from peer.ID, blks []b // Send all block keys (including duplicates) to any sessions that want them. // (The duplicates are needed by sessions for accounting purposes) - bs.wm.ReceiveFrom(ctx, from, allKs, haves, dontHaves) + bs.sm.ReceiveFrom(ctx, from, allKs, haves, dontHaves) // Send wanted blocks to decision engine bs.engine.ReceiveFrom(from, wanted, haves) @@ -480,14 +473,14 @@ func (bs *Bitswap) blockstoreHas(blks []blocks.Block) []bool { // PeerConnected is called by the network interface // when a peer initiates a new connection to bitswap. func (bs *Bitswap) PeerConnected(p peer.ID) { - bs.wm.Connected(p) + bs.pm.Connected(p) bs.engine.PeerConnected(p) } // PeerDisconnected is called by the network interface when a peer // closes a connection func (bs *Bitswap) PeerDisconnected(p peer.ID) { - bs.wm.Disconnected(p) + bs.pm.Disconnected(p) bs.engine.PeerDisconnected(p) } diff --git a/docs/go-bitswap.png b/docs/go-bitswap.png index 31dff2b85a71af71b056e0cdbaa12941d13dabf2..805bf6562a822c8cd68ed310ff49f07e4be45ba2 100644 GIT binary patch literal 81880 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

v5&)MErD_|GN3X;E4i}jv>&|g+Uyq= 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 Iy8Y;X0JMwC>Hq)$ diff --git a/docs/go-bitswap.puml b/docs/go-bitswap.puml index 6a291dc..af9134d 100644 --- a/docs/go-bitswap.puml +++ b/docs/go-bitswap.puml @@ -11,13 +11,6 @@ node "Sending Blocks" { [Engine] --> [TaskWorker (workers.go)] } -node "Requesting Blocks" { - [Bitswap] --* [WantManager] - [WantManager] --> [BlockPresenceManager] - [WantManager] --> [PeerManager] - [PeerManager] --* [MessageQueue] -} - node "Providing" { [Bitswap] --* [Provide Collector (workers.go)] [Provide Collector (workers.go)] --* [Provide Worker (workers.go)] @@ -31,14 +24,19 @@ node "Sessions (smart requests)" { [Bitswap] --* [SessionManager] [SessionManager] --> [SessionInterestManager] [SessionManager] --o [Session] + [SessionManager] --> [BlockPresenceManager] [Session] --* [sessionWantSender] [Session] --* [SessionPeerManager] - [Session] --> [WantManager] [Session] --> [ProvideQueryManager] [Session] --* [sessionWants] [Session] --> [SessionInterestManager] [sessionWantSender] --> [BlockPresenceManager] +} + +node "Requesting Blocks" { + [SessionManager] --> [PeerManager] [sessionWantSender] --> [PeerManager] + [PeerManager] --* [MessageQueue] } node "Network" { diff --git a/docs/how-bitswap-works.md b/docs/how-bitswap-works.md index 4b6ab1a..303b057 100644 --- a/docs/how-bitswap-works.md +++ b/docs/how-bitswap-works.md @@ -74,8 +74,8 @@ When a message is received, Bitswap So that the Engine can send responses to the wants - Informs the Engine of any received blocks So that the Engine can send the received blocks to any peers that want them -- Informs the WantManager of received blocks, HAVEs and DONT_HAVEs - So that the WantManager can inform interested sessions +- Informs the SessionManager of received blocks, HAVEs and DONT_HAVEs + So that the SessionManager can inform interested sessions When the client makes an API call, Bitswap creates a new Session and calls the corresponding method (eg `GetBlocks()`). @@ -101,9 +101,10 @@ The PeerTaskQueue prioritizes tasks such that the peers with the least amount of ### Requesting Blocks -When the WantManager is informed of a new message, it -- informs the SessionManager - The SessionManager informs the Sessions that are interested in the received blocks and wants +When the SessionManager is informed of a new message, it +- informs the BlockPresenceManager + The BlockPresenceManager keeps track of which peers have sent HAVES and DONT_HAVEs for each block +- informs the Sessions that are interested in the received blocks and wants - informs the PeerManager of received blocks The PeerManager checks if any wants were send to a peer for the received blocks. If so it sends a `CANCEL` message to those peers. @@ -114,7 +115,7 @@ The Session starts in "discovery" mode. This means it doesn't have any peers yet When the client initially requests blocks from a Session, the Session - informs the SessionInterestManager that it is interested in the want - informs the sessionWantManager of the want -- tells the WantManager to broadcast a `want-have` to all connected peers so as to discover which peers have the block +- tells the PeerManager to broadcast a `want-have` to all connected peers so as to discover which peers have the block - queries the ProviderQueryManager to discover which peers have the block When the session receives a message with `HAVE` or a `block`, it informs the SessionPeerManager. The SessionPeerManager keeps track of all peers in the session. diff --git a/internal/session/session.go b/internal/session/session.go index 34a7375..ef77980 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -25,17 +25,6 @@ const ( broadcastLiveWantsLimit = 64 ) -// WantManager is an interface that can be used to request blocks -// from given peers. -type WantManager interface { - // BroadcastWantHaves sends want-haves to all connected peers (used for - // session discovery) - BroadcastWantHaves(context.Context, uint64, []cid.Cid) - // RemoveSession removes the session from the WantManager (when the - // session shuts down) - RemoveSession(context.Context, uint64) -} - // PeerManager keeps track of which sessions are interested in which peers // and takes care of sending wants for the sessions type PeerManager interface { @@ -47,6 +36,11 @@ type PeerManager interface { UnregisterSession(uint64) // SendWants tells the PeerManager to send wants to the given peer SendWants(ctx context.Context, peerId peer.ID, wantBlocks []cid.Cid, wantHaves []cid.Cid) + // BroadcastWantHaves sends want-haves to all connected peers (used for + // session discovery) + BroadcastWantHaves(context.Context, []cid.Cid) + // SendCancels tells the PeerManager to send cancels to all peers + SendCancels(context.Context, []cid.Cid) } // SessionPeerManager keeps track of peers in the session @@ -98,7 +92,8 @@ type op struct { type Session struct { // dependencies ctx context.Context - wm WantManager + pm PeerManager + bpm *bsbpm.BlockPresenceManager sprm SessionPeerManager providerFinder ProviderFinder sim *bssim.SessionInterestManager @@ -131,7 +126,6 @@ type Session struct { // given context. func New(ctx context.Context, id uint64, - wm WantManager, sprm SessionPeerManager, providerFinder ProviderFinder, sim *bssim.SessionInterestManager, @@ -145,7 +139,8 @@ func New(ctx context.Context, sw: newSessionWants(broadcastLiveWantsLimit), tickDelayReqs: make(chan time.Duration), ctx: ctx, - wm: wm, + pm: pm, + bpm: bpm, sprm: sprm, providerFinder: providerFinder, sim: sim, @@ -301,13 +296,13 @@ func (s *Session) run(ctx context.Context) { s.sw.WantsSent(oper.keys) case opBroadcast: // Broadcast want-haves to all peers - s.broadcastWantHaves(ctx, oper.keys) + s.broadcast(ctx, oper.keys) default: panic("unhandled operation") } case <-s.idleTick.C: // The session hasn't received blocks for a while, broadcast - s.broadcastWantHaves(ctx, nil) + s.broadcast(ctx, nil) case <-s.periodicSearchTimer.C: // Periodically search for a random live want s.handlePeriodicSearch(ctx) @@ -325,7 +320,7 @@ func (s *Session) run(ctx context.Context) { // Called when the session hasn't received any blocks for some time, or when // all peers in the session have sent DONT_HAVE for a particular set of CIDs. // Send want-haves to all connected peers, and search for new peers with the CID. -func (s *Session) broadcastWantHaves(ctx context.Context, wants []cid.Cid) { +func (s *Session) broadcast(ctx context.Context, wants []cid.Cid) { // If this broadcast is because of an idle timeout (we haven't received // any blocks for a while) then broadcast all pending wants if wants == nil { @@ -333,7 +328,7 @@ func (s *Session) broadcastWantHaves(ctx context.Context, wants []cid.Cid) { } // Broadcast a want-have for the live wants to everyone we're connected to - s.wm.BroadcastWantHaves(ctx, s.id, wants) + s.broadcastWantHaves(ctx, wants) // do not find providers on consecutive ticks // -- just rely on periodic search widening @@ -341,7 +336,7 @@ func (s *Session) broadcastWantHaves(ctx context.Context, wants []cid.Cid) { // Search for providers who have the first want in the list. // Typically if the provider has the first block they will have // the rest of the blocks also. - log.Debugf("Ses%d: FindMorePeers with want %s (1st of %d wants)", s.id, wants[0], len(wants)) + log.Debugw("FindMorePeers", "session", s.id, "cid", wants[0], "pending", len(wants)) s.findMorePeers(ctx, wants[0]) } s.resetIdleTick() @@ -364,7 +359,7 @@ func (s *Session) handlePeriodicSearch(ctx context.Context) { // for new providers for blocks. s.findMorePeers(ctx, randomWant) - s.wm.BroadcastWantHaves(ctx, s.id, []cid.Cid{randomWant}) + s.broadcastWantHaves(ctx, []cid.Cid{randomWant}) s.periodicSearchTimer.Reset(s.periodicSearchDelay.NextWaitTime()) } @@ -390,8 +385,18 @@ func (s *Session) handleShutdown() { // Shut down the sessionWantSender (blocks until sessionWantSender stops // sending) s.sws.Shutdown() - // Remove the session from the want manager - s.wm.RemoveSession(s.ctx, s.id) + + // Remove session's interest in the given blocks. + cancelKs := s.sim.RemoveSessionInterest(s.id) + + // Free up block presence tracking for keys that no session is interested + // in anymore + s.bpm.RemoveKeys(cancelKs) + + // TODO: If the context is cancelled this won't actually send any CANCELs. + // We should use a longer lived context to send out these CANCELs. + // Send CANCEL to all peers for blocks that no session is interested in anymore + s.pm.SendCancels(s.ctx, cancelKs) } // handleReceive is called when the session receives blocks from a peer @@ -439,11 +444,17 @@ func (s *Session) wantBlocks(ctx context.Context, newks []cid.Cid) { // No peers discovered yet, broadcast some want-haves ks := s.sw.GetNextWants() if len(ks) > 0 { - log.Infof("Ses%d: No peers - broadcasting %d want HAVE requests\n", s.id, len(ks)) - s.wm.BroadcastWantHaves(ctx, s.id, ks) + log.Infow("No peers - broadcasting", "session", s.id, "want-count", len(ks)) + s.broadcastWantHaves(ctx, ks) } } +// Send want-haves to all connected peers +func (s *Session) broadcastWantHaves(ctx context.Context, wants []cid.Cid) { + log.Debugw("broadcastWantHaves", "session", s.id, "cids", wants) + s.pm.BroadcastWantHaves(ctx, wants) +} + // The session will broadcast if it has outstanding wants and doesn't receive // any blocks for some time. // The length of time is calculated diff --git a/internal/session/session_test.go b/internal/session/session_test.go index d6f89e2..a8773f1 100644 --- a/internal/session/session_test.go +++ b/internal/session/session_test.go @@ -17,28 +17,6 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" ) -type wantReq struct { - cids []cid.Cid -} - -type fakeWantManager struct { - wantReqs chan wantReq -} - -func newFakeWantManager() *fakeWantManager { - return &fakeWantManager{ - wantReqs: make(chan wantReq, 1), - } -} - -func (fwm *fakeWantManager) BroadcastWantHaves(ctx context.Context, sesid uint64, cids []cid.Cid) { - select { - case fwm.wantReqs <- wantReq{cids}: - case <-ctx.Done(): - } -} -func (fwm *fakeWantManager) RemoveSession(context.Context, uint64) {} - func newFakeSessionPeerManager() *bsspm.SessionPeerManager { return bsspm.New(1, newFakePeerTagger()) } @@ -76,11 +54,19 @@ func (fpf *fakeProviderFinder) FindProvidersAsync(ctx context.Context, k cid.Cid return make(chan peer.ID) } +type wantReq struct { + cids []cid.Cid +} + type fakePeerManager struct { + cancels []cid.Cid + wantReqs chan wantReq } func newFakePeerManager() *fakePeerManager { - return &fakePeerManager{} + return &fakePeerManager{ + wantReqs: make(chan wantReq, 1), + } } func (pm *fakePeerManager) RegisterSession(peer.ID, bspm.Session) bool { @@ -88,19 +74,27 @@ func (pm *fakePeerManager) RegisterSession(peer.ID, bspm.Session) bool { } func (pm *fakePeerManager) UnregisterSession(uint64) {} func (pm *fakePeerManager) SendWants(context.Context, peer.ID, []cid.Cid, []cid.Cid) {} +func (pm *fakePeerManager) BroadcastWantHaves(ctx context.Context, cids []cid.Cid) { + select { + case pm.wantReqs <- wantReq{cids}: + case <-ctx.Done(): + } +} +func (pm *fakePeerManager) SendCancels(ctx context.Context, cancels []cid.Cid) { + pm.cancels = append(pm.cancels, cancels...) +} func TestSessionGetBlocks(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer cancel() - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() bpm := bsbpm.New() notif := notifications.New() defer notif.Shutdown() id := testutil.GenerateSessionID() - session := New(ctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, time.Second, delay.Fixed(time.Minute), "") + session := New(ctx, id, fspm, fpf, sim, fpm, bpm, notif, time.Second, delay.Fixed(time.Minute), "") blockGenerator := blocksutil.NewBlockGenerator() blks := blockGenerator.Blocks(broadcastLiveWantsLimit * 2) var cids []cid.Cid @@ -115,7 +109,7 @@ func TestSessionGetBlocks(t *testing.T) { } // Wait for initial want request - receivedWantReq := <-fwm.wantReqs + receivedWantReq := <-fpm.wantReqs // Should have registered session's interest in blocks intSes := sim.FilterSessionInterested(id, cids) @@ -138,7 +132,7 @@ func TestSessionGetBlocks(t *testing.T) { time.Sleep(10 * time.Millisecond) // Verify new peers were recorded - if !testutil.MatchPeersIgnoreOrder(fpm.Peers(), peers) { + if !testutil.MatchPeersIgnoreOrder(fspm.Peers(), peers) { t.Fatal("peers not recorded by the peer manager") } @@ -172,20 +166,30 @@ func TestSessionGetBlocks(t *testing.T) { if len(wanted) != len(blks)-1 { t.Fatal("session wants incorrect number of blocks") } + + // Shut down session + cancel() + + time.Sleep(10 * time.Millisecond) + + // Verify wants were cancelled + if len(fpm.cancels) != len(blks) { + t.Fatal("expected cancels to be sent for all wants") + } } func TestSessionFindMorePeers(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 900*time.Millisecond) defer cancel() - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() bpm := bsbpm.New() notif := notifications.New() defer notif.Shutdown() id := testutil.GenerateSessionID() - session := New(ctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, time.Second, delay.Fixed(time.Minute), "") + session := New(ctx, id, fspm, fpf, sim, fpm, bpm, notif, time.Second, delay.Fixed(time.Minute), "") session.SetBaseTickDelay(200 * time.Microsecond) blockGenerator := blocksutil.NewBlockGenerator() blks := blockGenerator.Blocks(broadcastLiveWantsLimit * 2) @@ -200,7 +204,7 @@ func TestSessionFindMorePeers(t *testing.T) { // The session should initially broadcast want-haves select { - case <-fwm.wantReqs: + case <-fpm.wantReqs: case <-ctx.Done(): t.Fatal("Did not make first want request ") } @@ -217,14 +221,14 @@ func TestSessionFindMorePeers(t *testing.T) { // The session should now time out waiting for a response and broadcast // want-haves again select { - case <-fwm.wantReqs: + case <-fpm.wantReqs: case <-ctx.Done(): t.Fatal("Did not make second want request ") } // The session should keep broadcasting periodically until it receives a response select { - case receivedWantReq := <-fwm.wantReqs: + case receivedWantReq := <-fpm.wantReqs: if len(receivedWantReq.cids) != broadcastLiveWantsLimit { t.Fatal("did not rebroadcast whole live list") } @@ -250,8 +254,8 @@ func TestSessionFindMorePeers(t *testing.T) { func TestSessionOnPeersExhausted(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() @@ -259,7 +263,7 @@ func TestSessionOnPeersExhausted(t *testing.T) { notif := notifications.New() defer notif.Shutdown() id := testutil.GenerateSessionID() - session := New(ctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, time.Second, delay.Fixed(time.Minute), "") + session := New(ctx, id, fspm, fpf, sim, fpm, bpm, notif, time.Second, delay.Fixed(time.Minute), "") blockGenerator := blocksutil.NewBlockGenerator() blks := blockGenerator.Blocks(broadcastLiveWantsLimit + 5) var cids []cid.Cid @@ -273,7 +277,7 @@ func TestSessionOnPeersExhausted(t *testing.T) { } // Wait for initial want request - receivedWantReq := <-fwm.wantReqs + receivedWantReq := <-fpm.wantReqs // Should have sent out broadcast request for wants if len(receivedWantReq.cids) != broadcastLiveWantsLimit { @@ -284,7 +288,7 @@ func TestSessionOnPeersExhausted(t *testing.T) { session.onPeersExhausted(cids[len(cids)-2:]) // Wait for want request - receivedWantReq = <-fwm.wantReqs + receivedWantReq = <-fpm.wantReqs // Should have sent out broadcast request for wants if len(receivedWantReq.cids) != 2 { @@ -295,15 +299,15 @@ func TestSessionOnPeersExhausted(t *testing.T) { func TestSessionFailingToGetFirstBlock(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() bpm := bsbpm.New() notif := notifications.New() defer notif.Shutdown() id := testutil.GenerateSessionID() - session := New(ctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, 10*time.Millisecond, delay.Fixed(100*time.Millisecond), "") + session := New(ctx, id, fspm, fpf, sim, fpm, bpm, notif, 10*time.Millisecond, delay.Fixed(100*time.Millisecond), "") blockGenerator := blocksutil.NewBlockGenerator() blks := blockGenerator.Blocks(4) var cids []cid.Cid @@ -318,14 +322,14 @@ func TestSessionFailingToGetFirstBlock(t *testing.T) { // The session should initially broadcast want-haves select { - case <-fwm.wantReqs: + case <-fpm.wantReqs: case <-ctx.Done(): t.Fatal("Did not make first want request ") } // Verify a broadcast was made select { - case receivedWantReq := <-fwm.wantReqs: + case receivedWantReq := <-fpm.wantReqs: if len(receivedWantReq.cids) < len(cids) { t.Fatal("did not rebroadcast whole live list") } @@ -346,7 +350,7 @@ func TestSessionFailingToGetFirstBlock(t *testing.T) { // Wait for another broadcast to occur select { - case receivedWantReq := <-fwm.wantReqs: + case receivedWantReq := <-fpm.wantReqs: if len(receivedWantReq.cids) < len(cids) { t.Fatal("did not rebroadcast whole live list") } @@ -357,7 +361,7 @@ func TestSessionFailingToGetFirstBlock(t *testing.T) { // Wait for another broadcast to occur startTick = time.Now() select { - case receivedWantReq := <-fwm.wantReqs: + case receivedWantReq := <-fpm.wantReqs: if len(receivedWantReq.cids) < len(cids) { t.Fatal("did not rebroadcast whole live list") } @@ -374,7 +378,7 @@ func TestSessionFailingToGetFirstBlock(t *testing.T) { // Wait for another broadcast to occur startTick = time.Now() select { - case receivedWantReq := <-fwm.wantReqs: + case receivedWantReq := <-fpm.wantReqs: if len(receivedWantReq.cids) < len(cids) { t.Fatal("did not rebroadcast whole live list") } @@ -407,8 +411,8 @@ func TestSessionFailingToGetFirstBlock(t *testing.T) { } func TestSessionCtxCancelClosesGetBlocksChannel(t *testing.T) { - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() bpm := bsbpm.New() @@ -418,7 +422,7 @@ func TestSessionCtxCancelClosesGetBlocksChannel(t *testing.T) { // Create a new session with its own context sessctx, sesscancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - session := New(sessctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, time.Second, delay.Fixed(time.Minute), "") + session := New(sessctx, id, fspm, fpf, sim, fpm, bpm, notif, time.Second, delay.Fixed(time.Minute), "") timerCtx, timerCancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer timerCancel() @@ -450,8 +454,8 @@ func TestSessionCtxCancelClosesGetBlocksChannel(t *testing.T) { func TestSessionReceiveMessageAfterShutdown(t *testing.T) { ctx, cancelCtx := context.WithTimeout(context.Background(), 10*time.Millisecond) - fwm := newFakeWantManager() - fpm := newFakeSessionPeerManager() + fpm := newFakePeerManager() + fspm := newFakeSessionPeerManager() fpf := newFakeProviderFinder() sim := bssim.New() @@ -459,7 +463,7 @@ func TestSessionReceiveMessageAfterShutdown(t *testing.T) { notif := notifications.New() defer notif.Shutdown() id := testutil.GenerateSessionID() - session := New(ctx, id, fwm, fpm, fpf, sim, newFakePeerManager(), bpm, notif, time.Second, delay.Fixed(time.Minute), "") + session := New(ctx, id, fspm, fpf, sim, fpm, bpm, notif, time.Second, delay.Fixed(time.Minute), "") blockGenerator := blocksutil.NewBlockGenerator() blks := blockGenerator.Blocks(2) cids := []cid.Cid{blks[0].Cid(), blks[1].Cid()} @@ -470,7 +474,7 @@ func TestSessionReceiveMessageAfterShutdown(t *testing.T) { } // Wait for initial want request - <-fwm.wantReqs + <-fpm.wantReqs // Shut down session cancelCtx() diff --git a/internal/session/sessionwantsender_test.go b/internal/session/sessionwantsender_test.go index b679e9c..3593009 100644 --- a/internal/session/sessionwantsender_test.go +++ b/internal/session/sessionwantsender_test.go @@ -66,8 +66,9 @@ func (pm *mockPeerManager) RegisterSession(p peer.ID, sess bspm.Session) bool { return true } -func (pm *mockPeerManager) UnregisterSession(sesid uint64) { -} +func (*mockPeerManager) UnregisterSession(uint64) {} +func (*mockPeerManager) BroadcastWantHaves(context.Context, []cid.Cid) {} +func (*mockPeerManager) SendCancels(context.Context, []cid.Cid) {} func (pm *mockPeerManager) SendWants(ctx context.Context, p peer.ID, wantBlocks []cid.Cid, wantHaves []cid.Cid) { pm.lk.Lock() diff --git a/internal/sessioninterestmanager/sessioninterestmanager.go b/internal/sessioninterestmanager/sessioninterestmanager.go index 46888c9..6e345b5 100644 --- a/internal/sessioninterestmanager/sessioninterestmanager.go +++ b/internal/sessioninterestmanager/sessioninterestmanager.go @@ -90,7 +90,7 @@ func (sim *SessionInterestManager) SplitWantedUnwanted(blks []blocks.Block) ([]b return wantedBlks, notWantedBlks } -// When the WantManager receives a message is calls InterestedSessions() to +// When the SessionManager receives a message it calls InterestedSessions() to // find out which sessions are interested in the message. func (sim *SessionInterestManager) InterestedSessions(blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) []uint64 { sim.lk.RLock() diff --git a/internal/sessionmanager/sessionmanager.go b/internal/sessionmanager/sessionmanager.go index f7382fa..c69aa04 100644 --- a/internal/sessionmanager/sessionmanager.go +++ b/internal/sessionmanager/sessionmanager.go @@ -109,8 +109,10 @@ func (sm *SessionManager) GetNextSessionID() uint64 { return sm.sessID } -func (sm *SessionManager) ReceiveFrom(p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) []Session { - sessions := make([]Session, 0) +// 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) { + // Record block presence for HAVE / DONT_HAVE + sm.blockPresenceManager.ReceiveFrom(p, haves, dontHaves) // Notify each session that is interested in the blocks / HAVEs / DONT_HAVEs for _, id := range sm.sessionInterestManager.InterestedSessions(blks, haves, dontHaves) { @@ -120,9 +122,9 @@ func (sm *SessionManager) ReceiveFrom(p peer.ID, blks []cid.Cid, haves []cid.Cid if ok { sess.ReceiveFrom(p, blks, haves, dontHaves) - sessions = append(sessions, sess) } } - return sessions + // Send CANCEL to all peers with want-have / want-block + sm.peerManager.SendCancels(ctx, blks) } diff --git a/internal/sessionmanager/sessionmanager_test.go b/internal/sessionmanager/sessionmanager_test.go index 4e0152b..6fa118e 100644 --- a/internal/sessionmanager/sessionmanager_test.go +++ b/internal/sessionmanager/sessionmanager_test.go @@ -53,11 +53,16 @@ func (*fakeSesPeerManager) RemovePeer(peer.ID) bool { return false } func (*fakeSesPeerManager) HasPeers() bool { return false } type fakePeerManager struct { + cancels []cid.Cid } func (*fakePeerManager) RegisterSession(peer.ID, bspm.Session) bool { return true } func (*fakePeerManager) UnregisterSession(uint64) {} func (*fakePeerManager) SendWants(context.Context, peer.ID, []cid.Cid, []cid.Cid) {} +func (*fakePeerManager) BroadcastWantHaves(context.Context, []cid.Cid) {} +func (fpm *fakePeerManager) SendCancels(ctx context.Context, cancels []cid.Cid) { + fpm.cancels = append(fpm.cancels, cancels...) +} func sessionFactory(ctx context.Context, id uint64, @@ -101,26 +106,30 @@ func TestReceiveFrom(t *testing.T) { sim.RecordSessionInterest(firstSession.ID(), []cid.Cid{block.Cid()}) sim.RecordSessionInterest(thirdSession.ID(), []cid.Cid{block.Cid()}) - sm.ReceiveFrom(p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) + sm.ReceiveFrom(ctx, p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) if len(firstSession.ks) == 0 || len(secondSession.ks) > 0 || len(thirdSession.ks) == 0 { t.Fatal("should have received blocks but didn't") } - sm.ReceiveFrom(p, []cid.Cid{}, []cid.Cid{block.Cid()}, []cid.Cid{}) + sm.ReceiveFrom(ctx, p, []cid.Cid{}, []cid.Cid{block.Cid()}, []cid.Cid{}) if len(firstSession.wantBlocks) == 0 || len(secondSession.wantBlocks) > 0 || len(thirdSession.wantBlocks) == 0 { t.Fatal("should have received want-blocks but didn't") } - sm.ReceiveFrom(p, []cid.Cid{}, []cid.Cid{}, []cid.Cid{block.Cid()}) + sm.ReceiveFrom(ctx, p, []cid.Cid{}, []cid.Cid{}, []cid.Cid{block.Cid()}) if len(firstSession.wantHaves) == 0 || len(secondSession.wantHaves) > 0 || len(thirdSession.wantHaves) == 0 { t.Fatal("should have received want-haves but didn't") } + + if len(pm.cancels) != 1 { + t.Fatal("should have sent cancel for received blocks") + } } func TestReceiveBlocksWhenManagerContextCancelled(t *testing.T) { @@ -150,7 +159,7 @@ func TestReceiveBlocksWhenManagerContextCancelled(t *testing.T) { // wait for sessions to get removed time.Sleep(10 * time.Millisecond) - sm.ReceiveFrom(p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) + sm.ReceiveFrom(ctx, p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) if len(firstSession.ks) > 0 || len(secondSession.ks) > 0 || len(thirdSession.ks) > 0 { @@ -186,7 +195,7 @@ func TestReceiveBlocksWhenSessionContextCancelled(t *testing.T) { // wait for sessions to get removed time.Sleep(10 * time.Millisecond) - sm.ReceiveFrom(p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) + sm.ReceiveFrom(ctx, p, []cid.Cid{block.Cid()}, []cid.Cid{}, []cid.Cid{}) if len(firstSession.ks) == 0 || len(secondSession.ks) > 0 || len(thirdSession.ks) == 0 { diff --git a/internal/wantmanager/wantmanager.go b/internal/wantmanager/wantmanager.go deleted file mode 100644 index 539017a..0000000 --- a/internal/wantmanager/wantmanager.go +++ /dev/null @@ -1,103 +0,0 @@ -package wantmanager - -import ( - "context" - - bsbpm "github.com/ipfs/go-bitswap/internal/blockpresencemanager" - bssim "github.com/ipfs/go-bitswap/internal/sessioninterestmanager" - "github.com/ipfs/go-bitswap/internal/sessionmanager" - logging "github.com/ipfs/go-log" - - cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" -) - -var log = logging.Logger("bitswap") - -// PeerHandler sends wants / cancels to other peers -type PeerHandler interface { - // Connected is called when a peer connects. - Connected(p peer.ID) - // Disconnected is called when a peer disconnects - Disconnected(p peer.ID) - // BroadcastWantHaves sends want-haves to all connected peers - BroadcastWantHaves(ctx context.Context, wantHaves []cid.Cid) - // SendCancels sends cancels to all peers that had previously been sent - // a want-block or want-have for the given key - SendCancels(context.Context, []cid.Cid) -} - -// SessionManager receives incoming messages and distributes them to sessions -type SessionManager interface { - ReceiveFrom(p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) []sessionmanager.Session -} - -// WantManager -// - informs the SessionManager and BlockPresenceManager of incoming information -// and cancelled sessions -// - informs the PeerManager of connects and disconnects -type WantManager struct { - peerHandler PeerHandler - sim *bssim.SessionInterestManager - bpm *bsbpm.BlockPresenceManager - sm SessionManager -} - -// New initializes a new WantManager for a given context. -func New(ctx context.Context, peerHandler PeerHandler, sim *bssim.SessionInterestManager, bpm *bsbpm.BlockPresenceManager) *WantManager { - return &WantManager{ - peerHandler: peerHandler, - sim: sim, - bpm: bpm, - } -} - -func (wm *WantManager) SetSessionManager(sm SessionManager) { - wm.sm = sm -} - -// ReceiveFrom is called when a new message is received -func (wm *WantManager) ReceiveFrom(ctx context.Context, p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) { - // Record block presence for HAVE / DONT_HAVE - wm.bpm.ReceiveFrom(p, haves, dontHaves) - // Inform interested sessions - wm.sm.ReceiveFrom(p, blks, haves, dontHaves) - // Send CANCEL to all peers with want-have / want-block - wm.peerHandler.SendCancels(ctx, blks) -} - -// BroadcastWantHaves is called when want-haves should be broadcast to all -// connected peers (as part of session discovery) -func (wm *WantManager) BroadcastWantHaves(ctx context.Context, ses uint64, wantHaves []cid.Cid) { - // TODO: Avoid calling broadcast through here. It doesn't fit with - // everything else this module does. - - log.Debugf("BroadcastWantHaves session%d: %s", ses, wantHaves) - // Send want-haves to all peers - wm.peerHandler.BroadcastWantHaves(ctx, wantHaves) -} - -// RemoveSession is called when the session is shut down -func (wm *WantManager) RemoveSession(ctx context.Context, ses uint64) { - // Remove session's interest in the given blocks. - cancelKs := wm.sim.RemoveSessionInterest(ses) - - // Free up block presence tracking for keys that no session is interested - // in anymore - wm.bpm.RemoveKeys(cancelKs) - - // Send CANCEL to all peers for blocks that no session is interested in anymore - wm.peerHandler.SendCancels(ctx, cancelKs) -} - -// Connected is called when a new peer connects -func (wm *WantManager) Connected(p peer.ID) { - // Tell the peer handler that there is a new connection and give it the - // list of outstanding broadcast wants - wm.peerHandler.Connected(p) -} - -// Disconnected is called when a peer disconnects -func (wm *WantManager) Disconnected(p peer.ID) { - wm.peerHandler.Disconnected(p) -} diff --git a/internal/wantmanager/wantmanager_test.go b/internal/wantmanager/wantmanager_test.go deleted file mode 100644 index 9855eb3..0000000 --- a/internal/wantmanager/wantmanager_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package wantmanager - -import ( - "context" - "testing" - - bsbpm "github.com/ipfs/go-bitswap/internal/blockpresencemanager" - bssim "github.com/ipfs/go-bitswap/internal/sessioninterestmanager" - "github.com/ipfs/go-bitswap/internal/sessionmanager" - "github.com/ipfs/go-bitswap/internal/testutil" - - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" -) - -type fakePeerHandler struct { - lastBcstWants []cid.Cid - lastCancels []cid.Cid -} - -func (fph *fakePeerHandler) Connected(p peer.ID) { -} -func (fph *fakePeerHandler) Disconnected(p peer.ID) { - -} -func (fph *fakePeerHandler) BroadcastWantHaves(ctx context.Context, wantHaves []cid.Cid) { - fph.lastBcstWants = wantHaves -} -func (fph *fakePeerHandler) SendCancels(ctx context.Context, cancels []cid.Cid) { - fph.lastCancels = cancels -} - -type fakeSessionManager struct { -} - -func (*fakeSessionManager) ReceiveFrom(p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) []sessionmanager.Session { - return nil -} - -func TestReceiveFrom(t *testing.T) { - ctx := context.Background() - ph := &fakePeerHandler{} - sim := bssim.New() - bpm := bsbpm.New() - wm := New(context.Background(), ph, sim, bpm) - sm := &fakeSessionManager{} - wm.SetSessionManager(sm) - - p := testutil.GeneratePeers(1)[0] - ks := testutil.GenerateCids(2) - haves := testutil.GenerateCids(2) - dontHaves := testutil.GenerateCids(2) - wm.ReceiveFrom(ctx, p, ks, haves, dontHaves) - - if !bpm.PeerHasBlock(p, haves[0]) { - t.Fatal("expected block presence manager to be invoked") - } - if !bpm.PeerDoesNotHaveBlock(p, dontHaves[0]) { - t.Fatal("expected block presence manager to be invoked") - } - if len(ph.lastCancels) != len(ks) { - t.Fatal("expected received blocks to be cancelled") - } -} - -func TestRemoveSession(t *testing.T) { - ctx := context.Background() - ph := &fakePeerHandler{} - sim := bssim.New() - bpm := bsbpm.New() - wm := New(context.Background(), ph, sim, bpm) - sm := &fakeSessionManager{} - wm.SetSessionManager(sm) - - // Record session interest in 2 keys for session 0 and 2 keys for session 1 - // with 1 overlapping key - cids := testutil.GenerateCids(3) - ses0 := uint64(0) - ses1 := uint64(1) - ses0ks := cids[:2] - ses1ks := cids[1:] - sim.RecordSessionInterest(ses0, ses0ks) - sim.RecordSessionInterest(ses1, ses1ks) - - // Receive HAVE for all keys - p := testutil.GeneratePeers(1)[0] - ks := []cid.Cid{} - haves := append(ses0ks, ses1ks...) - dontHaves := []cid.Cid{} - wm.ReceiveFrom(ctx, p, ks, haves, dontHaves) - - // Remove session 0 - wm.RemoveSession(ctx, ses0) - - // Expect session 0 interest to be removed and session 1 interest to be - // unchanged - if len(sim.FilterSessionInterested(ses0, ses0ks)[0]) != 0 { - t.Fatal("expected session 0 interest to be removed") - } - if len(sim.FilterSessionInterested(ses1, ses1ks)[0]) != len(ses1ks) { - t.Fatal("expected session 1 interest to be unchanged") - } - - // Should clear block presence for key that was in session 0 and not - // in session 1 - if bpm.PeerHasBlock(p, ses0ks[0]) { - t.Fatal("expected block presence manager to be cleared") - } - if !bpm.PeerHasBlock(p, ses0ks[1]) { - t.Fatal("expected block presence manager to be unchanged for overlapping key") - } - - // Should cancel key that was in session 0 and not session 1 - if len(ph.lastCancels) != 1 || !ph.lastCancels[0].Equals(cids[0]) { - t.Fatal("expected removed want-have to be cancelled") - } -} -- GitLab