From f839308b57df0d75cd768496d58c2857db69c6a5 Mon Sep 17 00:00:00 2001 From: Gary Rong Date: Fri, 25 Nov 2022 11:23:44 +0800 Subject: [PATCH 1/2] core/rawdb: fix freezer validation --- core/rawdb/freezer.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go index 53bd989a482d..b4994b1536ae 100644 --- a/core/rawdb/freezer.go +++ b/core/rawdb/freezer.go @@ -325,23 +325,28 @@ func (f *Freezer) validate() error { return nil } var ( - length uint64 - name string + head uint64 + tail uint64 + name string ) // Hack to get length of any table for kind, table := range f.tables { - length = atomic.LoadUint64(&table.items) + head = atomic.LoadUint64(&table.items) + tail = atomic.LoadUint64(&table.itemHidden) name = kind break } // Now check every table against that length for kind, table := range f.tables { - items := atomic.LoadUint64(&table.items) - if length != items { - return fmt.Errorf("freezer tables %s and %s have differing lengths: %d != %d", kind, name, items, length) + if head != atomic.LoadUint64(&table.items) { + return fmt.Errorf("freezer tables %s and %s have differing head: %d != %d", kind, name, atomic.LoadUint64(&table.items), head) + } + if tail != atomic.LoadUint64(&table.itemHidden) { + return fmt.Errorf("freezer tables %s and %s have differing tail: %d != %d", kind, name, atomic.LoadUint64(&table.itemHidden), tail) } } - atomic.StoreUint64(&f.frozen, length) + atomic.StoreUint64(&f.frozen, head) + atomic.StoreUint64(&f.tail, tail) return nil } From 08c041986ce3432741762dcbd9bf834ca84bb1f9 Mon Sep 17 00:00:00 2001 From: Gary Rong Date: Fri, 25 Nov 2022 15:02:36 +0800 Subject: [PATCH 2/2] core/rawdb: address comment --- core/rawdb/freezer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go index b4994b1536ae..7bae0a2ea0d1 100644 --- a/core/rawdb/freezer.go +++ b/core/rawdb/freezer.go @@ -318,7 +318,7 @@ func (f *Freezer) Sync() error { return nil } -// validate checks that every table has the same length. +// validate checks that every table has the same boundary. // Used instead of `repair` in readonly mode. func (f *Freezer) validate() error { if len(f.tables) == 0 { @@ -329,14 +329,14 @@ func (f *Freezer) validate() error { tail uint64 name string ) - // Hack to get length of any table + // Hack to get boundary of any table for kind, table := range f.tables { head = atomic.LoadUint64(&table.items) tail = atomic.LoadUint64(&table.itemHidden) name = kind break } - // Now check every table against that length + // Now check every table against those boundaries. for kind, table := range f.tables { if head != atomic.LoadUint64(&table.items) { return fmt.Errorf("freezer tables %s and %s have differing head: %d != %d", kind, name, atomic.LoadUint64(&table.items), head)