fix(transaction): prevent concurrent map access in monitor #5309
+24
−18
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Checklist
Description
Fixes a race condition in
pkg/transaction/monitor.gothat causesfatal error: concurrent map iteration and map writepanics.The
checkPending()function was iterating overwatchesByNoncewithout holding the lock, whileWatchTransaction()could concurrently modify the map. Classic Go map concurrency footgun. 🔫Solution: Snapshot-based approach that minimizes lock contention:
TransactionReceipt,NonceAt)This avoids blocking
WatchTransaction()callers during potentially slow (100-500ms) RPC operations.Open API Spec Version Changes (if applicable)
N/A
Motivation and Context
Discovered while running Bee nodes in a Kurtosis test environment. The panic occurred during chequebook deployment when transaction monitoring was active.
Related Issue (Optional)
N/A
Screenshots (if appropriate):
N/A