| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/profile_sync_service.h" | 5 #include "chrome/browser/sync/profile_sync_service.h" |
| 6 | 6 |
| 7 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 // be there. | 636 // be there. |
| 637 InitializeBackend(!HasSyncSetupCompleted()); | 637 InitializeBackend(!HasSyncSetupCompleted()); |
| 638 } | 638 } |
| 639 | 639 |
| 640 void ProfileSyncService::OnGetTokenSuccess( | 640 void ProfileSyncService::OnGetTokenSuccess( |
| 641 const OAuth2TokenService::Request* request, | 641 const OAuth2TokenService::Request* request, |
| 642 const std::string& access_token, | 642 const std::string& access_token, |
| 643 const base::Time& expiration_time) { | 643 const base::Time& expiration_time) { |
| 644 DCHECK_EQ(access_token_request_, request); | 644 DCHECK_EQ(access_token_request_, request); |
| 645 access_token_request_.reset(); | 645 access_token_request_.reset(); |
| 646 // Reset backoff time after successful response. | |
| 647 request_access_token_backoff_.Reset(); | |
| 648 access_token_ = access_token; | 646 access_token_ = access_token; |
| 649 if (backend_) | 647 if (backend_) |
| 650 backend_->UpdateCredentials(GetCredentials()); | 648 backend_->UpdateCredentials(GetCredentials()); |
| 651 else | 649 else |
| 652 TryStart(); | 650 TryStart(); |
| 653 } | 651 } |
| 654 | 652 |
| 655 void ProfileSyncService::OnGetTokenFailure( | 653 void ProfileSyncService::OnGetTokenFailure( |
| 656 const OAuth2TokenService::Request* request, | 654 const OAuth2TokenService::Request* request, |
| 657 const GoogleServiceAuthError& error) { | 655 const GoogleServiceAuthError& error) { |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 } | 1102 } |
| 1105 | 1103 |
| 1106 } // namespace | 1104 } // namespace |
| 1107 | 1105 |
| 1108 void ProfileSyncService::OnConnectionStatusChange( | 1106 void ProfileSyncService::OnConnectionStatusChange( |
| 1109 syncer::ConnectionStatus status) { | 1107 syncer::ConnectionStatus status) { |
| 1110 if (status == syncer::CONNECTION_AUTH_ERROR) { | 1108 if (status == syncer::CONNECTION_AUTH_ERROR) { |
| 1111 // Sync server returned error indicating that access token is invalid. It | 1109 // Sync server returned error indicating that access token is invalid. It |
| 1112 // could be either expired or access is revoked. Let's request another | 1110 // could be either expired or access is revoked. Let's request another |
| 1113 // access token and if access is revoked then request for token will fail | 1111 // access token and if access is revoked then request for token will fail |
| 1114 // with corresponding error. | 1112 // with corresponding error. If access token is repeatedly reported |
| 1115 RequestAccessToken(); | 1113 // invalid, there may be some issues with token server, e.g. authentication |
| 1114 // server is inconsistent with token issue server. In that case, we |
| 1115 // backoff token requests exponentially to avoid hammering token server |
| 1116 // too much and to avoid getting same token due to token server's caching |
| 1117 // policy. |request_access_token_retry_timer_| is used to backoff request |
| 1118 // triggered by both auth error and failure talking to GAIA server. |
| 1119 // Therefore, we're likely to reach the backoff ceiling more quickly than |
| 1120 // you would expect from looking at the BackoffPolicy if both types of |
| 1121 // errors happen. We shouldn't receive two errors back-to-back without |
| 1122 // attempting a token/sync request in between, thus crank up request delay |
| 1123 // unnecessary. This is because we won't make a sync request if we hit an |
| 1124 // error until GAIA succeeds at sending a new token, and we won't request |
| 1125 // a new token unless sync reports a token failure. But to be safe, don't |
| 1126 // schedule request if this happens. |
| 1127 if (request_access_token_retry_timer_.IsRunning()) { |
| 1128 NOTREACHED(); |
| 1129 } else if (request_access_token_backoff_.failure_count() == 0) { |
| 1130 // First time request without delay. Currently invalid token is used |
| 1131 // to initialize sync backend and we'll always end up here. We don't |
| 1132 // want to delay initialization. |
| 1133 request_access_token_backoff_.InformOfRequest(false); |
| 1134 RequestAccessToken(); |
| 1135 } else { |
| 1136 request_access_token_backoff_.InformOfRequest(false); |
| 1137 request_access_token_retry_timer_.Start( |
| 1138 FROM_HERE, |
| 1139 request_access_token_backoff_.GetTimeUntilRelease(), |
| 1140 base::Bind(&ProfileSyncService::RequestAccessToken, |
| 1141 weak_factory_.GetWeakPtr())); |
| 1142 } |
| 1116 } else { | 1143 } else { |
| 1144 // Reset backoff time after successful connection. |
| 1145 if (status == syncer::CONNECTION_OK) { |
| 1146 // Request shouldn't be scheduled at this time. But if it is, it's |
| 1147 // possible that sync flips between OK and auth error states rapidly, |
| 1148 // thus hammers token server. To be safe, only reset backoff delay when |
| 1149 // no scheduled request. |
| 1150 if (request_access_token_retry_timer_.IsRunning()) { |
| 1151 NOTREACHED(); |
| 1152 } else { |
| 1153 request_access_token_backoff_.Reset(); |
| 1154 } |
| 1155 } |
| 1156 |
| 1117 const GoogleServiceAuthError auth_error = | 1157 const GoogleServiceAuthError auth_error = |
| 1118 ConnectionStatusToAuthError(status); | 1158 ConnectionStatusToAuthError(status); |
| 1119 DVLOG(1) << "Connection status change: " << auth_error.ToString(); | 1159 DVLOG(1) << "Connection status change: " << auth_error.ToString(); |
| 1120 UpdateAuthErrorState(auth_error); | 1160 UpdateAuthErrorState(auth_error); |
| 1121 } | 1161 } |
| 1122 } | 1162 } |
| 1123 | 1163 |
| 1124 void ProfileSyncService::OnStopSyncingPermanently() { | 1164 void ProfileSyncService::OnStopSyncingPermanently() { |
| 1125 sync_prefs_.SetStartSuppressed(true); | 1165 sync_prefs_.SetStartSuppressed(true); |
| 1126 DisableForUser(); | 1166 DisableForUser(); |
| (...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2134 NOTREACHED(); | 2174 NOTREACHED(); |
| 2135 #endif | 2175 #endif |
| 2136 } | 2176 } |
| 2137 | 2177 |
| 2138 return signin_->GetAuthenticatedUsername(); | 2178 return signin_->GetAuthenticatedUsername(); |
| 2139 } | 2179 } |
| 2140 | 2180 |
| 2141 WeakHandle<syncer::JsEventHandler> ProfileSyncService::GetJsEventHandler() { | 2181 WeakHandle<syncer::JsEventHandler> ProfileSyncService::GetJsEventHandler() { |
| 2142 return MakeWeakHandle(sync_js_controller_.AsWeakPtr()); | 2182 return MakeWeakHandle(sync_js_controller_.AsWeakPtr()); |
| 2143 } | 2183 } |
| OLD | NEW |