diff --git a/core/rawdb/chain_freezer.go b/core/rawdb/chain_freezer.go index c629e5a764..31b8774c66 100644 --- a/core/rawdb/chain_freezer.go +++ b/core/rawdb/chain_freezer.go @@ -39,11 +39,16 @@ const ( // storage. freezerRecheckInterval = time.Minute - // freezerBatchLimit is the maximum number of blocks to freeze in one batch - // before doing an fsync and deleting it from the key-value store. // TODO(galaio): For BSC, the 0.75 interval and freezing of 30,000 blocks will seriously affect performance. // It is temporarily adjusted to 100, and improves the freezing performance later. - freezerBatchLimit = 100 + SlowFreezerBatchLimit = 100 + SlowdownFreezeWindow = 24 * time.Hour +) + +var ( + // freezerBatchLimit is the maximum number of blocks to freeze in one batch + // before doing an fsync and deleting it from the key-value store. + freezerBatchLimit uint64 = 30000 ) var ( @@ -268,6 +273,7 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore, continueFreeze bool) { backoff = true continue } + trySlowdownFreeze(head) first = frozen last = threshold @@ -307,6 +313,7 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore, continueFreeze bool) { backoff = true continue } + trySlowdownFreeze(head) first, _ = f.Ancients() last = *number - threshold if last-first > freezerBatchLimit { @@ -735,3 +742,14 @@ func (f *chainFreezer) ResetTable(kind string, startAt uint64, onlyEmpty bool) e func (f *chainFreezer) SyncAncient() error { return f.ancients.SyncAncient() } + +func trySlowdownFreeze(head *types.Header) { + if time.Since(time.UnixMilli(int64(head.MilliTimestamp()))) > SlowdownFreezeWindow { + return + } + if freezerBatchLimit == SlowFreezerBatchLimit { + return + } + log.Info("Freezer need to slow down", "number", head.Number, "time", head.Time, "new", SlowFreezerBatchLimit) + freezerBatchLimit = SlowFreezerBatchLimit +}