bitswap: clean up ledgers when disconnecting
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Nov 28, 2016 at 17:36 UTC
f53dc7c8b5e8d40ca49160cce9b0d2cfc6b0780a
3 files changed
+30
-1
exchange/bitswap/bitswap.go
+1
@@ -414,6 +414,7 @@ func (bs *Bitswap) updateReceiveCounters(b blocks.Block) {
414
// Connected/Disconnected warns bitswap about peer connections
415
func (bs *Bitswap) PeerConnected(p peer.ID) {
416
bs.wm.Connected(p)
417
+ bs.engine.PeerConnected(p)
418
}
419
420
// Connected/Disconnected warns bitswap about peer connections
exchange/bitswap/decision/engine.go
+25
-1
@@ -298,8 +298,32 @@ func (e *Engine) MessageSent(p peer.ID, m bsmsg.BitSwapMessage) error {
298
return nil
299
}
300
301
+func (e *Engine) PeerConnected(p peer.ID) {
302
+ e.lock.Lock()
303
+ l, ok := e.ledgerMap[p]
304
+ if !ok {
305
+ l = newLedger(p)
306
+ e.ledgerMap[p] = l
307
+ }
308
+ l.lk.Lock()
309
+ l.ref++
310
+ l.lk.Unlock()
311
+ e.lock.Unlock()
312
+}
313
+
314
func (e *Engine) PeerDisconnected(p peer.ID) {
302
- // TODO: release ledger
315
+ e.lock.Lock()
316
+ defer e.lock.Unlock()
317
+ l, ok := e.ledgerMap[p]
318
+ if !ok {
319
+ return
320
+ }
321
+ l.lk.Lock()
322
+ l.ref--
323
+ if l.ref <= 0 {
324
+ delete(e.ledgerMap, p)
325
+ }
326
+ l.lk.Unlock()
327
}
328
329
func (e *Engine) numBytesSentTo(p peer.ID) uint64 {
exchange/bitswap/decision/ledger.go
+4
@@ -43,6 +43,10 @@ type ledger struct {
43
// to a given peer
44
sentToPeer map[string]time.Time
45
46
+ // ref is the reference count for this ledger, its used to ensure we
47
+ // don't drop the reference to this ledger in multi-connection scenarios
48
+ ref int
49
+
50
lk sync.Mutex
51
}
52