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

Unified Diff: chrome/browser/sync/engine/sync_scheduler.cc

Issue 7621085: Server directed error handling backend code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: upload before commit. Created 9 years, 4 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
« no previous file with comments | « chrome/browser/sync/engine/sync_scheduler.h ('k') | chrome/browser/sync/engine/syncer_proto_util.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/engine/sync_scheduler.cc
diff --git a/chrome/browser/sync/engine/sync_scheduler.cc b/chrome/browser/sync/engine/sync_scheduler.cc
index 394fb828cef1f9656a57ed90e09bf76da454ba0d..3f860494ef208b77cff425d870b913df08cdf521 100644
--- a/chrome/browser/sync/engine/sync_scheduler.cc
+++ b/chrome/browser/sync/engine/sync_scheduler.cc
@@ -29,6 +29,41 @@ using syncable::ModelTypePayloadMap;
using syncable::ModelTypeBitSet;
using sync_pb::GetUpdatesCallerInfo;
+namespace {
+bool ShouldRequestEarlyExit(
+ const browser_sync::SyncProtocolError& error) {
+ switch (error.error_type) {
+ case browser_sync::SYNC_SUCCESS:
+ case browser_sync::MIGRATION_DONE:
+ case browser_sync::THROTTLED:
+ case browser_sync::TRANSIENT_ERROR:
+ return false;
+ case browser_sync::NOT_MY_BIRTHDAY:
+ case browser_sync::CLEAR_PENDING:
+ // If we send terminate sync early then |sync_cycle_ended| notification
+ // would not be sent. If there were no actions then |ACTIONABLE_ERROR|
+ // notification wouldnt be sent either. Then the UI layer would be left
+ // waiting forever. So assert we would send something.
+ DCHECK(error.action != browser_sync::UNKNOWN_ACTION);
+ return true;
+ case browser_sync::INVALID_CREDENTIAL:
+ // The notification for this is handled by PostAndProcessHeaders|.
+ // Server does no have to send any action for this.
+ return true;
+ // Make the default a NOTREACHED. So if a new error is introduced we
+ // think about its expected functionality.
+ default:
+ NOTREACHED();
+ return false;
+ }
+}
+
+bool IsActionableError(
+ const browser_sync::SyncProtocolError& error) {
+ return (error.action != browser_sync::UNKNOWN_ACTION);
+}
+} // namespace
+
SyncScheduler::DelayProvider::DelayProvider() {}
SyncScheduler::DelayProvider::~DelayProvider() {}
@@ -1080,6 +1115,28 @@ void SyncScheduler::OnShouldStopSyncingPermanently() {
Notify(SyncEngineEvent::STOP_SYNCING_PERMANENTLY);
}
+void SyncScheduler::OnActionableError(
+ const sessions::SyncSessionSnapshot& snap) {
+ DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ SVLOG(2) << "OnActionableError";
+ SyncEngineEvent event(SyncEngineEvent::ACTIONABLE_ERROR);
+ sessions::SyncSessionSnapshot snapshot(snap);
+ event.snapshot = &snapshot;
+ session_context_->NotifyListeners(event);
+}
+
+void SyncScheduler::OnSyncProtocolError(
+ const sessions::SyncSessionSnapshot& snapshot) {
+ DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ if (ShouldRequestEarlyExit(snapshot.errors.sync_protocol_error)) {
+ SVLOG(2) << "Sync Scheduler requesting early exit.";
+ syncer_->RequestEarlyExit(); // Thread-safe.
+ }
+ if (IsActionableError(snapshot.errors.sync_protocol_error))
+ OnActionableError(snapshot);
+}
+
+
void SyncScheduler::OnServerConnectionEvent(
const ServerConnectionEvent& event) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
« no previous file with comments | « chrome/browser/sync/engine/sync_scheduler.h ('k') | chrome/browser/sync/engine/syncer_proto_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698