mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-23 21:26:42 +00:00
core: update
This commit is contained in:
parent
0861e6dffe
commit
fa1970fba7
2 changed files with 30 additions and 11 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue