Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(733)

Side by Side Diff: sync/sessions/nudge_tracker.cc

Issue 488843002: [Sync] Add support for server controlled nudge delays (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sync/sessions/nudge_tracker.h ('k') | sync/sessions/nudge_tracker_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « sync/sessions/nudge_tracker.h ('k') | sync/sessions/nudge_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698