Skip to content

Commit

Permalink
Merge pull request #3437 from ipfs/feat/bitswap-cleanup-ledger
Browse files Browse the repository at this point in the history
bitswap: clean up ledgers when disconnecting
  • Loading branch information
whyrusleeping authored May 20, 2017
2 parents 8e2aed3 + 331e60b commit ec43fe4
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 1 deletion.
1 change: 1 addition & 0 deletions exchange/bitswap/bitswap.go
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ func (bs *Bitswap) updateReceiveCounters(b blocks.Block) {
// Connected/Disconnected warns bitswap about peer connections
func (bs *Bitswap) PeerConnected(p peer.ID) {
bs.wm.Connected(p)
bs.engine.PeerConnected(p)
}

// Connected/Disconnected warns bitswap about peer connections
Expand Down
26 changes: 25 additions & 1 deletion exchange/bitswap/decision/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,32 @@ func (e *Engine) MessageSent(p peer.ID, m bsmsg.BitSwapMessage) error {
return nil
}

func (e *Engine) PeerConnected(p peer.ID) {
e.lock.Lock()
l, ok := e.ledgerMap[p]
if !ok {
l = newLedger(p)
e.ledgerMap[p] = l
}
l.lk.Lock()
l.ref++
l.lk.Unlock()
e.lock.Unlock()
}

func (e *Engine) PeerDisconnected(p peer.ID) {
// TODO: release ledger
e.lock.Lock()
defer e.lock.Unlock()
l, ok := e.ledgerMap[p]
if !ok {
return
}
l.lk.Lock()
l.ref--
if l.ref <= 0 {
delete(e.ledgerMap, p)
}
l.lk.Unlock()
}

func (e *Engine) numBytesSentTo(p peer.ID) uint64 {
Expand Down
5 changes: 5 additions & 0 deletions exchange/bitswap/decision/engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ func TestPeerIsAddedToPeersWhenMessageReceivedOrSent(t *testing.T) {
if !peerIsPartner(sanfrancisco.Peer, seattle.Engine) {
t.Fatal("Peer wasn't added as a Partner")
}

seattle.Engine.PeerDisconnected(sanfrancisco.Peer)
if peerIsPartner(sanfrancisco.Peer, seattle.Engine) {
t.Fatal("expected peer to be removed")
}
}

func peerIsPartner(p peer.ID, e *Engine) bool {
Expand Down
4 changes: 4 additions & 0 deletions exchange/bitswap/decision/ledger.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ type ledger struct {
// to a given peer
sentToPeer map[string]time.Time

// ref is the reference count for this ledger, its used to ensure we
// don't drop the reference to this ledger in multi-connection scenarios
ref int

lk sync.Mutex
}

Expand Down

0 comments on commit ec43fe4

Please sign in to comment.