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

Unified Diff: sync/engine/sync_scheduler_impl.cc

Issue 1251203002: [Sync] Add ClearServerData support to Sync Scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improve comments Created 5 years, 5 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: 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";

Powered by Google App Engine
This is Rietveld 408576698