iron-fish / ironfish

A novel cryptocurrency focused on privacy and accessibility.
https://ironfish.network
Mozilla Public License 2.0
964 stars 579 forks source link

Prevent race conditions when getting list of accounts during scanning #5094

Closed andiflabs closed 3 days ago

andiflabs commented 1 week ago

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) 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.

Testing Plan

Documentation

N/A

Breaking Change

N/A

NullSoldier commented 4 days ago

one day we'll remove the need for this TX and just use a lock that you can take when you are modifying or using accounts.