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

Unified Diff: sync/engine/sync_scheduler_impl.cc

Issue 13422003: sync: Refactor job ownership in SyncScheduler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove nudge while in backoff 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 da195369c991ef36342bbe89b2a517b1e3d5e846..bd2e3e9a31bf7fe84d9a14b83b77873846535550 100644
--- a/sync/engine/sync_scheduler_impl.cc
+++ b/sync/engine/sync_scheduler_impl.cc
@@ -83,11 +83,10 @@ ConfigurationParams::ConfigurationParams(
ConfigurationParams::~ConfigurationParams() {}
SyncSchedulerImpl::WaitInterval::WaitInterval()
- : mode(UNKNOWN),
- had_nudge(false) {}
+ : mode(UNKNOWN) {}
SyncSchedulerImpl::WaitInterval::WaitInterval(Mode mode, TimeDelta length)
- : mode(mode), had_nudge(false), length(length) {}
+ : mode(mode), length(length) {}
SyncSchedulerImpl::WaitInterval::~WaitInterval() {}
@@ -323,7 +322,6 @@ SyncSchedulerImpl::DecideWhileInWaitInterval(const SyncSessionJob& job,
SDVLOG(2) << "DecideWhileInWaitInterval with WaitInterval mode "
<< WaitInterval::GetModeString(wait_interval_->mode)
- << (wait_interval_->had_nudge ? " (had nudge)" : "")
<< ((priority == CANARY_PRIORITY) ? " (canary)" : "");
// If we save a job while in a WaitInterval, there is a well-defined moment
@@ -345,7 +343,7 @@ SyncSchedulerImpl::DecideWhileInWaitInterval(const SyncSessionJob& job,
// If we already had one nudge then just drop this nudge. We will retry
// later when the timer runs out.
if (priority == NORMAL_PRIORITY)
- return wait_interval_->had_nudge ? DROP : CONTINUE;
+ return DROP;
else // We are here because timer ran out. So retry.
tim (not reviewing) 2013/04/05 16:56:44 In fact this comment isn't true, so we should fix
rlarocque 2013/04/05 19:13:29 Done.
return CONTINUE;
}
@@ -541,13 +539,14 @@ void SyncSchedulerImpl::ScheduleNudgeImpl(
<< "Scheduling a nudge with "
<< run_delay.InMilliseconds() << " ms delay";
- PostDelayedTask(
- nudge_location,
- "DoSyncSessionJob",
- base::Bind(base::IgnoreResult(&SyncSchedulerImpl::DoNudgeSyncSessionJob),
- weak_ptr_factory_.GetWeakPtr(),
- NORMAL_PRIORITY),
- run_delay);
+ if (started_) {
+ pending_wakeup_timer_.Start(
+ nudge_location,
+ run_delay,
+ base::Bind(&SyncSchedulerImpl::DoNudgeSyncSessionJob,
+ weak_ptr_factory_.GetWeakPtr(),
+ NORMAL_PRIORITY));
+ }
}
const char* SyncSchedulerImpl::GetModeString(SyncScheduler::Mode mode) {
@@ -568,23 +567,6 @@ const char* SyncSchedulerImpl::GetDecisionString(
return "";
}
-void SyncSchedulerImpl::PostDelayedTask(
- const tracked_objects::Location& from_here,
- const char* name, const base::Closure& task, base::TimeDelta delay) {
- SDVLOG_LOC(from_here, 3) << "Posting " << name << " task with "
- << delay.InMilliseconds() << " ms delay";
- DCHECK_EQ(MessageLoop::current(), sync_loop_);
- if (!started_) {
- SDVLOG(1) << "Not posting task as scheduler is stopped.";
- return;
- }
- // This cancels the previous task, if one existed.
- pending_wakeup_event_.Reset(task);
- sync_loop_->PostDelayedTask(from_here,
- pending_wakeup_event_.callback(),
- delay);
-}
-
bool SyncSchedulerImpl::DoSyncSessionJobImpl(scoped_ptr<SyncSessionJob> job,
JobPriority priority) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
@@ -600,14 +582,6 @@ bool SyncSchedulerImpl::DoSyncSessionJobImpl(scoped_ptr<SyncSessionJob> job,
if (decision == SAVE) {
if (job->purpose() == SyncSessionJob::CONFIGURATION) {
pending_configure_job_ = job.Pass();
-
- // It's very unlikely, but possible, that the WaitInterval's wakeup task
- // isn't actually active at this point. Sometimes the WaitInterval gets
- // preempted by a nudge-while-in-backoff. We can't just assume that
- // there's a task waiting to wake us up once the WaitInterval expires;
- // we need to ensure it by rescheduling the WaitInterval (while taking
- // into account any time already spent waiting, of course).
- ResumeWaiting();
} else {
pending_nudge_job_ = job.Pass();
}
@@ -652,8 +626,8 @@ bool SyncSchedulerImpl::DoSyncSessionJobImpl(scoped_ptr<SyncSessionJob> job,
return success;
}
-bool SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) {
- return DoSyncSessionJobImpl(pending_nudge_job_.Pass(), priority);
+void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) {
+ DoSyncSessionJobImpl(pending_nudge_job_.Pass(), priority);
}
bool SyncSchedulerImpl::DoConfigurationSyncSessionJob(JobPriority priority) {
@@ -782,29 +756,8 @@ void SyncSchedulerImpl::ScheduleNextSync(
// we should be able to detect such errors and only retry when we detect
// transient errors.
- if (IsBackingOff() && wait_interval_->timer.IsRunning() &&
- mode_ == NORMAL_MODE) {
- // When in normal mode, we allow up to one nudge per backoff interval. It
- // appears that this was our nudge for this interval, and it failed.
- //
- // Note: This does not prevent us from running canary jobs. For example,
- // an IP address change might still result in another nudge being executed
- // during this backoff interval.
- SDVLOG(2) << "A nudge during backoff failed, creating new pending nudge.";
- DCHECK_EQ(SyncSessionJob::NUDGE, finished_job->purpose());
- DCHECK(!wait_interval_->had_nudge);
-
- wait_interval_->had_nudge = true;
- DCHECK(!pending_nudge_job_);
-
- pending_nudge_job_ = finished_job.Pass();
- RestartWaiting();
- } else {
- // Either this is the first failure or a consecutive failure after our
- // backoff timer expired. We handle it the same way in either case.
- SDVLOG(2) << "Non-'backoff nudge' SyncShare job failed";
- HandleContinuationError(finished_job.Pass(), session);
- }
+ SDVLOG(2) << "SyncShare job failed; will start or update backoff";
+ HandleContinuationError(finished_job.Pass(), session);
}
void SyncSchedulerImpl::AdjustPolling(const SyncSessionJob* old_job) {
@@ -828,28 +781,22 @@ void SyncSchedulerImpl::AdjustPolling(const SyncSessionJob* old_job) {
&SyncSchedulerImpl::PollTimerCallback);
}
-void SyncSchedulerImpl::ResumeWaiting() {
- TimeDelta length =
- wait_interval_->timer.desired_run_time() - TimeTicks::Now();
- wait_interval_->length = length < TimeDelta::FromSeconds(0) ?
- TimeDelta::FromSeconds(0) : length;
- RestartWaiting();
-}
-
void SyncSchedulerImpl::RestartWaiting() {
CHECK(wait_interval_.get());
- wait_interval_->timer.Stop();
DCHECK(wait_interval_->length >= TimeDelta::FromSeconds(0));
if (wait_interval_->mode == WaitInterval::THROTTLED) {
- pending_wakeup_event_.Reset(base::Bind(&SyncSchedulerImpl::Unthrottle,
- weak_ptr_factory_.GetWeakPtr()));
-
+ pending_wakeup_timer_.Start(
+ FROM_HERE,
+ wait_interval_->length,
+ base::Bind(&SyncSchedulerImpl::Unthrottle,
+ weak_ptr_factory_.GetWeakPtr()));
} else {
- pending_wakeup_event_.Reset(base::Bind(&SyncSchedulerImpl::TryCanaryJob,
- weak_ptr_factory_.GetWeakPtr()));
+ pending_wakeup_timer_.Start(
+ FROM_HERE,
+ wait_interval_->length,
+ base::Bind(&SyncSchedulerImpl::TryCanaryJob,
+ weak_ptr_factory_.GetWeakPtr()));
}
- wait_interval_->timer.Start(FROM_HERE, wait_interval_->length,
- pending_wakeup_event_.callback());
}
void SyncSchedulerImpl::HandleContinuationError(
@@ -867,7 +814,6 @@ void SyncSchedulerImpl::HandleContinuationError(
<< " job. The time delta(ms) is "
<< length.InMilliseconds();
- // This will reset the had_nudge variable as well.
wait_interval_.reset(new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF,
length));
NotifyRetryTime(base::Time::Now() + length);
@@ -906,7 +852,7 @@ void SyncSchedulerImpl::StopImpl(const base::Closure& callback) {
wait_interval_.reset();
NotifyRetryTime(base::Time());
poll_timer_.Stop();
- pending_wakeup_event_.Cancel();
+ pending_wakeup_timer_.Stop();
pending_nudge_job_.reset();
pending_configure_job_.reset();
if (started_) {

Powered by Google App Engine
This is Rietveld 408576698