[Consensus] Add locking on the chain index vector.#950
Merged
codeofalltrades merged 1 commit intoVeil-Project:masterfrom May 26, 2021
Merged
[Consensus] Add locking on the chain index vector.#950codeofalltrades merged 1 commit intoVeil-Project:masterfrom
codeofalltrades merged 1 commit intoVeil-Project:masterfrom
Conversation
This alleviates a data race reported by tsan (concurrent access to size(), operator[], and resize()).
Collaborator
|
When does cs_vchain get unlocked? |
Collaborator
Author
|
When the lock object is destroyed, when it goes out of scope. |
WetOne
approved these changes
May 24, 2021
Collaborator
|
utACK 3cf8acf |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Problem
tsan identified a data race on CChain, particularly concurrent access to the underlying vector's
operator[],size, andresizemember functions.Solution
Create a new lock
cs_vchainand markvchainas guarded by it, and ensure that the lock is taken prior to any use.For the
operator==member function, grab both the locks in a prescribed order to avoid a deadlock.Tested
Configured with --with-sanitizers=tsan, built with clang, run on regtest with 2 SHA mining threads enabled.