fix mpsc DynamicBoundedQueue try_enqueue could fail even if the queue is empty #2368
+26
−0
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:
We used
folly::DMPSCQueue<> q(1024)
and encountered try_enqueue() return false frequently even if the queue is empty.Debug:
I logged the three atomic value
debit, credit, transfer
before and aftertry_enqueue()
operation, and saw the issue.We use version
v2018.08.20.00
the threshold_ is not rounded up, so the capacity is 1024+102 =1126.At this case, capacity=1126, debit=1126, credit=4, transfer=1122, so the queue is actually empty.
Now there is 2 concurrent producers both do
takeTransfer()
.Producer_1 succeeded take transfer value, but haven't
subDebit(w)
.producer_2 saw transfer value is 0, and return, and check debit + weight > capacity, then
try_enqueue()
failed.The unit_test in the pr can reproduce the case.
Fix:
Let prodcuer do
tryReduceDebit()
earlier, when debit reaches half capacity.