@cryptotaxi247 / kubo / commits / f53dc7c8b

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