@ -2519,12 +2519,14 @@ void wallet2::parse_block_round(const cryptonote::blobdata &blob, cryptonote::bl
error = ! cryptonote : : parse_and_validate_block_from_blob ( blob , bl , bl_id ) ;
error = ! cryptonote : : parse_and_validate_block_from_blob ( blob , bl , bl_id ) ;
}
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
void wallet2 : : pull_blocks ( uint64_t start_height , uint64_t & blocks_start_height , const std : : list < crypto : : hash > & short_chain_history , std : : vector < cryptonote : : block_complete_entry > & blocks , std : : vector < cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : block_output_indices > & o_indices )
void wallet2 : : pull_blocks ( uint64_t start_height , uint64_t & blocks_start_height , const std : : list < crypto : : hash > & short_chain_history , std : : vector < cryptonote : : block_complete_entry > & blocks , std : : vector < cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : block_output_indices > & o_indices , uint64_t & current_height )
{
{
cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : request req = AUTO_VAL_INIT ( req ) ;
cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : request req = AUTO_VAL_INIT ( req ) ;
cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : response res = AUTO_VAL_INIT ( res ) ;
cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : response res = AUTO_VAL_INIT ( res ) ;
req . block_ids = short_chain_history ;
req . block_ids = short_chain_history ;
MDEBUG ( " Pulling blocks: start_height " < < start_height ) ;
req . prune = true ;
req . prune = true ;
req . start_height = start_height ;
req . start_height = start_height ;
req . no_miner_tx = m_refresh_type = = RefreshNoCoinbase ;
req . no_miner_tx = m_refresh_type = = RefreshNoCoinbase ;
@ -2544,6 +2546,10 @@ void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height,
blocks_start_height = res . start_height ;
blocks_start_height = res . start_height ;
blocks = std : : move ( res . blocks ) ;
blocks = std : : move ( res . blocks ) ;
o_indices = std : : move ( res . output_indices ) ;
o_indices = std : : move ( res . output_indices ) ;
current_height = res . current_height ;
MDEBUG ( " Pulled blocks: blocks_start_height " < < blocks_start_height < < " , count " < < blocks . size ( )
< < " , height " < < blocks_start_height + blocks . size ( ) < < " , node height " < < res . current_height ) ;
}
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
void wallet2 : : pull_hashes ( uint64_t start_height , uint64_t & blocks_start_height , const std : : list < crypto : : hash > & short_chain_history , std : : vector < crypto : : hash > & hashes )
void wallet2 : : pull_hashes ( uint64_t start_height , uint64_t & blocks_start_height , const std : : list < crypto : : hash > & short_chain_history , std : : vector < crypto : : hash > & hashes )
@ -2726,9 +2732,10 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
refresh ( trusted_daemon , start_height , blocks_fetched , received_money ) ;
refresh ( trusted_daemon , start_height , blocks_fetched , received_money ) ;
}
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
void wallet2 : : pull_and_parse_next_blocks ( uint64_t start_height , uint64_t & blocks_start_height , std : : list < crypto : : hash > & short_chain_history , const std : : vector < cryptonote : : block_complete_entry > & prev_blocks , const std : : vector < parsed_block > & prev_parsed_blocks , std : : vector < cryptonote : : block_complete_entry > & blocks , std : : vector < parsed_block > & parsed_blocks , bool & error, std : : exception_ptr & exception )
void wallet2 : : pull_and_parse_next_blocks ( uint64_t start_height , uint64_t & blocks_start_height , std : : list < crypto : : hash > & short_chain_history , const std : : vector < cryptonote : : block_complete_entry > & prev_blocks , const std : : vector < parsed_block > & prev_parsed_blocks , std : : vector < cryptonote : : block_complete_entry > & blocks , std : : vector < parsed_block > & parsed_blocks , bool & last, bool & error, std : : exception_ptr & exception )
{
{
error = false ;
error = false ;
last = false ;
exception = NULL ;
exception = NULL ;
try
try
@ -2746,7 +2753,8 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
// pull the new blocks
// pull the new blocks
std : : vector < cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : block_output_indices > o_indices ;
std : : vector < cryptonote : : COMMAND_RPC_GET_BLOCKS_FAST : : block_output_indices > o_indices ;
pull_blocks ( start_height , blocks_start_height , short_chain_history , blocks , o_indices ) ;
uint64_t current_height ;
pull_blocks ( start_height , blocks_start_height , short_chain_history , blocks , o_indices , current_height ) ;
THROW_WALLET_EXCEPTION_IF ( blocks . size ( ) ! = o_indices . size ( ) , error : : wallet_internal_error , " Mismatched sizes of blocks and o_indices " ) ;
THROW_WALLET_EXCEPTION_IF ( blocks . size ( ) ! = o_indices . size ( ) , error : : wallet_internal_error , " Mismatched sizes of blocks and o_indices " ) ;
tools : : threadpool & tpool = tools : : threadpool : : getInstance ( ) ;
tools : : threadpool & tpool = tools : : threadpool : : getInstance ( ) ;
@ -2784,6 +2792,7 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
}
}
}
}
waiter . wait ( & tpool ) ;
waiter . wait ( & tpool ) ;
last = ! blocks . empty ( ) & & cryptonote : : get_block_height ( parsed_blocks . back ( ) . block ) + 1 = = current_height ;
}
}
catch ( . . . )
catch ( . . . )
{
{
@ -3250,7 +3259,7 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
} ) ;
} ) ;
auto scope_exit_handler_hwdev = epee : : misc_utils : : create_scope_leave_handler ( [ & ] ( ) { hwdev . computing_key_images ( false ) ; } ) ;
auto scope_exit_handler_hwdev = epee : : misc_utils : : create_scope_leave_handler ( [ & ] ( ) { hwdev . computing_key_images ( false ) ; } ) ;
bool first = true ;
bool first = true , last = false ;
while ( m_run . load ( std : : memory_order_relaxed ) )
while ( m_run . load ( std : : memory_order_relaxed ) )
{
{
uint64_t next_blocks_start_height ;
uint64_t next_blocks_start_height ;
@ -3272,7 +3281,8 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
refreshed = true ;
refreshed = true ;
break ;
break ;
}
}
tpool . submit ( & waiter , [ & ] { pull_and_parse_next_blocks ( start_height , next_blocks_start_height , short_chain_history , blocks , parsed_blocks , next_blocks , next_parsed_blocks , error , exception ) ; } ) ;
if ( ! last )
tpool . submit ( & waiter , [ & ] { pull_and_parse_next_blocks ( start_height , next_blocks_start_height , short_chain_history , blocks , parsed_blocks , next_blocks , next_parsed_blocks , last , error , exception ) ; } ) ;
if ( ! first )
if ( ! first )
{
{