summaryrefslogtreecommitdiffstats
path: root/sync/sessions/nudge_tracker.cc
diff options
context:
space:
mode:
authorzea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-22 21:41:11 +0000
committerzea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-22 21:45:07 +0000
commit9b8535f1150f0b8dc6920ba47c8436510b302693 (patch)
tree8b5c09e3f11a27269a1b8638e4daa52da9796042 /sync/sessions/nudge_tracker.cc
parent272098237b925537dccc45bab30006a27831a3ed (diff)
downloadchromium_src-9b8535f1150f0b8dc6920ba47c8436510b302693.zip
chromium_src-9b8535f1150f0b8dc6920ba47c8436510b302693.tar.gz
chromium_src-9b8535f1150f0b8dc6920ba47c8436510b302693.tar.bz2
[Sync] Add support for server controlled nudge delays
Server nudge delays override the local ones, but must be longer than the default nudge delay. If set to 0, will reset the nudge to the default. To accomplish this the delay logic was refactored and moved into the sync scheduler, which is now aware of all delays for all types and sync cycles. BUG=401600 Review URL: https://codereview.chromium.org/488843002 Cr-Commit-Position: refs/heads/master@{#291512} git-svn-id: svn://svn.chromium.org/chrome/trunk/src@291512 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/sessions/nudge_tracker.cc')
-rw-r--r--sync/sessions/nudge_tracker.cc92
1 files changed, 87 insertions, 5 deletions
diff --git a/sync/sessions/nudge_tracker.cc b/sync/sessions/nudge_tracker.cc
index d9aaec6..9c62b07 100644
--- a/sync/sessions/nudge_tracker.cc
+++ b/sync/sessions/nudge_tracker.cc
@@ -5,17 +5,58 @@
#include "sync/sessions/nudge_tracker.h"
#include "base/basictypes.h"
+#include "sync/internal_api/public/engine/polling_constants.h"
#include "sync/protocol/sync.pb.h"
namespace syncer {
namespace sessions {
+namespace {
+
+// Delays for syncer nudges.
+const int kDefaultNudgeDelayMilliseconds = 200;
+const int kSlowNudgeDelayMilliseconds = 2000;
+const int kDefaultSessionsCommitDelaySeconds = 10;
+const int kSyncRefreshDelayMilliseconds = 500;
+const int kSyncSchedulerDelayMilliseconds = 250;
+
+base::TimeDelta GetDefaultDelayForType(ModelType model_type,
+ base::TimeDelta minimum_delay) {
+ switch (model_type) {
+ case AUTOFILL:
+ // Accompany types rely on nudges from other types, and hence have long
+ // nudge delays.
+ return base::TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds);
+ case BOOKMARKS:
+ case PREFERENCES:
+ // Types with sometimes automatic changes get longer delays to allow more
+ // coalescing.
+ return base::TimeDelta::FromMilliseconds(kSlowNudgeDelayMilliseconds);
+ case SESSIONS:
+ case FAVICON_IMAGES:
+ case FAVICON_TRACKING:
+ // Types with navigation triggered changes get longer delays to allow more
+ // coalescing.
+ return base::TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds);
+ default:
+ return minimum_delay;
+ }
+}
+
+} // namespace
+
size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10;
NudgeTracker::NudgeTracker()
: type_tracker_deleter_(&type_trackers_),
invalidations_enabled_(false),
- invalidations_out_of_sync_(true) {
+ invalidations_out_of_sync_(true),
+ minimum_local_nudge_delay_(
+ base::TimeDelta::FromMilliseconds(kDefaultNudgeDelayMilliseconds)),
+ local_refresh_nudge_delay_(
+ base::TimeDelta::FromMilliseconds(kSyncRefreshDelayMilliseconds)),
+ remote_invalidation_nudge_delay_(
+ base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMilliseconds)) {
ModelTypeSet protocol_types = ProtocolTypes();
// Default initialize all the type trackers.
for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good();
@@ -80,30 +121,45 @@ void NudgeTracker::RecordSuccessfulSyncCycle() {
}
}
-void NudgeTracker::RecordLocalChange(ModelTypeSet types) {
+base::TimeDelta NudgeTracker::RecordLocalChange(ModelTypeSet types) {
+ // Start with the longest delay.
+ base::TimeDelta delay =
+ base::TimeDelta::FromMilliseconds(kDefaultShortPollIntervalSeconds);
for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good();
type_it.Inc()) {
TypeTrackerMap::iterator tracker_it = type_trackers_.find(type_it.Get());
DCHECK(tracker_it != type_trackers_.end());
- tracker_it->second->RecordLocalChange();
+
+ // Only if the type tracker has a valid delay (non-zero) that is shorter
+ // than the calculated delay do we update the calculated delay.
+ base::TimeDelta type_delay = tracker_it->second->RecordLocalChange();
+ if (type_delay == base::TimeDelta()) {
+ type_delay = GetDefaultDelayForType(type_it.Get(),
+ minimum_local_nudge_delay_);
+ }
+ if (type_delay < delay)
+ delay = type_delay;
}
+ return delay;
}
-void NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) {
+base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) {
for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get());
DCHECK(tracker_it != type_trackers_.end());
tracker_it->second->RecordLocalRefreshRequest();
}
+ return local_refresh_nudge_delay_;
}
-void NudgeTracker::RecordRemoteInvalidation(
+base::TimeDelta NudgeTracker::RecordRemoteInvalidation(
syncer::ModelType type,
scoped_ptr<InvalidationInterface> invalidation) {
// Forward the invalidations to the proper recipient.
TypeTrackerMap::iterator tracker_it = type_trackers_.find(type);
DCHECK(tracker_it != type_trackers_.end());
tracker_it->second->RecordRemoteInvalidation(invalidation.Pass());
+ return remote_invalidation_nudge_delay_;
}
void NudgeTracker::RecordInitialSyncRequired(syncer::ModelType type) {
@@ -317,5 +373,31 @@ void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) {
next_retry_time_ = retry_time;
}
+void NudgeTracker::OnReceivedCustomNudgeDelays(
+ const std::map<ModelType, base::TimeDelta>& delay_map) {
+ for (std::map<ModelType, base::TimeDelta>::const_iterator iter =
+ delay_map.begin();
+ iter != delay_map.end();
+ ++iter) {
+ ModelType type = iter->first;
+ DCHECK(syncer::ProtocolTypes().Has(type));
+ TypeTrackerMap::iterator type_iter = type_trackers_.find(type);
+ if (type_iter == type_trackers_.end())
+ continue;
+
+ if (iter->second > minimum_local_nudge_delay_) {
+ type_iter->second->UpdateLocalNudgeDelay(iter->second);
+ } else {
+ type_iter->second->UpdateLocalNudgeDelay(
+ GetDefaultDelayForType(type,
+ minimum_local_nudge_delay_));
+ }
+ }
+}
+
+void NudgeTracker::SetDefaultNudgeDelay(base::TimeDelta nudge_delay) {
+ minimum_local_nudge_delay_ = nudge_delay;
+}
+
} // namespace sessions
} // namespace syncer