Merge branch 'ethereum:master' into portal

This commit is contained in:
Chen Kai 2024-04-17 18:32:35 +08:00 committed by GitHub
commit f1a812fcad
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 18 deletions

View file

@ -45,6 +45,10 @@ const (
// metricsGatheringInterval specifies the interval to retrieve pebble database // metricsGatheringInterval specifies the interval to retrieve pebble database
// compaction, io and pause stats to report to the user. // compaction, io and pause stats to report to the user.
metricsGatheringInterval = 3 * time.Second metricsGatheringInterval = 3 * time.Second
// degradationWarnInterval specifies how often warning should be printed if the
// leveldb database cannot keep up with requested writes.
degradationWarnInterval = time.Minute
) )
// Database is a persistent key-value store based on the pebble storage engine. // Database is a persistent key-value store based on the pebble storage engine.
@ -76,14 +80,16 @@ type Database struct {
log log.Logger // Contextual logger tracking the database path log log.Logger // Contextual logger tracking the database path
activeComp int // Current number of active compactions activeComp int // Current number of active compactions
compStartTime time.Time // The start time of the earliest currently-active compaction compStartTime time.Time // The start time of the earliest currently-active compaction
compTime atomic.Int64 // Total time spent in compaction in ns compTime atomic.Int64 // Total time spent in compaction in ns
level0Comp atomic.Uint32 // Total number of level-zero compactions level0Comp atomic.Uint32 // Total number of level-zero compactions
nonLevel0Comp atomic.Uint32 // Total number of non level-zero compactions nonLevel0Comp atomic.Uint32 // Total number of non level-zero compactions
writeDelayStartTime time.Time // The start time of the latest write stall
writeDelayCount atomic.Int64 // Total number of write stall counts writeStalled atomic.Bool // Flag whether the write is stalled
writeDelayTime atomic.Int64 // Total time spent in write stalls writeDelayStartTime time.Time // The start time of the latest write stall
writeDelayCount atomic.Int64 // Total number of write stall counts
writeDelayTime atomic.Int64 // Total time spent in write stalls
writeOptions *pebble.WriteOptions writeOptions *pebble.WriteOptions
} }
@ -112,10 +118,13 @@ func (d *Database) onCompactionEnd(info pebble.CompactionInfo) {
func (d *Database) onWriteStallBegin(b pebble.WriteStallBeginInfo) { func (d *Database) onWriteStallBegin(b pebble.WriteStallBeginInfo) {
d.writeDelayStartTime = time.Now() d.writeDelayStartTime = time.Now()
d.writeDelayCount.Add(1)
d.writeStalled.Store(true)
} }
func (d *Database) onWriteStallEnd() { func (d *Database) onWriteStallEnd() {
d.writeDelayTime.Add(int64(time.Since(d.writeDelayStartTime))) d.writeDelayTime.Add(int64(time.Since(d.writeDelayStartTime)))
d.writeStalled.Store(false)
} }
// panicLogger is just a noop logger to disable Pebble's internal logger. // panicLogger is just a noop logger to disable Pebble's internal logger.
@ -450,13 +459,15 @@ func (d *Database) meter(refresh time.Duration, namespace string) {
// Create storage and warning log tracer for write delay. // Create storage and warning log tracer for write delay.
var ( var (
compTimes [2]int64 compTimes [2]int64
writeDelayTimes [2]int64 compWrites [2]int64
writeDelayCounts [2]int64 compReads [2]int64
compWrites [2]int64
compReads [2]int64
nWrites [2]int64 nWrites [2]int64
writeDelayTimes [2]int64
writeDelayCounts [2]int64
lastWriteStallReport time.Time
) )
// Iterate ad infinitum and collect the stats // Iterate ad infinitum and collect the stats
@ -496,6 +507,13 @@ func (d *Database) meter(refresh time.Duration, namespace string) {
if d.writeDelayMeter != nil { if d.writeDelayMeter != nil {
d.writeDelayMeter.Mark(writeDelayTimes[i%2] - writeDelayTimes[(i-1)%2]) d.writeDelayMeter.Mark(writeDelayTimes[i%2] - writeDelayTimes[(i-1)%2])
} }
// Print a warning log if writing has been stalled for a while. The log will
// be printed per minute to avoid overwhelming users.
if d.writeStalled.Load() && writeDelayCounts[i%2] == writeDelayCounts[(i-1)%2] &&
time.Now().After(lastWriteStallReport.Add(degradationWarnInterval)) {
d.log.Warn("Database compacting, degraded performance")
lastWriteStallReport = time.Now()
}
if d.compTimeMeter != nil { if d.compTimeMeter != nil {
d.compTimeMeter.Mark(compTimes[i%2] - compTimes[(i-1)%2]) d.compTimeMeter.Mark(compTimes[i%2] - compTimes[(i-1)%2])
} }

View file

@ -209,11 +209,7 @@ func codeChunkIndex(chunk *uint256.Int) (*uint256.Int, byte) {
chunkOffset = new(uint256.Int).Add(codeOffset, chunk) chunkOffset = new(uint256.Int).Add(codeOffset, chunk)
treeIndex, subIndexMod = new(uint256.Int).DivMod(chunkOffset, verkleNodeWidth, new(uint256.Int)) treeIndex, subIndexMod = new(uint256.Int).DivMod(chunkOffset, verkleNodeWidth, new(uint256.Int))
) )
var subIndex byte return treeIndex, byte(subIndexMod.Uint64())
if len(subIndexMod) != 0 {
subIndex = byte(subIndexMod[0])
}
return treeIndex, subIndex
} }
// CodeChunkKey returns the verkle tree key of the code chunk for the // CodeChunkKey returns the verkle tree key of the code chunk for the