OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/sessions/nudge_tracker.h" | 5 #include "components/sync/sessions_impl/nudge_tracker.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "sync/internal_api/public/engine/polling_constants.h" | 12 #include "components/sync/engine/polling_constants.h" |
13 #include "sync/protocol/sync.pb.h" | 13 #include "components/sync/protocol/sync.pb.h" |
14 | 14 |
15 namespace syncer { | 15 namespace syncer { |
16 namespace sessions { | 16 namespace sessions { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
20 // Delays for syncer nudges. | 20 // Delays for syncer nudges. |
21 const int kDefaultNudgeDelayMilliseconds = 200; | 21 const int kDefaultNudgeDelayMilliseconds = 200; |
22 const int kSlowNudgeDelayMilliseconds = 2000; | 22 const int kSlowNudgeDelayMilliseconds = 2000; |
23 const int kDefaultSessionsCommitDelaySeconds = 10; | 23 const int kDefaultSessionsCommitDelaySeconds = 10; |
24 const int kSyncRefreshDelayMilliseconds = 500; | 24 const int kSyncRefreshDelayMilliseconds = 500; |
25 const int kSyncSchedulerDelayMilliseconds = 250; | 25 const int kSyncSchedulerDelayMilliseconds = 250; |
26 | 26 |
27 base::TimeDelta GetDefaultDelayForType(ModelType model_type, | 27 base::TimeDelta GetDefaultDelayForType(ModelType model_type, |
28 base::TimeDelta minimum_delay) { | 28 base::TimeDelta minimum_delay) { |
29 switch (model_type) { | 29 switch (model_type) { |
30 case AUTOFILL: | 30 case AUTOFILL: |
31 // Accompany types rely on nudges from other types, and hence have long | 31 // Accompany types rely on nudges from other types, and hence have long |
32 // nudge delays. | 32 // nudge delays. |
33 return base::TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds); | 33 return base::TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds); |
34 case BOOKMARKS: | 34 case BOOKMARKS: |
35 case PREFERENCES: | 35 case PREFERENCES: |
36 // Types with sometimes automatic changes get longer delays to allow more | 36 // Types with sometimes automatic changes get longer delays to allow more |
37 // coalescing. | 37 // coalescing. |
38 return base::TimeDelta::FromMilliseconds(kSlowNudgeDelayMilliseconds); | 38 return base::TimeDelta::FromMilliseconds(kSlowNudgeDelayMilliseconds); |
39 case SESSIONS: | 39 case SESSIONS: |
40 case FAVICON_IMAGES: | 40 case FAVICON_IMAGES: |
41 case FAVICON_TRACKING: | 41 case FAVICON_TRACKING: |
42 // Types with navigation triggered changes get longer delays to allow more | 42 // Types with navigation triggered changes get longer delays to allow more |
43 // coalescing. | 43 // coalescing. |
44 return base::TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds); | 44 return base::TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds); |
45 default: | 45 default: |
46 return minimum_delay; | 46 return minimum_delay; |
47 } | 47 } |
48 } | 48 } |
49 | 49 |
50 } // namespace | 50 } // namespace |
51 | 51 |
52 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; | 52 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; |
53 | 53 |
54 NudgeTracker::NudgeTracker() | 54 NudgeTracker::NudgeTracker() |
55 : invalidations_enabled_(false), | 55 : invalidations_enabled_(false), |
56 invalidations_out_of_sync_(true), | 56 invalidations_out_of_sync_(true), |
57 minimum_local_nudge_delay_( | 57 minimum_local_nudge_delay_( |
58 base::TimeDelta::FromMilliseconds(kDefaultNudgeDelayMilliseconds)), | 58 base::TimeDelta::FromMilliseconds(kDefaultNudgeDelayMilliseconds)), |
59 local_refresh_nudge_delay_( | 59 local_refresh_nudge_delay_( |
60 base::TimeDelta::FromMilliseconds(kSyncRefreshDelayMilliseconds)), | 60 base::TimeDelta::FromMilliseconds(kSyncRefreshDelayMilliseconds)), |
61 remote_invalidation_nudge_delay_( | 61 remote_invalidation_nudge_delay_( |
62 base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMilliseconds)) { | 62 base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMilliseconds)) { |
63 ModelTypeSet protocol_types = ProtocolTypes(); | 63 ModelTypeSet protocol_types = ProtocolTypes(); |
64 // Default initialize all the type trackers. | 64 // Default initialize all the type trackers. |
65 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); | 65 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); |
66 it.Inc()) { | 66 it.Inc()) { |
67 type_trackers_.insert( | 67 type_trackers_.insert( |
68 std::make_pair(it.Get(), base::WrapUnique(new DataTypeTracker()))); | 68 std::make_pair(it.Get(), base::WrapUnique(new DataTypeTracker()))); |
69 } | 69 } |
70 } | 70 } |
71 | 71 |
72 NudgeTracker::~NudgeTracker() { } | 72 NudgeTracker::~NudgeTracker() {} |
73 | 73 |
74 bool NudgeTracker::IsSyncRequired() const { | 74 bool NudgeTracker::IsSyncRequired() const { |
75 if (IsRetryRequired()) | 75 if (IsRetryRequired()) |
76 return true; | 76 return true; |
77 | 77 |
78 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 78 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
79 it != type_trackers_.end(); ++it) { | 79 it != type_trackers_.end(); ++it) { |
80 if (it->second->IsSyncRequired()) { | 80 if (it->second->IsSyncRequired()) { |
81 return true; | 81 return true; |
82 } | 82 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); | 132 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); |
133 type_it.Inc()) { | 133 type_it.Inc()) { |
134 TypeTrackerMap::const_iterator tracker_it = | 134 TypeTrackerMap::const_iterator tracker_it = |
135 type_trackers_.find(type_it.Get()); | 135 type_trackers_.find(type_it.Get()); |
136 DCHECK(tracker_it != type_trackers_.end()); | 136 DCHECK(tracker_it != type_trackers_.end()); |
137 | 137 |
138 // Only if the type tracker has a valid delay (non-zero) that is shorter | 138 // Only if the type tracker has a valid delay (non-zero) that is shorter |
139 // than the calculated delay do we update the calculated delay. | 139 // than the calculated delay do we update the calculated delay. |
140 base::TimeDelta type_delay = tracker_it->second->RecordLocalChange(); | 140 base::TimeDelta type_delay = tracker_it->second->RecordLocalChange(); |
141 if (type_delay.is_zero()) { | 141 if (type_delay.is_zero()) { |
142 type_delay = GetDefaultDelayForType(type_it.Get(), | 142 type_delay = |
143 minimum_local_nudge_delay_); | 143 GetDefaultDelayForType(type_it.Get(), minimum_local_nudge_delay_); |
144 } | 144 } |
145 if (type_delay < delay) | 145 if (type_delay < delay) |
146 delay = type_delay; | 146 delay = type_delay; |
147 } | 147 } |
148 return delay; | 148 return delay; |
149 } | 149 } |
150 | 150 |
151 base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { | 151 base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { |
152 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | 152 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { |
153 TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get()); | 153 TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get()); |
(...skipping 27 matching lines...) Expand all Loading... |
181 | 181 |
182 void NudgeTracker::OnInvalidationsEnabled() { | 182 void NudgeTracker::OnInvalidationsEnabled() { |
183 invalidations_enabled_ = true; | 183 invalidations_enabled_ = true; |
184 } | 184 } |
185 | 185 |
186 void NudgeTracker::OnInvalidationsDisabled() { | 186 void NudgeTracker::OnInvalidationsDisabled() { |
187 invalidations_enabled_ = false; | 187 invalidations_enabled_ = false; |
188 invalidations_out_of_sync_ = true; | 188 invalidations_out_of_sync_ = true; |
189 } | 189 } |
190 | 190 |
191 void NudgeTracker::SetTypesThrottledUntil( | 191 void NudgeTracker::SetTypesThrottledUntil(ModelTypeSet types, |
192 ModelTypeSet types, | 192 base::TimeDelta length, |
193 base::TimeDelta length, | 193 base::TimeTicks now) { |
194 base::TimeTicks now) { | |
195 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | 194 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { |
196 TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get()); | 195 TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get()); |
197 tracker_it->second->ThrottleType(length, now); | 196 tracker_it->second->ThrottleType(length, now); |
198 } | 197 } |
199 } | 198 } |
200 | 199 |
201 void NudgeTracker::UpdateTypeThrottlingState(base::TimeTicks now) { | 200 void NudgeTracker::UpdateTypeThrottlingState(base::TimeTicks now) { |
202 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 201 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
203 it != type_trackers_.end(); ++it) { | 202 it != type_trackers_.end(); ++it) { |
204 it->second->UpdateThrottleState(now); | 203 it->second->UpdateThrottleState(now); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 return sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH; | 330 return sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH; |
332 } else if (has_commit_pending) { | 331 } else if (has_commit_pending) { |
333 return sync_pb::GetUpdatesCallerInfo::LOCAL; | 332 return sync_pb::GetUpdatesCallerInfo::LOCAL; |
334 } else if (has_retry) { | 333 } else if (has_retry) { |
335 return sync_pb::GetUpdatesCallerInfo::RETRY; | 334 return sync_pb::GetUpdatesCallerInfo::RETRY; |
336 } else { | 335 } else { |
337 return sync_pb::GetUpdatesCallerInfo::UNKNOWN; | 336 return sync_pb::GetUpdatesCallerInfo::UNKNOWN; |
338 } | 337 } |
339 } | 338 } |
340 | 339 |
341 void NudgeTracker::FillProtoMessage( | 340 void NudgeTracker::FillProtoMessage(ModelType type, |
342 ModelType type, | 341 sync_pb::GetUpdateTriggers* msg) const { |
343 sync_pb::GetUpdateTriggers* msg) const { | |
344 DCHECK(type_trackers_.find(type) != type_trackers_.end()); | 342 DCHECK(type_trackers_.find(type) != type_trackers_.end()); |
345 | 343 |
346 // Fill what we can from the global data. | 344 // Fill what we can from the global data. |
347 msg->set_invalidations_out_of_sync(invalidations_out_of_sync_); | 345 msg->set_invalidations_out_of_sync(invalidations_out_of_sync_); |
348 | 346 |
349 // Delegate the type-specific work to the DataTypeTracker class. | 347 // Delegate the type-specific work to the DataTypeTracker class. |
350 type_trackers_.find(type)->second->FillGetUpdatesTriggersMessage(msg); | 348 type_trackers_.find(type)->second->FillGetUpdatesTriggersMessage(msg); |
351 } | 349 } |
352 | 350 |
353 void NudgeTracker::SetSyncCycleStartTime(base::TimeTicks now) { | 351 void NudgeTracker::SetSyncCycleStartTime(base::TimeTicks now) { |
(...skipping 27 matching lines...) Expand all Loading... |
381 } | 379 } |
382 | 380 |
383 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { | 381 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { |
384 next_retry_time_ = retry_time; | 382 next_retry_time_ = retry_time; |
385 } | 383 } |
386 | 384 |
387 void NudgeTracker::OnReceivedCustomNudgeDelays( | 385 void NudgeTracker::OnReceivedCustomNudgeDelays( |
388 const std::map<ModelType, base::TimeDelta>& delay_map) { | 386 const std::map<ModelType, base::TimeDelta>& delay_map) { |
389 for (std::map<ModelType, base::TimeDelta>::const_iterator iter = | 387 for (std::map<ModelType, base::TimeDelta>::const_iterator iter = |
390 delay_map.begin(); | 388 delay_map.begin(); |
391 iter != delay_map.end(); | 389 iter != delay_map.end(); ++iter) { |
392 ++iter) { | |
393 ModelType type = iter->first; | 390 ModelType type = iter->first; |
394 DCHECK(syncer::ProtocolTypes().Has(type)); | 391 DCHECK(syncer::ProtocolTypes().Has(type)); |
395 TypeTrackerMap::const_iterator type_iter = type_trackers_.find(type); | 392 TypeTrackerMap::const_iterator type_iter = type_trackers_.find(type); |
396 if (type_iter == type_trackers_.end()) | 393 if (type_iter == type_trackers_.end()) |
397 continue; | 394 continue; |
398 | 395 |
399 if (iter->second > minimum_local_nudge_delay_) { | 396 if (iter->second > minimum_local_nudge_delay_) { |
400 type_iter->second->UpdateLocalNudgeDelay(iter->second); | 397 type_iter->second->UpdateLocalNudgeDelay(iter->second); |
401 } else { | 398 } else { |
402 type_iter->second->UpdateLocalNudgeDelay( | 399 type_iter->second->UpdateLocalNudgeDelay( |
403 GetDefaultDelayForType(type, | 400 GetDefaultDelayForType(type, minimum_local_nudge_delay_)); |
404 minimum_local_nudge_delay_)); | |
405 } | 401 } |
406 } | 402 } |
407 } | 403 } |
408 | 404 |
409 void NudgeTracker::SetDefaultNudgeDelay(base::TimeDelta nudge_delay) { | 405 void NudgeTracker::SetDefaultNudgeDelay(base::TimeDelta nudge_delay) { |
410 minimum_local_nudge_delay_ = nudge_delay; | 406 minimum_local_nudge_delay_ = nudge_delay; |
411 } | 407 } |
412 | 408 |
413 } // namespace sessions | 409 } // namespace sessions |
414 } // namespace syncer | 410 } // namespace syncer |
OLD | NEW |