From 3f916170935d5bf642c9380b722c0465def4ab1a Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 10 Apr 2025 15:24:30 +0200 Subject: [PATCH] clean up --- core/rawdb/chain_freezer.go | 2 + core/rawdb/eradb/eradb.go | 128 ++++++++++++++---------------------- 2 files changed, 50 insertions(+), 80 deletions(-) diff --git a/core/rawdb/chain_freezer.go b/core/rawdb/chain_freezer.go index 1341fcab15..7cb58a94b6 100644 --- a/core/rawdb/chain_freezer.go +++ b/core/rawdb/chain_freezer.go @@ -66,6 +66,8 @@ func newChainFreezer(datadir string, namespace string, readonly bool) (*chainFre if datadir == "" { freezer = NewMemoryFreezer(readonly, chainFreezerTableConfigs) } else { + // Instantiate eradb outside of freezer to avoid + // creating an instance for the state freezer. eraDatadir := path.Join(datadir, "era") eradb, err := eradb.New(eraDatadir) if err != nil { diff --git a/core/rawdb/eradb/eradb.go b/core/rawdb/eradb/eradb.go index 340d5556af..ecefffe3c8 100644 --- a/core/rawdb/eradb/eradb.go +++ b/core/rawdb/eradb/eradb.go @@ -23,11 +23,18 @@ import ( "path/filepath" "github.com/ethereum/go-ethereum/common/lru" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/internal/era" "github.com/ethereum/go-ethereum/log" ) +/** +* TODO: +* - FD leak possible on cache eviction. +* - FD leak possible on concurrent access to GetRaw*. + */ + +// EraDatabase manages read access to a directory of era1 files. +// The getter methods are thread-safe. type EraDatabase struct { datadir string // TODO: should take into account configured number of fd handles. @@ -55,6 +62,46 @@ func New(datadir string) (*EraDatabase, error) { return db, nil } +// Close closes all open era1 files in the cache. +func (db *EraDatabase) Close() { + // Close all open era1 files in the cache. + keys := db.cache.Keys() + for _, key := range keys { + if e, ok := db.cache.Get(key); ok { + e.Close() + } + } +} + +// GetRawBody returns the raw body for a given block number. +func (db *EraDatabase) GetRawBody(number uint64) ([]byte, error) { + // Lookup the table by epoch. + epoch := number / uint64(era.MaxEra1Size) + e, err := db.getEraByEpoch(epoch) + if err != nil { + return nil, err + } + // The era1 file for given epoch may not exist. + if e == nil { + return nil, nil + } + return e.GetRawBodyByNumber(number) +} + +// GetRawReceipts returns the raw receipts for a given block number. +func (db *EraDatabase) GetRawReceipts(number uint64) ([]byte, error) { + epoch := number / uint64(era.MaxEra1Size) + e, err := db.getEraByEpoch(epoch) + if err != nil { + return nil, err + } + // The era1 file for given epoch may not exist. + if e == nil { + return nil, nil + } + return e.GetRawReceiptsByNumber(number) +} + func (db *EraDatabase) openEra(name string) (*era.Era, error) { e, err := era.Open(name) if err != nil { @@ -96,82 +143,3 @@ func (db *EraDatabase) getEraByEpoch(epoch uint64) (*era.Era, error) { db.cache.Add(epoch, e) return e, nil } - -func (db *EraDatabase) Close() { - // Close all open era1 files in the cache. - keys := db.cache.Keys() - for _, key := range keys { - if e, ok := db.cache.Get(key); ok { - e.Close() - } - } -} - -// TODO: do we need this method? we do have headers in the freezer. -func (db *EraDatabase) GetHeaderByNumber(number uint64) (*types.Header, error) { - // Lookup the table by epoch. - epoch := number / uint64(era.MaxEra1Size) - e, err := db.getEraByEpoch(epoch) - if err != nil { - return nil, err - } - // The era1 file for given epoch may not exist. - if e == nil { - return nil, nil - } - return e.GetHeaderByNumber(number) -} - -func (db *EraDatabase) GetRawBody(number uint64) ([]byte, error) { - // Lookup the table by epoch. - epoch := number / uint64(era.MaxEra1Size) - e, err := db.getEraByEpoch(epoch) - if err != nil { - return nil, err - } - // The era1 file for given epoch may not exist. - if e == nil { - return nil, nil - } - return e.GetRawBodyByNumber(number) -} - -func (db *EraDatabase) GetRawReceipts(number uint64) ([]byte, error) { - epoch := number / uint64(era.MaxEra1Size) - e, err := db.getEraByEpoch(epoch) - if err != nil { - return nil, err - } - // The era1 file for given epoch may not exist. - if e == nil { - return nil, nil - } - return e.GetRawReceiptsByNumber(number) -} - -func (db *EraDatabase) GetBlockByNumber(number uint64) (*types.Block, error) { - // Lookup the table by epoch. - epoch := number / uint64(era.MaxEra1Size) - e, err := db.getEraByEpoch(epoch) - if err != nil { - return nil, err - } - // The era1 file for given epoch may not exist. - if e == nil { - return nil, nil - } - return e.GetBlockByNumber(number) -} - -func (db *EraDatabase) GetReceiptsByNumber(number uint64) (types.Receipts, error) { - epoch := number / uint64(era.MaxEra1Size) - e, err := db.getEraByEpoch(epoch) - if err != nil { - return nil, err - } - // The era1 file for given epoch may not exist. - if e == nil { - return nil, nil - } - return e.GetReceiptsByNumber(number) -}