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

Unified Diff: sync/sessions/nudge_tracker.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/sessions/nudge_tracker.h ('k') | sync/sessions/nudge_tracker_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/sessions/nudge_tracker.cc
diff --git a/sync/sessions/nudge_tracker.cc b/sync/sessions/nudge_tracker.cc
deleted file mode 100644
index 0a611b28a95a1919858cc853842ec01482d8a62d..0000000000000000000000000000000000000000
--- a/sync/sessions/nudge_tracker.cc
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "sync/sessions/nudge_tracker.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/memory/ptr_util.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()
- : invalidations_enabled_(false),
- 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();
- it.Inc()) {
- type_trackers_.insert(
- std::make_pair(it.Get(), base::WrapUnique(new DataTypeTracker())));
- }
-}
-
-NudgeTracker::~NudgeTracker() { }
-
-bool NudgeTracker::IsSyncRequired() const {
- if (IsRetryRequired())
- return true;
-
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->IsSyncRequired()) {
- return true;
- }
- }
-
- return false;
-}
-
-bool NudgeTracker::IsGetUpdatesRequired() const {
- if (invalidations_out_of_sync_)
- return true;
-
- if (IsRetryRequired())
- return true;
-
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->IsGetUpdatesRequired()) {
- return true;
- }
- }
- return false;
-}
-
-bool NudgeTracker::IsRetryRequired() const {
- if (sync_cycle_start_time_.is_null())
- return false;
-
- if (current_retry_time_.is_null())
- return false;
-
- return current_retry_time_ <= sync_cycle_start_time_;
-}
-
-void NudgeTracker::RecordSuccessfulSyncCycle() {
- // If a retry was required, we've just serviced it. Unset the flag.
- if (IsRetryRequired())
- current_retry_time_ = base::TimeTicks();
-
- // A successful cycle while invalidations are enabled puts us back into sync.
- invalidations_out_of_sync_ = !invalidations_enabled_;
-
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- it->second->RecordSuccessfulSyncCycle();
- }
-}
-
-base::TimeDelta NudgeTracker::RecordLocalChange(ModelTypeSet types) {
- // Start with the longest delay.
- base::TimeDelta delay =
- base::TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds);
- for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good();
- type_it.Inc()) {
- TypeTrackerMap::const_iterator tracker_it =
- type_trackers_.find(type_it.Get());
- DCHECK(tracker_it != type_trackers_.end());
-
- // 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.is_zero()) {
- type_delay = GetDefaultDelayForType(type_it.Get(),
- minimum_local_nudge_delay_);
- }
- if (type_delay < delay)
- delay = type_delay;
- }
- return delay;
-}
-
-base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) {
- for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
- TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get());
- DCHECK(tracker_it != type_trackers_.end());
- tracker_it->second->RecordLocalRefreshRequest();
- }
- return local_refresh_nudge_delay_;
-}
-
-base::TimeDelta NudgeTracker::RecordRemoteInvalidation(
- syncer::ModelType type,
- std::unique_ptr<InvalidationInterface> invalidation) {
- // Forward the invalidations to the proper recipient.
- TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
- DCHECK(tracker_it != type_trackers_.end());
- tracker_it->second->RecordRemoteInvalidation(std::move(invalidation));
- return remote_invalidation_nudge_delay_;
-}
-
-void NudgeTracker::RecordInitialSyncRequired(syncer::ModelType type) {
- TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
- DCHECK(tracker_it != type_trackers_.end());
- tracker_it->second->RecordInitialSyncRequired();
-}
-
-void NudgeTracker::RecordCommitConflict(syncer::ModelType type) {
- TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
- DCHECK(tracker_it != type_trackers_.end());
- tracker_it->second->RecordCommitConflict();
-}
-
-void NudgeTracker::OnInvalidationsEnabled() {
- invalidations_enabled_ = true;
-}
-
-void NudgeTracker::OnInvalidationsDisabled() {
- invalidations_enabled_ = false;
- invalidations_out_of_sync_ = true;
-}
-
-void NudgeTracker::SetTypesThrottledUntil(
- ModelTypeSet types,
- base::TimeDelta length,
- base::TimeTicks now) {
- for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
- TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(it.Get());
- tracker_it->second->ThrottleType(length, now);
- }
-}
-
-void NudgeTracker::UpdateTypeThrottlingState(base::TimeTicks now) {
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- it->second->UpdateThrottleState(now);
- }
-}
-
-bool NudgeTracker::IsAnyTypeThrottled() const {
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->IsThrottled()) {
- return true;
- }
- }
- return false;
-}
-
-bool NudgeTracker::IsTypeThrottled(ModelType type) const {
- DCHECK(type_trackers_.find(type) != type_trackers_.end());
- return type_trackers_.find(type)->second->IsThrottled();
-}
-
-base::TimeDelta NudgeTracker::GetTimeUntilNextUnthrottle(
- base::TimeTicks now) const {
- DCHECK(IsAnyTypeThrottled()) << "This function requires a pending unthrottle";
-
- // Return min of GetTimeUntilUnthrottle() values for all IsThrottled() types.
- base::TimeDelta time_until_next_unthrottle = base::TimeDelta::Max();
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->IsThrottled()) {
- time_until_next_unthrottle = std::min(
- time_until_next_unthrottle, it->second->GetTimeUntilUnthrottle(now));
- }
- }
- DCHECK(!time_until_next_unthrottle.is_max());
-
- return time_until_next_unthrottle;
-}
-
-ModelTypeSet NudgeTracker::GetThrottledTypes() const {
- ModelTypeSet result;
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->IsThrottled()) {
- result.Put(it->first);
- }
- }
- return result;
-}
-
-ModelTypeSet NudgeTracker::GetNudgedTypes() const {
- ModelTypeSet result;
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->HasLocalChangePending()) {
- result.Put(it->first);
- }
- }
- return result;
-}
-
-ModelTypeSet NudgeTracker::GetNotifiedTypes() const {
- ModelTypeSet result;
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->HasPendingInvalidation()) {
- result.Put(it->first);
- }
- }
- return result;
-}
-
-ModelTypeSet NudgeTracker::GetRefreshRequestedTypes() const {
- ModelTypeSet result;
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- if (it->second->HasRefreshRequestPending()) {
- result.Put(it->first);
- }
- }
- return result;
-}
-
-void NudgeTracker::SetLegacyNotificationHint(
- ModelType type,
- sync_pb::DataTypeProgressMarker* progress) const {
- DCHECK(type_trackers_.find(type) != type_trackers_.end());
- type_trackers_.find(type)->second->SetLegacyNotificationHint(progress);
-}
-
-sync_pb::GetUpdatesCallerInfo::GetUpdatesSource NudgeTracker::GetLegacySource()
- const {
- // There's an order to these sources: NOTIFICATION, DATATYPE_REFRESH, LOCAL,
- // RETRY. The server makes optimization decisions based on this field, so
- // it's important to get this right. Setting it wrong could lead to missed
- // updates.
- //
- // This complexity is part of the reason why we're deprecating 'source' in
- // favor of 'origin'.
- bool has_invalidation_pending = false;
- bool has_refresh_request_pending = false;
- bool has_commit_pending = false;
- bool is_initial_sync_required = false;
- bool has_retry = IsRetryRequired();
-
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- const DataTypeTracker& tracker = *it->second;
- if (!tracker.IsThrottled() && tracker.HasPendingInvalidation()) {
- has_invalidation_pending = true;
- }
- if (!tracker.IsThrottled() && tracker.HasRefreshRequestPending()) {
- has_refresh_request_pending = true;
- }
- if (!tracker.IsThrottled() && tracker.HasLocalChangePending()) {
- has_commit_pending = true;
- }
- if (!tracker.IsThrottled() && tracker.IsInitialSyncRequired()) {
- is_initial_sync_required = true;
- }
- }
-
- if (has_invalidation_pending) {
- return sync_pb::GetUpdatesCallerInfo::NOTIFICATION;
- } else if (has_refresh_request_pending) {
- return sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH;
- } else if (is_initial_sync_required) {
- // Not quite accurate, but good enough for our purposes. This setting of
- // SOURCE is just a backward-compatibility hack anyway.
- return sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH;
- } else if (has_commit_pending) {
- return sync_pb::GetUpdatesCallerInfo::LOCAL;
- } else if (has_retry) {
- return sync_pb::GetUpdatesCallerInfo::RETRY;
- } else {
- return sync_pb::GetUpdatesCallerInfo::UNKNOWN;
- }
-}
-
-void NudgeTracker::FillProtoMessage(
- ModelType type,
- sync_pb::GetUpdateTriggers* msg) const {
- DCHECK(type_trackers_.find(type) != type_trackers_.end());
-
- // Fill what we can from the global data.
- msg->set_invalidations_out_of_sync(invalidations_out_of_sync_);
-
- // Delegate the type-specific work to the DataTypeTracker class.
- type_trackers_.find(type)->second->FillGetUpdatesTriggersMessage(msg);
-}
-
-void NudgeTracker::SetSyncCycleStartTime(base::TimeTicks now) {
- sync_cycle_start_time_ = now;
-
- // If current_retry_time_ is still set, that means we have an old retry time
- // left over from a previous cycle. For example, maybe we tried to perform
- // this retry, hit a network connection error, and now we're in exponential
- // backoff. In that case, we want this sync cycle to include the GU retry
- // flag so we leave this variable set regardless of whether or not there is an
- // overwrite pending.
- if (!current_retry_time_.is_null()) {
- return;
- }
-
- // If do not have a current_retry_time_, but we do have a next_retry_time_ and
- // it is ready to go, then we set it as the current_retry_time_. It will stay
- // there until a GU retry has succeeded.
- if (!next_retry_time_.is_null() &&
- next_retry_time_ <= sync_cycle_start_time_) {
- current_retry_time_ = next_retry_time_;
- next_retry_time_ = base::TimeTicks();
- }
-}
-
-void NudgeTracker::SetHintBufferSize(size_t size) {
- for (TypeTrackerMap::const_iterator it = type_trackers_.begin();
- it != type_trackers_.end(); ++it) {
- it->second->UpdatePayloadBufferSize(size);
- }
-}
-
-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::const_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
« 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