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()