Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Unified Diff: chrome/browser/sync/profile_sync_service.cc

Issue 9235040: [Sync] Handle errors during first sync gracefully. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: for review. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/profile_sync_service.cc
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 21673d880f045cdd5da3494950f4182b6c8daf41..d06b2770495725ef83de5fd7eb533f36fe331f1c 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -32,7 +32,6 @@
#include "chrome/browser/sync/backend_migrator.h"
#include "chrome/browser/sync/glue/change_processor.h"
#include "chrome/browser/sync/glue/data_type_controller.h"
-#include "chrome/browser/sync/glue/data_type_manager.h"
#include "chrome/browser/sync/glue/session_data_type_controller.h"
#include "chrome/browser/sync/glue/session_model_associator.h"
#include "chrome/browser/sync/glue/typed_url_data_type_controller.h"
@@ -127,7 +126,8 @@ ProfileSyncService::ProfileSyncService(ProfileSyncComponentsFactory* factory,
encrypt_everything_(false),
encryption_pending_(false),
auto_start_enabled_(start_behavior == AUTO_START),
- failed_datatypes_handler_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+ failed_datatypes_handler_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
+ configure_status_(DataTypeManager::UNKNOWN) {
// By default, dev, canary, and unbranded Chromium users will go to the
// development servers. Development servers have more features than standard
// sync servers. Users with officially-branded Chrome stable and beta builds
@@ -354,6 +354,24 @@ void ProfileSyncService::OnSyncConfigureDone(
}
}
+void ProfileSyncService::OnSyncConfigureRetry() {
+ // In platforms with auto start we would just wait for the
+ // configure to finish. In other platforms we would throw
+ // an unrecoverable error.
Andrew T Wilson (Slow) 2012/01/27 18:41:11 Add a note that the reason we do this is to force
lipalani1 2012/01/27 19:35:26 Done.
+ // Also if backend has been initialized(the user is authenticated
+ // and nigori is downloaded) we would simply wait rather than going into
+ // unrecoverable error, even if the platform has auto start disabled.
+ // Note: In those scenarios the UI does not wait for the configuration
+ // to finish
Andrew T Wilson (Slow) 2012/01/27 18:41:11 nit: period at end of sentence.
lipalani1 2012/01/27 19:35:26 Done.
+ if (!auto_start_enabled_ && !backend_initialized_) {
+ OnUnrecoverableError(FROM_HERE,
+ "Configure failed to download.");
+ }
+
+ NotifyObservers();
+}
+
+
void ProfileSyncService::StartUp() {
// Don't start up multiple times.
if (backend_.get()) {
@@ -1333,16 +1351,35 @@ void ProfileSyncService::Observe(int type,
DataTypeManager::ConfigureResult* result =
content::Details<DataTypeManager::ConfigureResult>(details).ptr();
- DataTypeManager::ConfigureStatus status = result->status;
- DVLOG(1) << "PSS SYNC_CONFIGURE_DONE called with status: " << status;
- if (status == DataTypeManager::ABORTED &&
+ configure_status_ = result->status;
+ DVLOG(1) << "PSS SYNC_CONFIGURE_DONE called with status: "
+ << configure_status_;
+
+ // The possible status values:
+ // ABORT - Configuration was aborted. This is not an error, if
+ // initiated by user..
Andrew T Wilson (Slow) 2012/01/27 18:41:11 nit: double '..'
lipalani1 2012/01/27 19:35:26 Done.
+ // RETRY - Configure failed but we are retrying.
+ // OK - Everything succeeded.
+ // PARTIAL_SUCCESS - Some datatypes failed to start.
+ // Everything else is an UnrecoverableError. So treat it as such.
+
+ // First handle the abort case.
+ if (configure_status_ == DataTypeManager::ABORTED &&
expect_sync_configuration_aborted_) {
DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted";
expect_sync_configuration_aborted_ = false;
return;
}
- if (status != DataTypeManager::OK &&
- status != DataTypeManager::PARTIAL_SUCCESS) {
+
+ // Handle retry case.
+ if (configure_status_ == DataTypeManager::RETRY) {
+ OnSyncConfigureRetry();
+ return;
+ }
+
+ // Handle unrecoverable error.
+ if (configure_status_ != DataTypeManager::OK &&
+ configure_status_ != DataTypeManager::PARTIAL_SUCCESS) {
// Something catastrophic had happened. We should only have one
// error representing it.
DCHECK(result->errors.size() == 1);
@@ -1350,7 +1387,7 @@ void ProfileSyncService::Observe(int type,
DCHECK(error.IsSet());
std::string message =
"Sync configuration failed with status " +
- DataTypeManager::ConfigureStatusToString(status) +
+ DataTypeManager::ConfigureStatusToString(configure_status_) +
" during " + syncable::ModelTypeToString(error.type()) +
": " + error.message();
LOG(ERROR) << "ProfileSyncService error: "
@@ -1360,6 +1397,7 @@ void ProfileSyncService::Observe(int type,
return;
}
+ // Now handle partial success and full success.
MessageLoop::current()->PostTask(FROM_HERE,
base::Bind(&ProfileSyncService::OnSyncConfigureDone,
weak_factory_.GetWeakPtr(), *result));

Powered by Google App Engine
This is Rietveld 408576698