[C++] Fixed race condition in MemoryLimitController #10142
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.
Motivation
There is a race condition between the
reserveMemory()
and the mutex condition notification done when the other thread releases the memory.The problem is that we're doing
tryReserveMemory()
in a loop but without holding the mutex. It can happen that wetryReserveMemory()
return false (memory is full) and before we acquire the mutex and start waiting on the condition, the other thread had already released the memory and tried to notify.Modification
We need to do the
tryReserveMemory()
while holding the mutex, so that we don't have this condition. It is fine to do it without mutex the first time, so that we can avoid the mutex contention in the normal case, as long as we fall back to the mutex and check again.