in aws_common/include/aws_common/sdk_utils/throttling_manager.h [48:76]
T MakeCall(std::function<T(const U & request)> api, const U & api_param, std::string api_name,
ErrorArgs... error_on_throttling_args) const
{
if (0 == max_api_tps_.count(api_name)) {
return api(api_param);
}
/* Min delta is 1s / TPS, e.g. 5 TPS -> 200ms wait time between calls */
auto min_delta_allowed = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::seconds(1) / max_api_tps_.at(api_name))
.count();
std::lock_guard<std::mutex> lock(api_call_time_mutex_);
{
if (0 == last_call_time_per_api_.count(api_name)) {
last_call_time_per_api_.insert(std::make_pair(
api_name, std::chrono::time_point<std::chrono::steady_clock>(std::chrono::seconds(0))));
}
auto now = std::chrono::steady_clock::now();
auto delta_in_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now - last_call_time_per_api_.at(api_name))
.count();
if (delta_in_ms >= min_delta_allowed) {
last_call_time_per_api_.at(api_name) = now;
return api(api_param);
} else {
T outcome(Aws::Client::AWSError<E>(error_on_throttling_args...));
return outcome;
}
}
}