Merge pull request #22319 from karalabe/fix-defer-leak
core: fix temp memory blowup caused by defers holding on to state
This commit is contained in:
		
						commit
						2fc465a7be
					
				| @ -1805,6 +1805,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er | |||||||
| 		return it.index, err | 		return it.index, err | ||||||
| 	} | 	} | ||||||
| 	// No validation errors for the first block (or chain prefix skipped)
 | 	// No validation errors for the first block (or chain prefix skipped)
 | ||||||
|  | 	var activeState *state.StateDB | ||||||
|  | 	defer func() { | ||||||
|  | 		// The chain importer is starting and stopping trie prefetchers. If a bad
 | ||||||
|  | 		// block or other error is hit however, an early return may not properly
 | ||||||
|  | 		// terminate the background threads. This defer ensures that we clean up
 | ||||||
|  | 		// and dangling prefetcher, without defering each and holding on live refs.
 | ||||||
|  | 		if activeState != nil { | ||||||
|  | 			activeState.StopPrefetcher() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 
 | ||||||
| 	for ; block != nil && err == nil || err == ErrKnownBlock; block, err = it.next() { | 	for ; block != nil && err == nil || err == ErrKnownBlock; block, err = it.next() { | ||||||
| 		// If the chain is terminating, stop processing blocks
 | 		// If the chain is terminating, stop processing blocks
 | ||||||
| 		if bc.insertStopped() { | 		if bc.insertStopped() { | ||||||
| @ -1867,7 +1878,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er | |||||||
| 		} | 		} | ||||||
| 		// Enable prefetching to pull in trie node paths while processing transactions
 | 		// Enable prefetching to pull in trie node paths while processing transactions
 | ||||||
| 		statedb.StartPrefetcher("chain") | 		statedb.StartPrefetcher("chain") | ||||||
| 		defer statedb.StopPrefetcher() // stopped on write anyway, defer meant to catch early error returns
 | 		activeState = statedb | ||||||
| 
 | 
 | ||||||
| 		// If we have a followup block, run that against the current state to pre-cache
 | 		// If we have a followup block, run that against the current state to pre-cache
 | ||||||
| 		// transactions and probabilistically some of the account/storage trie nodes.
 | 		// transactions and probabilistically some of the account/storage trie nodes.
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user