}
}
+#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;
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() {
};
CephContext *m_cct;
+ const std::string m_name;
Bucket m_throttle;
uint64_t m_avg = 0;
uint64_t m_burst = 0;
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 <typename T, typename I, void(T::*MF)(int, I*, uint64_t)>
void add_blocker(uint64_t c, T *handler, I *item, uint64_t flag) {
Context *ctx = new FunctionContext([handler, item, flag](int r) {
}
};
-static std::list<uint64_t> 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<uint64_t, std::string> 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 <typename I>
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();
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.