Index: sync/engine/sync_scheduler_impl.cc |
diff --git a/sync/engine/sync_scheduler_impl.cc b/sync/engine/sync_scheduler_impl.cc |
index a1394fbe4d87a62af2c1f4895fd34e6d5a070f10..3e03114fe57e8a2458a3f422cd2eba1833e44fee 100644 |
--- a/sync/engine/sync_scheduler_impl.cc |
+++ b/sync/engine/sync_scheduler_impl.cc |
@@ -79,6 +79,14 @@ bool IsActionableError( |
return (error.action != UNKNOWN_ACTION); |
} |
+void RunAndReset(base::Closure* task) { |
+ DCHECK(task); |
+ if (task->is_null()) |
+ return; |
+ task->Run(); |
+ task->Reset(); |
+} |
+ |
} // namespace |
ConfigurationParams::ConfigurationParams() |
@@ -98,6 +106,12 @@ ConfigurationParams::ConfigurationParams( |
} |
ConfigurationParams::~ConfigurationParams() {} |
+ClearParams::ClearParams(const base::Closure& report_success_task) |
+ : report_success_task(report_success_task) { |
+ DCHECK(!report_success_task.is_null()); |
+} |
+ClearParams::~ClearParams() {} |
+ |
SyncSchedulerImpl::WaitInterval::WaitInterval() |
: mode(UNKNOWN) {} |
@@ -218,6 +232,10 @@ void SyncSchedulerImpl::Start(Mode mode, base::Time last_poll_time) { |
DCHECK(!session_context_->account_name().empty()); |
DCHECK(syncer_.get()); |
+ |
+ if (mode == CLEAR_SERVER_DATA_MODE) { |
+ DCHECK_EQ(mode_, CONFIGURATION_MODE); |
+ } |
Mode old_mode = mode_; |
mode_ = mode; |
// Only adjust the poll reset time if it was valid and in the past. |
@@ -313,6 +331,16 @@ void SyncSchedulerImpl::ScheduleConfiguration( |
} |
} |
+void SyncSchedulerImpl::ScheduleClearServerData(const ClearParams& params) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK_EQ(CLEAR_SERVER_DATA_MODE, mode_); |
+ DCHECK(!pending_configure_params_); |
+ DCHECK(!params.report_success_task.is_null()); |
+ CHECK(started_) << "Scheduler must be running to clear."; |
+ pending_clear_params_.reset(new ClearParams(params)); |
+ TrySyncSessionJob(); |
+} |
+ |
bool SyncSchedulerImpl::CanRunJobNow(JobPriority priority) { |
DCHECK(CalledOnValidThread()); |
if (IsCurrentlyThrottled()) { |
@@ -347,8 +375,8 @@ bool SyncSchedulerImpl::CanRunNudgeJobNow(JobPriority priority) { |
return false; |
} |
- if (mode_ == CONFIGURATION_MODE) { |
- SDVLOG(1) << "Not running nudge because we're in configuration mode."; |
+ if (mode_ != NORMAL_MODE) { |
+ SDVLOG(1) << "Not running nudge because we're not in normal mode."; |
return false; |
} |
@@ -450,6 +478,7 @@ void SyncSchedulerImpl::ScheduleNudgeImpl( |
const char* SyncSchedulerImpl::GetModeString(SyncScheduler::Mode mode) { |
switch (mode) { |
ENUM_CASE(CONFIGURATION_MODE); |
+ ENUM_CASE(CLEAR_SERVER_DATA_MODE); |
ENUM_CASE(NORMAL_MODE); |
} |
return ""; |
@@ -496,10 +525,7 @@ void SyncSchedulerImpl::DoConfigurationSyncSessionJob(JobPriority priority) { |
if (!CanRunJobNow(priority)) { |
SDVLOG(2) << "Unable to run configure job right now."; |
- if (!pending_configure_params_->retry_task.is_null()) { |
- pending_configure_params_->retry_task.Run(); |
- pending_configure_params_->retry_task.Reset(); |
- } |
+ RunAndReset(&pending_configure_params_->retry_task); |
return; |
} |
@@ -520,13 +546,34 @@ void SyncSchedulerImpl::DoConfigurationSyncSessionJob(JobPriority priority) { |
HandleFailure(session->status_controller().model_neutral_state()); |
// Sync cycle might receive response from server that causes scheduler to |
// stop and draws pending_configure_params_ invalid. |
- if (started_ && !pending_configure_params_->retry_task.is_null()) { |
- pending_configure_params_->retry_task.Run(); |
- pending_configure_params_->retry_task.Reset(); |
- } |
+ if (started_) |
+ RunAndReset(&pending_configure_params_->retry_task); |
} |
} |
+void SyncSchedulerImpl::DoClearServerDataSyncSessionJob(JobPriority priority) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK_EQ(mode_, CLEAR_SERVER_DATA_MODE); |
+ |
+ if (!CanRunJobNow(priority)) { |
+ SDVLOG(2) << "Unable to run clear server data job right now."; |
+ RunAndReset(&pending_configure_params_->retry_task); |
+ return; |
+ } |
+ |
+ scoped_ptr<SyncSession> session(SyncSession::Build(session_context_, this)); |
+ const bool success = syncer_->PostClearServerData(session.get()); |
+ if (!success) { |
+ HandleFailure(session->status_controller().model_neutral_state()); |
+ return; |
+ } |
+ |
+ SDVLOG(2) << "Clear succeeded."; |
+ pending_clear_params_->report_success_task.Run(); |
pavely
2015/07/27 19:45:05
You can use RunAndReset here as well.
maniscalco
2015/07/27 20:38:12
RunAndReset isn't a perfect fit since here we need
|
+ pending_clear_params_.reset(); |
+ HandleSuccess(); |
+} |
+ |
void SyncSchedulerImpl::HandleSuccess() { |
// If we're here, then we successfully reached the server. End all backoff. |
wait_interval_.reset(); |
@@ -673,6 +720,7 @@ void SyncSchedulerImpl::Stop() { |
poll_timer_.Stop(); |
pending_wakeup_timer_.Stop(); |
pending_configure_params_.reset(); |
+ pending_clear_params_.reset(); |
if (started_) |
started_ = false; |
} |
@@ -705,6 +753,10 @@ void SyncSchedulerImpl::TrySyncSessionJobImpl() { |
SDVLOG(2) << "Found pending configure job"; |
DoConfigurationSyncSessionJob(priority); |
} |
+ } else if (mode_ == CLEAR_SERVER_DATA_MODE) { |
+ if (pending_clear_params_) { |
+ DoClearServerDataSyncSessionJob(priority); |
+ } |
} else if (CanRunNudgeJobNow(priority)) { |
if (nudge_tracker_.IsSyncRequired()) { |
SDVLOG(2) << "Found pending nudge job"; |