Index: chrome/browser/chromeos/login/enrollment/enrollment_screen.cc |
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_screen.cc b/chrome/browser/chromeos/login/enrollment/enrollment_screen.cc |
index 6652c6b9e495a9454085bcefd59c4ebf3dd0325d..e7830a215d8b095a70057ef821635ef2bbb685d7 100644 |
--- a/chrome/browser/chromeos/login/enrollment/enrollment_screen.cc |
+++ b/chrome/browser/chromeos/login/enrollment/enrollment_screen.cc |
@@ -52,6 +52,19 @@ const char * const kMetricEnrollmentTimeFailure = |
const char * const kMetricEnrollmentTimeSuccess = |
"Enterprise.EnrollmentTime.Success"; |
+// Retry policy constants. |
+const int INITIAL_DELAY_MS = 4 * 1000; // 4 seconds |
xiyuan
2017/02/03 23:34:14
nit: constant should be name as kTheConstantName,
kumarniranjan
2017/02/06 21:38:24
Done.
|
+const double MULTIPLY_FACTOR = 1.5; |
+const double JITTER_FACTOR = 0.1; // +/- 10% jitter |
+const int64_t MAX_DELAY_MS = 8 * 60 * 1000; // 8 minutes |
+ |
+// Helper function. Returns true if we are using Hands Off Enrollment. |
+bool UsingHandsOffEnrollment() { |
+ return policy::DeviceCloudPolicyManagerChromeOS:: |
+ GetZeroTouchEnrollmentMode() == |
+ policy::ZeroTouchEnrollmentMode::HANDS_OFF; |
+} |
+ |
} // namespace |
namespace chromeos { |
@@ -66,7 +79,16 @@ EnrollmentScreen::EnrollmentScreen(BaseScreenDelegate* base_screen_delegate, |
EnrollmentScreenActor* actor) |
: BaseScreen(base_screen_delegate, OobeScreen::SCREEN_OOBE_ENROLLMENT), |
actor_(actor), |
- weak_ptr_factory_(this) {} |
+ weak_ptr_factory_(this) { |
+ retry_policy_.num_errors_to_ignore = 0; |
+ retry_policy_.initial_delay_ms = INITIAL_DELAY_MS; |
+ retry_policy_.multiply_factor = MULTIPLY_FACTOR; |
+ retry_policy_.jitter_factor = JITTER_FACTOR; |
+ retry_policy_.maximum_backoff_ms = MAX_DELAY_MS; |
+ retry_policy_.entry_lifetime_ms = -1; |
+ retry_policy_.always_use_initial_delay = true; |
+ retry_backoff_.reset(new net::BackoffEntry(&retry_policy_)); |
+} |
EnrollmentScreen::~EnrollmentScreen() { |
DCHECK(!enrollment_helper_ || g_browser_process->IsShuttingDown()); |
@@ -190,6 +212,22 @@ void EnrollmentScreen::OnLoginDone(const std::string& user, |
} |
void EnrollmentScreen::OnRetry() { |
+ retry_task_.Cancel(); |
+ ProcessRetry(); |
+} |
+ |
+void EnrollmentScreen::AutomaticRetry() { |
+ retry_backoff_->InformOfRequest(false); |
+ retry_task_.Reset(base::Bind(&EnrollmentScreen::ProcessRetry, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, retry_task_.callback(), retry_backoff_->GetTimeUntilRelease()); |
+} |
+ |
+void EnrollmentScreen::ProcessRetry() { |
+ num_retries_++; |
xiyuan
2017/02/03 23:34:14
nit: use pre-increment,
i.e.
++num_retries_;
kumarniranjan
2017/02/06 21:38:24
Done.
|
+ LOG(WARNING) << "Enrollment retry " << num_retries_; |
Show(); |
} |
@@ -243,16 +281,21 @@ void EnrollmentScreen::OnEnrollmentError(policy::EnrollmentStatus status) { |
// based enrollment and we have a fallback authentication, show it. |
if (status.status() == policy::EnrollmentStatus::REGISTRATION_FAILED && |
status.client_status() == policy::DM_STATUS_SERVICE_DEVICE_NOT_FOUND && |
- current_auth_ == AUTH_ATTESTATION && AdvanceToNextAuth()) |
+ current_auth_ == AUTH_ATTESTATION && AdvanceToNextAuth()) { |
Show(); |
- else |
+ } else { |
actor_->ShowEnrollmentStatus(status); |
+ if (UsingHandsOffEnrollment()) |
+ AutomaticRetry(); |
+ } |
} |
void EnrollmentScreen::OnOtherError( |
EnterpriseEnrollmentHelper::OtherError error) { |
RecordEnrollmentErrorMetrics(); |
actor_->ShowOtherError(error); |
+ if (UsingHandsOffEnrollment()) |
+ AutomaticRetry(); |
} |
void EnrollmentScreen::OnDeviceEnrolled(const std::string& additional_token) { |
@@ -323,6 +366,7 @@ void EnrollmentScreen::SendEnrollmentAuthToken(const std::string& token) { |
} |
void EnrollmentScreen::ShowEnrollmentStatusOnSuccess() { |
+ retry_backoff_->InformOfRequest(true); |
if (elapsed_timer_) |
UMA_ENROLLMENT_TIME(kMetricEnrollmentTimeSuccess, elapsed_timer_); |
actor_->ShowEnrollmentStatus( |