mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
core/rawdb: fixed data race between retrieve and close
closes https://github.com/ethereum/go-ethereum/issues/20420
This commit is contained in:
parent
eb2fd823b2
commit
e1856f2bc3
1 changed files with 4 additions and 1 deletions
|
|
@ -541,19 +541,22 @@ func (t *freezerTable) getBounds(item uint64) (uint32, uint32, uint32, error) {
|
||||||
// Retrieve looks up the data offset of an item with the given number and retrieves
|
// Retrieve looks up the data offset of an item with the given number and retrieves
|
||||||
// the raw binary blob from the data file.
|
// the raw binary blob from the data file.
|
||||||
func (t *freezerTable) Retrieve(item uint64) ([]byte, error) {
|
func (t *freezerTable) Retrieve(item uint64) ([]byte, error) {
|
||||||
|
t.lock.RLock()
|
||||||
// Ensure the table and the item is accessible
|
// Ensure the table and the item is accessible
|
||||||
if t.index == nil || t.head == nil {
|
if t.index == nil || t.head == nil {
|
||||||
|
t.lock.RUnlock()
|
||||||
return nil, errClosed
|
return nil, errClosed
|
||||||
}
|
}
|
||||||
if atomic.LoadUint64(&t.items) <= item {
|
if atomic.LoadUint64(&t.items) <= item {
|
||||||
|
t.lock.RUnlock()
|
||||||
return nil, errOutOfBounds
|
return nil, errOutOfBounds
|
||||||
}
|
}
|
||||||
// Ensure the item was not deleted from the tail either
|
// Ensure the item was not deleted from the tail either
|
||||||
offset := atomic.LoadUint32(&t.itemOffset)
|
offset := atomic.LoadUint32(&t.itemOffset)
|
||||||
if uint64(offset) > item {
|
if uint64(offset) > item {
|
||||||
|
t.lock.RUnlock()
|
||||||
return nil, errOutOfBounds
|
return nil, errOutOfBounds
|
||||||
}
|
}
|
||||||
t.lock.RLock()
|
|
||||||
startOffset, endOffset, filenum, err := t.getBounds(item - uint64(offset))
|
startOffset, endOffset, filenum, err := t.getBounds(item - uint64(offset))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.lock.RUnlock()
|
t.lock.RUnlock()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue