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 kSyncRefreshDelayMilliseconds = 500; |
| 21 const int kSyncSchedulerDelayMilliseconds = 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(kSyncRefreshDelayMilliseconds)), |
| 58 remote_invalidation_nudge_delay_( |
| 59 base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMilliseconds)) { |
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 |