@ -1612,7 +1612,7 @@ void CWalletTx::GetAmounts(std::list<COutputEntry>& listReceived,
@@ -1612,7 +1612,7 @@ void CWalletTx::GetAmounts(std::list<COutputEntry>& listReceived,
* @ return Earliest timestamp that could be successfully scanned from . Timestamp
* returned will be higher than startTime if relevant blocks could not be read .
*/
int64_t CWallet : : RescanFromTime ( int64_t startTime , bool update )
int64_t CWallet : : RescanFromTime ( int64_t startTime , const WalletRescanReserver & reserver , bool update )
{
// Find starting block. May be null if nCreateTime is greater than the
// highest blockchain timestamp, in which case there is nothing that needs
@ -1625,7 +1625,7 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update)
@@ -1625,7 +1625,7 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update)
}
if ( startBlock ) {
const CBlockIndex * const failedBlock = ScanForWalletTransactions ( startBlock , nullptr , update ) ;
const CBlockIndex * const failedBlock = ScanForWalletTransactions ( startBlock , nullptr , reserver , update ) ;
if ( failedBlock ) {
return failedBlock - > GetBlockTimeMax ( ) + TIMESTAMP_WINDOW + 1 ;
}
@ -1649,11 +1649,12 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update)
@@ -1649,11 +1649,12 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update)
* the main chain after to the addition of any new keys you want to detect
* transactions for .
*/
CBlockIndex * CWallet : : ScanForWalletTransactions ( CBlockIndex * pindexStart , CBlockIndex * pindexStop , bool fUpdate )
CBlockIndex * CWallet : : ScanForWalletTransactions ( CBlockIndex * pindexStart , CBlockIndex * pindexStop , const WalletRescanReserver & reserver , bool fUpdate )
{
int64_t nNow = GetTime ( ) ;
const CChainParams & chainParams = Params ( ) ;
assert ( reserver . isReserved ( ) ) ;
if ( pindexStop ) {
assert ( pindexStop - > nHeight > = pindexStart - > nHeight ) ;
}
@ -1662,8 +1663,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
@@ -1662,8 +1663,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
CBlockIndex * ret = nullptr ;
{
fAbortRescan = false ;
fScanningWallet = true ;
ShowProgress ( _ ( " Rescanning... " ) , 0 ) ; // show rescan progress in GUI as dialog or on splashscreen, if -rescan on startup
CBlockIndex * tip = nullptr ;
double dProgressStart ;
@ -1727,8 +1726,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
@@ -1727,8 +1726,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
LogPrintf ( " Rescan aborted at block %d. Progress=%f \n " , pindex - > nHeight , GuessVerificationProgress ( chainParams . TxData ( ) , pindex ) ) ;
}
ShowProgress ( _ ( " Rescanning... " ) , 100 ) ; // hide progress dialog in GUI
fScanningWallet = false ;
}
return ret ;
}
@ -4039,7 +4036,14 @@ CWallet* CWallet::CreateWalletFromFile(const std::string walletFile)
@@ -4039,7 +4036,14 @@ CWallet* CWallet::CreateWalletFromFile(const std::string walletFile)
}
nStart = GetTimeMillis ( ) ;
walletInstance - > ScanForWalletTransactions ( pindexRescan , nullptr , true ) ;
{
WalletRescanReserver reserver ( walletInstance ) ;
if ( ! reserver . reserve ( ) ) {
InitError ( _ ( " Failed to rescan the wallet during initialization " ) ) ;
return nullptr ;
}
walletInstance - > ScanForWalletTransactions ( pindexRescan , nullptr , reserver , true ) ;
}
LogPrintf ( " rescan %15dms \n " , GetTimeMillis ( ) - nStart ) ;
walletInstance - > SetBestChain ( chainActive . GetLocator ( ) ) ;
walletInstance - > dbw - > IncrementUpdateCounter ( ) ;