From bc96a9bfc61afdb696fb92cb644ed5fc3d1793f1 Mon Sep 17 00:00:00 2001 From: Russell Yanofsky Date: Thu, 16 Jan 2020 16:47:00 -0500 Subject: [PATCH] wallet: Avoid use of Chain::Lock in importmulti This is a step toward removing the Chain::Lock class and reducing cs_main locking. This change only affects behavior in the case where wallet last block processed falls behind the chain tip, in which case it may use a more accurate rescan time. --- src/interfaces/chain.cpp | 7 ------- src/interfaces/chain.h | 4 ---- src/wallet/rpcdump.cpp | 9 +-------- src/wallet/test/wallet_tests.cpp | 1 + 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index 1c1fbe7387d..dbc49eca1b8 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -87,13 +87,6 @@ class LockImpl : public Chain::Lock, public UniqueLock assert(block != nullptr); return block->GetBlockTime(); } - int64_t getBlockMedianTimePast(int height) override - { - LockAssertion lock(::cs_main); - CBlockIndex* block = ::ChainActive()[height]; - assert(block != nullptr); - return block->GetMedianTimePast(); - } bool haveBlockOnDisk(int height) override { LockAssertion lock(::cs_main); diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h index 7504f4cfb60..4c711a618dd 100644 --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -103,10 +103,6 @@ public: //! Get block time. Height must be valid or this function will abort. virtual int64_t getBlockTime(int height) = 0; - //! Get block median time past. Height must be valid or this function - //! will abort. - virtual int64_t getBlockMedianTimePast(int height) = 0; - //! Check that the block is available on disk (i.e. has not been //! pruned), and contains transactions. virtual bool haveBlockOnDisk(int height) = 0; diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 255255c3f94..c77559c63d0 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -1379,20 +1379,13 @@ UniValue importmulti(const JSONRPCRequest& mainRequest) EnsureWalletIsUnlocked(pwallet); // Verify all timestamps are present before importing any keys. - const Optional tip_height = locked_chain->getHeight(); - now = tip_height ? locked_chain->getBlockMedianTimePast(*tip_height) : 0; + CHECK_NONFATAL(pwallet->chain().findBlock(pwallet->GetLastBlockHash(), FoundBlock().time(nLowestTimestamp).mtpTime(now))); for (const UniValue& data : requests.getValues()) { GetImportTimestamp(data, now); } const int64_t minimumTimestamp = 1; - if (fRescan && tip_height) { - nLowestTimestamp = locked_chain->getBlockTime(*tip_height); - } else { - fRescan = false; - } - for (const UniValue& data : requests.getValues()) { const int64_t timestamp = std::max(GetImportTimestamp(data, now), minimumTimestamp); const UniValue result = ProcessImport(pwallet, data, timestamp); diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp index f333b09ad98..fb5b0587de7 100644 --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -152,6 +152,7 @@ BOOST_FIXTURE_TEST_CASE(importmulti_rescan, TestChain100Setup) { std::shared_ptr wallet = std::make_shared(chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); wallet->SetupLegacyScriptPubKeyMan(); + WITH_LOCK(wallet->cs_wallet, wallet->SetLastBlockProcessed(newTip->nHeight, newTip->GetBlockHash())); AddWallet(wallet); UniValue keys; keys.setArray();