@ -1760,9 +1760,9 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
}
}
// Update the on-disk chain state.
// Update the on-disk chain state.
bool static WriteChainState ( CValidationState & state ) {
bool static WriteChainState ( CValidationState & state , bool forceWrite = false ) {
static int64_t nLastWrite = 0 ;
static int64_t nLastWrite = 0 ;
if ( pcoinsTip- > GetCacheSize ( ) > nCoinCacheSize | | ( ! IsInitialBlockDownload ( ) & & GetTimeMicros ( ) > nLastWrite + 600 * 1000000 ) ) {
if ( forceWrite | | pcoinsTip- > GetCacheSize ( ) > nCoinCacheSize | | ( ! IsInitialBlockDownload ( ) & & GetTimeMicros ( ) > nLastWrite + 600 * 1000000 ) ) {
// Typical CCoins structures on disk are around 100 bytes in size.
// Typical CCoins structures on disk are around 100 bytes in size.
// Pushing a new one to the database can cause it to be written
// Pushing a new one to the database can cause it to be written
// twice (once in the log, and once in the tables). This is already
// twice (once in the log, and once in the tables). This is already
@ -3022,6 +3022,8 @@ bool InitBlockIndex() {
return error ( " LoadBlockIndex() : genesis block not accepted " ) ;
return error ( " LoadBlockIndex() : genesis block not accepted " ) ;
if ( ! ActivateBestChain ( state , & block ) )
if ( ! ActivateBestChain ( state , & block ) )
return error ( " LoadBlockIndex() : genesis block cannot be activated " ) ;
return error ( " LoadBlockIndex() : genesis block cannot be activated " ) ;
// Force a chainstate write so that when we VerifyDB in a moment, it doesnt check stale data
return WriteChainState ( state , true ) ;
} catch ( std : : runtime_error & e ) {
} catch ( std : : runtime_error & e ) {
return error ( " LoadBlockIndex() : failed to initialize block database : % s " , e.what()) ;
return error ( " LoadBlockIndex() : failed to initialize block database : % s " , e.what()) ;
}
}
@ -3157,12 +3159,14 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
}
}
// process in case the block isn't known yet
// process in case the block isn't known yet
if ( mapBlockIndex . count ( hash ) = = 0 ) {
if ( mapBlockIndex . count ( hash ) = = 0 | | ( mapBlockIndex [ hash ] - > nStatus & BLOCK_HAVE_DATA ) = = 0 ) {
CValidationState state ;
CValidationState state ;
if ( ProcessNewBlock ( state , NULL , & block , dbp ) )
if ( ProcessNewBlock ( state , NULL , & block , dbp ) )
nLoaded + + ;
nLoaded + + ;
if ( state . IsError ( ) )
if ( state . IsError ( ) )
break ;
break ;
} else if ( hash ! = Params ( ) . HashGenesisBlock ( ) & & mapBlockIndex [ hash ] - > nHeight % 1000 = = 0 ) {
LogPrintf ( " Block Import: already had block %s at height %d \n " , hash . ToString ( ) , mapBlockIndex [ hash ] - > nHeight ) ;
}
}
// Recursively process earlier encountered successors of this block
// Recursively process earlier encountered successors of this block