Skip to content

Commit

Permalink
core/rawdb: fix data race between Retrieve and Close (ethereum#20919)
Browse files Browse the repository at this point in the history
* core/rawdb: fixed data race between retrieve and close

closes ethereum#20420

* core/rawdb: use non-atomic load while holding mutex
  • Loading branch information
MariusVanDerWijden authored Apr 14, 2020
1 parent eb2fd82 commit 2a836bb
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions core/rawdb/freezer_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -541,20 +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
// the raw binary blob from the data file.
func (t *freezerTable) Retrieve(item uint64) ([]byte, error) {
t.lock.RLock()
// Ensure the table and the item is accessible
if t.index == nil || t.head == nil {
t.lock.RUnlock()
return nil, errClosed
}
if atomic.LoadUint64(&t.items) <= item {
t.lock.RUnlock()
return nil, errOutOfBounds
}
// Ensure the item was not deleted from the tail either
offset := atomic.LoadUint32(&t.itemOffset)
if uint64(offset) > item {
if uint64(t.itemOffset) > item {
t.lock.RUnlock()
return nil, errOutOfBounds
}
t.lock.RLock()
startOffset, endOffset, filenum, err := t.getBounds(item - uint64(offset))
startOffset, endOffset, filenum, err := t.getBounds(item - uint64(t.itemOffset))
if err != nil {
t.lock.RUnlock()
return nil, err
Expand Down

0 comments on commit 2a836bb

Please sign in to comment.