|
@@ -113,7 +113,7 @@ func NewPruner(db ethdb.Database, datadir, trieCachePath string, bloomSize uint6
|
|
|
}, nil
|
|
}, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func prune(maindb ethdb.Database, stateBloom *stateBloom, middleStateRoots map[common.Hash]struct{}, start time.Time) error {
|
|
|
|
|
|
|
+func prune(snaptree *snapshot.Tree, root common.Hash, maindb ethdb.Database, stateBloom *stateBloom, bloomPath string, middleStateRoots map[common.Hash]struct{}, start time.Time) error {
|
|
|
// Delete all stale trie nodes in the disk. With the help of state bloom
|
|
// Delete all stale trie nodes in the disk. With the help of state bloom
|
|
|
// the trie nodes(and codes) belong to the active state will be filtered
|
|
// the trie nodes(and codes) belong to the active state will be filtered
|
|
|
// out. A very small part of stale tries will also be filtered because of
|
|
// out. A very small part of stale tries will also be filtered because of
|
|
@@ -186,6 +186,25 @@ func prune(maindb ethdb.Database, stateBloom *stateBloom, middleStateRoots map[c
|
|
|
iter.Release()
|
|
iter.Release()
|
|
|
log.Info("Pruned state data", "nodes", count, "size", size, "elapsed", common.PrettyDuration(time.Since(pstart)))
|
|
log.Info("Pruned state data", "nodes", count, "size", size, "elapsed", common.PrettyDuration(time.Since(pstart)))
|
|
|
|
|
|
|
|
|
|
+ // Pruning is done, now drop the "useless" layers from the snapshot.
|
|
|
|
|
+ // Firstly, flushing the target layer into the disk. After that all
|
|
|
|
|
+ // diff layers below the target will all be merged into the disk.
|
|
|
|
|
+ if err := snaptree.Cap(root, 0); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ // Secondly, flushing the snapshot journal into the disk. All diff
|
|
|
|
|
+ // layers upon are dropped silently. Eventually the entire snapshot
|
|
|
|
|
+ // tree is converted into a single disk layer with the pruning target
|
|
|
|
|
+ // as the root.
|
|
|
|
|
+ if _, err := snaptree.Journal(root); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ // Delete the state bloom, it marks the entire pruning procedure is
|
|
|
|
|
+ // finished. If any crashes or manual exit happens before this,
|
|
|
|
|
+ // `RecoverPruning` will pick it up in the next restarts to redo all
|
|
|
|
|
+ // the things.
|
|
|
|
|
+ os.RemoveAll(bloomPath)
|
|
|
|
|
+
|
|
|
// Start compactions, will remove the deleted data from the disk immediately.
|
|
// Start compactions, will remove the deleted data from the disk immediately.
|
|
|
// Note for small pruning, the compaction is skipped.
|
|
// Note for small pruning, the compaction is skipped.
|
|
|
if count >= rangeCompactionThreshold {
|
|
if count >= rangeCompactionThreshold {
|
|
@@ -314,29 +333,7 @@ func (p *Pruner) Prune(root common.Hash) error {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
log.Info("State bloom filter committed", "name", filterName)
|
|
log.Info("State bloom filter committed", "name", filterName)
|
|
|
-
|
|
|
|
|
- if err := prune(p.db, p.stateBloom, middleRoots, start); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Pruning is done, now drop the "useless" layers from the snapshot.
|
|
|
|
|
- // Firstly, flushing the target layer into the disk. After that all
|
|
|
|
|
- // diff layers below the target will all be merged into the disk.
|
|
|
|
|
- if err := p.snaptree.Cap(root, 0); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Secondly, flushing the snapshot journal into the disk. All diff
|
|
|
|
|
- // layers upon the target layer are dropped silently. Eventually the
|
|
|
|
|
- // entire snapshot tree is converted into a single disk layer with
|
|
|
|
|
- // the pruning target as the root.
|
|
|
|
|
- if _, err := p.snaptree.Journal(root); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Delete the state bloom, it marks the entire pruning procedure is
|
|
|
|
|
- // finished. If any crashes or manual exit happens before this,
|
|
|
|
|
- // `RecoverPruning` will pick it up in the next restarts to redo all
|
|
|
|
|
- // the things.
|
|
|
|
|
- os.RemoveAll(filterName)
|
|
|
|
|
- return nil
|
|
|
|
|
|
|
+ return prune(p.snaptree, root, p.db, p.stateBloom, filterName, middleRoots, start)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// RecoverPruning will resume the pruning procedure during the system restart.
|
|
// RecoverPruning will resume the pruning procedure during the system restart.
|
|
@@ -400,28 +397,7 @@ func RecoverPruning(datadir string, db ethdb.Database, trieCachePath string) err
|
|
|
log.Error("Pruning target state is not existent")
|
|
log.Error("Pruning target state is not existent")
|
|
|
return errors.New("non-existent target state")
|
|
return errors.New("non-existent target state")
|
|
|
}
|
|
}
|
|
|
- if err := prune(db, stateBloom, middleRoots, time.Now()); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Pruning is done, now drop the "useless" layers from the snapshot.
|
|
|
|
|
- // Firstly, flushing the target layer into the disk. After that all
|
|
|
|
|
- // diff layers below the target will all be merged into the disk.
|
|
|
|
|
- if err := snaptree.Cap(stateBloomRoot, 0); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Secondly, flushing the snapshot journal into the disk. All diff
|
|
|
|
|
- // layers upon are dropped silently. Eventually the entire snapshot
|
|
|
|
|
- // tree is converted into a single disk layer with the pruning target
|
|
|
|
|
- // as the root.
|
|
|
|
|
- if _, err := snaptree.Journal(stateBloomRoot); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- // Delete the state bloom, it marks the entire pruning procedure is
|
|
|
|
|
- // finished. If any crashes or manual exit happens before this,
|
|
|
|
|
- // `RecoverPruning` will pick it up in the next restarts to redo all
|
|
|
|
|
- // the things.
|
|
|
|
|
- os.RemoveAll(stateBloomPath)
|
|
|
|
|
- return nil
|
|
|
|
|
|
|
+ return prune(snaptree, stateBloomRoot, db, stateBloom, stateBloomPath, middleRoots, time.Now())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// extractGenesis loads the genesis state and commits all the state entries
|
|
// extractGenesis loads the genesis state and commits all the state entries
|