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_); |