core: update

This commit is contained in:
Gary Rong 2025-08-20 11:01:24 +08:00
parent 0861e6dffe
commit fa1970fba7
2 changed files with 30 additions and 11 deletions

View file

@ -533,8 +533,12 @@ func NewBlockChain(db ethdb.Database, genesis *Genesis, engine consensus.Engine,
// Start state size tracker // Start state size tracker
if bc.cfg.EnableStateSizeTracking { if bc.cfg.EnableStateSizeTracking {
bc.stateSizer = state.NewSizeTracker(bc.db, bc.triedb) stateSizer, err := state.NewSizeTracker(bc.db, bc.triedb)
bc.stateSizer.Start() if err == nil {
bc.stateSizer = stateSizer
} else {
log.Info("Failed to setup size tracker", "err", err)
}
} }
return bc, nil return bc, nil
} }

View file

@ -25,6 +25,7 @@ import (
"time" "time"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
@ -40,6 +41,7 @@ const (
// Metrics for uploading the state statistics. // Metrics for uploading the state statistics.
var ( var (
blockInfoGauge = metrics.NewRegisteredGaugeInfo("state/size/block", nil)
accountsGauge = metrics.NewRegisteredGauge("state/size/account/count", nil) accountsGauge = metrics.NewRegisteredGauge("state/size/account/count", nil)
accountBytesGauge = metrics.NewRegisteredGauge("state/size/account/bytes", nil) accountBytesGauge = metrics.NewRegisteredGauge("state/size/account/bytes", nil)
storagesGauge = metrics.NewRegisteredGauge("state/size/storage/count", nil) storagesGauge = metrics.NewRegisteredGauge("state/size/storage/count", nil)
@ -237,18 +239,19 @@ type SizeTracker struct {
} }
// NewSizeTracker creates a new state size tracker and starts it automatically // NewSizeTracker creates a new state size tracker and starts it automatically
func NewSizeTracker(db ethdb.KeyValueStore, triedb *triedb.Database) *SizeTracker { func NewSizeTracker(db ethdb.KeyValueStore, triedb *triedb.Database) (*SizeTracker, error) {
return &SizeTracker{ if triedb.Scheme() != rawdb.PathScheme {
return nil, errors.New("state size tracker is not compatible with hash mode")
}
t := &SizeTracker{
db: db, db: db,
triedb: triedb, triedb: triedb,
abort: make(chan struct{}), abort: make(chan struct{}),
aborted: make(chan struct{}), aborted: make(chan struct{}),
updateCh: make(chan *stateUpdate), updateCh: make(chan *stateUpdate),
} }
}
func (t *SizeTracker) Start() {
go t.run() go t.run()
return t, nil
} }
func (t *SizeTracker) Stop() { func (t *SizeTracker) Stop() {
@ -299,11 +302,12 @@ func (t *SizeTracker) run() {
continue continue
} }
stat := base.add(diff) stat := base.add(diff)
stats[u.root] = stat
t.upload(stat) t.upload(stat)
stats[u.root] = stat
heap.Push(&h, stats[u.root]) heap.Push(&h, stats[u.root])
for u.blockNumber-h[0].BlockNumber > statEvictThreshold { for u.blockNumber-h[0].BlockNumber > statEvictThreshold {
delete(stats, h[0].StateRoot)
heap.Pop(&h) heap.Pop(&h)
} }
@ -317,6 +321,7 @@ type buildResult struct {
stat SizeStats stat SizeStats
root common.Hash root common.Hash
blockNumber uint64 blockNumber uint64
elapsed time.Duration
err error err error
} }
@ -332,6 +337,8 @@ wait:
if t.triedb.SnapshotCompleted() { if t.triedb.SnapshotCompleted() {
break wait break wait
} }
case <-t.updateCh:
continue
case <-t.abort: case <-t.abort:
return nil, errors.New("size tracker closed") return nil, errors.New("size tracker closed")
} }
@ -360,6 +367,7 @@ wait:
if done == nil { if done == nil {
done = make(chan buildResult) done = make(chan buildResult)
go t.build(entry.root, entry.blockNumber, done) go t.build(entry.root, entry.blockNumber, done)
log.Info("Measuring persistent state size", "root", root, "number", entry.blockNumber)
} }
case result := <-done: case result := <-done:
@ -368,9 +376,9 @@ wait:
} }
var ( var (
stats = make(map[common.Hash]SizeStats) stats = make(map[common.Hash]SizeStats)
apply func(root common.Hash, stats SizeStats) error apply func(root common.Hash, stat SizeStats) error
) )
apply = func(root common.Hash, stat SizeStats) error { apply = func(root common.Hash, base SizeStats) error {
for _, child := range children[root] { for _, child := range children[root] {
entry, ok := updates[child] entry, ok := updates[child]
if !ok { if !ok {
@ -380,7 +388,7 @@ wait:
if err != nil { if err != nil {
return err return err
} }
stats[child] = stat.add(diff) stats[child] = base.add(diff)
if err := apply(child, stats[child]); err != nil { if err := apply(child, stats[child]); err != nil {
return err return err
} }
@ -390,6 +398,7 @@ wait:
if err := apply(result.root, result.stat); err != nil { if err := apply(result.root, result.stat); err != nil {
return nil, err return nil, err
} }
log.Info("Measured persistent state size", "root", result.root, "number", result.blockNumber, "elapsed", common.PrettyDuration(result.elapsed))
return stats, nil return stats, nil
case <-t.abort: case <-t.abort:
@ -409,6 +418,7 @@ func (t *SizeTracker) build(root common.Hash, blockNumber uint64, done chan buil
storageTrienodes, storageTrienodeBytes int64 storageTrienodes, storageTrienodeBytes int64
group errgroup.Group group errgroup.Group
start = time.Now()
) )
// Start all table iterations concurrently with direct metric updates // Start all table iterations concurrently with direct metric updates
@ -479,6 +489,7 @@ func (t *SizeTracker) build(root common.Hash, blockNumber uint64, done chan buil
root: root, root: root,
blockNumber: blockNumber, blockNumber: blockNumber,
stat: stat, stat: stat,
elapsed: time.Since(start),
} }
} }
} }
@ -534,6 +545,10 @@ func (t *SizeTracker) iterateTable(closed chan struct{}, prefix []byte, name str
} }
func (t *SizeTracker) upload(stats SizeStats) { func (t *SizeTracker) upload(stats SizeStats) {
blockInfoGauge.Update(metrics.GaugeInfoValue{
"number": hexutil.Uint64(stats.BlockNumber).String(),
"hash": stats.StateRoot.Hex(),
})
accountsGauge.Update(stats.Accounts) accountsGauge.Update(stats.Accounts)
accountBytesGauge.Update(stats.AccountBytes) accountBytesGauge.Update(stats.AccountBytes)
storagesGauge.Update(stats.Storages) storagesGauge.Update(stats.Storages)