diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 6ba77f862..f25a7edd1 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -144,6 +144,36 @@ UniValue convertpassphrase(const UniValue& params, bool fHelp, const CPubKey& my return ret; } +UniValue abortrescan(const UniValue& params, bool fHelp, const CPubKey& mypk) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() > 0) + throw runtime_error( + "abortrescan\n" + "\nAbort a currently running rescan.\n" + "\nUse 'getrescaninfo' to get rescan progress details.\n" + "\nReturns true if aborting rescan, false otherwise.\n" + "\nArguments: none\n" + "\nExamples:\n" + "\nAbort rescan :\n" + + HelpExampleCli("abortrescan","") + + "\nAs a JSON-RPC call\n" + + HelpExampleRpc("abortrescan","") + ); + if(!pwalletMain->fRescanning) { + LogPrintf("%s: no rescan running\n",__func__); + return false; + } + if(pwalletMain->IsAbortingRescan()) { + LogPrintf("%s: already aborting current rescan\n",__func__); + return false; + } + pwalletMain->AbortRescan(); + return true; +} + UniValue getrescaninfo(const UniValue& params, bool fHelp, const CPubKey& mypk) { if (!EnsureWalletIsAvailable(fHelp)) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 9e8cd1aa4..1d32f8dd5 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2778,6 +2778,19 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) while (pindex) { pwalletMain->rescanHeight = pindex->GetHeight(); + if(pwalletMain->fAbortRescan) { + //TODO: should we update witness caches? + LogPrintf("%s: Rescan aborted at block %d\n", pwalletMain->rescanHeight); + pwalletMain->fRescanning = false; + return ret; + } + if (ShutdownRequested()) { + //TODO: should we update witness caches? + LogPrintf("%s: Rescan interrupted by shutdown request at block %d\n", pwalletMain->rescanHeight); + pwalletMain->fRescanning = false; + return ret; + } + if (pindex->GetHeight() % 100 == 0 && dProgressTip - dProgressStart > 0.0) ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), pindex, false) - dProgressStart) / (dProgressTip - dProgressStart) * 100)))); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 56bd327c8..0f8b2283c 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -807,6 +807,13 @@ public: bool fSweepEnabled = false; bool fSweepExternalEnabled = false; bool fSweepRunning = false; + + std::atomic fAbortRescan{false}; + // abort current rescan + void AbortRescan() { fAbortRescan = true; } + // Are we currently aborting a rescan? + bool IsAbortingRescan() const { return fAbortRescan; } + // Are we currently rescanning? bool fRescanning = false; // Current height of our rescan