Skip to content

Commit 726dd7d

Browse files
committed
core/rawdb: use max(finality, head-90k) as chain freezing threshold
1 parent 33c4b23 commit 726dd7d

File tree

1 file changed

+51
-16
lines changed

1 file changed

+51
-16
lines changed

core/rawdb/chain_freezer.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/ethereum/go-ethereum/common"
2626
"github.com/ethereum/go-ethereum/ethdb"
2727
"github.com/ethereum/go-ethereum/log"
28+
"github.com/ethereum/go-ethereum/params"
2829
)
2930

3031
const (
@@ -72,17 +73,48 @@ func (f *chainFreezer) Close() error {
7273
return f.Freezer.Close()
7374
}
7475

75-
// readFinalized loads the finalized block from database.
76-
func (f *chainFreezer) readFinalized(db ethdb.KeyValueReader) (uint64, common.Hash, error) {
77-
hash := ReadFinalizedBlockHash(db)
76+
// block tags
77+
const (
78+
finalizedBlock = "finalized"
79+
headBlock = "head"
80+
)
81+
82+
// readBlock returns the number of specified block. 0 is returned if the block
83+
// is unknown or not available yet.
84+
func (f *chainFreezer) readBlock(db ethdb.KeyValueReader, tag string) uint64 {
85+
var hash common.Hash
86+
switch tag {
87+
case finalizedBlock:
88+
hash = ReadFinalizedBlockHash(db)
89+
case headBlock:
90+
hash = ReadHeadBlockHash(db)
91+
default:
92+
return 0
93+
}
7894
if hash == (common.Hash{}) {
79-
return 0, common.Hash{}, errors.New("finalized block is not available")
95+
return 0
8096
}
8197
number := ReadHeaderNumber(db, hash)
8298
if number == nil {
83-
return 0, common.Hash{}, errors.New("finalized block number is not available")
99+
return 0
84100
}
85-
return *number, hash, nil
101+
return *number
102+
}
103+
104+
// freezeThreshold returns the threshold for chain freezing. It's determined
105+
// by formula: max(finality, HEAD-params.FullImmutabilityThreshold).
106+
func (f *chainFreezer) freezeThreshold(db ethdb.KeyValueReader) (uint64, error) {
107+
final, head := f.readBlock(db, finalizedBlock), f.readBlock(db, headBlock)
108+
if head > params.FullImmutabilityThreshold {
109+
head -= params.FullImmutabilityThreshold
110+
}
111+
if final == 0 && head == 0 {
112+
return 0, errors.New("freezing threshold is not available")
113+
}
114+
if final > head {
115+
return final, nil
116+
}
117+
return head, nil
86118
}
87119

88120
// freeze is a background thread that periodically checks the blockchain for any
@@ -122,30 +154,30 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) {
122154
return
123155
}
124156
}
125-
finalNumber, finalHash, err := f.readFinalized(nfdb)
157+
number, err := f.freezeThreshold(nfdb)
126158
if err != nil {
127-
backoff = true // chain is not finalized yet
128-
log.Debug("Finalized block is not available yet")
159+
backoff = true
160+
log.Debug("Current full block not old enough to freeze")
129161
continue
130162
}
131163
frozen := f.frozen.Load()
132164

133165
// Short circuit if finalized blocks are already frozen.
134-
if frozen != 0 && frozen-1 >= finalNumber {
166+
if frozen != 0 && frozen-1 >= number {
135167
backoff = true
136-
log.Debug("Ancient blocks frozen already", "number", finalNumber, "hash", finalHash, "frozen", frozen)
168+
log.Debug("Ancient blocks frozen already", "number", number, "frozen", frozen)
137169
continue
138170
}
139171
// Seems we have data ready to be frozen, process in usable batches
140172
var (
141173
start = time.Now()
142-
first = frozen
143-
limit = finalNumber
174+
first = frozen // the first block to freeze
175+
last = number // the last block to freezer
144176
)
145-
if limit-first+1 > freezerBatchLimit {
146-
limit = freezerBatchLimit + first - 1
177+
if last-first+1 > freezerBatchLimit {
178+
last = freezerBatchLimit + first - 1
147179
}
148-
ancients, err := f.freezeRange(nfdb, first, limit)
180+
ancients, err := f.freezeRange(nfdb, first, last)
149181
if err != nil {
150182
log.Error("Error in block freeze operation", "err", err)
151183
backoff = true
@@ -237,6 +269,9 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) {
237269
}
238270
}
239271

272+
// freezeRange moves a batch of chain segments from the fast database to the freezer.
273+
// The parameters (number, limit) specify the relevant block range, both of which
274+
// are included.
240275
func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hashes []common.Hash, err error) {
241276
hashes = make([]common.Hash, 0, limit-number+1)
242277

0 commit comments

Comments
 (0)