From f19cd58957d2fcc4a925985dc0c28871967000b9 Mon Sep 17 00:00:00 2001 From: rodrigo <77309055+RodrigoVillar@users.noreply.github.com> Date: Wed, 3 Sep 2025 09:50:44 -0400 Subject: [PATCH] feat(rawdb): skip freezers (#220) ## Why this should be merged As described in https://github.com/ava-labs/coreth/issues/1137, database inspection of a Coreth chain database fails because `InspectDatabase()` expects for freezers to be used. This PR fixes this bug by adding an option to skip freezer inspection. This PR should be followed with a downstream PR in Coreth to pass in an option to skip freezer inspection during database inspection. ## How this works Extends `inspectDatabaseConfig` with a `skipFreezers` field and adds the associated option function for it. ## How this was tested CI + ran `InspectDatabase()` against Coreth locally --- core/rawdb/ancient_utils.go | 6 +++++- core/rawdb/database.go | 2 +- core/rawdb/database.libevm.go | 8 ++++++++ core/rawdb/database.libevm_test.go | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/core/rawdb/ancient_utils.go b/core/rawdb/ancient_utils.go index 0b15234690..1a53993acb 100644 --- a/core/rawdb/ancient_utils.go +++ b/core/rawdb/ancient_utils.go @@ -22,6 +22,7 @@ import ( "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/ethdb" + "github.com/ava-labs/libevm/libevm/options" ) type tableSize struct { @@ -77,7 +78,10 @@ func inspect(name string, order map[string]bool, reader ethdb.AncientReader) (fr } // inspectFreezers inspects all freezers registered in the system. -func inspectFreezers(db ethdb.Database) ([]freezerInfo, error) { +func inspectFreezers(db ethdb.Database, opts ...InspectDatabaseOption) ([]freezerInfo, error) { + if options.As[inspectDatabaseConfig](opts...).skipFreezers { + return nil, nil + } var infos []freezerInfo for _, freezer := range freezers { switch freezer { diff --git a/core/rawdb/database.go b/core/rawdb/database.go index 1fc7bdc35f..835a7f1c1a 100644 --- a/core/rawdb/database.go +++ b/core/rawdb/database.go @@ -604,7 +604,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte, opts ...Insp {"Light client", "Bloom trie nodes", bloomTrieNodes.Size(), bloomTrieNodes.Count()}, } // Inspect all registered append-only file store then. - ancients, err := inspectFreezers(db) + ancients, err := inspectFreezers(db, opts...) if err != nil { return err } diff --git a/core/rawdb/database.libevm.go b/core/rawdb/database.libevm.go index a7528b2618..20ff2294e2 100644 --- a/core/rawdb/database.libevm.go +++ b/core/rawdb/database.libevm.go @@ -28,6 +28,7 @@ type inspectDatabaseConfig struct { statRecorders []func([]byte, common.StorageSize) bool isMetas []func([]byte) bool statsTransformers []func([][]string) [][]string + skipFreezers bool } func (c inspectDatabaseConfig) recordStat(key []byte, size common.StorageSize) bool { @@ -91,3 +92,10 @@ func WithDatabaseStatsTransformer(transform func(rows [][]string) [][]string) In c.statsTransformers = append(c.statsTransformers, transform) }) } + +// WithSkipFreezers returns an option that causes for freezer inspection to be skipped. +func WithSkipFreezers() InspectDatabaseOption { + return newInspectOpt(func(c *inspectDatabaseConfig) { + c.skipFreezers = true + }) +} diff --git a/core/rawdb/database.libevm_test.go b/core/rawdb/database.libevm_test.go index 684ab11773..548e08b558 100644 --- a/core/rawdb/database.libevm_test.go +++ b/core/rawdb/database.libevm_test.go @@ -20,6 +20,9 @@ import ( "bytes" "fmt" "sort" + "testing" + + "github.com/stretchr/testify/require" "github.com/ava-labs/libevm/common" // To ensure that all methods are available to importing packages, this test @@ -28,6 +31,18 @@ import ( "github.com/ava-labs/libevm/ethdb" ) +func TestSkipFreezers(t *testing.T) { + require := require.New(t) + db := rawdb.NewMemoryDatabase() + + var ( + keyPrefix []byte + keyStart []byte + ) + + require.NoError(rawdb.InspectDatabase(db, keyPrefix, keyStart, rawdb.WithSkipFreezers())) +} + // ExampleDatabaseStat demonstrates the method signatures of DatabaseStat, which // exposes an otherwise unexported type that won't have its methods documented. func ExampleDatabaseStat() {