trie: cache collapsed tries node, not rlp blobs (#16876)
The current trie memory database/cache that we do pruning on stores trie nodes as binary rlp encoded blobs, and also stores the node relationships/references for GC purposes. However, most of the trie nodes (everything apart from a value node) is in essence just a collection of references. This PR switches out the RLP encoded trie blobs with the collapsed-but-not-serialized trie nodes. This permits most of the references to be recovered from within the node data structure, avoiding the need to track them a second time (expensive memory wise).
This commit is contained in:
		
				
					committed by
					
						 Felix Lange
						Felix Lange
					
				
			
			
				
	
			
			
			
						parent
						
							8db8d074e2
						
					
				
				
					commit
					d926bf2c7e
				
			| @@ -297,7 +297,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl | ||||
| 				database.TrieDB().Reference(root, common.Hash{}) | ||||
| 			} | ||||
| 			// Dereference all past tries we ourselves are done working with | ||||
| 			database.TrieDB().Dereference(proot, common.Hash{}) | ||||
| 			database.TrieDB().Dereference(proot) | ||||
| 			proot = root | ||||
|  | ||||
| 			// TODO(karalabe): Do we need the preimages? Won't they accumulate too much? | ||||
| @@ -320,7 +320,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl | ||||
| 			done[uint64(result.Block)] = result | ||||
|  | ||||
| 			// Dereference any paret tries held in memory by this task | ||||
| 			database.TrieDB().Dereference(res.rootref, common.Hash{}) | ||||
| 			database.TrieDB().Dereference(res.rootref) | ||||
|  | ||||
| 			// Stream completed traces to the user, aborting on the first error | ||||
| 			for result, ok := done[next]; ok; result, ok = done[next] { | ||||
| @@ -526,7 +526,7 @@ func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (* | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		database.TrieDB().Reference(root, common.Hash{}) | ||||
| 		database.TrieDB().Dereference(proot, common.Hash{}) | ||||
| 		database.TrieDB().Dereference(proot) | ||||
| 		proot = root | ||||
| 	} | ||||
| 	nodes, imgs := database.TrieDB().Size() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user