TangSiyang2001 commented on code in PR #42413: URL: https://github.com/apache/doris/pull/42413#discussion_r1836029560
########## cloud/src/rate-limiter/rate_limiter.cpp: ########## @@ -41,36 +46,92 @@ void RateLimiter::init(google::protobuf::Service* service) { int64_t max_qps_limit = std::stoll(v.substr(p + 1)); if (max_qps_limit > 0) { rpc_name_to_max_qps_limit[rpc_name] = max_qps_limit; - LOG(INFO) << "set rpc: " << rpc_name << " max_qps_limit: " << max_qps_limit; } } catch (...) { - LOG(WARNING) << "failed to set max_qps_limit to rpc: " << rpc_name + LOG(WARNING) << "failed to parse max_qps_limit to rpc: " << rpc_name << " config: " << v; } } } + return rpc_name_to_max_qps_limit; +} + +template <typename Callable> +void for_each_rpc_name(google::protobuf::Service* service, Callable cb) { auto method_size = service->GetDescriptor()->method_count(); for (auto i = 0; i < method_size; ++i) { std::string rpc_name = service->GetDescriptor()->method(i)->name(); - int64_t max_qps_limit = config::default_max_qps_limit; + cb(rpc_name); + } +} - auto it = rpc_name_to_max_qps_limit.find(rpc_name); - if (it != rpc_name_to_max_qps_limit.end()) { +void RateLimiter::init(google::protobuf::Service* service) { + auto rpc_name_to_specific_limit = parse_specific_qps_limit(config::specific_max_qps_limit); + std::unique_lock write_lock(mutex_); + for_each_rpc_name(service, [&](const std::string& rpc_name) { + auto it = rpc_name_to_specific_limit.find(rpc_name); + int64_t max_qps_limit = config::default_max_qps_limit; + if (it != rpc_name_to_specific_limit.end()) { max_qps_limit = it->second; } limiters_[rpc_name] = std::make_shared<RpcRateLimiter>(rpc_name, max_qps_limit); + }); + for (const auto& [k, _] : rpc_name_to_specific_limit) { + rpc_with_specific_limit_.insert(k); } } std::shared_ptr<RpcRateLimiter> RateLimiter::get_rpc_rate_limiter(const std::string& rpc_name) { - // no need to be locked, because it is only modified during initialization auto it = limiters_.find(rpc_name); if (it == limiters_.end()) { return nullptr; } return it->second; } +bool RateLimiter::set_rate_limit(int64_t qps_limit) { + std::lock_guard lock(mutex_); + auto filter = [this](const auto& kv) { return !rpc_with_specific_limit_.contains(kv.first); }; Review Comment: nope, just as it means literally -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org