From 031b060af030c218098ea59f3e520197ff7a913c Mon Sep 17 00:00:00 2001 From: Jaquee Date: Mon, 30 Jan 2017 11:57:58 +0100 Subject: [PATCH 1/4] wallet2::init() - disconnect before init if connected Makes it possible for GUI to reinit with new daemon without closing and reopening wallet. --- src/wallet/wallet2.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 9bdfc7b04..c52281a2b 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -487,6 +487,8 @@ std::pair, password_container> wallet2::make_new(const //---------------------------------------------------------------------------------------------------- bool wallet2::init(std::string daemon_address, uint64_t upper_transaction_size_limit) { + if(m_http_client.is_connected()) + m_http_client.disconnect(); m_upper_transaction_size_limit = upper_transaction_size_limit; m_daemon_address = std::move(daemon_address); return m_http_client.set_server(get_daemon_address()); From 805625b5412e0c37bf7008e4f1a9b75b40a6fd06 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Mon, 30 Jan 2017 11:59:19 +0100 Subject: [PATCH 2/4] wallet api: Remove initAsync() and don't start refresh automatically on init --- src/wallet/api/wallet.cpp | 15 +-------------- src/wallet/api/wallet.h | 4 +--- src/wallet/wallet2_api.h | 18 ++++-------------- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 9e40d2e02..deab4fe1f 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -515,7 +515,6 @@ bool WalletImpl::recover(const std::string &path, const std::string &seed) try { m_wallet->set_seed_language(old_language); m_wallet->generate(path, "", recovery_key, true, false); - // TODO: wallet->init(daemon_address); } catch (const std::exception &e) { m_status = Status_Critical; @@ -646,19 +645,7 @@ string WalletImpl::keysFilename() const bool WalletImpl::init(const std::string &daemon_address, uint64_t upper_transaction_size_limit) { clearStatus(); - if (!doInit(daemon_address, upper_transaction_size_limit)) - return false; - bool result = this->refresh(); - // enabling background refresh thread - startRefresh(); - return result; -} - -void WalletImpl::initAsync(const string &daemon_address, uint64_t upper_transaction_size_limit) -{ - clearStatus(); - doInit(daemon_address, upper_transaction_size_limit); - startRefresh(); + return doInit(daemon_address, upper_transaction_size_limit); } void WalletImpl::setRefreshFromBlockHeight(uint64_t refresh_from_block_height) diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h index 7daf63e43..3994afaa3 100644 --- a/src/wallet/api/wallet.h +++ b/src/wallet/api/wallet.h @@ -78,8 +78,7 @@ public: bool store(const std::string &path); std::string filename() const; std::string keysFilename() const; - bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit); - void initAsync(const std::string &daemon_address, uint64_t upper_transaction_size_limit); + bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit = 0); bool connectToDaemon(); ConnectionStatus connected() const; void setTrustedDaemon(bool arg); @@ -135,7 +134,6 @@ private: bool isNewWallet() const; bool doInit(const std::string &daemon_address, uint64_t upper_transaction_size_limit); - private: friend class PendingTransactionImpl; friend class UnsignedTransactionImpl; diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h index 563f16eaa..883da7da2 100644 --- a/src/wallet/wallet2_api.h +++ b/src/wallet/wallet2_api.h @@ -332,26 +332,16 @@ struct Wallet */ virtual std::string keysFilename() const = 0; /*! - * \brief init - initializes wallet with daemon connection params. implicitly connects to the daemon - * and refreshes the wallet. "refreshed" callback will be invoked. if daemon_address is - * local address, "trusted daemon" will be set to true forcibly + * \brief init - initializes wallet with daemon connection params. + * if daemon_address is local address, "trusted daemon" will be set to true forcibly + * startRefresh() should be called when wallet is initialized. * * \param daemon_address - daemon address in "hostname:port" format * \param upper_transaction_size_limit - * \return - true if initialized and refreshed successfully + * \return - true on success */ virtual bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit) = 0; - /*! - * \brief init - initalizes wallet asynchronously. logic is the same as "init" but returns immediately. - * "refreshed" callback will be invoked. - * - * \param daemon_address - daemon address in "hostname:port" format - * \param upper_transaction_size_limit - * \return - true if initialized and refreshed successfully - */ - virtual void initAsync(const std::string &daemon_address, uint64_t upper_transaction_size_limit) = 0; - /*! * \brief createWatchOnly - Creates a watch only wallet * \param path - where to store the wallet From 0cc50bdd11a9d66f769a6e0d03d72fd4f6b33bff Mon Sep 17 00:00:00 2001 From: Jaquee Date: Mon, 30 Jan 2017 18:00:10 +0100 Subject: [PATCH 3/4] GUI: Improved refresh performance --- src/wallet/api/wallet.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index deab4fe1f..830f98909 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -85,11 +85,14 @@ struct Wallet2CallbackImpl : public tools::i_wallet2_callback virtual void on_new_block(uint64_t height, const cryptonote::block& block) { - //LOG_PRINT_L3(__FUNCTION__ << ": new block. height: " << height); - - if (m_listener) { - m_listener->newBlock(height); - // m_listener->updated(); + // Don't flood the GUI with signals. On fast refresh - send signal every 1000th block + // get_refresh_from_block_height() returns the blockheight from when the wallet was + // created or the restore height specified when wallet was recovered + if(height >= m_wallet->m_wallet->get_refresh_from_block_height() || height % 1000 == 0) { + // LOG_PRINT_L3(__FUNCTION__ << ": new block. height: " << height); + if (m_listener) { + m_listener->newBlock(height); + } } } @@ -534,7 +537,7 @@ bool WalletImpl::close() if (status() != Status_Critical) m_wallet->store(); else - LOG_PRINT_L3("Status_Critical - not storing wallet"); + LOG_ERROR("Status_Critical - not storing wallet"); LOG_PRINT_L1("wallet::store done"); LOG_PRINT_L1("Calling wallet::stop..."); m_wallet->stop(); @@ -1310,8 +1313,8 @@ void WalletImpl::doRefresh() void WalletImpl::startRefresh() { - LOG_PRINT_L2(__FUNCTION__ << ": refresh started/resumed..."); if (!m_refreshEnabled) { + LOG_PRINT_L2(__FUNCTION__ << ": refresh started/resumed..."); m_refreshEnabled = true; m_refreshCV.notify_one(); } From b14d109bae52749142a6f503f7cc5751100288c2 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Mon, 30 Jan 2017 20:31:19 +0100 Subject: [PATCH 4/4] update wallet api tests --- tests/libwallet_api_tests/main.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/libwallet_api_tests/main.cpp b/tests/libwallet_api_tests/main.cpp index 6f33684cd..cb1169df3 100644 --- a/tests/libwallet_api_tests/main.cpp +++ b/tests/libwallet_api_tests/main.cpp @@ -897,7 +897,8 @@ TEST_F(WalletTest2, WalletCallBackRefreshedAsync) std::chrono::seconds wait_for = std::chrono::seconds(20); std::unique_lock lock (wallet_src_listener->mutex); - wallet_src->initAsync(TESTNET_DAEMON_ADDRESS, 0); + wallet_src->init(MAINNET_DAEMON_ADDRESS, 0); + wallet_src->startRefresh(); std::cerr << "TEST: waiting on refresh lock...\n"; wallet_src_listener->cv_refresh.wait_for(lock, wait_for); std::cerr << "TEST: refresh lock acquired...\n"; @@ -1050,8 +1051,8 @@ TEST_F(WalletManagerMainnetTest, CreateAndRefreshWalletMainNetAsync) std::chrono::seconds wait_for = std::chrono::seconds(SECONDS_TO_REFRESH); std::unique_lock lock (wallet_listener->mutex); - wallet->initAsync(MAINNET_DAEMON_ADDRESS, 0); - // wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->startRefresh(); std::cerr << "TEST: waiting on refresh lock...\n"; wallet_listener->cv_refresh.wait_for(lock, wait_for); std::cerr << "TEST: refresh lock acquired...\n"; @@ -1076,8 +1077,8 @@ TEST_F(WalletManagerMainnetTest, OpenAndRefreshWalletMainNetAsync) std::chrono::seconds wait_for = std::chrono::seconds(SECONDS_TO_REFRESH); std::unique_lock lock (wallet_listener->mutex); - wallet->initAsync(MAINNET_DAEMON_ADDRESS, 0); - // wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->startRefresh(); std::cerr << "TEST: waiting on refresh lock...\n"; wallet_listener->cv_refresh.wait_for(lock, wait_for); std::cerr << "TEST: refresh lock acquired...\n"; @@ -1110,8 +1111,8 @@ TEST_F(WalletManagerMainnetTest, RecoverAndRefreshWalletMainNetAsync) std::unique_ptr wallet_listener (new MyWalletListener(wallet)); std::chrono::seconds wait_for = std::chrono::seconds(SECONDS_TO_REFRESH); std::unique_lock lock (wallet_listener->mutex); - wallet->initAsync(MAINNET_DAEMON_ADDRESS, 0); - // wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->init(MAINNET_DAEMON_ADDRESS, 0); + wallet->startRefresh(); std::cerr << "TEST: waiting on refresh lock...\n"; // here we wait for 120 seconds and test if wallet doesn't syncrnonize blockchain completely,