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

Unified Diff: sync/engine/sync_scheduler_impl.cc

Issue 12538015: sync: Handle POLL jobs in separate a code path (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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 0f55c5fa8dd99cb944adfcef61eea1ccbb272d78..351b6ba83ceb60d5e59e63d8157540fa39daeff8 100644
--- a/sync/engine/sync_scheduler_impl.cc
+++ b/sync/engine/sync_scheduler_impl.cc
@@ -343,15 +343,13 @@ SyncSchedulerImpl::DecideWhileInWaitInterval(const SyncSessionJob& job,
JobPriority priority) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
DCHECK(wait_interval_.get());
+ DCHECK_NE(job.purpose(), SyncSessionJob::POLL);
SDVLOG(2) << "DecideWhileInWaitInterval with WaitInterval mode "
<< WaitInterval::GetModeString(wait_interval_->mode)
<< (wait_interval_->had_nudge ? " (had nudge)" : "")
<< ((priority == CANARY_PRIORITY) ? " (canary)" : "");
- if (job.purpose() == SyncSessionJob::POLL)
- return DROP;
-
// If we save a job while in a WaitInterval, there is a well-defined moment
// in time in the future when it makes sense for that SAVE-worthy job to try
// running again -- the end of the WaitInterval.
@@ -383,6 +381,10 @@ SyncSchedulerImpl::JobProcessDecision SyncSchedulerImpl::DecideOnJob(
JobPriority priority) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ // POLL jobs do not call this function.
+ DCHECK(job.purpose() == SyncSessionJob::NUDGE ||
+ job.purpose() == SyncSessionJob::CONFIGURATION);
+
// See if our type is throttled.
ModelTypeSet throttled_types =
session_context_->throttled_data_type_tracker()->GetThrottledTypes();
@@ -412,10 +414,8 @@ SyncSchedulerImpl::JobProcessDecision SyncSchedulerImpl::DecideOnJob(
if (mode_ == CONFIGURATION_MODE) {
if (job.purpose() == SyncSessionJob::NUDGE)
return SAVE; // Running requires a mode switch.
- else if (job.purpose() == SyncSessionJob::CONFIGURATION)
+ else // job.purpose() == SyncSessionJob::CONFIGURATION
tim (not reviewing) 2013/03/18 22:57:40 I think you mean to delete this.
return CONTINUE;
- else
- return DROP;
}
// We are in normal mode.
@@ -683,6 +683,7 @@ void SyncSchedulerImpl::ScheduleSyncSessionJob(
const tracked_objects::Location& loc,
scoped_ptr<SyncSessionJob> job) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ DCHECK_EQ(job->purpose(), SyncSessionJob::NUDGE);
if (no_scheduling_allowed_) {
NOTREACHED() << "Illegal to schedule job while session in progress.";
return;
@@ -696,14 +697,10 @@ void SyncSchedulerImpl::ScheduleSyncSessionJob(
<< SyncSessionJob::GetPurposeString(job->purpose())
<< " job and " << delay.InMilliseconds() << " ms delay";
- DCHECK(job->purpose() == SyncSessionJob::NUDGE ||
- job->purpose() == SyncSessionJob::POLL);
- if (job->purpose() == SyncSessionJob::NUDGE) {
- SDVLOG_LOC(loc, 2) << "Resetting pending_nudge to ";
- DCHECK(!pending_nudge_ || pending_nudge_->session() ==
- job->session());
- pending_nudge_ = job.get();
- }
+ SDVLOG_LOC(loc, 2) << "Resetting pending_nudge to ";
+ DCHECK(!pending_nudge_ || pending_nudge_->session() ==
+ job->session());
+ pending_nudge_ = job.get();
PostDelayedTask(loc, "DoSyncSessionJob",
base::Bind(base::IgnoreResult(&SyncSchedulerImpl::DoSyncSessionJob),
@@ -756,7 +753,64 @@ bool SyncSchedulerImpl::DoSyncSessionJob(scoped_ptr<SyncSessionJob> job,
job->end_step());
SDVLOG(2) << "Done SyncShare, returned: " << premature_exit;
- return FinishSyncSessionJob(job.Pass(), premature_exit);
+ bool success = FinishSyncSessionJob(job.get(), premature_exit);
rlarocque 2013/03/18 22:02:18 One of the goals of this patch is to take all the
tim (not reviewing) 2013/03/18 22:57:40 Please audit all the comments that reference DoSyn
+
+ if (IsSyncingCurrentlySilenced()) {
+ SDVLOG(2) << "We are currently throttled; scheduling Unthrottle.";
+ // If we're here, it's because |job| was silenced until a server specified
+ // time. (Note, it had to be |job|, because DecideOnJob would not permit
+ // any job through while in WaitInterval::THROTTLED).
+ scoped_ptr<SyncSessionJob> clone = job->Clone();
+ if (clone->purpose() == SyncSessionJob::NUDGE)
+ pending_nudge_ = clone.get();
+ else if (clone->purpose() == SyncSessionJob::CONFIGURATION)
+ wait_interval_->pending_configure_job = clone.get();
+ else
+ NOTREACHED();
+
+ RestartWaiting(clone.Pass());
+ return success;
+ }
+
+ if (!success) {
tim (not reviewing) 2013/03/18 22:57:40 nit - please make { } usage consistent for single
rlarocque 2013/03/19 00:15:03 I think it's been inconsistent for a while. For e
+ ScheduleNextSync(job.Pass());
+ }
+
+ return success;
+}
+
+void SyncSchedulerImpl::DoPollSyncSessionJob(scoped_ptr<SyncSessionJob> job) {
+ DCHECK_EQ(job->purpose(), SyncSessionJob::POLL);
+
+ base::AutoReset<bool> protector(&no_scheduling_allowed_, true);
+
+ if (wait_interval_.get()) {
rlarocque 2013/03/18 22:02:18 The if statements on lines 787-800 are intended to
tim (not reviewing) 2013/03/18 22:57:40 I know this may seem pedantic, but I'd like to try
rlarocque 2013/03/19 00:15:03 I see your point. I agree that we want to keep al
+ SDVLOG(2) << "Dropping POLL job in wait interval.";
+ return;
+ }
+
+ if (mode_ == CONFIGURATION_MODE) {
+ SDVLOG(2) << "Dropping POLL job in configuration mode.";
+ return;
+ }
+
+ if (session_context_->connection_manager()->HasInvalidAuthToken()) {
+ SDVLOG(2) << "Dropping POLL job because auth token is invalid.";
+ return;
+ }
+
+ SDVLOG(2) << "Calling SyncShare with "
+ << SyncSessionJob::GetPurposeString(job->purpose()) << " job";
+ bool premature_exit = !syncer_->SyncShare(job->mutable_session(),
+ job->start_step(),
+ job->end_step());
+ SDVLOG(2) << "Done SyncShare, returned: " << premature_exit;
+
+ FinishSyncSessionJob(job.get(), premature_exit);
+
+ if (IsSyncingCurrentlySilenced()) {
+ RestartWaiting(scoped_ptr<SyncSessionJob>());
tim (not reviewing) 2013/03/18 22:57:40 Comment that we send a NULL job here because a POL
rlarocque 2013/03/19 00:15:03 Will do.
+ }
}
void SyncSchedulerImpl::UpdateNudgeTimeRecords(const SyncSourceInfo& info) {
@@ -784,7 +838,7 @@ void SyncSchedulerImpl::UpdateNudgeTimeRecords(const SyncSourceInfo& info) {
}
}
-bool SyncSchedulerImpl::FinishSyncSessionJob(scoped_ptr<SyncSessionJob> job,
+bool SyncSchedulerImpl::FinishSyncSessionJob(SyncSessionJob* job,
bool exited_prematurely) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
@@ -796,15 +850,8 @@ bool SyncSchedulerImpl::FinishSyncSessionJob(scoped_ptr<SyncSessionJob> job,
}
SDVLOG(2) << "Updating the next polling time after SyncMain";
- ScheduleNextSync(job.Pass(), succeeded);
- return succeeded;
-}
-
-void SyncSchedulerImpl::ScheduleNextSync(
- scoped_ptr<SyncSessionJob> finished_job, bool succeeded) {
- DCHECK_EQ(MessageLoop::current(), sync_loop_);
- AdjustPolling(finished_job.get());
+ AdjustPolling(job);
if (succeeded) {
// No job currently supported by the scheduler could succeed without
@@ -813,29 +860,17 @@ void SyncSchedulerImpl::ScheduleNextSync(
wait_interval_.reset();
NotifyRetryTime(base::Time());
SDVLOG(2) << "Job succeeded so not scheduling more jobs";
- return;
+ return succeeded;
tim (not reviewing) 2013/03/18 22:57:40 Just fall through?
rlarocque 2013/03/19 00:15:03 Will do.
}
- if (IsSyncingCurrentlySilenced()) {
- SDVLOG(2) << "We are currently throttled; scheduling Unthrottle.";
- // If we're here, it's because |job| was silenced until a server specified
- // time. (Note, it had to be |job|, because DecideOnJob would not permit
- // any job through while in WaitInterval::THROTTLED).
- scoped_ptr<SyncSessionJob> clone = finished_job->Clone();
- if (clone->purpose() == SyncSessionJob::NUDGE)
- pending_nudge_ = clone.get();
- else if (clone->purpose() == SyncSessionJob::CONFIGURATION)
- wait_interval_->pending_configure_job = clone.get();
- else
- clone.reset(); // Unthrottling is enough, no need to force a canary.
-
- RestartWaiting(clone.Pass());
- return;
- }
+ return succeeded;
+}
- if (finished_job->purpose() == SyncSessionJob::POLL) {
- return; // We don't retry POLL jobs.
- }
+void SyncSchedulerImpl::ScheduleNextSync(
+ scoped_ptr<SyncSessionJob> finished_job) {
+ DCHECK_EQ(MessageLoop::current(), sync_loop_);
+ DCHECK(finished_job->purpose() == SyncSessionJob::CONFIGURATION
+ || finished_job->purpose() == SyncSessionJob::NUDGE);
// TODO(rlarocque): There's no reason why we should blindly backoff and retry
// if we don't succeed. Some types of errors are not likely to disappear on
@@ -1035,7 +1070,12 @@ void SyncSchedulerImpl::PollTimerCallback() {
TimeTicks::Now(),
s.Pass(),
ConfigurationParams()));
- ScheduleSyncSessionJob(FROM_HERE, job.Pass());
+ if (no_scheduling_allowed_) {
+ NOTREACHED() << "Illegal to schedule job while session in progress.";
tim (not reviewing) 2013/03/18 22:57:40 Can you explain why we can't be here, given that t
rlarocque 2013/03/19 00:15:03 The no_scheduling_allowed_ flag is true only when
+ return;
+ }
+
+ DoPollSyncSessionJob(job.Pass());
}
void SyncSchedulerImpl::Unthrottle(scoped_ptr<SyncSessionJob> to_be_canary) {

Powered by Google App Engine
This is Rietveld 408576698