Skip to content

Commit 321de3a

Browse files
committed
Avoids freezing the head of the chain
1 parent 675d10f commit 321de3a

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

core/rawdb/chain_freezer.go

+28-2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ func (f *chainFreezer) Close() error {
8686
return f.AncientStore.Close()
8787
}
8888

89+
// readHeadNumber returns the number of chain head block. 0 is returned if the
90+
// block is unknown or not available yet.
91+
func (f *chainFreezer) readHeadNumber(db ethdb.KeyValueReader) uint64 {
92+
hash := ReadHeadBlockHash(db)
93+
if hash == (common.Hash{}) {
94+
log.Error("Head block is not reachable")
95+
return 0
96+
}
97+
number := ReadHeaderNumber(db, hash)
98+
if number == nil {
99+
log.Error("Number of head block is missing")
100+
return 0
101+
}
102+
return *number
103+
}
104+
89105
// readFinalizedNumber returns the number of finalized block. 0 is returned
90106
// if the block is unknown or not available yet.
91107
func (f *chainFreezer) readFinalizedNumber(db ethdb.KeyValueReader) uint64 {
@@ -103,10 +119,20 @@ func (f *chainFreezer) readFinalizedNumber(db ethdb.KeyValueReader) uint64 {
103119

104120
// freezeThreshold returns the threshold for chain freezing.
105121
func (f *chainFreezer) freezeThreshold(db ethdb.KeyValueReader) (uint64, error) {
106-
final := f.readFinalizedNumber(db)
107-
if final == 0 {
122+
var (
123+
head = f.readHeadNumber(db)
124+
final = f.readFinalizedNumber(db)
125+
)
126+
127+
if final == 0 || (head == final && final == 1) {
108128
return 0, errors.New("freezing threshold is not available")
109129
}
130+
131+
// avoids freezing the head of the chain, since freezing removes the block from the active database
132+
if head == final {
133+
final--
134+
}
135+
110136
return final, nil
111137
}
112138

0 commit comments

Comments
 (0)