wallet: Refactor WalletRescanReserver to use wallet reference

This commit is contained in:
João Barbosa 2020-04-12 00:42:15 +01:00
parent b470c75847
commit fc289b7898
6 changed files with 23 additions and 23 deletions

View File

@ -152,7 +152,7 @@ void TestGUI(interfaces::Node& node)
wallet->SetLastBlockProcessed(105, ::ChainActive().Tip()->GetBlockHash()); wallet->SetLastBlockProcessed(105, ::ChainActive().Tip()->GetBlockHash());
} }
{ {
WalletRescanReserver reserver(wallet.get()); WalletRescanReserver reserver(*wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet->ScanForWalletTransactions(Params().GetConsensus().hashGenesisBlock, 0 /* block height */, {} /* max height */, reserver, true /* fUpdate */); CWallet::ScanResult result = wallet->ScanForWalletTransactions(Params().GetConsensus().hashGenesisBlock, 0 /* block height */, {} /* max height */, reserver, true /* fUpdate */);
QCOMPARE(result.status, CWallet::ScanResult::SUCCESS); QCOMPARE(result.status, CWallet::ScanResult::SUCCESS);

View File

@ -130,7 +130,7 @@ UniValue importprivkey(const JSONRPCRequest& request)
EnsureLegacyScriptPubKeyMan(*wallet, true); EnsureLegacyScriptPubKeyMan(*wallet, true);
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
bool fRescan = true; bool fRescan = true;
{ {
auto locked_chain = pwallet->chain().lock(); auto locked_chain = pwallet->chain().lock();
@ -274,7 +274,7 @@ UniValue importaddress(const JSONRPCRequest& request)
throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled when blocks are pruned"); throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled when blocks are pruned");
} }
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
if (fRescan && !reserver.reserve()) { if (fRescan && !reserver.reserve()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait."); throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait.");
} }
@ -474,7 +474,7 @@ UniValue importpubkey(const JSONRPCRequest& request)
throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled when blocks are pruned"); throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled when blocks are pruned");
} }
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
if (fRescan && !reserver.reserve()) { if (fRescan && !reserver.reserve()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait."); throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait.");
} }
@ -549,7 +549,7 @@ UniValue importwallet(const JSONRPCRequest& request)
throw JSONRPCError(RPC_WALLET_ERROR, "Importing wallets is disabled when blocks are pruned"); throw JSONRPCError(RPC_WALLET_ERROR, "Importing wallets is disabled when blocks are pruned");
} }
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
if (!reserver.reserve()) { if (!reserver.reserve()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait."); throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait.");
} }
@ -1365,7 +1365,7 @@ UniValue importmulti(const JSONRPCRequest& mainRequest)
} }
} }
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
if (fRescan && !reserver.reserve()) { if (fRescan && !reserver.reserve()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait."); throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait.");
} }

View File

