mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
parent
d318152a00
commit
07d3c421f3
1 changed files with 3 additions and 51 deletions
|
|
@ -18,22 +18,18 @@ package trie
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"runtime"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/VictoriaMetrics/fastcache"
|
"github.com/VictoriaMetrics/fastcache"
|
||||||
"github.com/XinFinOrg/XDPoSChain/common"
|
"github.com/XinFinOrg/XDPoSChain/common"
|
||||||
"github.com/XinFinOrg/XDPoSChain/ethdb"
|
"github.com/XinFinOrg/XDPoSChain/ethdb"
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/trie/triedb/hashdb"
|
"github.com/XinFinOrg/XDPoSChain/trie/triedb/hashdb"
|
||||||
"github.com/XinFinOrg/XDPoSChain/trie/trienode"
|
"github.com/XinFinOrg/XDPoSChain/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config defines all necessary options for database.
|
// Config defines all necessary options for database.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Cache int // Memory allowance (MB) to use for caching trie nodes in memory
|
Cache int // Memory allowance (MB) to use for caching trie nodes in memory
|
||||||
Journal string // Journal of clean cache to survive node restarts
|
Preimages bool // Flag whether the preimage of trie key is recorded
|
||||||
Preimages bool // Flag whether the preimage of trie key is recorded
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// backend defines the methods needed to access/update trie nodes in different
|
// backend defines the methods needed to access/update trie nodes in different
|
||||||
|
|
@ -79,11 +75,7 @@ type Database struct {
|
||||||
func prepare(diskdb ethdb.Database, config *Config) *Database {
|
func prepare(diskdb ethdb.Database, config *Config) *Database {
|
||||||
var cleans *fastcache.Cache
|
var cleans *fastcache.Cache
|
||||||
if config != nil && config.Cache > 0 {
|
if config != nil && config.Cache > 0 {
|
||||||
if config.Journal == "" {
|
cleans = fastcache.New(config.Cache * 1024 * 1024)
|
||||||
cleans = fastcache.New(config.Cache * 1024 * 1024)
|
|
||||||
} else {
|
|
||||||
cleans = fastcache.LoadFromFileOrNew(config.Journal, config.Cache*1024*1024)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
var preimages *preimageStore
|
var preimages *preimageStore
|
||||||
if config != nil && config.Preimages {
|
if config != nil && config.Preimages {
|
||||||
|
|
@ -196,46 +188,6 @@ func (db *Database) Close() error {
|
||||||
return db.backend.Close()
|
return db.backend.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// saveCache saves clean state cache to given directory path
|
|
||||||
// using specified CPU cores.
|
|
||||||
func (db *Database) saveCache(dir string, threads int) error {
|
|
||||||
if db.cleans == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
log.Info("Writing clean trie cache to disk", "path", dir, "threads", threads)
|
|
||||||
|
|
||||||
start := time.Now()
|
|
||||||
err := db.cleans.SaveToFileConcurrent(dir, threads)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Failed to persist clean trie cache", "error", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info("Persisted the clean trie cache", "path", dir, "elapsed", common.PrettyDuration(time.Since(start)))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SaveCache atomically saves fast cache data to the given dir using all
|
|
||||||
// available CPU cores.
|
|
||||||
func (db *Database) SaveCache(dir string) error {
|
|
||||||
return db.saveCache(dir, runtime.GOMAXPROCS(0))
|
|
||||||
}
|
|
||||||
|
|
||||||
// SaveCachePeriodically atomically saves fast cache data to the given dir with
|
|
||||||
// the specified interval. All dump operation will only use a single CPU core.
|
|
||||||
func (db *Database) SaveCachePeriodically(dir string, interval time.Duration, stopCh <-chan struct{}) {
|
|
||||||
ticker := time.NewTicker(interval)
|
|
||||||
defer ticker.Stop()
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ticker.C:
|
|
||||||
db.saveCache(dir, 1)
|
|
||||||
case <-stopCh:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cap iteratively flushes old but still referenced trie nodes until the total
|
// Cap iteratively flushes old but still referenced trie nodes until the total
|
||||||
// memory usage goes below the given threshold. The held pre-images accumulated
|
// memory usage goes below the given threshold. The held pre-images accumulated
|
||||||
// up to this point will be flushed in case the size exceeds the threshold.
|
// up to this point will be flushed in case the size exceeds the threshold.
|
||||||
Loading…
Reference in a new issue