mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
les: fix light fetcher database race
This commit is contained in:
parent
4e61ed02e2
commit
055eb26ae8
1 changed files with 14 additions and 4 deletions
|
|
@ -46,7 +46,7 @@ type lightFetcher struct {
|
||||||
peers map[*peer]*fetcherPeerInfo
|
peers map[*peer]*fetcherPeerInfo
|
||||||
lastUpdateStats *updateStatsEntry
|
lastUpdateStats *updateStatsEntry
|
||||||
|
|
||||||
lock sync.Mutex // qwerqwerqwe
|
lock sync.Mutex
|
||||||
deliverChn chan fetchResponse
|
deliverChn chan fetchResponse
|
||||||
reqMu sync.RWMutex
|
reqMu sync.RWMutex
|
||||||
requested map[uint64]fetchRequest
|
requested map[uint64]fetchRequest
|
||||||
|
|
@ -560,8 +560,13 @@ func (f *lightFetcher) checkAnnouncedHeaders(fp *fetcherPeerInfo, headers []*typ
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// we ran out of recently delivered headers but have not reached a node known by this peer yet, continue matching
|
// we ran out of recently delivered headers but have not reached a node known by this peer yet, continue matching
|
||||||
td = f.chain.GetTd(header.ParentHash, header.Number.Uint64()-1)
|
hash, number := header.ParentHash, header.Number.Uint64()-1
|
||||||
header = f.chain.GetHeader(header.ParentHash, header.Number.Uint64()-1)
|
td = f.chain.GetTd(hash, number)
|
||||||
|
header = f.chain.GetHeader(hash, number)
|
||||||
|
if header == nil || td == nil {
|
||||||
|
log.Error("Missing parent of validated header", "hash", hash, "number", number)
|
||||||
|
return false
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
header = headers[i]
|
header = headers[i]
|
||||||
td = tds[i]
|
td = tds[i]
|
||||||
|
|
@ -645,13 +650,18 @@ func (f *lightFetcher) checkKnownNode(p *peer, n *fetcherTreeNode) bool {
|
||||||
if td == nil {
|
if td == nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
header := f.chain.GetHeader(n.hash, n.number)
|
||||||
|
// check the availability of both header and td because reads are not protected by chain db mutex
|
||||||
|
// Note: returning false is always safe here
|
||||||
|
if header == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fp := f.peers[p]
|
fp := f.peers[p]
|
||||||
if fp == nil {
|
if fp == nil {
|
||||||
p.Log().Debug("Unknown peer to check known nodes")
|
p.Log().Debug("Unknown peer to check known nodes")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
header := f.chain.GetHeader(n.hash, n.number)
|
|
||||||
if !f.checkAnnouncedHeaders(fp, []*types.Header{header}, []*big.Int{td}) {
|
if !f.checkAnnouncedHeaders(fp, []*types.Header{header}, []*big.Int{td}) {
|
||||||
p.Log().Debug("Inconsistent announcement")
|
p.Log().Debug("Inconsistent announcement")
|
||||||
go f.pm.removePeer(p.id)
|
go f.pm.removePeer(p.id)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue