Chromium Code Reviews| 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 "sync/sessions/nudge_tracker.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "sync/internal_api/public/engine/polling_constants.h" | |
| 8 #include "sync/protocol/sync.pb.h" | 9 #include "sync/protocol/sync.pb.h" |
| 9 | 10 |
| 10 namespace syncer { | 11 namespace syncer { |
| 11 namespace sessions { | 12 namespace sessions { |
| 12 | 13 |
| 14 namespace { | |
| 15 | |
| 16 // Delays for syncer nudges. | |
| 17 const int kDefaultNudgeDelayMilliseconds = 200; | |
| 18 const int kSlowNudgeDelayMilliseconds = 2000; | |
| 19 const int kDefaultSessionsCommitDelaySeconds = 10; | |
| 20 const int kSyncRefreshDelayMsec = 500; | |
|
rlarocque
2014/08/21 17:24:53
nit: It would be nice if the Msec vs. Millisecond
| |
| 21 const int kSyncSchedulerDelayMsec = 250; | |
| 22 | |
| 23 base::TimeDelta GetDefaultDelayForType(ModelType model_type, | |
| 24 base::TimeDelta minimum_delay) { | |
| 25 switch (model_type) { | |
| 26 case AUTOFILL: | |
| 27 // Accompany types rely on nudges from other types, and hence have long | |
| 28 // nudge delays. | |
| 29 return base::TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds); | |
| 30 case BOOKMARKS: | |
| 31 case PREFERENCES: | |
| 32 // Types with sometimes automatic changes get longer delays to allow more | |
| 33 // coalescing. | |
| 34 return base::TimeDelta::FromMilliseconds(kSlowNudgeDelayMilliseconds); | |
| 35 case SESSIONS: | |
| 36 case FAVICON_IMAGES: | |
| 37 case FAVICON_TRACKING: | |
| 38 // Types with navigation triggered changes get longer delays to allow more | |
| 39 // coalescing. | |
| 40 return base::TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds); | |
| 41 default: | |
| 42 return minimum_delay; | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 } // namespace | |
| 47 | |
| 13 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; | 48 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; |
| 14 | 49 |
| 15 NudgeTracker::NudgeTracker() | 50 NudgeTracker::NudgeTracker() |
| 16 : type_tracker_deleter_(&type_trackers_), | 51 : type_tracker_deleter_(&type_trackers_), |
| 17 invalidations_enabled_(false), | 52 invalidations_enabled_(false), |
| 18 invalidations_out_of_sync_(true) { | 53 invalidations_out_of_sync_(true), |
| 54 minimum_local_nudge_delay_( | |
| 55 base::TimeDelta::FromMilliseconds(kDefaultNudgeDelayMilliseconds)), | |
| 56 local_refresh_nudge_delay_( | |
| 57 base::TimeDelta::FromMilliseconds(kSyncRefreshDelayMsec)), | |
| 58 remote_invalidation_nudge_delay_( | |
| 59 base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec)) { | |
| 19 ModelTypeSet protocol_types = ProtocolTypes(); | 60 ModelTypeSet protocol_types = ProtocolTypes(); |
| 20 // Default initialize all the type trackers. | 61 // Default initialize all the type trackers. |
| 21 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); | 62 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); |
| 22 it.Inc()) { | 63 it.Inc()) { |
| 23 type_trackers_.insert(std::make_pair(it.Get(), new DataTypeTracker())); | 64 type_trackers_.insert(std::make_pair(it.Get(), new DataTypeTracker())); |
| 24 } | 65 } |
| 25 } | 66 } |
| 26 | 67 |
| 27 NudgeTracker::~NudgeTracker() { } | 68 NudgeTracker::~NudgeTracker() { } |
| 28 | 69 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 | 114 |
| 74 // A successful cycle while invalidations are enabled puts us back into sync. | 115 // A successful cycle while invalidations are enabled puts us back into sync. |
| 75 invalidations_out_of_sync_ = !invalidations_enabled_; | 116 invalidations_out_of_sync_ = !invalidations_enabled_; |
| 76 | 117 |
| 77 for (TypeTrackerMap::iterator it = type_trackers_.begin(); | 118 for (TypeTrackerMap::iterator it = type_trackers_.begin(); |
| 78 it != type_trackers_.end(); ++it) { | 119 it != type_trackers_.end(); ++it) { |
| 79 it->second->RecordSuccessfulSyncCycle(); | 120 it->second->RecordSuccessfulSyncCycle(); |
| 80 } | 121 } |
| 81 } | 122 } |
| 82 | 123 |
| 83 void NudgeTracker::RecordLocalChange(ModelTypeSet types) { | 124 base::TimeDelta NudgeTracker::RecordLocalChange(ModelTypeSet types) { |
| 125 // Start with the longest delay. | |
| 126 base::TimeDelta delay = | |
| 127 base::TimeDelta::FromMilliseconds(kDefaultShortPollIntervalSeconds); | |
| 84 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); | 128 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); |
| 85 type_it.Inc()) { | 129 type_it.Inc()) { |
| 86 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type_it.Get()); | 130 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type_it.Get()); |
| 87 DCHECK(tracker_it != type_trackers_.end()); | 131 DCHECK(tracker_it != type_trackers_.end()); |
| 88 tracker_it->second->RecordLocalChange(); | 132 |
| 133 // Only if the type tracker has a valid delay (non-zero) that is shorter | |
| 134 // than the calculated delay do we update the calculated delay. | |
| 135 base::TimeDelta type_delay = tracker_it->second->RecordLocalChange(); | |
| 136 if (type_delay == base::TimeDelta()) { | |
| 137 type_delay = GetDefaultDelayForType(type_it.Get(), | |
| 138 minimum_local_nudge_delay_); | |
| 139 } | |
| 140 if (type_delay < delay) | |
| 141 delay = type_delay; | |
| 89 } | 142 } |
| 143 return delay; | |
| 90 } | 144 } |
| 91 | 145 |
| 92 void NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { | 146 base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { |
| 93 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | 147 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { |
| 94 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); | 148 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); |
| 95 DCHECK(tracker_it != type_trackers_.end()); | 149 DCHECK(tracker_it != type_trackers_.end()); |
| 96 tracker_it->second->RecordLocalRefreshRequest(); | 150 tracker_it->second->RecordLocalRefreshRequest(); |
| 97 } | 151 } |
| 152 return local_refresh_nudge_delay_; | |
| 98 } | 153 } |
| 99 | 154 |
| 100 void NudgeTracker::RecordRemoteInvalidation( | 155 base::TimeDelta NudgeTracker::RecordRemoteInvalidation( |
| 101 syncer::ModelType type, | 156 syncer::ModelType type, |
| 102 scoped_ptr<InvalidationInterface> invalidation) { | 157 scoped_ptr<InvalidationInterface> invalidation) { |
| 103 // Forward the invalidations to the proper recipient. | 158 // Forward the invalidations to the proper recipient. |
| 104 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); | 159 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); |
| 105 DCHECK(tracker_it != type_trackers_.end()); | 160 DCHECK(tracker_it != type_trackers_.end()); |
| 106 tracker_it->second->RecordRemoteInvalidation(invalidation.Pass()); | 161 tracker_it->second->RecordRemoteInvalidation(invalidation.Pass()); |
| 162 return remote_invalidation_nudge_delay_; | |
| 107 } | 163 } |
| 108 | 164 |
| 109 void NudgeTracker::RecordInitialSyncRequired(syncer::ModelType type) { | 165 void NudgeTracker::RecordInitialSyncRequired(syncer::ModelType type) { |
| 110 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); | 166 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); |
| 111 DCHECK(tracker_it != type_trackers_.end()); | 167 DCHECK(tracker_it != type_trackers_.end()); |
| 112 tracker_it->second->RecordInitialSyncRequired(); | 168 tracker_it->second->RecordInitialSyncRequired(); |
| 113 } | 169 } |
| 114 | 170 |
| 115 void NudgeTracker::OnInvalidationsEnabled() { | 171 void NudgeTracker::OnInvalidationsEnabled() { |
| 116 invalidations_enabled_ = true; | 172 invalidations_enabled_ = true; |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 for (TypeTrackerMap::iterator it = type_trackers_.begin(); | 366 for (TypeTrackerMap::iterator it = type_trackers_.begin(); |
| 311 it != type_trackers_.end(); ++it) { | 367 it != type_trackers_.end(); ++it) { |
| 312 it->second->UpdatePayloadBufferSize(size); | 368 it->second->UpdatePayloadBufferSize(size); |
| 313 } | 369 } |
| 314 } | 370 } |
| 315 | 371 |
| 316 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { | 372 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { |
| 317 next_retry_time_ = retry_time; | 373 next_retry_time_ = retry_time; |
| 318 } | 374 } |
| 319 | 375 |
| 376 void NudgeTracker::OnReceivedCustomNudgeDelays( | |
| 377 const std::map<ModelType, base::TimeDelta>& delay_map) { | |
| 378 for (std::map<ModelType, base::TimeDelta>::const_iterator iter = | |
| 379 delay_map.begin(); | |
| 380 iter != delay_map.end(); | |
| 381 ++iter) { | |
| 382 ModelType type = iter->first; | |
| 383 DCHECK(syncer::ProtocolTypes().Has(type)); | |
| 384 TypeTrackerMap::iterator type_iter = type_trackers_.find(type); | |
| 385 if (type_iter == type_trackers_.end()) | |
| 386 continue; | |
| 387 | |
| 388 if (iter->second > minimum_local_nudge_delay_) { | |
| 389 type_iter->second->UpdateLocalNudgeDelay(iter->second); | |
| 390 } else { | |
| 391 type_iter->second->UpdateLocalNudgeDelay( | |
| 392 GetDefaultDelayForType(type, | |
| 393 minimum_local_nudge_delay_)); | |
| 394 } | |
| 395 } | |
| 396 } | |
| 397 | |
| 398 void NudgeTracker::SetDefaultNudgeDelay(base::TimeDelta nudge_delay) { | |
| 399 minimum_local_nudge_delay_ = nudge_delay; | |
| 400 } | |
| 401 | |
| 320 } // namespace sessions | 402 } // namespace sessions |
| 321 } // namespace syncer | 403 } // namespace syncer |
| OLD | NEW |