@ -3540,7 +3540,7 @@ UniValue rescanblockchain(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(*pwallet);
if (!reserver.reserve()) { if (!reserver.reserve()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait."); throw JSONRPCError(RPC_WALLET_ERROR, "Wallet is currently rescanning. Abort existing rescan or wait.");
} }

View File

@ -54,7 +54,7 @@ BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash()); wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
} }
AddKey(wallet, coinbaseKey); AddKey(wallet, coinbaseKey);
WalletRescanReserver reserver(&wallet); WalletRescanReserver reserver(wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet.ScanForWalletTransactions({} /* start_block */, 0 /* start_height */, {} /* max_height */, reserver, false /* update */); CWallet::ScanResult result = wallet.ScanForWalletTransactions({} /* start_block */, 0 /* start_height */, {} /* max_height */, reserver, false /* update */);
BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE); BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE);
@ -73,7 +73,7 @@ BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash()); wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
} }
AddKey(wallet, coinbaseKey); AddKey(wallet, coinbaseKey);
WalletRescanReserver reserver(&wallet); WalletRescanReserver reserver(wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */); CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */);
BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::SUCCESS); BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::SUCCESS);
@ -96,7 +96,7 @@ BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash()); wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
} }
AddKey(wallet, coinbaseKey); AddKey(wallet, coinbaseKey);
WalletRescanReserver reserver(&wallet); WalletRescanReserver reserver(wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */); CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */);
BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE); BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE);
@ -118,7 +118,7 @@ BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash()); wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
} }
AddKey(wallet, coinbaseKey); AddKey(wallet, coinbaseKey);
WalletRescanReserver reserver(&wallet); WalletRescanReserver reserver(wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */); CWallet::ScanResult result = wallet.ScanForWalletTransactions(oldTip->GetBlockHash(), oldTip->nHeight, {} /* max_height */, reserver, false /* update */);
BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE); BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::FAILURE);
@ -463,7 +463,7 @@ public:
bool firstRun; bool firstRun;
wallet->LoadWallet(firstRun); wallet->LoadWallet(firstRun);
AddKey(*wallet, coinbaseKey); AddKey(*wallet, coinbaseKey);
WalletRescanReserver reserver(wallet.get()); WalletRescanReserver reserver(*wallet);
reserver.reserve(); reserver.reserve();
CWallet::ScanResult result = wallet->ScanForWalletTransactions(::ChainActive().Genesis()->GetBlockHash(), 0 /* start_height */, {} /* max_height */, reserver, false /* update */); CWallet::ScanResult result = wallet->ScanForWalletTransactions(::ChainActive().Genesis()->GetBlockHash(), 0 /* start_height */, {} /* max_height */, reserver, false /* update */);
BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::SUCCESS); BOOST_CHECK_EQUAL(result.status, CWallet::ScanResult::SUCCESS);

View File

@ -4023,7 +4023,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
} }
{ {
WalletRescanReserver reserver(walletInstance.get()); WalletRescanReserver reserver(*walletInstance);
if (!reserver.reserve() || (ScanResult::SUCCESS != walletInstance->ScanForWalletTransactions(locked_chain->getBlockHash(rescan_height), rescan_height, {} /* max height */, reserver, true /* update */).status)) { if (!reserver.reserve() || (ScanResult::SUCCESS != walletInstance->ScanForWalletTransactions(locked_chain->getBlockHash(rescan_height), rescan_height, {} /* max height */, reserver, true /* update */).status)) {
error = _("Failed to rescan the wallet during initialization").translated; error = _("Failed to rescan the wallet during initialization").translated;
return nullptr; return nullptr;

View File

@ -1244,35 +1244,35 @@ void MaybeResendWalletTxs();
class WalletRescanReserver class WalletRescanReserver
{ {
private: private:
CWallet* m_wallet; CWallet& m_wallet;
bool m_could_reserve; bool m_could_reserve;
public: public:
explicit WalletRescanReserver(CWallet* w) : m_wallet(w), m_could_reserve(false) {} explicit WalletRescanReserver(CWallet& w) : m_wallet(w), m_could_reserve(false) {}
bool reserve() bool reserve()
{ {
assert(!m_could_reserve); assert(!m_could_reserve);
std::lock_guard<std::mutex> lock(m_wallet->mutexScanning); std::lock_guard<std::mutex> lock(m_wallet.mutexScanning);
if (m_wallet->fScanningWallet) { if (m_wallet.fScanningWallet) {
return false; return false;
} }
m_wallet->m_scanning_start = GetTimeMillis(); m_wallet.m_scanning_start = GetTimeMillis();
m_wallet->m_scanning_progress = 0; m_wallet.m_scanning_progress = 0;
m_wallet->fScanningWallet = true; m_wallet.fScanningWallet = true;
m_could_reserve = true; m_could_reserve = true;
return true; return true;
} }
bool isReserved() const bool isReserved() const
{ {
return (m_could_reserve && m_wallet->fScanningWallet); return (m_could_reserve && m_wallet.fScanningWallet);
} }
~WalletRescanReserver() ~WalletRescanReserver()
{ {
std::lock_guard<std::mutex> lock(m_wallet->mutexScanning); std::lock_guard<std::mutex> lock(m_wallet.mutexScanning);
if (m_could_reserve) { if (m_could_reserve) {
m_wallet->fScanningWallet = false; m_wallet.fScanningWallet = false;
} }
} }
}; };