Use a lockfree data structure to store page states #3425
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.
Note that this only supports safe reads without locks, adding new page states still needs locking, but it would be possible to support updates using atomics.
The ConcurrentVector is optimized in two ways:
I currently have the sizes set up so that the access cost of the pageStates structure only increases with every 128GB of new file data. I also played around with increasing the page group size, but settled with using a large index size (256KB) instead as I wasn't sure about the possible side-effects of increasing the page group size.
The ConcurrentVector is also used for the frame group indices stored in the BMFileHandle as I noticed that there could be a data race in
getFrameIdx
if a new page group is added in another thread (very unlikely, as the frame group index vector is only appended to and not otherwise modified, as other threads would need to resize the vector, claim and then write to the freed memory between when a thread reads the frame group index vector's data pointer and accesses the data).