output: Prevent flushing threads from consuming too much CPU. #1901
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.
I believe this patch fixes the CPU spikes issue reported by #1636 and #1889
(possibly also #1665).
Problem
If one flush thread sets the retry state, this makes other threads
wait until the next retry time. This behaviour itself is fine and ok.
However, in this case the
interval
variable has a meaningless valuebecause
state.next_clock
is behind the system time. And since thesleep call gets skipped in such a case:
it effectively make the waiting threads to consume the resource
aggressively with busy loops.
Solution
This patch makes a flush thread to wait in a sleep state until the
next retry time, insteads of busy looping
Note
This bug seems to exist from v0.14 since this commit 6c5ba1a.