| 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 |