| Index: sync/sessions/data_type_tracker.cc
|
| diff --git a/sync/sessions/data_type_tracker.cc b/sync/sessions/data_type_tracker.cc
|
| deleted file mode 100644
|
| index fa7a507334502ee39df21b2c84d6a10ae3357d3b..0000000000000000000000000000000000000000
|
| --- a/sync/sessions/data_type_tracker.cc
|
| +++ /dev/null
|
| @@ -1,243 +0,0 @@
|
| -// Copyright 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/data_type_tracker.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/logging.h"
|
| -#include "sync/internal_api/public/base/invalidation_interface.h"
|
| -#include "sync/sessions/nudge_tracker.h"
|
| -
|
| -namespace syncer {
|
| -namespace sessions {
|
| -
|
| -DataTypeTracker::DataTypeTracker()
|
| - : local_nudge_count_(0),
|
| - local_refresh_request_count_(0),
|
| - payload_buffer_size_(NudgeTracker::kDefaultMaxPayloadsPerType),
|
| - initial_sync_required_(false),
|
| - sync_required_to_resolve_conflict_(false) {
|
| -}
|
| -
|
| -DataTypeTracker::~DataTypeTracker() { }
|
| -
|
| -base::TimeDelta DataTypeTracker::RecordLocalChange() {
|
| - local_nudge_count_++;
|
| - return nudge_delay_;
|
| -}
|
| -
|
| -void DataTypeTracker::RecordLocalRefreshRequest() {
|
| - local_refresh_request_count_++;
|
| -}
|
| -
|
| -void DataTypeTracker::RecordRemoteInvalidation(
|
| - std::unique_ptr<InvalidationInterface> incoming) {
|
| - DCHECK(incoming);
|
| -
|
| - // Merge the incoming invalidation into our list of pending invalidations.
|
| - //
|
| - // We won't use STL algorithms here because our concept of equality doesn't
|
| - // quite fit the expectations of set_intersection. In particular, two
|
| - // invalidations can be equal according to the SingleObjectInvalidationSet's
|
| - // rules (ie. have equal versions), but still have different AckHandle values
|
| - // and need to be acknowledged separately.
|
| - //
|
| - // The invalidations service can only track one outsanding invalidation per
|
| - // type and version, so the acknowledgement here should be redundant. We'll
|
| - // acknowledge them anyway since it should do no harm, and makes this code a
|
| - // bit easier to test.
|
| - //
|
| - // Overlaps should be extremely rare for most invalidations. They can happen
|
| - // for unknown version invalidations, though.
|
| -
|
| - ScopedVector<InvalidationInterface>::iterator it =
|
| - pending_invalidations_.begin();
|
| -
|
| - // Find the lower bound.
|
| - while (it != pending_invalidations_.end() &&
|
| - InvalidationInterface::LessThanByVersion(**it, *incoming)) {
|
| - it++;
|
| - }
|
| -
|
| - if (it != pending_invalidations_.end() &&
|
| - !InvalidationInterface::LessThanByVersion(*incoming, **it) &&
|
| - !InvalidationInterface::LessThanByVersion(**it, *incoming)) {
|
| - // Incoming overlaps with existing. Either both are unknown versions
|
| - // (likely) or these two have the same version number (very unlikely).
|
| - // Acknowledge and overwrite existing.
|
| -
|
| - // Insert before the existing and get iterator to inserted.
|
| - ScopedVector<InvalidationInterface>::iterator it2 =
|
| - pending_invalidations_.insert(it, incoming.release());
|
| -
|
| - // Increment that iterator to the old one, then acknowledge and remove it.
|
| - ++it2;
|
| - (*it2)->Acknowledge();
|
| - pending_invalidations_.erase(it2);
|
| - } else {
|
| - // The incoming has a version not in the pending_invalidations_ list.
|
| - // Add it to the list at the proper position.
|
| - pending_invalidations_.insert(it, incoming.release());
|
| - }
|
| -
|
| - // The incoming invalidation may have caused us to exceed our buffer size.
|
| - // Trim some items from our list, if necessary.
|
| - while (pending_invalidations_.size() > payload_buffer_size_) {
|
| - last_dropped_invalidation_.reset(pending_invalidations_.front());
|
| - last_dropped_invalidation_->Drop();
|
| - pending_invalidations_.weak_erase(pending_invalidations_.begin());
|
| - }
|
| -}
|
| -
|
| -void DataTypeTracker::RecordInitialSyncRequired() {
|
| - initial_sync_required_ = true;
|
| -}
|
| -
|
| -void DataTypeTracker::RecordCommitConflict() {
|
| - sync_required_to_resolve_conflict_ = true;
|
| -}
|
| -
|
| -void DataTypeTracker::RecordSuccessfulSyncCycle() {
|
| - // If we were throttled, then we would have been excluded from this cycle's
|
| - // GetUpdates and Commit actions. Our state remains unchanged.
|
| - if (IsThrottled())
|
| - return;
|
| -
|
| - local_nudge_count_ = 0;
|
| - local_refresh_request_count_ = 0;
|
| -
|
| - // TODO(rlarocque): If we want this to be correct even if we should happen to
|
| - // crash before writing all our state, we should wait until the results of
|
| - // this sync cycle have been written to disk before updating the invalidations
|
| - // state. See crbug.com/324996.
|
| - for (ScopedVector<InvalidationInterface>::const_iterator it =
|
| - pending_invalidations_.begin();
|
| - it != pending_invalidations_.end();
|
| - ++it) {
|
| - (*it)->Acknowledge();
|
| - }
|
| - pending_invalidations_.clear();
|
| -
|
| - if (last_dropped_invalidation_) {
|
| - last_dropped_invalidation_->Acknowledge();
|
| - last_dropped_invalidation_.reset();
|
| - }
|
| -
|
| - initial_sync_required_ = false;
|
| - sync_required_to_resolve_conflict_ = false;
|
| -}
|
| -
|
| -// This limit will take effect on all future invalidations received.
|
| -void DataTypeTracker::UpdatePayloadBufferSize(size_t new_size) {
|
| - payload_buffer_size_ = new_size;
|
| -}
|
| -
|
| -bool DataTypeTracker::IsSyncRequired() const {
|
| - return !IsThrottled() && (HasLocalChangePending() || IsGetUpdatesRequired());
|
| -}
|
| -
|
| -bool DataTypeTracker::IsGetUpdatesRequired() const {
|
| - return !IsThrottled() &&
|
| - (HasRefreshRequestPending() || HasPendingInvalidation() ||
|
| - IsInitialSyncRequired() || IsSyncRequiredToResolveConflict());
|
| -}
|
| -
|
| -bool DataTypeTracker::HasLocalChangePending() const {
|
| - return local_nudge_count_ > 0;
|
| -}
|
| -
|
| -bool DataTypeTracker::HasRefreshRequestPending() const {
|
| - return local_refresh_request_count_ > 0;
|
| -}
|
| -
|
| -bool DataTypeTracker::HasPendingInvalidation() const {
|
| - return !pending_invalidations_.empty() || last_dropped_invalidation_;
|
| -}
|
| -
|
| -bool DataTypeTracker::IsInitialSyncRequired() const {
|
| - return initial_sync_required_;
|
| -}
|
| -
|
| -bool DataTypeTracker::IsSyncRequiredToResolveConflict() const {
|
| - return sync_required_to_resolve_conflict_;
|
| -}
|
| -
|
| -void DataTypeTracker::SetLegacyNotificationHint(
|
| - sync_pb::DataTypeProgressMarker* progress) const {
|
| - DCHECK(!IsThrottled())
|
| - << "We should not make requests if the type is throttled.";
|
| -
|
| - if (!pending_invalidations_.empty() &&
|
| - !pending_invalidations_.back()->IsUnknownVersion()) {
|
| - // The old-style source info can contain only one hint per type. We grab
|
| - // the most recent, to mimic the old coalescing behaviour.
|
| - progress->set_notification_hint(
|
| - pending_invalidations_.back()->GetPayload());
|
| - } else if (HasLocalChangePending()) {
|
| - // The old-style source info sent up an empty string (as opposed to
|
| - // nothing at all) when the type was locally nudged, but had not received
|
| - // any invalidations.
|
| - progress->set_notification_hint(std::string());
|
| - }
|
| -}
|
| -
|
| -void DataTypeTracker::FillGetUpdatesTriggersMessage(
|
| - sync_pb::GetUpdateTriggers* msg) const {
|
| - // Fill the list of payloads, if applicable. The payloads must be ordered
|
| - // oldest to newest, so we insert them in the same order as we've been storing
|
| - // them internally.
|
| - for (ScopedVector<InvalidationInterface>::const_iterator it =
|
| - pending_invalidations_.begin();
|
| - it != pending_invalidations_.end();
|
| - ++it) {
|
| - if (!(*it)->IsUnknownVersion()) {
|
| - msg->add_notification_hint((*it)->GetPayload());
|
| - }
|
| - }
|
| -
|
| - msg->set_server_dropped_hints(
|
| - !pending_invalidations_.empty() &&
|
| - (*pending_invalidations_.begin())->IsUnknownVersion());
|
| - msg->set_client_dropped_hints(!!last_dropped_invalidation_);
|
| - msg->set_local_modification_nudges(local_nudge_count_);
|
| - msg->set_datatype_refresh_nudges(local_refresh_request_count_);
|
| - msg->set_initial_sync_in_progress(initial_sync_required_);
|
| - msg->set_sync_for_resolve_conflict_in_progress(
|
| - sync_required_to_resolve_conflict_);
|
| -}
|
| -
|
| -bool DataTypeTracker::IsThrottled() const {
|
| - return !unthrottle_time_.is_null();
|
| -}
|
| -
|
| -base::TimeDelta DataTypeTracker::GetTimeUntilUnthrottle(
|
| - base::TimeTicks now) const {
|
| - if (!IsThrottled()) {
|
| - NOTREACHED();
|
| - return base::TimeDelta::FromSeconds(0);
|
| - }
|
| - return std::max(base::TimeDelta::FromSeconds(0),
|
| - unthrottle_time_ - now);
|
| -}
|
| -
|
| -void DataTypeTracker::ThrottleType(base::TimeDelta duration,
|
| - base::TimeTicks now) {
|
| - unthrottle_time_ = std::max(unthrottle_time_, now + duration);
|
| -}
|
| -
|
| -void DataTypeTracker::UpdateThrottleState(base::TimeTicks now) {
|
| - if (now >= unthrottle_time_) {
|
| - unthrottle_time_ = base::TimeTicks();
|
| - }
|
| -}
|
| -
|
| -void DataTypeTracker::UpdateLocalNudgeDelay(base::TimeDelta delay) {
|
| - nudge_delay_ = delay;
|
| -}
|
| -
|
| -} // namespace sessions
|
| -} // namespace syncer
|
|
|