Merge pull request #38 from salvium/tx-parallel-scanning-fix
Fixed wallet scanning parallelisation, speed up wallet scans from chain
This commit is contained in:
@@ -2859,6 +2859,7 @@ void wallet2::process_new_scanned_transaction(
|
|||||||
const carrot::subaddress_index_extended subaddr_ext = {i->first.major, i->first.minor, derive_type, true};
|
const carrot::subaddress_index_extended subaddr_ext = {i->first.major, i->first.minor, derive_type, true};
|
||||||
// save to m_subaddresses as well, so that we can populate account subaddress map
|
// save to m_subaddresses as well, so that we can populate account subaddress map
|
||||||
// when we open the wallet first time.
|
// when we open the wallet first time.
|
||||||
|
if (derive_type == carrot::AddressDeriveType::PreCarrot)
|
||||||
m_subaddresses_extended[onetime_address] = subaddr_ext;
|
m_subaddresses_extended[onetime_address] = subaddr_ext;
|
||||||
|
|
||||||
// update m_salvium_txs
|
// update m_salvium_txs
|
||||||
@@ -3381,9 +3382,7 @@ void wallet2::process_parsed_blocks(const uint64_t start_height, const std::vect
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
size_t tx_output_idx = 0;
|
size_t tx_output_idx = 0;
|
||||||
while (i < blocks.size()) {
|
while (i < blocks.size()) {
|
||||||
const parsed_block &par_blk = parsed_blocks.at(i);
|
/*
|
||||||
const std::uint64_t height = start_height + i;
|
|
||||||
const bool skip_scan_for_this_block = should_skip_block(par_blk.block, height);
|
|
||||||
if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
||||||
tx_scan_job(par_blk.block.miner_tx, tx_output_idx);
|
tx_scan_job(par_blk.block.miner_tx, tx_output_idx);
|
||||||
tx_output_idx += par_blk.block.miner_tx.vout.size();
|
tx_output_idx += par_blk.block.miner_tx.vout.size();
|
||||||
@@ -3395,30 +3394,33 @@ void wallet2::process_parsed_blocks(const uint64_t start_height, const std::vect
|
|||||||
if (!skip_scan_for_this_block)
|
if (!skip_scan_for_this_block)
|
||||||
tx_scan_job(tx, tx_output_idx);
|
tx_scan_job(tx, tx_output_idx);
|
||||||
tx_output_idx += tx.vout.size();
|
tx_output_idx += tx.vout.size();
|
||||||
|
*/
|
||||||
|
tools::threadpool::waiter scan_blocks_waiter(tpool);
|
||||||
|
for (size_t j = 0; j < 10; ++j)
|
||||||
|
{
|
||||||
|
if (i+j >= blocks.size()) break;
|
||||||
|
const parsed_block &par_blk = parsed_blocks.at(i+j);
|
||||||
|
const std::uint64_t height = start_height + i + j;
|
||||||
|
const bool skip_scan_for_this_block = should_skip_block(par_blk.block, height);
|
||||||
|
if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
||||||
|
tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(par_blk.block.miner_tx), tx_output_idx));
|
||||||
|
tx_output_idx += par_blk.block.miner_tx.vout.size();
|
||||||
|
if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
||||||
|
tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(par_blk.block.protocol_tx), tx_output_idx));
|
||||||
|
tx_output_idx += par_blk.block.protocol_tx.vout.size();
|
||||||
|
for (const cryptonote::transaction &tx : par_blk.txes)
|
||||||
|
{
|
||||||
|
if (!skip_scan_for_this_block)
|
||||||
|
tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(tx), tx_output_idx));
|
||||||
|
tx_output_idx += tx.vout.size();
|
||||||
}
|
}
|
||||||
// tools::threadpool::waiter scan_blocks_waiter(tpool);
|
}
|
||||||
// for (size_t j = 0; j < 10; ++j)
|
if (!scan_blocks_waiter.wait())
|
||||||
// {
|
{
|
||||||
// if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
THROW_WALLET_EXCEPTION_IF(password_failure, error::password_needed);
|
||||||
// tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(par_blk.block.miner_tx), tx_output_idx));
|
THROW_WALLET_EXCEPTION(error::wallet_internal_error, "Unrecognized exception in enote scanning threadpool");
|
||||||
// tx_output_idx += par_blk.block.miner_tx.vout.size();
|
}
|
||||||
// if (!skip_scan_for_this_block && m_refresh_type != RefreshNoCoinbase)
|
i+=10;
|
||||||
// tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(par_blk.block.protocol_tx), tx_output_idx));
|
|
||||||
// tx_output_idx += par_blk.block.protocol_tx.vout.size();
|
|
||||||
// for (const cryptonote::transaction &tx : par_blk.txes)
|
|
||||||
// {
|
|
||||||
// if (!skip_scan_for_this_block)
|
|
||||||
// tpool.submit(&scan_blocks_waiter, std::bind(tx_scan_job, std::cref(tx), tx_output_idx));
|
|
||||||
// tx_output_idx += tx.vout.size();
|
|
||||||
// }
|
|
||||||
// if (++i >= blocks.size()) break;
|
|
||||||
// }
|
|
||||||
// if (!scan_blocks_waiter.wait())
|
|
||||||
// {
|
|
||||||
// THROW_WALLET_EXCEPTION_IF(password_failure, error::password_needed);
|
|
||||||
// THROW_WALLET_EXCEPTION(error::wallet_internal_error, "Unrecognized exception in enote scanning threadpool");
|
|
||||||
// }
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start processing blockchain entries with scanned outputs
|
// Start processing blockchain entries with scanned outputs
|
||||||
|
|||||||
Reference in New Issue
Block a user