From 25e497db3f05b9d148c47698a70a5bd5419f50a5 Mon Sep 17 00:00:00 2001 From: thotbot Date: Sat, 3 Jul 2021 23:16:06 +0200 Subject: [PATCH] Misc. network related - Add interface for bytes sent/received - Allow wallet refresh while daemon is not synchronized - emit success boolean for refreshed() - don't call refreshThreadFunc (we don't need it) - lower rpc timeout from 3m30s (?!) to 10 seconds --- src/wallet/api/transaction_history.cpp | 3 +- src/wallet/api/wallet.cpp | 57 +++++++++++++------------- src/wallet/api/wallet2_api.h | 2 +- src/wallet/node_rpc_proxy.cpp | 2 +- src/wallet/wallet2.h | 2 +- 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/wallet/api/transaction_history.cpp b/src/wallet/api/transaction_history.cpp index b362223f9..7a9e116b5 100644 --- a/src/wallet/api/transaction_history.cpp +++ b/src/wallet/api/transaction_history.cpp @@ -274,5 +274,4 @@ void TransactionHistoryImpl::refresh() } } // namespace - -namespace Bitmonero = Monero; +} diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index ec0459c96..91e93fb7a 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -68,8 +68,8 @@ namespace { static const int MAX_REFRESH_INTERVAL_MILLIS = 1000 * 60 * 1; // Default refresh interval when connected to remote node static const int DEFAULT_REMOTE_NODE_REFRESH_INTERVAL_MILLIS = 1000 * 10; - // Connection timeout 30 sec - static const int DEFAULT_CONNECTION_TIMEOUT_MILLIS = 1000 * 30; + // Connection timeout 10 sec + static const int DEFAULT_CONNECTION_TIMEOUT_MILLIS = 1000 * 10; std::string get_default_ringdb_path(cryptonote::network_type nettype) { @@ -435,10 +435,6 @@ WalletImpl::WalletImpl(NetworkType nettype, uint64_t kdf_rounds) m_refreshIntervalMillis = DEFAULT_REFRESH_INTERVAL_MILLIS; - m_refreshThread = boost::thread([this] () { - this->refreshThreadFunc(); - }); - } WalletImpl::~WalletImpl() @@ -1062,7 +1058,7 @@ uint64_t WalletImpl::daemonBlockChainHeight() const if(m_wallet->light_wallet()) { return m_wallet->get_light_wallet_scanned_block_height(); } - if (!m_is_connected) + if (!m_is_connected && m_synchronized) return 0; std::string err; uint64_t result = m_wallet->get_daemon_blockchain_height(err); @@ -1081,7 +1077,7 @@ uint64_t WalletImpl::daemonBlockChainTargetHeight() const if(m_wallet->light_wallet()) { return m_wallet->get_light_wallet_blockchain_height(); } - if (!m_is_connected) + if (!m_is_connected && m_synchronized) return 0; std::string err; uint64_t result = m_wallet->get_daemon_blockchain_target_height(err); @@ -2451,37 +2447,34 @@ void WalletImpl::refreshThreadFunc() void WalletImpl::doRefresh() { + bool success = true; bool rescan = m_refreshShouldRescan.exchange(false); // synchronizing async and sync refresh calls boost::lock_guard guarg(m_refreshMutex2); do try { LOG_PRINT_L3(__FUNCTION__ << ": doRefresh, rescan = "<light_wallet() || daemonSynced()) { - if(rescan) - m_wallet->rescan_blockchain(false); - m_wallet->refresh(trustedDaemon()); - if (!m_synchronized) { - m_synchronized = true; - } - // assuming if we have empty history, it wasn't initialized yet - // for further history changes client need to update history in - // "on_money_received" and "on_money_sent" callbacks - if (m_history->count() == 0) { - m_history->refresh(); - } - m_wallet->find_and_save_rings(false); - } else { - LOG_PRINT_L3(__FUNCTION__ << ": skipping refresh - daemon is not synced"); + if(rescan) + m_wallet->rescan_blockchain(false); + m_wallet->refresh(trustedDaemon()); + if (!m_synchronized) { + m_synchronized = true; } + // assuming if we have empty history, it wasn't initialized yet + // for further history changes client need to update history in + // "on_money_received" and "on_money_sent" callbacks + if (m_history->count() == 0) { + m_history->refresh(); + } + m_wallet->find_and_save_rings(false); } catch (const std::exception &e) { + success = false; setStatusError(e.what()); break; }while(!rescan && (rescan=m_refreshShouldRescan.exchange(false))); // repeat if not rescanned and rescan was requested + m_is_connected = success; if (m_wallet2Callback->getListener()) { - m_wallet2Callback->getListener()->refreshed(); + m_wallet2Callback->getListener()->refreshed(success); } } @@ -2544,8 +2537,14 @@ void WalletImpl::pendingTxPostProcess(PendingTransactionImpl * pending) bool WalletImpl::doInit(const string &daemon_address, const std::string &proxy_address, uint64_t upper_transaction_size_limit, bool ssl) { - if (!m_wallet->init(daemon_address, m_daemon_login, proxy_address, upper_transaction_size_limit)) - return false; + if (!m_wallet->init(daemon_address, + m_daemon_login, + proxy_address, + upper_transaction_size_limit, + trustedDaemon(), + ssl ? epee::net_utils::ssl_support_t::e_ssl_support_autodetect : epee::net_utils::ssl_support_t::e_ssl_support_disabled)) { + return false; + } // in case new wallet, this will force fast-refresh (pulling hashes instead of blocks) // If daemon isn't synced a calculated block height will be used instead diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index 0ce7f90b8..5731264db 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -478,7 +478,7 @@ struct WalletListener /** * @brief refreshed - called when wallet refreshed by background thread or explicitly refreshed by calling "refresh" synchronously */ - virtual void refreshed() = 0; + virtual void refreshed(bool success) = 0; /** * @brief called by device if the action is required diff --git a/src/wallet/node_rpc_proxy.cpp b/src/wallet/node_rpc_proxy.cpp index e4db442cb..691421282 100644 --- a/src/wallet/node_rpc_proxy.cpp +++ b/src/wallet/node_rpc_proxy.cpp @@ -49,7 +49,7 @@ using namespace epee; namespace tools { -static const std::chrono::seconds rpc_timeout = std::chrono::minutes(3) + std::chrono::seconds(30); +static const std::chrono::seconds rpc_timeout = std::chrono::seconds(10); NodeRPCProxy::NodeRPCProxy(epee::net_utils::http::abstract_http_client &http_client, rpc_payment_state_t &rpc_payment_state, boost::recursive_mutex &mutex) : m_http_client(http_client) diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 879cc93d7..6bb61c58c 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -232,7 +232,7 @@ private: friend class wallet_keys_unlocker; friend class wallet_device_callback; public: - static constexpr const std::chrono::seconds rpc_timeout = std::chrono::minutes(3) + std::chrono::seconds(30); + static constexpr const std::chrono::seconds rpc_timeout = std::chrono::seconds(10); enum RefreshType { RefreshFull,