From 4ada1cbaaf6df3d54ebded392df93d26c00c8c7a Mon Sep 17 00:00:00 2001 From: Dongsheng Yang Date: Mon, 11 Jun 2018 22:21:06 -0400 Subject: [PATCH] TokenBucketThrottle: keep the order of request we want to throttle Signed-off-by: Dongsheng Yang --- src/common/Throttle.h | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/common/Throttle.h b/src/common/Throttle.h index a9715f4c9b167..0572252973008 100644 --- a/src/common/Throttle.h +++ b/src/common/Throttle.h @@ -372,28 +372,40 @@ public: SafeTimer *timer, Mutex *timer_lock); ~TokenBucketThrottle(); + + template + void add_blocker(uint64_t c, T *handler, I *item, uint64_t flag) { + Context *ctx = new FunctionContext([handler, item, flag](int r) { + (handler->*MF)(r, item, flag); + }); + m_blockers.emplace_back(c, ctx); + } template bool get(uint64_t c, T *handler, I *item, uint64_t flag) { if (0 == m_throttle.max) return false; - bool waited = false; - + bool wait = false; + uint64_t got = 0; Mutex::Locker lock(m_lock); - uint64_t got = m_throttle.get(c); - if (got < c) { - // Not enough tokens, add a blocker for it. - Context *ctx = new FunctionContext([handler, item, flag](int r) { - (handler->*MF)(r, item, flag); - }); - m_blockers.emplace_back(c - got, ctx); - waited = true; + if (!m_blockers.empty()) { + // Keep the order of requests, add item after previous blocked requests. + wait = true; + } else { + got = m_throttle.get(c); + if (got < c) { + // Not enough tokens, add a blocker for it. + wait = true; + } } - return waited; + + if (wait) + add_blocker(c - got, handler, item, flag); + + return wait; } - void set_max(uint64_t m); void set_average(uint64_t avg); -- 2.39.5