From b3632a235791fba44439e28668c150e67690094f Mon Sep 17 00:00:00 2001 From: Shiyang Ruan Date: Wed, 28 Nov 2018 10:23:34 +0800 Subject: [PATCH] TokenBucketThrottle: Add name for TokenBucketThrottle. In order to specific which one is failed when applying the limit. Signed-off-by: Shiyang Ruan --- src/common/Throttle.cc | 10 ++++++++-- src/common/Throttle.h | 8 +++++++- src/librbd/io/ImageRequestWQ.cc | 19 ++++++++++--------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/common/Throttle.cc b/src/common/Throttle.cc index 4d0e340966475..40a8e6ed3eb95 100644 --- a/src/common/Throttle.cc +++ b/src/common/Throttle.cc @@ -656,6 +656,10 @@ void OrderedThrottle::complete_pending_ops(std::unique_lock& l) { } } +#undef dout_prefix +#define dout_prefix *_dout << "TokenBucketThrottle(" << m_name << " " \ + << (void*)this << ") " + uint64_t TokenBucketThrottle::Bucket::get(uint64_t c) { if (0 == max) { return 0; @@ -700,13 +704,15 @@ void TokenBucketThrottle::Bucket::set_max(uint64_t m) { TokenBucketThrottle::TokenBucketThrottle( CephContext *cct, + const std::string &name, uint64_t capacity, uint64_t avg, SafeTimer *timer, Mutex *timer_lock) - : m_cct(cct), m_throttle(m_cct, "token_bucket_throttle", capacity), + : m_cct(cct), m_name(name), + m_throttle(m_cct, name + "_bucket", capacity), m_avg(avg), m_timer(timer), m_timer_lock(timer_lock), - m_lock("token_bucket_throttle_lock") + m_lock(name + "_lock") {} TokenBucketThrottle::~TokenBucketThrottle() { diff --git a/src/common/Throttle.h b/src/common/Throttle.h index 0164dc9815ab3..f382140e8bfb9 100644 --- a/src/common/Throttle.h +++ b/src/common/Throttle.h @@ -357,6 +357,7 @@ class TokenBucketThrottle { }; CephContext *m_cct; + const std::string m_name; Bucket m_throttle; uint64_t m_avg = 0; uint64_t m_burst = 0; @@ -406,11 +407,16 @@ class TokenBucketThrottle { double m_schedule_tick = 1.0; public: - TokenBucketThrottle(CephContext *cct, uint64_t capacity, uint64_t avg, + TokenBucketThrottle(CephContext *cct, const std::string &name, + uint64_t capacity, uint64_t avg, SafeTimer *timer, Mutex *timer_lock); ~TokenBucketThrottle(); + const std::string &get_name() { + return m_name; + } + template void add_blocker(uint64_t c, T *handler, I *item, uint64_t flag) { Context *ctx = new FunctionContext([handler, item, flag](int r) { diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index 9aef36cc40097..81c39d9b1420a 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -79,13 +79,13 @@ struct ImageRequestWQ::C_RefreshFinish : public Context { } }; -static std::list throttle_flags = { - RBD_QOS_IOPS_THROTTLE, - RBD_QOS_BPS_THROTTLE, - RBD_QOS_READ_IOPS_THROTTLE, - RBD_QOS_WRITE_IOPS_THROTTLE, - RBD_QOS_READ_BPS_THROTTLE, - RBD_QOS_WRITE_BPS_THROTTLE +static std::map throttle_flags = { + { RBD_QOS_IOPS_THROTTLE, "rbd_qos_iops_throttle" }, + { RBD_QOS_BPS_THROTTLE, "rbd_qos_bps_throttle" }, + { RBD_QOS_READ_IOPS_THROTTLE, "rbd_qos_read_iops_throttle" }, + { RBD_QOS_WRITE_IOPS_THROTTLE, "rbd_qos_write_iops_throttle" }, + { RBD_QOS_READ_BPS_THROTTLE, "rbd_qos_read_bps_throttle" }, + { RBD_QOS_WRITE_BPS_THROTTLE, "rbd_qos_write_bps_throttle" } }; template @@ -103,7 +103,8 @@ ImageRequestWQ::ImageRequestWQ(I *image_ctx, const string &name, for (auto flag : throttle_flags) { m_throttles.push_back(make_pair( - flag, new TokenBucketThrottle(cct, 0, 0, timer, timer_lock))); + flag.first, + new TokenBucketThrottle(cct, flag.second, 0, 0, timer, timer_lock))); } this->register_work_queue(); @@ -638,7 +639,7 @@ void ImageRequestWQ::apply_qos_limit(const uint64_t flag, int r = throttle->set_limit(limit, burst); if (r < 0) { - lderr(cct) << "invalid qos parameter: " + lderr(cct) << throttle->get_name() << ": invalid qos parameter: " << "burst(" << burst << ") is less than " << "limit(" << limit << ")" << dendl; // if apply failed, we should at least make sure the limit works. -- 2.39.5