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

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: For review. 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
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 993b72755abcd019a89a4ff8380c7a91d5c9dbac..a8f6f5d995aa526f6be89ff46d794f13372ab3af 100644
--- a/chrome/browser/sync/engine/sync_scheduler.cc
+++ b/chrome/browser/sync/engine/sync_scheduler.cc
@@ -29,6 +29,40 @@ using syncable::ModelTypePayloadMap;
using syncable::ModelTypeBitSet;
using sync_pb::GetUpdatesCallerInfo;
+namespace {
+bool ShouldRequestEarlyExit(
+ const browser_sync::sessions::SyncProtocolError& error) {
+ switch (error.error_type) {
+ case browser_sync::sessions::SUCCESS:
+ case browser_sync::sessions::MIGRATION_DONE:
+ case browser_sync::sessions::THROTTLED:
+ case browser_sync::sessions::TRANSIENT_ERROR:
+ return false;
+ case browser_sync::sessions::NOT_MY_BIRTHDAY:
+ case browser_sync::sessions::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::sessions::UNKNOWN_ACTION);
+ return true;
+ case browser_sync::sessions::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::sessions::SyncProtocolError& error) {
+ return (error.action != browser_sync::sessions::UNKNOWN_ACTION);
+}
+} // namespace
+
SyncScheduler::DelayProvider::DelayProvider() {}
SyncScheduler::DelayProvider::~DelayProvider() {}
@@ -1084,6 +1118,29 @@ void SyncScheduler::OnShouldStopSyncingPermanently() {
Notify(SyncEngineEvent::STOP_SYNCING_PERMANENTLY);
}
+void SyncScheduler::OnActionableError(sessions::SyncSession* session) {
+ DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ SVLOG(2) << "OnActionableError";
+ SyncEngineEvent event(SyncEngineEvent::ACTIONABLE_ERROR);
+ sessions::SyncSessionSnapshot snapshot(session->TakeSnapshot());
+ event.snapshot = &snapshot;
+ session->context()->NotifyListeners(event);
+}
+
+void SyncScheduler::OnSyncProtocolError(sessions::SyncSession* session) {
+ DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ if (ShouldRequestEarlyExit(
+ session->status_controller()->sync_protocol_error())) {
+ SVLOG(2) << "OnRequestEarlyExit";
tim (not reviewing) 2011/08/25 15:58:55 nit - log should be updated "SyncScheduler request
lipalani1 2011/08/26 20:07:19 Done.
+ syncer_->RequestEarlyExit(); // Thread-safe.
+
tim (not reviewing) 2011/08/25 15:58:55 nit - extra newline
lipalani1 2011/08/26 20:07:19 Done.
+ }
+ if (IsActionableError(session->status_controller()->sync_protocol_error()))
+ OnActionableError(session);
+
tim (not reviewing) 2011/08/25 15:58:55 nit - extra newline.
lipalani1 2011/08/26 20:07:19 Done.
+}
+
+
void SyncScheduler::OnServerConnectionEvent(
const ServerConnectionEvent& event) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);

Powered by Google App Engine
This is Rietveld 408576698