Calling Wallet.reset() while a scanning is running can sometimes result in race conditions. In particular, WalletScanner may attempt to query account heads at the same time while accounts are being reset, resulting in errors.
This commit fixes the problem by using database transactions (1) while WalletScanner read accounts and (2) while Wallet.reset() updates accounts.
This commit also adds transactions in Wallet.getEarliestHead() and Wallet.getLatestHead(). These methods are not used during scanning, but they suffer from the same kind of problem.
Note that this commit fixes specific race conditions related to getting the list of accounts to scan, but other race conditions that affect scanning may still exist.
Summary
Calling
Wallet.reset()
while a scanning is running can sometimes result in race conditions. In particular,WalletScanner
may attempt to query account heads at the same time while accounts are being reset, resulting in errors.This commit fixes the problem by using database transactions (1) while
WalletScanner
read accounts and (2) whileWallet.reset()
updates accounts.This commit also adds transactions in
Wallet.getEarliestHead()
andWallet.getLatestHead()
. These methods are not used during scanning, but they suffer from the same kind of problem.Note that this commit fixes specific race conditions related to getting the list of accounts to scan, but other race conditions that affect scanning may still exist.
Testing Plan
Documentation
N/A
Breaking Change
N/A