@ -57,7 +57,6 @@ const (
// Config includes all the configurations for pruning.
// Config includes all the configurations for pruning.
type Config struct {
type Config struct {
Datadir string // The directory of the state database
Datadir string // The directory of the state database
Cachedir string // The directory of state clean cache
BloomSize uint64 // The Megabytes of memory allocated to bloom-filter
BloomSize uint64 // The Megabytes of memory allocated to bloom-filter
}
}
@ -241,7 +240,7 @@ func (p *Pruner) Prune(root common.Hash) error {
return err
return err
}
}
if stateBloomRoot != ( common . Hash { } ) {
if stateBloomRoot != ( common . Hash { } ) {
return RecoverPruning ( p . config . Datadir , p . db , p . config . Cachedir )
return RecoverPruning ( p . config . Datadir , p . db )
}
}
// If the target state root is not specified, use the HEAD-127 as the
// If the target state root is not specified, use the HEAD-127 as the
// target. The reason for picking it is:
// target. The reason for picking it is:
@ -299,12 +298,6 @@ func (p *Pruner) Prune(root common.Hash) error {
log . Info ( "Selecting user-specified state as the pruning target" , "root" , root )
log . Info ( "Selecting user-specified state as the pruning target" , "root" , root )
}
}
}
}
// Before start the pruning, delete the clean trie cache first.
// It's necessary otherwise in the next restart we will hit the
// deleted state root in the "clean cache" so that the incomplete
// state is picked for usage.
deleteCleanTrieCache ( p . config . Cachedir )
// All the state roots of the middle layer should be forcibly pruned,
// All the state roots of the middle layer should be forcibly pruned,
// otherwise the dangling state will be left.
// otherwise the dangling state will be left.
middleRoots := make ( map [ common . Hash ] struct { } )
middleRoots := make ( map [ common . Hash ] struct { } )
@ -342,7 +335,7 @@ func (p *Pruner) Prune(root common.Hash) error {
// pruning can be resumed. What's more if the bloom filter is constructed, the
// pruning can be resumed. What's more if the bloom filter is constructed, the
// pruning **has to be resumed**. Otherwise a lot of dangling nodes may be left
// pruning **has to be resumed**. Otherwise a lot of dangling nodes may be left
// in the disk.
// in the disk.
func RecoverPruning ( datadir string , db ethdb . Database , trieCachePath string ) error {
func RecoverPruning ( datadir string , db ethdb . Database ) error {
stateBloomPath , stateBloomRoot , err := findBloomFilter ( datadir )
stateBloomPath , stateBloomRoot , err := findBloomFilter ( datadir )
if err != nil {
if err != nil {
return err
return err
@ -378,12 +371,6 @@ func RecoverPruning(datadir string, db ethdb.Database, trieCachePath string) err
}
}
log . Info ( "Loaded state bloom filter" , "path" , stateBloomPath )
log . Info ( "Loaded state bloom filter" , "path" , stateBloomPath )
// Before start the pruning, delete the clean trie cache first.
// It's necessary otherwise in the next restart we will hit the
// deleted state root in the "clean cache" so that the incomplete
// state is picked for usage.
deleteCleanTrieCache ( trieCachePath )
// All the state roots of the middle layers should be forcibly pruned,
// All the state roots of the middle layers should be forcibly pruned,
// otherwise the dangling state will be left.
// otherwise the dangling state will be left.
var (
var (
@ -497,23 +484,3 @@ func findBloomFilter(datadir string) (string, common.Hash, error) {
}
}
return stateBloomPath , stateBloomRoot , nil
return stateBloomPath , stateBloomRoot , nil
}
}
const warningLog = `
WARNING !
The clean trie cache is not found . Please delete it by yourself after the
pruning . Remember don ' t start the Geth without deleting the clean trie cache
otherwise the entire database may be damaged !
Check the command description "geth snapshot prune-state --help" for more details .
`
func deleteCleanTrieCache ( path string ) {
if ! common . FileExist ( path ) {
log . Warn ( warningLog )
return
}
os . RemoveAll ( path )
log . Info ( "Deleted trie clean cache" , "path" , path )
}