diff options
Diffstat (limited to 'cpp/src/qpid/broker/RateFlowcontrol.h')
| -rw-r--r-- | cpp/src/qpid/broker/RateFlowcontrol.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/cpp/src/qpid/broker/RateFlowcontrol.h b/cpp/src/qpid/broker/RateFlowcontrol.h index 3323097eff..99f9d2c0c4 100644 --- a/cpp/src/qpid/broker/RateFlowcontrol.h +++ b/cpp/src/qpid/broker/RateFlowcontrol.h @@ -62,6 +62,7 @@ public: } void sentCredit(const qpid::sys::AbsTime& t, uint32_t credit); uint32_t receivedMessage(const qpid::sys::AbsTime& t, uint32_t msgs); + uint32_t availableCredit(const qpid::sys::AbsTime& t); bool flowStopped() const; }; @@ -79,14 +80,22 @@ inline void RateFlowcontrol::sentCredit(const qpid::sys::AbsTime& t, uint32_t cr creditSent = t; } -inline uint32_t RateFlowcontrol::receivedMessage(const qpid::sys::AbsTime& t, uint32_t msgs) { - requestedCredit +=msgs; +inline uint32_t RateFlowcontrol::availableCredit(const qpid::sys::AbsTime& t) { qpid::sys::Duration d(creditSent, t); // Could be -ve before first sentCredit int64_t toSend = std::min(rate * d / qpid::sys::TIME_SEC, static_cast<int64_t>(requestedCredit)); return toSend > 0 ? toSend : 0; } +inline uint32_t RateFlowcontrol::receivedMessage(const qpid::sys::AbsTime& t, uint32_t msgs) { + requestedCredit +=msgs; + // Don't send credit for every message, only send if more than 0.5s since last credit or + // we've got less than .25 of the max left (heuristic) + return requestedCredit*4 >= maxCredit*3 || qpid::sys::Duration(creditSent, t) >= 500*qpid::sys::TIME_MSEC + ? availableCredit(t) + : 0; +} + inline bool RateFlowcontrol::flowStopped() const { return requestedCredit >= maxCredit; } |
