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 |