@@ -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
3031const (
@@ -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.
240275func (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