mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-04 08:22:36 +02:00
wallet: Refactor WalletRescanReserver to use wallet reference
This commit is contained in:
parent
b470c75847
commit
fc289b7898
@ -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);
|
||||||
|
@ -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.");
|
||||||
}
|
}
|
||||||
|
@ -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.");
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user