Otherwise, we risk spinning on wait_for() with a small
delay.
Fixes: http://tracker.ceph.com/issues/15953
Signed-off-by: Samuel Just <sjust@redhat.com>
(cherry picked from commit
6f835726a7df5b29a96849fc1362186fd2116d9b)
auto start = std::chrono::system_clock::now();
delay = _get_delay(c);
- while ((delay > std::chrono::duration<double>(0)) ||
- !((max == 0) || (current == 0) || ((current + c) <= max))) {
+ while (true) {
+ if (!((max == 0) || (current == 0) || (current + c) <= max)) {
+ (*ticket)->wait(l);
+ } else if (delay > std::chrono::duration<double>(0)) {
+ (*ticket)->wait_for(l, delay);
+ } else {
+ break;
+ }
assert(ticket == waiters.begin());
- (*ticket)->wait_for(l, delay);
delay = _get_delay(c) - (std::chrono::system_clock::now() - start);
}
waiters.pop_front();