add required locking (mutex) to GetMempoolTx #403
Merged
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.
Closes #402
To reproduce the problem, call the
GetMempoolTx
gRPC concurrently. For example, run the following in two shell windows simultaneously:The
lightwalletd
instance should panic within several seconds.The problem is that
mempoolMap
may have been changed (by another thread) during the current thread's single execution of this function, so that when it's indexed bytxid
at line service.go:479, that key may not exist.I looked for other (unreported) instances of this problem and didn't find any, although did find that
GetLatestBlock()
has a "logical" race condition; it may return a height and hash that don't correspond to each other since they're fetched separately without locking. So this PR also fixes this problem.