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

Side by Side Diff: components/sync/engine_impl/sync_scheduler_impl.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sync/engine/sync_scheduler_impl.h" 5 #include "components/sync/engine_impl/sync_scheduler_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
17 #include "base/threading/platform_thread.h" 17 #include "base/threading/platform_thread.h"
18 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
19 #include "sync/engine/backoff_delay_provider.h" 19 #include "components/sync/base/data_type_histogram.h"
20 #include "sync/engine/syncer.h" 20 #include "components/sync/base/logging.h"
21 #include "sync/protocol/proto_enum_conversions.h" 21 #include "components/sync/engine_impl/backoff_delay_provider.h"
22 #include "sync/protocol/sync.pb.h" 22 #include "components/sync/engine_impl/syncer.h"
23 #include "sync/util/data_type_histogram.h" 23 #include "components/sync/protocol/proto_enum_conversions.h"
24 #include "sync/util/logging.h" 24 #include "components/sync/protocol/sync.pb.h"
25 25
26 using base::TimeDelta; 26 using base::TimeDelta;
27 using base::TimeTicks; 27 using base::TimeTicks;
28 28
29 namespace syncer { 29 namespace syncer {
30 30
31 using sessions::SyncSession; 31 using sessions::SyncSession;
32 using sessions::SyncSessionSnapshot; 32 using sessions::SyncSessionSnapshot;
33 using sync_pb::GetUpdatesCallerInfo; 33 using sync_pb::GetUpdatesCallerInfo;
34 34
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 return true; 72 return true;
73 // Make UNKNOWN_ERROR a NOTREACHED. All the other error should be explicitly 73 // Make UNKNOWN_ERROR a NOTREACHED. All the other error should be explicitly
74 // handled. 74 // handled.
75 case UNKNOWN_ERROR: 75 case UNKNOWN_ERROR:
76 NOTREACHED(); 76 NOTREACHED();
77 return false; 77 return false;
78 } 78 }
79 return false; 79 return false;
80 } 80 }
81 81
82 bool IsActionableError( 82 bool IsActionableError(const SyncProtocolError& error) {
83 const SyncProtocolError& error) {
84 return (error.action != UNKNOWN_ACTION); 83 return (error.action != UNKNOWN_ACTION);
85 } 84 }
86 85
87 void RunAndReset(base::Closure* task) { 86 void RunAndReset(base::Closure* task) {
88 DCHECK(task); 87 DCHECK(task);
89 if (task->is_null()) 88 if (task->is_null())
90 return; 89 return;
91 task->Run(); 90 task->Run();
92 task->Reset(); 91 task->Reset();
93 } 92 }
(...skipping 19 matching lines...) Expand all
113 default; 112 default;
114 ConfigurationParams::~ConfigurationParams() {} 113 ConfigurationParams::~ConfigurationParams() {}
115 114
116 ClearParams::ClearParams(const base::Closure& report_success_task) 115 ClearParams::ClearParams(const base::Closure& report_success_task)
117 : report_success_task(report_success_task) { 116 : report_success_task(report_success_task) {
118 DCHECK(!report_success_task.is_null()); 117 DCHECK(!report_success_task.is_null());
119 } 118 }
120 ClearParams::ClearParams(const ClearParams& other) = default; 119 ClearParams::ClearParams(const ClearParams& other) = default;
121 ClearParams::~ClearParams() {} 120 ClearParams::~ClearParams() {}
122 121
123 SyncSchedulerImpl::WaitInterval::WaitInterval() 122 SyncSchedulerImpl::WaitInterval::WaitInterval() : mode(UNKNOWN) {}
124 : mode(UNKNOWN) {}
125 123
126 SyncSchedulerImpl::WaitInterval::WaitInterval(Mode mode, TimeDelta length) 124 SyncSchedulerImpl::WaitInterval::WaitInterval(Mode mode, TimeDelta length)
127 : mode(mode), length(length) {} 125 : mode(mode), length(length) {}
128 126
129 SyncSchedulerImpl::WaitInterval::~WaitInterval() {} 127 SyncSchedulerImpl::WaitInterval::~WaitInterval() {}
130 128
131 #define ENUM_CASE(x) case x: return #x; break; 129 #define ENUM_CASE(x) \
130 case x: \
131 return #x; \
132 break;
132 133
133 const char* SyncSchedulerImpl::WaitInterval::GetModeString(Mode mode) { 134 const char* SyncSchedulerImpl::WaitInterval::GetModeString(Mode mode) {
134 switch (mode) { 135 switch (mode) {
135 ENUM_CASE(UNKNOWN); 136 ENUM_CASE(UNKNOWN);
136 ENUM_CASE(EXPONENTIAL_BACKOFF); 137 ENUM_CASE(EXPONENTIAL_BACKOFF);
137 ENUM_CASE(THROTTLED); 138 ENUM_CASE(THROTTLED);
138 } 139 }
139 NOTREACHED(); 140 NOTREACHED();
140 return ""; 141 return "";
141 } 142 }
(...skipping 15 matching lines...) Expand all
157 } 158 }
158 } 159 }
159 160
160 // Helper macros to log with the syncer thread name; useful when there 161 // Helper macros to log with the syncer thread name; useful when there
161 // are multiple syncer threads involved. 162 // are multiple syncer threads involved.
162 163
163 #define SLOG(severity) LOG(severity) << name_ << ": " 164 #define SLOG(severity) LOG(severity) << name_ << ": "
164 165
165 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": " 166 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": "
166 167
167 #define SDVLOG_LOC(from_here, verbose_level) \ 168 #define SDVLOG_LOC(from_here, verbose_level) \
168 DVLOG_LOC(from_here, verbose_level) << name_ << ": " 169 DVLOG_LOC(from_here, verbose_level) << name_ << ": "
169 170
170 SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name, 171 SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name,
171 BackoffDelayProvider* delay_provider, 172 BackoffDelayProvider* delay_provider,
172 sessions::SyncSessionContext* context, 173 sessions::SyncSessionContext* context,
173 Syncer* syncer) 174 Syncer* syncer)
174 : name_(name), 175 : name_(name),
175 started_(false), 176 started_(false),
176 syncer_short_poll_interval_seconds_( 177 syncer_short_poll_interval_seconds_(
177 TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds)), 178 TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds)),
178 syncer_long_poll_interval_seconds_( 179 syncer_long_poll_interval_seconds_(
179 TimeDelta::FromSeconds(kDefaultLongPollIntervalSeconds)), 180 TimeDelta::FromSeconds(kDefaultLongPollIntervalSeconds)),
180 mode_(CONFIGURATION_MODE), 181 mode_(CONFIGURATION_MODE),
181 delay_provider_(delay_provider), 182 delay_provider_(delay_provider),
182 syncer_(syncer), 183 syncer_(syncer),
183 session_context_(context), 184 session_context_(context),
184 next_sync_session_job_priority_(NORMAL_PRIORITY), 185 next_sync_session_job_priority_(NORMAL_PRIORITY),
185 weak_ptr_factory_(this), 186 weak_ptr_factory_(this),
186 weak_ptr_factory_for_weak_handle_(this) { 187 weak_ptr_factory_for_weak_handle_(this) {
187 weak_handle_this_ = MakeWeakHandle( 188 weak_handle_this_ =
188 weak_ptr_factory_for_weak_handle_.GetWeakPtr()); 189 MakeWeakHandle(weak_ptr_factory_for_weak_handle_.GetWeakPtr());
189 } 190 }
190 191
191 SyncSchedulerImpl::~SyncSchedulerImpl() { 192 SyncSchedulerImpl::~SyncSchedulerImpl() {
192 DCHECK(CalledOnValidThread()); 193 DCHECK(CalledOnValidThread());
193 Stop(); 194 Stop();
194 } 195 }
195 196
196 void SyncSchedulerImpl::OnCredentialsUpdated() { 197 void SyncSchedulerImpl::OnCredentialsUpdated() {
197 DCHECK(CalledOnValidThread()); 198 DCHECK(CalledOnValidThread());
198 199
199 if (HttpResponse::SYNC_AUTH_ERROR == 200 if (HttpResponse::SYNC_AUTH_ERROR ==
200 session_context_->connection_manager()->server_status()) { 201 session_context_->connection_manager()->server_status()) {
201 OnServerConnectionErrorFixed(); 202 OnServerConnectionErrorFixed();
202 } 203 }
203 } 204 }
204 205
205 void SyncSchedulerImpl::OnConnectionStatusChange() { 206 void SyncSchedulerImpl::OnConnectionStatusChange() {
206 if (HttpResponse::CONNECTION_UNAVAILABLE == 207 if (HttpResponse::CONNECTION_UNAVAILABLE ==
207 session_context_->connection_manager()->server_status()) { 208 session_context_->connection_manager()->server_status()) {
208 // Optimistically assume that the connection is fixed and try 209 // Optimistically assume that the connection is fixed and try
209 // connecting. 210 // connecting.
210 OnServerConnectionErrorFixed(); 211 OnServerConnectionErrorFixed();
211 } 212 }
212 } 213 }
213 214
214 void SyncSchedulerImpl::OnServerConnectionErrorFixed() { 215 void SyncSchedulerImpl::OnServerConnectionErrorFixed() {
215 // There could be a pending nudge or configuration job in several cases: 216 // There could be a pending nudge or configuration job in several cases:
216 // 217 //
217 // 1. We're in exponential backoff. 218 // 1. We're in exponential backoff.
218 // 2. We're silenced / throttled. 219 // 2. We're silenced / throttled.
219 // 3. A nudge was saved previously due to not having a valid auth token. 220 // 3. A nudge was saved previously due to not having a valid auth token.
220 // 4. A nudge was scheduled + saved while in configuration mode. 221 // 4. A nudge was scheduled + saved while in configuration mode.
221 // 222 //
222 // In all cases except (2), we want to retry contacting the server. We 223 // In all cases except (2), we want to retry contacting the server. We
223 // call TryCanaryJob to achieve this, and note that nothing -- not even a 224 // call TryCanaryJob to achieve this, and note that nothing -- not even a
224 // canary job -- can bypass a THROTTLED WaitInterval. The only thing that 225 // canary job -- can bypass a THROTTLED WaitInterval. The only thing that
225 // has the authority to do that is the Unthrottle timer. 226 // has the authority to do that is the Unthrottle timer.
226 TryCanaryJob(); 227 TryCanaryJob();
227 } 228 }
228 229
229 void SyncSchedulerImpl::Start(Mode mode, base::Time last_poll_time) { 230 void SyncSchedulerImpl::Start(Mode mode, base::Time last_poll_time) {
230 DCHECK(CalledOnValidThread()); 231 DCHECK(CalledOnValidThread());
231 std::string thread_name = base::PlatformThread::GetName(); 232 std::string thread_name = base::PlatformThread::GetName();
232 if (thread_name.empty()) 233 if (thread_name.empty())
233 thread_name = "<Main thread>"; 234 thread_name = "<Main thread>";
234 SDVLOG(2) << "Start called from thread " 235 SDVLOG(2) << "Start called from thread " << thread_name << " with mode "
235 << thread_name << " with mode " << GetModeString(mode); 236 << GetModeString(mode);
236 if (!started_) { 237 if (!started_) {
237 started_ = true; 238 started_ = true;
238 SendInitialSnapshot(); 239 SendInitialSnapshot();
239 } 240 }
240 241
241 DCHECK(syncer_.get()); 242 DCHECK(syncer_.get());
242 243
243 if (mode == CLEAR_SERVER_DATA_MODE) { 244 if (mode == CLEAR_SERVER_DATA_MODE) {
244 DCHECK_EQ(mode_, CONFIGURATION_MODE); 245 DCHECK_EQ(mode_, CONFIGURATION_MODE);
245 } 246 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 ModelTypeSet throttled_types = nudge_tracker_.GetThrottledTypes(); 279 ModelTypeSet throttled_types = nudge_tracker_.GetThrottledTypes();
279 return Difference(enabled_protocol_types, throttled_types); 280 return Difference(enabled_protocol_types, throttled_types);
280 } 281 }
281 282
282 void SyncSchedulerImpl::SendInitialSnapshot() { 283 void SyncSchedulerImpl::SendInitialSnapshot() {
283 DCHECK(CalledOnValidThread()); 284 DCHECK(CalledOnValidThread());
284 std::unique_ptr<SyncSession> dummy( 285 std::unique_ptr<SyncSession> dummy(
285 SyncSession::Build(session_context_, this)); 286 SyncSession::Build(session_context_, this));
286 SyncCycleEvent event(SyncCycleEvent::STATUS_CHANGED); 287 SyncCycleEvent event(SyncCycleEvent::STATUS_CHANGED);
287 event.snapshot = dummy->TakeSnapshot(); 288 event.snapshot = dummy->TakeSnapshot();
288 FOR_EACH_OBSERVER(SyncEngineEventListener, 289 FOR_EACH_OBSERVER(SyncEngineEventListener, *session_context_->listeners(),
289 *session_context_->listeners(),
290 OnSyncCycleEvent(event)); 290 OnSyncCycleEvent(event));
291 } 291 }
292 292
293 namespace { 293 namespace {
294 294
295 // Helper to extract the routing info corresponding to types in 295 // Helper to extract the routing info corresponding to types in
296 // |types_to_download| from |current_routes|. 296 // |types_to_download| from |current_routes|.
297 void BuildModelSafeParams( 297 void BuildModelSafeParams(ModelTypeSet types_to_download,
298 ModelTypeSet types_to_download, 298 const ModelSafeRoutingInfo& current_routes,
299 const ModelSafeRoutingInfo& current_routes, 299 ModelSafeRoutingInfo* result_routes) {
300 ModelSafeRoutingInfo* result_routes) {
301 for (ModelTypeSet::Iterator iter = types_to_download.First(); iter.Good(); 300 for (ModelTypeSet::Iterator iter = types_to_download.First(); iter.Good();
302 iter.Inc()) { 301 iter.Inc()) {
303 ModelType type = iter.Get(); 302 ModelType type = iter.Get();
304 ModelSafeRoutingInfo::const_iterator route = current_routes.find(type); 303 ModelSafeRoutingInfo::const_iterator route = current_routes.find(type);
305 DCHECK(route != current_routes.end()); 304 DCHECK(route != current_routes.end());
306 ModelSafeGroup group = route->second; 305 ModelSafeGroup group = route->second;
307 (*result_routes)[type] = group; 306 (*result_routes)[type] = group;
308 } 307 }
309 } 308 }
310 309
311 } // namespace. 310 } // namespace.
312 311
313 void SyncSchedulerImpl::ScheduleConfiguration( 312 void SyncSchedulerImpl::ScheduleConfiguration(
314 const ConfigurationParams& params) { 313 const ConfigurationParams& params) {
315 DCHECK(CalledOnValidThread()); 314 DCHECK(CalledOnValidThread());
316 DCHECK(IsConfigRelatedUpdateSourceValue(params.source)); 315 DCHECK(IsConfigRelatedUpdateSourceValue(params.source));
317 DCHECK_EQ(CONFIGURATION_MODE, mode_); 316 DCHECK_EQ(CONFIGURATION_MODE, mode_);
318 DCHECK(!params.ready_task.is_null()); 317 DCHECK(!params.ready_task.is_null());
319 CHECK(started_) << "Scheduler must be running to configure."; 318 CHECK(started_) << "Scheduler must be running to configure.";
320 SDVLOG(2) << "Reconfiguring syncer."; 319 SDVLOG(2) << "Reconfiguring syncer.";
321 320
322 // Only one configuration is allowed at a time. Verify we're not waiting 321 // Only one configuration is allowed at a time. Verify we're not waiting
323 // for a pending configure job. 322 // for a pending configure job.
324 DCHECK(!pending_configure_params_); 323 DCHECK(!pending_configure_params_);
325 324
326 ModelSafeRoutingInfo restricted_routes; 325 ModelSafeRoutingInfo restricted_routes;
327 BuildModelSafeParams(params.types_to_download, 326 BuildModelSafeParams(params.types_to_download, params.routing_info,
328 params.routing_info,
329 &restricted_routes); 327 &restricted_routes);
330 session_context_->SetRoutingInfo(restricted_routes); 328 session_context_->SetRoutingInfo(restricted_routes);
331 329
332 // Only reconfigure if we have types to download. 330 // Only reconfigure if we have types to download.
333 if (!params.types_to_download.Empty()) { 331 if (!params.types_to_download.Empty()) {
334 pending_configure_params_.reset(new ConfigurationParams(params)); 332 pending_configure_params_.reset(new ConfigurationParams(params));
335 TrySyncSessionJob(); 333 TrySyncSessionJob();
336 } else { 334 } else {
337 SDVLOG(2) << "No change in routing info, calling ready task directly."; 335 SDVLOG(2) << "No change in routing info, calling ready task directly.";
338 params.ready_task.Run(); 336 params.ready_task.Run();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 388
391 return true; 389 return true;
392 } 390 }
393 391
394 void SyncSchedulerImpl::ScheduleLocalNudge( 392 void SyncSchedulerImpl::ScheduleLocalNudge(
395 ModelTypeSet types, 393 ModelTypeSet types,
396 const tracked_objects::Location& nudge_location) { 394 const tracked_objects::Location& nudge_location) {
397 DCHECK(CalledOnValidThread()); 395 DCHECK(CalledOnValidThread());
398 DCHECK(!types.Empty()); 396 DCHECK(!types.Empty());
399 397
400 SDVLOG_LOC(nudge_location, 2) 398 SDVLOG_LOC(nudge_location, 2) << "Scheduling sync because of local change to "
401 << "Scheduling sync because of local change to " 399 << ModelTypeSetToString(types);
402 << ModelTypeSetToString(types);
403 UpdateNudgeTimeRecords(types); 400 UpdateNudgeTimeRecords(types);
404 base::TimeDelta nudge_delay = nudge_tracker_.RecordLocalChange(types); 401 base::TimeDelta nudge_delay = nudge_tracker_.RecordLocalChange(types);
405 ScheduleNudgeImpl(nudge_delay, nudge_location); 402 ScheduleNudgeImpl(nudge_delay, nudge_location);
406 } 403 }
407 404
408 void SyncSchedulerImpl::ScheduleLocalRefreshRequest( 405 void SyncSchedulerImpl::ScheduleLocalRefreshRequest(
409 ModelTypeSet types, 406 ModelTypeSet types,
410 const tracked_objects::Location& nudge_location) { 407 const tracked_objects::Location& nudge_location) {
411 DCHECK(CalledOnValidThread()); 408 DCHECK(CalledOnValidThread());
412 DCHECK(!types.Empty()); 409 DCHECK(!types.Empty());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 const tracked_objects::Location& nudge_location) { 445 const tracked_objects::Location& nudge_location) {
449 DCHECK(CalledOnValidThread()); 446 DCHECK(CalledOnValidThread());
450 CHECK(!syncer_->IsSyncing()); 447 CHECK(!syncer_->IsSyncing());
451 448
452 if (!started_) { 449 if (!started_) {
453 SDVLOG_LOC(nudge_location, 2) 450 SDVLOG_LOC(nudge_location, 2)
454 << "Dropping nudge, scheduler is not running."; 451 << "Dropping nudge, scheduler is not running.";
455 return; 452 return;
456 } 453 }
457 454
458 SDVLOG_LOC(nudge_location, 2) 455 SDVLOG_LOC(nudge_location, 2) << "In ScheduleNudgeImpl with delay "
459 << "In ScheduleNudgeImpl with delay " 456 << delay.InMilliseconds() << " ms";
460 << delay.InMilliseconds() << " ms";
461 457
462 if (!CanRunNudgeJobNow(NORMAL_PRIORITY)) 458 if (!CanRunNudgeJobNow(NORMAL_PRIORITY))
463 return; 459 return;
464 460
465 TimeTicks incoming_run_time = TimeTicks::Now() + delay; 461 TimeTicks incoming_run_time = TimeTicks::Now() + delay;
466 if (!scheduled_nudge_time_.is_null() && 462 if (!scheduled_nudge_time_.is_null() &&
467 (scheduled_nudge_time_ < incoming_run_time)) { 463 (scheduled_nudge_time_ < incoming_run_time)) {
468 // Old job arrives sooner than this one. Don't reschedule it. 464 // Old job arrives sooner than this one. Don't reschedule it.
469 return; 465 return;
470 } 466 }
471 467
472 // Either there is no existing nudge in flight or the incoming nudge should be 468 // Either there is no existing nudge in flight or the incoming nudge should be
473 // made to arrive first (preempt) the existing nudge. We reschedule in either 469 // made to arrive first (preempt) the existing nudge. We reschedule in either
474 // case. 470 // case.
475 SDVLOG_LOC(nudge_location, 2) 471 SDVLOG_LOC(nudge_location, 2) << "Scheduling a nudge with "
476 << "Scheduling a nudge with " 472 << delay.InMilliseconds() << " ms delay";
477 << delay.InMilliseconds() << " ms delay";
478 scheduled_nudge_time_ = incoming_run_time; 473 scheduled_nudge_time_ = incoming_run_time;
479 pending_wakeup_timer_.Start( 474 pending_wakeup_timer_.Start(
480 nudge_location, 475 nudge_location, delay, base::Bind(&SyncSchedulerImpl::PerformDelayedNudge,
481 delay, 476 weak_ptr_factory_.GetWeakPtr()));
482 base::Bind(&SyncSchedulerImpl::PerformDelayedNudge,
483 weak_ptr_factory_.GetWeakPtr()));
484 } 477 }
485 478
486 const char* SyncSchedulerImpl::GetModeString(SyncScheduler::Mode mode) { 479 const char* SyncSchedulerImpl::GetModeString(SyncScheduler::Mode mode) {
487 switch (mode) { 480 switch (mode) {
488 ENUM_CASE(CONFIGURATION_MODE); 481 ENUM_CASE(CONFIGURATION_MODE);
489 ENUM_CASE(CLEAR_SERVER_DATA_MODE); 482 ENUM_CASE(CLEAR_SERVER_DATA_MODE);
490 ENUM_CASE(NORMAL_MODE); 483 ENUM_CASE(NORMAL_MODE);
491 } 484 }
492 return ""; 485 return "";
493 } 486 }
494 487
495 void SyncSchedulerImpl::SetDefaultNudgeDelay(base::TimeDelta delay_ms) { 488 void SyncSchedulerImpl::SetDefaultNudgeDelay(base::TimeDelta delay_ms) {
496 DCHECK(CalledOnValidThread()); 489 DCHECK(CalledOnValidThread());
497 nudge_tracker_.SetDefaultNudgeDelay(delay_ms); 490 nudge_tracker_.SetDefaultNudgeDelay(delay_ms);
498 } 491 }
499 492
500 void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) { 493 void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) {
501 DCHECK(CalledOnValidThread()); 494 DCHECK(CalledOnValidThread());
502 DCHECK(CanRunNudgeJobNow(priority)); 495 DCHECK(CanRunNudgeJobNow(priority));
503 496
504 DVLOG(2) << "Will run normal mode sync cycle with types " 497 DVLOG(2) << "Will run normal mode sync cycle with types "
505 << ModelTypeSetToString(session_context_->GetEnabledTypes()); 498 << ModelTypeSetToString(session_context_->GetEnabledTypes());
506 std::unique_ptr<SyncSession> session( 499 std::unique_ptr<SyncSession> session(
507 SyncSession::Build(session_context_, this)); 500 SyncSession::Build(session_context_, this));
508 bool success = syncer_->NormalSyncShare( 501 bool success = syncer_->NormalSyncShare(GetEnabledAndUnthrottledTypes(),
509 GetEnabledAndUnthrottledTypes(), &nudge_tracker_, session.get()); 502 &nudge_tracker_, session.get());
510 503
511 if (success) { 504 if (success) {
512 // That cycle took care of any outstanding work we had. 505 // That cycle took care of any outstanding work we had.
513 SDVLOG(2) << "Nudge succeeded."; 506 SDVLOG(2) << "Nudge succeeded.";
514 nudge_tracker_.RecordSuccessfulSyncCycle(); 507 nudge_tracker_.RecordSuccessfulSyncCycle();
515 scheduled_nudge_time_ = base::TimeTicks(); 508 scheduled_nudge_time_ = base::TimeTicks();
516 HandleSuccess(); 509 HandleSuccess();
517 510
518 // If this was a canary, we may need to restart the poll timer (the poll 511 // If this was a canary, we may need to restart the poll timer (the poll
519 // timer may have fired while the scheduler was in an error state, ignoring 512 // timer may have fired while the scheduler was in an error state, ignoring
(...skipping 17 matching lines...) Expand all
537 RunAndReset(&pending_configure_params_->retry_task); 530 RunAndReset(&pending_configure_params_->retry_task);
538 return; 531 return;
539 } 532 }
540 533
541 SDVLOG(2) << "Will run configure SyncShare with types " 534 SDVLOG(2) << "Will run configure SyncShare with types "
542 << ModelTypeSetToString(session_context_->GetEnabledTypes()); 535 << ModelTypeSetToString(session_context_->GetEnabledTypes());
543 std::unique_ptr<SyncSession> session( 536 std::unique_ptr<SyncSession> session(
544 SyncSession::Build(session_context_, this)); 537 SyncSession::Build(session_context_, this));
545 bool success = syncer_->ConfigureSyncShare( 538 bool success = syncer_->ConfigureSyncShare(
546 pending_configure_params_->types_to_download, 539 pending_configure_params_->types_to_download,
547 pending_configure_params_->source, 540 pending_configure_params_->source, session.get());
548 session.get());
549 541
550 if (success) { 542 if (success) {
551 SDVLOG(2) << "Configure succeeded."; 543 SDVLOG(2) << "Configure succeeded.";
552 pending_configure_params_->ready_task.Run(); 544 pending_configure_params_->ready_task.Run();
553 pending_configure_params_.reset(); 545 pending_configure_params_.reset();
554 HandleSuccess(); 546 HandleSuccess();
555 } else { 547 } else {
556 HandleFailure(session->status_controller().model_neutral_state()); 548 HandleFailure(session->status_controller().model_neutral_state());
557 // Sync cycle might receive response from server that causes scheduler to 549 // Sync cycle might receive response from server that causes scheduler to
558 // stop and draws pending_configure_params_ invalid. 550 // stop and draws pending_configure_params_ invalid.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 const sessions::ModelNeutralState& model_neutral_state) { 587 const sessions::ModelNeutralState& model_neutral_state) {
596 if (IsCurrentlyThrottled()) { 588 if (IsCurrentlyThrottled()) {
597 SDVLOG(2) << "Was throttled during previous sync cycle."; 589 SDVLOG(2) << "Was throttled during previous sync cycle.";
598 } else if (!IsBackingOff()) { 590 } else if (!IsBackingOff()) {
599 // Setup our backoff if this is our first such failure. 591 // Setup our backoff if this is our first such failure.
600 TimeDelta length = delay_provider_->GetDelay( 592 TimeDelta length = delay_provider_->GetDelay(
601 delay_provider_->GetInitialDelay(model_neutral_state)); 593 delay_provider_->GetInitialDelay(model_neutral_state));
602 wait_interval_.reset( 594 wait_interval_.reset(
603 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); 595 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length));
604 SDVLOG(2) << "Sync cycle failed. Will back off for " 596 SDVLOG(2) << "Sync cycle failed. Will back off for "
605 << wait_interval_->length.InMilliseconds() << "ms."; 597 << wait_interval_->length.InMilliseconds() << "ms.";
606 } else { 598 } else {
607 // Increase our backoff interval and schedule another retry. 599 // Increase our backoff interval and schedule another retry.
608 TimeDelta length = delay_provider_->GetDelay(wait_interval_->length); 600 TimeDelta length = delay_provider_->GetDelay(wait_interval_->length);
609 wait_interval_.reset( 601 wait_interval_.reset(
610 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); 602 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length));
611 SDVLOG(2) << "Sync cycle failed. Will back off for " 603 SDVLOG(2) << "Sync cycle failed. Will back off for "
612 << wait_interval_->length.InMilliseconds() << "ms."; 604 << wait_interval_->length.InMilliseconds() << "ms.";
613 } 605 }
614 RestartWaiting(); 606 RestartWaiting();
615 } 607 }
616 608
617 void SyncSchedulerImpl::DoPollSyncSessionJob() { 609 void SyncSchedulerImpl::DoPollSyncSessionJob() {
618 SDVLOG(2) << "Polling with types " 610 SDVLOG(2) << "Polling with types "
619 << ModelTypeSetToString(GetEnabledAndUnthrottledTypes()); 611 << ModelTypeSetToString(GetEnabledAndUnthrottledTypes());
620 std::unique_ptr<SyncSession> session( 612 std::unique_ptr<SyncSession> session(
621 SyncSession::Build(session_context_, this)); 613 SyncSession::Build(session_context_, this));
622 bool success = syncer_->PollSyncShare( 614 bool success =
623 GetEnabledAndUnthrottledTypes(), 615 syncer_->PollSyncShare(GetEnabledAndUnthrottledTypes(), session.get());
624 session.get());
625 616
626 // Only restart the timer if the poll succeeded. Otherwise rely on normal 617 // Only restart the timer if the poll succeeded. Otherwise rely on normal
627 // failure handling to retry with backoff. 618 // failure handling to retry with backoff.
628 if (success) { 619 if (success) {
629 AdjustPolling(FORCE_RESET); 620 AdjustPolling(FORCE_RESET);
630 HandleSuccess(); 621 HandleSuccess();
631 } else { 622 } else {
632 HandleFailure(session->status_controller().model_neutral_state()); 623 HandleFailure(session->status_controller().model_neutral_state());
633 } 624 }
634 } 625 }
635 626
636 void SyncSchedulerImpl::UpdateNudgeTimeRecords(ModelTypeSet types) { 627 void SyncSchedulerImpl::UpdateNudgeTimeRecords(ModelTypeSet types) {
637 DCHECK(CalledOnValidThread()); 628 DCHECK(CalledOnValidThread());
638 base::TimeTicks now = TimeTicks::Now(); 629 base::TimeTicks now = TimeTicks::Now();
639 // Update timing information for how often datatypes are triggering nudges. 630 // Update timing information for how often datatypes are triggering nudges.
640 for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { 631 for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) {
641 base::TimeTicks previous = last_local_nudges_by_model_type_[iter.Get()]; 632 base::TimeTicks previous = last_local_nudges_by_model_type_[iter.Get()];
642 last_local_nudges_by_model_type_[iter.Get()] = now; 633 last_local_nudges_by_model_type_[iter.Get()] = now;
643 if (previous.is_null()) 634 if (previous.is_null())
644 continue; 635 continue;
645 636
646 #define PER_DATA_TYPE_MACRO(type_str) \ 637 #define PER_DATA_TYPE_MACRO(type_str) \
647 SYNC_FREQ_HISTOGRAM("Sync.Freq" type_str, now - previous); 638 SYNC_FREQ_HISTOGRAM("Sync.Freq" type_str, now - previous);
648 SYNC_DATA_TYPE_HISTOGRAM(iter.Get()); 639 SYNC_DATA_TYPE_HISTOGRAM(iter.Get());
649 #undef PER_DATA_TYPE_MACRO 640 #undef PER_DATA_TYPE_MACRO
650 } 641 }
651 } 642 }
652 643
653 TimeDelta SyncSchedulerImpl::GetPollInterval() { 644 TimeDelta SyncSchedulerImpl::GetPollInterval() {
654 return (!session_context_->notifications_enabled() || 645 return (!session_context_->notifications_enabled() ||
655 !session_context_->ShouldFetchUpdatesBeforeCommit()) ? 646 !session_context_->ShouldFetchUpdatesBeforeCommit())
656 syncer_short_poll_interval_seconds_ : 647 ? syncer_short_poll_interval_seconds_
657 syncer_long_poll_interval_seconds_; 648 : syncer_long_poll_interval_seconds_;
658 } 649 }
659 650
660 void SyncSchedulerImpl::AdjustPolling(PollAdjustType type) { 651 void SyncSchedulerImpl::AdjustPolling(PollAdjustType type) {
661 DCHECK(CalledOnValidThread()); 652 DCHECK(CalledOnValidThread());
662 if (!started_) 653 if (!started_)
663 return; 654 return;
664 655
665 TimeDelta poll_interval = GetPollInterval(); 656 TimeDelta poll_interval = GetPollInterval();
666 TimeDelta poll_delay = poll_interval; 657 TimeDelta poll_delay = poll_interval;
667 const TimeTicks now = TimeTicks::Now(); 658 const TimeTicks now = TimeTicks::Now();
(...skipping 30 matching lines...) Expand all
698 // Adjust poll rate. Start will reset the timer if it was already running. 689 // Adjust poll rate. Start will reset the timer if it was already running.
699 poll_timer_.Start(FROM_HERE, poll_delay, this, 690 poll_timer_.Start(FROM_HERE, poll_delay, this,
700 &SyncSchedulerImpl::PollTimerCallback); 691 &SyncSchedulerImpl::PollTimerCallback);
701 } 692 }
702 693
703 void SyncSchedulerImpl::RestartWaiting() { 694 void SyncSchedulerImpl::RestartWaiting() {
704 CHECK(wait_interval_.get()); 695 CHECK(wait_interval_.get());
705 DCHECK(wait_interval_->length >= TimeDelta::FromSeconds(0)); 696 DCHECK(wait_interval_->length >= TimeDelta::FromSeconds(0));
706 NotifyRetryTime(base::Time::Now() + wait_interval_->length); 697 NotifyRetryTime(base::Time::Now() + wait_interval_->length);
707 SDVLOG(2) << "Starting WaitInterval timer of length " 698 SDVLOG(2) << "Starting WaitInterval timer of length "
708 << wait_interval_->length.InMilliseconds() << "ms."; 699 << wait_interval_->length.InMilliseconds() << "ms.";
709 if (wait_interval_->mode == WaitInterval::THROTTLED) { 700 if (wait_interval_->mode == WaitInterval::THROTTLED) {
710 pending_wakeup_timer_.Start( 701 pending_wakeup_timer_.Start(FROM_HERE, wait_interval_->length,
711 FROM_HERE, 702 base::Bind(&SyncSchedulerImpl::Unthrottle,
712 wait_interval_->length, 703 weak_ptr_factory_.GetWeakPtr()));
713 base::Bind(&SyncSchedulerImpl::Unthrottle,
714 weak_ptr_factory_.GetWeakPtr()));
715 } else { 704 } else {
716 pending_wakeup_timer_.Start( 705 pending_wakeup_timer_.Start(
717 FROM_HERE, 706 FROM_HERE, wait_interval_->length,
718 wait_interval_->length,
719 base::Bind(&SyncSchedulerImpl::ExponentialBackoffRetry, 707 base::Bind(&SyncSchedulerImpl::ExponentialBackoffRetry,
720 weak_ptr_factory_.GetWeakPtr())); 708 weak_ptr_factory_.GetWeakPtr()));
721 } 709 }
722 } 710 }
723 711
724 void SyncSchedulerImpl::Stop() { 712 void SyncSchedulerImpl::Stop() {
725 DCHECK(CalledOnValidThread()); 713 DCHECK(CalledOnValidThread());
726 SDVLOG(2) << "Stop called"; 714 SDVLOG(2) << "Stop called";
727 715
728 // Kill any in-flight method calls. 716 // Kill any in-flight method calls.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 } 774 }
787 775
788 if (IsBackingOff() && !pending_wakeup_timer_.IsRunning()) { 776 if (IsBackingOff() && !pending_wakeup_timer_.IsRunning()) {
789 // If we succeeded, our wait interval would have been cleared. If it hasn't 777 // If we succeeded, our wait interval would have been cleared. If it hasn't
790 // been cleared, then we should increase our backoff interval and schedule 778 // been cleared, then we should increase our backoff interval and schedule
791 // another retry. 779 // another retry.
792 TimeDelta length = delay_provider_->GetDelay(wait_interval_->length); 780 TimeDelta length = delay_provider_->GetDelay(wait_interval_->length);
793 wait_interval_.reset( 781 wait_interval_.reset(
794 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length)); 782 new WaitInterval(WaitInterval::EXPONENTIAL_BACKOFF, length));
795 SDVLOG(2) << "Sync cycle failed. Will back off for " 783 SDVLOG(2) << "Sync cycle failed. Will back off for "
796 << wait_interval_->length.InMilliseconds() << "ms."; 784 << wait_interval_->length.InMilliseconds() << "ms.";
797 RestartWaiting(); 785 RestartWaiting();
798 } 786 }
799 } 787 }
800 788
801 void SyncSchedulerImpl::PollTimerCallback() { 789 void SyncSchedulerImpl::PollTimerCallback() {
802 DCHECK(CalledOnValidThread()); 790 DCHECK(CalledOnValidThread());
803 CHECK(!syncer_->IsSyncing()); 791 CHECK(!syncer_->IsSyncing());
804 792
805 TrySyncSessionJob(); 793 TrySyncSessionJob();
806 } 794 }
(...skipping 21 matching lines...) Expand all
828 816
829 void SyncSchedulerImpl::TypeUnthrottle(base::TimeTicks unthrottle_time) { 817 void SyncSchedulerImpl::TypeUnthrottle(base::TimeTicks unthrottle_time) {
830 DCHECK(CalledOnValidThread()); 818 DCHECK(CalledOnValidThread());
831 nudge_tracker_.UpdateTypeThrottlingState(unthrottle_time); 819 nudge_tracker_.UpdateTypeThrottlingState(unthrottle_time);
832 NotifyThrottledTypesChanged(nudge_tracker_.GetThrottledTypes()); 820 NotifyThrottledTypesChanged(nudge_tracker_.GetThrottledTypes());
833 821
834 if (nudge_tracker_.IsAnyTypeThrottled()) { 822 if (nudge_tracker_.IsAnyTypeThrottled()) {
835 const base::TimeTicks now = base::TimeTicks::Now(); 823 const base::TimeTicks now = base::TimeTicks::Now();
836 base::TimeDelta time_until_next_unthrottle = 824 base::TimeDelta time_until_next_unthrottle =
837 nudge_tracker_.GetTimeUntilNextUnthrottle(now); 825 nudge_tracker_.GetTimeUntilNextUnthrottle(now);
838 type_unthrottle_timer_.Start( 826 type_unthrottle_timer_.Start(FROM_HERE, time_until_next_unthrottle,
839 FROM_HERE, 827 base::Bind(&SyncSchedulerImpl::TypeUnthrottle,
840 time_until_next_unthrottle, 828 weak_ptr_factory_.GetWeakPtr(),
841 base::Bind(&SyncSchedulerImpl::TypeUnthrottle, 829 now + time_until_next_unthrottle));
842 weak_ptr_factory_.GetWeakPtr(),
843 now + time_until_next_unthrottle));
844 } 830 }
845 831
846 // Maybe this is a good time to run a nudge job. Let's try it. 832 // Maybe this is a good time to run a nudge job. Let's try it.
847 if (nudge_tracker_.IsSyncRequired() && CanRunNudgeJobNow(NORMAL_PRIORITY)) 833 if (nudge_tracker_.IsSyncRequired() && CanRunNudgeJobNow(NORMAL_PRIORITY))
848 TrySyncSessionJob(); 834 TrySyncSessionJob();
849 } 835 }
850 836
851 void SyncSchedulerImpl::PerformDelayedNudge() { 837 void SyncSchedulerImpl::PerformDelayedNudge() {
852 // Circumstances may have changed since we scheduled this delayed nudge. 838 // Circumstances may have changed since we scheduled this delayed nudge.
853 // We must check to see if it's OK to run the job before we do so. 839 // We must check to see if it's OK to run the job before we do so.
854 if (CanRunNudgeJobNow(NORMAL_PRIORITY)) 840 if (CanRunNudgeJobNow(NORMAL_PRIORITY))
855 TrySyncSessionJob(); 841 TrySyncSessionJob();
856 842
857 // We're not responsible for setting up any retries here. The functions that 843 // We're not responsible for setting up any retries here. The functions that
858 // first put us into a state that prevents successful sync cycles (eg. global 844 // first put us into a state that prevents successful sync cycles (eg. global
859 // throttling, type throttling, network errors, transient errors) will also 845 // throttling, type throttling, network errors, transient errors) will also
860 // setup the appropriate retry logic (eg. retry after timeout, exponential 846 // setup the appropriate retry logic (eg. retry after timeout, exponential
861 // backoff, retry when the network changes). 847 // backoff, retry when the network changes).
862 } 848 }
863 849
864 void SyncSchedulerImpl::ExponentialBackoffRetry() { 850 void SyncSchedulerImpl::ExponentialBackoffRetry() {
865 TryCanaryJob(); 851 TryCanaryJob();
866 } 852 }
867 853
868 void SyncSchedulerImpl::NotifyRetryTime(base::Time retry_time) { 854 void SyncSchedulerImpl::NotifyRetryTime(base::Time retry_time) {
869 FOR_EACH_OBSERVER(SyncEngineEventListener, 855 FOR_EACH_OBSERVER(SyncEngineEventListener, *session_context_->listeners(),
870 *session_context_->listeners(),
871 OnRetryTimeChanged(retry_time)); 856 OnRetryTimeChanged(retry_time));
872 } 857 }
873 858
874 void SyncSchedulerImpl::NotifyThrottledTypesChanged(ModelTypeSet types) { 859 void SyncSchedulerImpl::NotifyThrottledTypesChanged(ModelTypeSet types) {
875 FOR_EACH_OBSERVER(SyncEngineEventListener, 860 FOR_EACH_OBSERVER(SyncEngineEventListener, *session_context_->listeners(),
876 *session_context_->listeners(),
877 OnThrottledTypesChanged(types)); 861 OnThrottledTypesChanged(types));
878 } 862 }
879 863
880 bool SyncSchedulerImpl::IsBackingOff() const { 864 bool SyncSchedulerImpl::IsBackingOff() const {
881 DCHECK(CalledOnValidThread()); 865 DCHECK(CalledOnValidThread());
882 return wait_interval_.get() && wait_interval_->mode == 866 return wait_interval_.get() &&
883 WaitInterval::EXPONENTIAL_BACKOFF; 867 wait_interval_->mode == WaitInterval::EXPONENTIAL_BACKOFF;
884 } 868 }
885 869
886 void SyncSchedulerImpl::OnThrottled(const base::TimeDelta& throttle_duration) { 870 void SyncSchedulerImpl::OnThrottled(const base::TimeDelta& throttle_duration) {
887 DCHECK(CalledOnValidThread()); 871 DCHECK(CalledOnValidThread());
888 wait_interval_.reset(new WaitInterval(WaitInterval::THROTTLED, 872 wait_interval_.reset(
889 throttle_duration)); 873 new WaitInterval(WaitInterval::THROTTLED, throttle_duration));
890 NotifyRetryTime(base::Time::Now() + wait_interval_->length); 874 NotifyRetryTime(base::Time::Now() + wait_interval_->length);
891 NotifyThrottledTypesChanged(ModelTypeSet::All()); 875 NotifyThrottledTypesChanged(ModelTypeSet::All());
892 } 876 }
893 877
894 void SyncSchedulerImpl::OnTypesThrottled( 878 void SyncSchedulerImpl::OnTypesThrottled(
895 ModelTypeSet types, 879 ModelTypeSet types,
896 const base::TimeDelta& throttle_duration) { 880 const base::TimeDelta& throttle_duration) {
897 base::TimeTicks now = base::TimeTicks::Now(); 881 base::TimeTicks now = base::TimeTicks::Now();
898 882
899 SDVLOG(1) << "Throttling " << ModelTypeSetToString(types) << " for " 883 SDVLOG(1) << "Throttling " << ModelTypeSetToString(types) << " for "
900 << throttle_duration.InMinutes() << " minutes."; 884 << throttle_duration.InMinutes() << " minutes.";
901 885
902 nudge_tracker_.SetTypesThrottledUntil(types, throttle_duration, now); 886 nudge_tracker_.SetTypesThrottledUntil(types, throttle_duration, now);
903 base::TimeDelta time_until_next_unthrottle = 887 base::TimeDelta time_until_next_unthrottle =
904 nudge_tracker_.GetTimeUntilNextUnthrottle(now); 888 nudge_tracker_.GetTimeUntilNextUnthrottle(now);
905 type_unthrottle_timer_.Start( 889 type_unthrottle_timer_.Start(FROM_HERE, time_until_next_unthrottle,
906 FROM_HERE, 890 base::Bind(&SyncSchedulerImpl::TypeUnthrottle,
907 time_until_next_unthrottle, 891 weak_ptr_factory_.GetWeakPtr(),
908 base::Bind(&SyncSchedulerImpl::TypeUnthrottle, 892 now + time_until_next_unthrottle));
909 weak_ptr_factory_.GetWeakPtr(),
910 now + time_until_next_unthrottle));
911 NotifyThrottledTypesChanged(nudge_tracker_.GetThrottledTypes()); 893 NotifyThrottledTypesChanged(nudge_tracker_.GetThrottledTypes());
912 } 894 }
913 895
914 bool SyncSchedulerImpl::IsCurrentlyThrottled() { 896 bool SyncSchedulerImpl::IsCurrentlyThrottled() {
915 DCHECK(CalledOnValidThread()); 897 DCHECK(CalledOnValidThread());
916 return wait_interval_.get() && wait_interval_->mode == 898 return wait_interval_.get() &&
917 WaitInterval::THROTTLED; 899 wait_interval_->mode == WaitInterval::THROTTLED;
918 } 900 }
919 901
920 void SyncSchedulerImpl::OnReceivedShortPollIntervalUpdate( 902 void SyncSchedulerImpl::OnReceivedShortPollIntervalUpdate(
921 const base::TimeDelta& new_interval) { 903 const base::TimeDelta& new_interval) {
922 DCHECK(CalledOnValidThread()); 904 DCHECK(CalledOnValidThread());
923 if (new_interval == syncer_short_poll_interval_seconds_) 905 if (new_interval == syncer_short_poll_interval_seconds_)
924 return; 906 return;
925 SDVLOG(1) << "Updating short poll interval to " << new_interval.InMinutes() 907 SDVLOG(1) << "Updating short poll interval to " << new_interval.InMinutes()
926 << " minutes."; 908 << " minutes.";
927 syncer_short_poll_interval_seconds_ = new_interval; 909 syncer_short_poll_interval_seconds_ = new_interval;
(...skipping 26 matching lines...) Expand all
954 936
955 void SyncSchedulerImpl::OnSyncProtocolError( 937 void SyncSchedulerImpl::OnSyncProtocolError(
956 const SyncProtocolError& sync_protocol_error) { 938 const SyncProtocolError& sync_protocol_error) {
957 DCHECK(CalledOnValidThread()); 939 DCHECK(CalledOnValidThread());
958 if (ShouldRequestEarlyExit(sync_protocol_error)) { 940 if (ShouldRequestEarlyExit(sync_protocol_error)) {
959 SDVLOG(2) << "Sync Scheduler requesting early exit."; 941 SDVLOG(2) << "Sync Scheduler requesting early exit.";
960 Stop(); 942 Stop();
961 } 943 }
962 if (IsActionableError(sync_protocol_error)) { 944 if (IsActionableError(sync_protocol_error)) {
963 SDVLOG(2) << "OnActionableError"; 945 SDVLOG(2) << "OnActionableError";
964 FOR_EACH_OBSERVER(SyncEngineEventListener, 946 FOR_EACH_OBSERVER(SyncEngineEventListener, *session_context_->listeners(),
965 *session_context_->listeners(),
966 OnActionableError(sync_protocol_error)); 947 OnActionableError(sync_protocol_error));
967 } 948 }
968 } 949 }
969 950
970 void SyncSchedulerImpl::OnReceivedGuRetryDelay(const base::TimeDelta& delay) { 951 void SyncSchedulerImpl::OnReceivedGuRetryDelay(const base::TimeDelta& delay) {
971 nudge_tracker_.SetNextRetryTime(TimeTicks::Now() + delay); 952 nudge_tracker_.SetNextRetryTime(TimeTicks::Now() + delay);
972 retry_timer_.Start(FROM_HERE, delay, this, 953 retry_timer_.Start(FROM_HERE, delay, this,
973 &SyncSchedulerImpl::RetryTimerCallback); 954 &SyncSchedulerImpl::RetryTimerCallback);
974 } 955 }
975 956
976 void SyncSchedulerImpl::OnReceivedMigrationRequest(ModelTypeSet types) { 957 void SyncSchedulerImpl::OnReceivedMigrationRequest(ModelTypeSet types) {
977 FOR_EACH_OBSERVER(SyncEngineEventListener, 958 FOR_EACH_OBSERVER(SyncEngineEventListener, *session_context_->listeners(),
978 *session_context_->listeners(), 959 OnMigrationRequested(types));
979 OnMigrationRequested(types));
980 } 960 }
981 961
982 void SyncSchedulerImpl::SetNotificationsEnabled(bool notifications_enabled) { 962 void SyncSchedulerImpl::SetNotificationsEnabled(bool notifications_enabled) {
983 DCHECK(CalledOnValidThread()); 963 DCHECK(CalledOnValidThread());
984 session_context_->set_notifications_enabled(notifications_enabled); 964 session_context_->set_notifications_enabled(notifications_enabled);
985 if (notifications_enabled) 965 if (notifications_enabled)
986 nudge_tracker_.OnInvalidationsEnabled(); 966 nudge_tracker_.OnInvalidationsEnabled();
987 else 967 else
988 nudge_tracker_.OnInvalidationsDisabled(); 968 nudge_tracker_.OnInvalidationsDisabled();
989 } 969 }
990 970
991 #undef SDVLOG_LOC 971 #undef SDVLOG_LOC
992 972
993 #undef SDVLOG 973 #undef SDVLOG
994 974
995 #undef SLOG 975 #undef SLOG
996 976
997 #undef ENUM_CASE 977 #undef ENUM_CASE
998 978
999 } // namespace syncer 979 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/engine_impl/sync_scheduler_impl.h ('k') | components/sync/engine_impl/sync_scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698