From e228f66e215a8cfbfb664ed958832d00b6894ef5 Mon Sep 17 00:00:00 2001 From: BurtonQin Date: Wed, 19 Feb 2020 18:39:02 +0800 Subject: [PATCH] les: protect field access with lock to avoid possible data race --- les/client_handler.go | 5 ++++- les/clientpool.go | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/les/client_handler.go b/les/client_handler.go index 7fdb165719..047626d4d0 100644 --- a/les/client_handler.go +++ b/les/client_handler.go @@ -125,7 +125,10 @@ func (h *clientHandler) handle(p *peer) error { serverConnectionGauge.Update(int64(h.backend.peers.Len())) }() - h.fetcher.announce(p, p.headInfo) + p.lock.RLock() + headInfo := p.headInfo + p.lock.RUnlock() + h.fetcher.announce(p, headInfo) // pool entry can be nil during the unit test. if p.poolEntry != nil { diff --git a/les/clientpool.go b/les/clientpool.go index da76f08b91..85c3f44dc6 100644 --- a/les/clientpool.go +++ b/les/clientpool.go @@ -481,7 +481,10 @@ func (f *clientPool) setCapacity(c *clientInfo, capacity uint64) error { f.connectedCap += capacity - oldCapacity c.balanceTracker.setCapacity(capacity) f.connectedQueue.Update(c.queueIndex) - if f.connectedCap > f.capLimit { + f.lock.Lock() + capLimit := f.capLimit + f.lock.Unlock() + if f.connectedCap > capLimit { var kickList []*clientInfo kick := true f.connectedQueue.MultiPop(func(data interface{}, priority int64) bool { @@ -491,7 +494,7 @@ func (f *clientPool) setCapacity(c *clientInfo, capacity uint64) error { if client == c { kick = false } - return kick && (f.connectedCap > f.capLimit) + return kick && (f.connectedCap > capLimit) }) if kick { now := mclock.Now()