()
| 796 | } |
| 797 | |
| 798 | func (bc *BlockChain) CommitStateDB() { |
| 799 | // Ensure the state of a recent block is also stored to disk. |
| 800 | // We're writing three different states to catch different restart scenarios: |
| 801 | // - HEAD: So we don't need to reprocess any blocks in the general case |
| 802 | // - HEAD-1: So we don't do large reorgs if our HEAD becomes an uncle |
| 803 | // - HEAD-127: So we have a hard limit on the number of blocks reexecuted |
| 804 | if !bc.cacheConfig.Disabled { |
| 805 | triedb := bc.stateCache.TrieDB() |
| 806 | privTrieDB := bc.privateStateCache.TrieDB() |
| 807 | |
| 808 | for _, offset := range []uint64{0, 1, triesInMemory - 1} { |
| 809 | if number := bc.CurrentBlock().NumberU64(); number > offset { |
| 810 | recent := bc.GetBlockByNumber(number - offset) |
| 811 | |
| 812 | log.Debug("Writing cached state to disk", "block", recent.Number(), "hash", recent.Hash().Hex(), "root", recent.StateRoot()) |
| 813 | if err := triedb.Commit(recent.StateRoot(), true); err != nil { |
| 814 | log.Error("Failed to commit recent state trie", "err", err) |
| 815 | } |
| 816 | |
| 817 | if bc.syncMode == syncer.FullSync { |
| 818 | log.Debug("Writing private cached state to disk", "block", recent.Number(), "hash", recent.Hash().Hex(), "root", recent.StateRoot()) |
| 819 | if err := privTrieDB.Commit(GetPrivateStateRoot(bc.db, recent.StateRoot()), true); err != nil { |
| 820 | log.Error("Failed to commit recent private state trie", "err", err) |
| 821 | } |
| 822 | } |
| 823 | |
| 824 | } |
| 825 | } |
| 826 | for !bc.triegc.Empty() { |
| 827 | triedb.Dereference(bc.triegc.PopItem().(common.Hash)) |
| 828 | // TODO: process GC on privTrieDB |
| 829 | } |
| 830 | if size, _ := triedb.Size(); size != 0 { |
| 831 | log.Error("Dangling trie nodes after full cleanup") |
| 832 | } |
| 833 | |
| 834 | if size, _ := privTrieDB.Size(); size != 0 { |
| 835 | log.Error("Dangling trie nodes(private statedb) after full cleanup") |
| 836 | } |
| 837 | } |
| 838 | } |
| 839 | |
| 840 | func (bc *BlockChain) procFutureBlocks() { |
| 841 | blocks := make([]*types.Block, 0, bc.futureBlocks.Len()) |
no test coverage detected