core/rawdb: Use backoff flag to avoid repeating select

This commit is contained in:
Austin Roberts 2020-04-30 16:52:27 -05:00
parent 9f3ecf34fb
commit 0633250a3b

View file

@ -257,6 +257,7 @@ func (f *freezer) Sync() error {
func (f *freezer) freeze(db ethdb.KeyValueStore) { func (f *freezer) freeze(db ethdb.KeyValueStore) {
nfdb := &nofreezedb{KeyValueStore: db} nfdb := &nofreezedb{KeyValueStore: db}
backoff := false
for { for {
select { select {
case <-f.quit: case <-f.quit:
@ -264,55 +265,42 @@ func (f *freezer) freeze(db ethdb.KeyValueStore) {
return return
default: default:
} }
if backoff {
select {
case <-time.NewTimer(freezerRecheckInterval).C:
backoff = false
case <-f.quit:
return
}
}
// Retrieve the freezing threshold. // Retrieve the freezing threshold.
hash := ReadHeadBlockHash(nfdb) hash := ReadHeadBlockHash(nfdb)
if hash == (common.Hash{}) { if hash == (common.Hash{}) {
log.Debug("Current full block hash unavailable") // new chain, empty database log.Debug("Current full block hash unavailable") // new chain, empty database
select {
case <-time.NewTimer(freezerRecheckInterval).C:
continue
case <-f.quit:
return
}
} }
number := ReadHeaderNumber(nfdb, hash) number := ReadHeaderNumber(nfdb, hash)
switch { switch {
case number == nil: case number == nil:
log.Error("Current full block number unavailable", "hash", hash) log.Error("Current full block number unavailable", "hash", hash)
select { backoff = true
case <-time.NewTimer(freezerRecheckInterval).C: continue
continue
case <-f.quit:
return
}
case *number < params.ImmutabilityThreshold: case *number < params.ImmutabilityThreshold:
log.Debug("Current full block not old enough", "number", *number, "hash", hash, "delay", params.ImmutabilityThreshold) log.Debug("Current full block not old enough", "number", *number, "hash", hash, "delay", params.ImmutabilityThreshold)
select { backoff = true
case <-time.NewTimer(freezerRecheckInterval).C: continue
continue
case <-f.quit:
return
}
case *number-params.ImmutabilityThreshold <= f.frozen: case *number-params.ImmutabilityThreshold <= f.frozen:
log.Debug("Ancient blocks frozen already", "number", *number, "hash", hash, "frozen", f.frozen) log.Debug("Ancient blocks frozen already", "number", *number, "hash", hash, "frozen", f.frozen)
select { backoff = true
case <-time.NewTimer(freezerRecheckInterval).C: continue
continue
case <-f.quit:
return
}
} }
head := ReadHeader(nfdb, hash, *number) head := ReadHeader(nfdb, hash, *number)
if head == nil { if head == nil {
log.Error("Current full block unavailable", "number", *number, "hash", hash) log.Error("Current full block unavailable", "number", *number, "hash", hash)
select { backoff = true
case <-time.NewTimer(freezerRecheckInterval).C: continue
continue
case <-f.quit:
return
}
} }
// Seems we have data ready to be frozen, process in usable batches // Seems we have data ready to be frozen, process in usable batches
limit := *number - params.ImmutabilityThreshold limit := *number - params.ImmutabilityThreshold
@ -398,12 +386,7 @@ func (f *freezer) freeze(db ethdb.KeyValueStore) {
// Avoid database thrashing with tiny writes // Avoid database thrashing with tiny writes
if f.frozen-first < freezerBatchLimit { if f.frozen-first < freezerBatchLimit {
select { backoff = true
case <-time.NewTimer(freezerRecheckInterval).C:
continue
case <-f.quit:
return
}
} }
} }
} }