diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-03-21 10:30:25 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-03-21 10:30:25 +0000 |
commit | 350e99ae57f07b5ff3dae99277e48821b109bc62 (patch) | |
tree | 7a640ab89d640717d0df80ed691100b080e75eca | |
parent | Merge pull request #1902 (diff) | |
download | monero-350e99ae57f07b5ff3dae99277e48821b109bc62.tar.xz |
wallet2: cache which pool txes were scanned already
This massively speeds up the wallet updating the pool on mainnet,
where the tx backlog is more than 500 txes.
Diffstat (limited to '')
-rw-r--r-- | src/wallet/wallet2.cpp | 21 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 7 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index e81b946cb..7a1f4863e 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1381,6 +1381,8 @@ void wallet2::pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_hei //---------------------------------------------------------------------------------------------------- void wallet2::update_pool_state() { + MDEBUG("update_pool_state start"); + // get the pool state cryptonote::COMMAND_RPC_GET_TRANSACTION_POOL::request req; cryptonote::COMMAND_RPC_GET_TRANSACTION_POOL::response res; @@ -1390,6 +1392,7 @@ void wallet2::update_pool_state() THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "get_transaction_pool"); THROW_WALLET_EXCEPTION_IF(res.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "get_transaction_pool"); THROW_WALLET_EXCEPTION_IF(res.status != CORE_RPC_STATUS_OK, error::get_tx_pool_error); + MDEBUG("update_pool_state got pool"); // remove any pending tx that's not in the pool std::unordered_map<crypto::hash, wallet2::unconfirmed_transfer_details>::iterator it = m_unconfirmed_txs.begin(); @@ -1444,6 +1447,7 @@ void wallet2::update_pool_state() } } } + MDEBUG("update_pool_state done first loop"); // remove pool txes to us that aren't in the pool anymore std::unordered_map<crypto::hash, wallet2::payment_details>::iterator uit = m_unconfirmed_payments.begin(); @@ -1465,6 +1469,7 @@ void wallet2::update_pool_state() m_unconfirmed_payments.erase(pit); } } + MDEBUG("update_pool_state done second loop"); // add new pool txes to us for (auto it: res.transactions) @@ -1473,6 +1478,11 @@ void wallet2::update_pool_state() if(epee::string_tools::parse_hexstr_to_binbuff(it.id_hash, txid_data) && txid_data.size() == sizeof(crypto::hash)) { const crypto::hash txid = *reinterpret_cast<const crypto::hash*>(txid_data.data()); + if (m_scanned_pool_txs[0].find(txid) != m_scanned_pool_txs[0].end() || m_scanned_pool_txs[1].find(txid) != m_scanned_pool_txs[1].end()) + { + LOG_PRINT_L2("Already seen " << txid << ", skipped"); + continue; + } if (m_unconfirmed_payments.find(txid) == m_unconfirmed_payments.end()) { LOG_PRINT_L1("Found new pool tx: " << txid); @@ -1491,9 +1501,11 @@ void wallet2::update_pool_state() cryptonote::COMMAND_RPC_GET_TRANSACTIONS::request req; cryptonote::COMMAND_RPC_GET_TRANSACTIONS::response res; req.txs_hashes.push_back(it.id_hash); + MDEBUG("asking for " << it.id_hash); req.decode_as_json = false; m_daemon_rpc_mutex.lock(); bool r = epee::net_utils::invoke_http_json("/gettransactions", req, res, m_http_client, rpc_timeout); + MDEBUG("asked for " << it.id_hash << ", got " << r << " and " << res.status); m_daemon_rpc_mutex.unlock(); if (r && res.status == CORE_RPC_STATUS_OK) { @@ -1512,6 +1524,12 @@ void wallet2::update_pool_state() if (tx_hash == txid) { process_new_transaction(txid, tx, std::vector<uint64_t>(), 0, time(NULL), false, true); + m_scanned_pool_txs[0].insert(txid); + if (m_scanned_pool_txs[0].size() > 5000) + { + std::swap(m_scanned_pool_txs[0], m_scanned_pool_txs[1]); + m_scanned_pool_txs[0].clear(); + } } else { @@ -1550,7 +1568,7 @@ void wallet2::update_pool_state() } else { - LOG_PRINT_L1("Already saw that one"); + LOG_PRINT_L1("Already saw that one, it's for us"); } } else @@ -1558,6 +1576,7 @@ void wallet2::update_pool_state() LOG_PRINT_L0("Failed to parse txid"); } } + MDEBUG("update_pool_state end"); } //---------------------------------------------------------------------------------------------------- void wallet2::fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history) diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 5c8d0ae86..9c2e6ddb1 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -485,6 +485,10 @@ namespace tools if(ver < 17) return; a & m_unconfirmed_payments; + if(ver < 18) + return; + a & m_scanned_pool_txs[0]; + a & m_scanned_pool_txs[1]; } /*! @@ -677,9 +681,10 @@ namespace tools bool m_confirm_missing_payment_id; bool m_ask_password; NodeRPCProxy m_node_rpc_proxy; + std::unordered_set<crypto::hash> m_scanned_pool_txs[2]; }; } -BOOST_CLASS_VERSION(tools::wallet2, 17) +BOOST_CLASS_VERSION(tools::wallet2, 18) BOOST_CLASS_VERSION(tools::wallet2::transfer_details, 7) BOOST_CLASS_VERSION(tools::wallet2::payment_details, 1) BOOST_CLASS_VERSION(tools::wallet2::unconfirmed_transfer_details, 6) |