buffet: Handle 'rateLimitExceeded' errors by retrying the request later
When server replies with 403/rateLimitExceeded, treat this error as
retriable and repeat the request after some time.
Also adjusted the first retry interval to be 1 seconds instead of
100 ms (which was added in error).
BUG=chrome-os-partner:41855
TEST=`FEATURES=test emerge-link buffet`
Change-Id: I4123a770fc88ec73f368f1c1a5ecf91f1b60f9e1
Reviewed-on: https://chromium-review.googlesource.com/281773
Trybot-Ready: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Aaron Kemp <kemp@google.com>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index f1c84b8..779a57d 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -124,7 +124,7 @@
shill_client_{shill_client} {
cloud_backoff_policy_.reset(new chromeos::BackoffEntry::Policy{});
cloud_backoff_policy_->num_errors_to_ignore = 0;
- cloud_backoff_policy_->initial_delay_ms = 100;
+ cloud_backoff_policy_->initial_delay_ms = 1000;
cloud_backoff_policy_->multiply_factor = 2.0;
cloud_backoff_policy_->jitter_factor = 0.1;
cloud_backoff_policy_->maximum_backoff_ms = 30000;
@@ -602,8 +602,6 @@
return;
}
- cloud_backoff_entry_->InformOfRequest(true);
-
chromeos::ErrorPtr error;
auto json_resp = chromeos::http::ParseJsonResponse(response.get(), nullptr,
&error);
@@ -614,10 +612,17 @@
if (!response->IsSuccessful()) {
ParseGCDError(json_resp.get(), &error);
+ if (status_code == chromeos::http::status_code::Forbidden &&
+ error->HasError(buffet::kErrorDomainGCDServer, "rateLimitExceeded")) {
+ // If we exceeded server quota, retry the request later.
+ RetryCloudRequest(data);
+ return;
+ }
data->error_callback.Run(error.get());
return;
}
+ cloud_backoff_entry_->InformOfRequest(true);
SetRegistrationStatus(RegistrationStatus::kConnected);
data->success_callback.Run(*json_resp);
}
@@ -632,6 +637,7 @@
void DeviceRegistrationInfo::RetryCloudRequest(
const std::shared_ptr<const CloudRequestData>& data) {
+ // TODO(avakulenko): Tie connecting/connected status to XMPP channel instead.
SetRegistrationStatus(RegistrationStatus::kConnecting);
cloud_backoff_entry_->InformOfRequest(false);
SendCloudRequest(data);