core/rawdb: add logging and fix comments around AncientRange function. (#28379)

This adds warning logs when the read does not match the expected count.
We can also remove the size limit since the function documentation explicitly states
that callers should limit the count.
This commit is contained in:
Jakub Freebit 2023-10-31 20:04:45 +09:00 committed by GitHub
parent ea2e66a58e
commit 447945e438
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 10 deletions

View File

@ -334,14 +334,19 @@ func ReadHeaderRange(db ethdb.Reader, number uint64, count uint64) []rlp.RawValu
return rlpHeaders return rlpHeaders
} }
// read remaining from ancients // read remaining from ancients
max := count * 700 data, err := db.AncientRange(ChainFreezerHeaderTable, i+1-count, count, 0)
data, err := db.AncientRange(ChainFreezerHeaderTable, i+1-count, count, max) if err != nil {
if err == nil && uint64(len(data)) == count { log.Error("Failed to read headers from freezer", "err", err)
// the data is on the order [h, h+1, .., n] -- reordering needed return rlpHeaders
}
if uint64(len(data)) != count {
log.Warn("Incomplete read of headers from freezer", "wanted", count, "read", len(data))
return rlpHeaders
}
// The data is on the order [h, h+1, .., n] -- reordering needed
for i := range data { for i := range data {
rlpHeaders = append(rlpHeaders, data[len(data)-1-i]) rlpHeaders = append(rlpHeaders, data[len(data)-1-i])
} }
}
return rlpHeaders return rlpHeaders
} }

View File

@ -119,9 +119,10 @@ func (f *ResettableFreezer) Ancient(kind string, number uint64) ([]byte, error)
// AncientRange retrieves multiple items in sequence, starting from the index 'start'. // AncientRange retrieves multiple items in sequence, starting from the index 'start'.
// It will return // It will return
// - at most 'max' items, // - at most 'count' items,
// - at least 1 item (even if exceeding the maxByteSize), but will otherwise // - if maxBytes is specified: at least 1 item (even if exceeding the maxByteSize),
// return as many items as fit into maxByteSize // but will otherwise return as many items as fit into maxByteSize.
// - if maxBytes is not specified, 'count' items will be returned if they are present.
func (f *ResettableFreezer) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { func (f *ResettableFreezer) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) {
f.lock.RLock() f.lock.RLock()
defer f.lock.RUnlock() defer f.lock.RUnlock()