| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/data_type_tracker.h" | 5 #include "sync/sessions/data_type_tracker.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "sync/internal_api/public/base/invalidation_interface.h" | 8 #include "sync/internal_api/public/base/invalidation_interface.h" |
| 9 #include "sync/sessions/nudge_tracker.h" | 9 #include "sync/sessions/nudge_tracker.h" |
| 10 | 10 |
| 11 namespace syncer { | 11 namespace syncer { |
| 12 namespace sessions { | 12 namespace sessions { |
| 13 | 13 |
| 14 DataTypeTracker::DataTypeTracker() | 14 DataTypeTracker::DataTypeTracker() |
| 15 : local_nudge_count_(0), | 15 : local_nudge_count_(0), |
| 16 local_refresh_request_count_(0), | 16 local_refresh_request_count_(0), |
| 17 payload_buffer_size_(NudgeTracker::kDefaultMaxPayloadsPerType), | 17 payload_buffer_size_(NudgeTracker::kDefaultMaxPayloadsPerType), |
| 18 initial_sync_required_(false) { | 18 initial_sync_required_(false), |
| 19 sync_required_to_resolve_conflict_(false) { |
| 19 } | 20 } |
| 20 | 21 |
| 21 DataTypeTracker::~DataTypeTracker() { } | 22 DataTypeTracker::~DataTypeTracker() { } |
| 22 | 23 |
| 23 base::TimeDelta DataTypeTracker::RecordLocalChange() { | 24 base::TimeDelta DataTypeTracker::RecordLocalChange() { |
| 24 local_nudge_count_++; | 25 local_nudge_count_++; |
| 25 return nudge_delay_; | 26 return nudge_delay_; |
| 26 } | 27 } |
| 27 | 28 |
| 28 void DataTypeTracker::RecordLocalRefreshRequest() { | 29 void DataTypeTracker::RecordLocalRefreshRequest() { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 last_dropped_invalidation_.reset(pending_invalidations_.front()); | 86 last_dropped_invalidation_.reset(pending_invalidations_.front()); |
| 86 last_dropped_invalidation_->Drop(); | 87 last_dropped_invalidation_->Drop(); |
| 87 pending_invalidations_.weak_erase(pending_invalidations_.begin()); | 88 pending_invalidations_.weak_erase(pending_invalidations_.begin()); |
| 88 } | 89 } |
| 89 } | 90 } |
| 90 | 91 |
| 91 void DataTypeTracker::RecordInitialSyncRequired() { | 92 void DataTypeTracker::RecordInitialSyncRequired() { |
| 92 initial_sync_required_ = true; | 93 initial_sync_required_ = true; |
| 93 } | 94 } |
| 94 | 95 |
| 96 void DataTypeTracker::RecordCommitConflict() { |
| 97 sync_required_to_resolve_conflict_ = true; |
| 98 } |
| 99 |
| 95 void DataTypeTracker::RecordSuccessfulSyncCycle() { | 100 void DataTypeTracker::RecordSuccessfulSyncCycle() { |
| 96 // If we were throttled, then we would have been excluded from this cycle's | 101 // If we were throttled, then we would have been excluded from this cycle's |
| 97 // GetUpdates and Commit actions. Our state remains unchanged. | 102 // GetUpdates and Commit actions. Our state remains unchanged. |
| 98 if (IsThrottled()) | 103 if (IsThrottled()) |
| 99 return; | 104 return; |
| 100 | 105 |
| 101 local_nudge_count_ = 0; | 106 local_nudge_count_ = 0; |
| 102 local_refresh_request_count_ = 0; | 107 local_refresh_request_count_ = 0; |
| 103 | 108 |
| 104 // TODO(rlarocque): If we want this to be correct even if we should happen to | 109 // TODO(rlarocque): If we want this to be correct even if we should happen to |
| 105 // crash before writing all our state, we should wait until the results of | 110 // crash before writing all our state, we should wait until the results of |
| 106 // this sync cycle have been written to disk before updating the invalidations | 111 // this sync cycle have been written to disk before updating the invalidations |
| 107 // state. See crbug.com/324996. | 112 // state. See crbug.com/324996. |
| 108 for (ScopedVector<InvalidationInterface>::const_iterator it = | 113 for (ScopedVector<InvalidationInterface>::const_iterator it = |
| 109 pending_invalidations_.begin(); | 114 pending_invalidations_.begin(); |
| 110 it != pending_invalidations_.end(); | 115 it != pending_invalidations_.end(); |
| 111 ++it) { | 116 ++it) { |
| 112 (*it)->Acknowledge(); | 117 (*it)->Acknowledge(); |
| 113 } | 118 } |
| 114 pending_invalidations_.clear(); | 119 pending_invalidations_.clear(); |
| 115 | 120 |
| 116 if (last_dropped_invalidation_) { | 121 if (last_dropped_invalidation_) { |
| 117 last_dropped_invalidation_->Acknowledge(); | 122 last_dropped_invalidation_->Acknowledge(); |
| 118 last_dropped_invalidation_.reset(); | 123 last_dropped_invalidation_.reset(); |
| 119 } | 124 } |
| 120 | 125 |
| 121 initial_sync_required_ = false; | 126 initial_sync_required_ = false; |
| 127 sync_required_to_resolve_conflict_ = false; |
| 122 } | 128 } |
| 123 | 129 |
| 124 // This limit will take effect on all future invalidations received. | 130 // This limit will take effect on all future invalidations received. |
| 125 void DataTypeTracker::UpdatePayloadBufferSize(size_t new_size) { | 131 void DataTypeTracker::UpdatePayloadBufferSize(size_t new_size) { |
| 126 payload_buffer_size_ = new_size; | 132 payload_buffer_size_ = new_size; |
| 127 } | 133 } |
| 128 | 134 |
| 129 bool DataTypeTracker::IsSyncRequired() const { | 135 bool DataTypeTracker::IsSyncRequired() const { |
| 130 return !IsThrottled() && (HasLocalChangePending() || IsGetUpdatesRequired()); | 136 return !IsThrottled() && (HasLocalChangePending() || IsGetUpdatesRequired()); |
| 131 } | 137 } |
| 132 | 138 |
| 133 bool DataTypeTracker::IsGetUpdatesRequired() const { | 139 bool DataTypeTracker::IsGetUpdatesRequired() const { |
| 134 return !IsThrottled() && | 140 return !IsThrottled() && |
| 135 (HasRefreshRequestPending() || HasPendingInvalidation() || | 141 (HasRefreshRequestPending() || HasPendingInvalidation() || |
| 136 IsInitialSyncRequired()); | 142 IsInitialSyncRequired() || IsSyncRequiredToResolveConflict()); |
| 137 } | 143 } |
| 138 | 144 |
| 139 bool DataTypeTracker::HasLocalChangePending() const { | 145 bool DataTypeTracker::HasLocalChangePending() const { |
| 140 return local_nudge_count_ > 0; | 146 return local_nudge_count_ > 0; |
| 141 } | 147 } |
| 142 | 148 |
| 143 bool DataTypeTracker::HasRefreshRequestPending() const { | 149 bool DataTypeTracker::HasRefreshRequestPending() const { |
| 144 return local_refresh_request_count_ > 0; | 150 return local_refresh_request_count_ > 0; |
| 145 } | 151 } |
| 146 | 152 |
| 147 bool DataTypeTracker::HasPendingInvalidation() const { | 153 bool DataTypeTracker::HasPendingInvalidation() const { |
| 148 return !pending_invalidations_.empty() || last_dropped_invalidation_; | 154 return !pending_invalidations_.empty() || last_dropped_invalidation_; |
| 149 } | 155 } |
| 150 | 156 |
| 151 bool DataTypeTracker::IsInitialSyncRequired() const { | 157 bool DataTypeTracker::IsInitialSyncRequired() const { |
| 152 return initial_sync_required_; | 158 return initial_sync_required_; |
| 153 } | 159 } |
| 154 | 160 |
| 161 bool DataTypeTracker::IsSyncRequiredToResolveConflict() const { |
| 162 return sync_required_to_resolve_conflict_; |
| 163 } |
| 164 |
| 155 void DataTypeTracker::SetLegacyNotificationHint( | 165 void DataTypeTracker::SetLegacyNotificationHint( |
| 156 sync_pb::DataTypeProgressMarker* progress) const { | 166 sync_pb::DataTypeProgressMarker* progress) const { |
| 157 DCHECK(!IsThrottled()) | 167 DCHECK(!IsThrottled()) |
| 158 << "We should not make requests if the type is throttled."; | 168 << "We should not make requests if the type is throttled."; |
| 159 | 169 |
| 160 if (!pending_invalidations_.empty() && | 170 if (!pending_invalidations_.empty() && |
| 161 !pending_invalidations_.back()->IsUnknownVersion()) { | 171 !pending_invalidations_.back()->IsUnknownVersion()) { |
| 162 // The old-style source info can contain only one hint per type. We grab | 172 // The old-style source info can contain only one hint per type. We grab |
| 163 // the most recent, to mimic the old coalescing behaviour. | 173 // the most recent, to mimic the old coalescing behaviour. |
| 164 progress->set_notification_hint( | 174 progress->set_notification_hint( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 185 } | 195 } |
| 186 } | 196 } |
| 187 | 197 |
| 188 msg->set_server_dropped_hints( | 198 msg->set_server_dropped_hints( |
| 189 !pending_invalidations_.empty() && | 199 !pending_invalidations_.empty() && |
| 190 (*pending_invalidations_.begin())->IsUnknownVersion()); | 200 (*pending_invalidations_.begin())->IsUnknownVersion()); |
| 191 msg->set_client_dropped_hints(last_dropped_invalidation_); | 201 msg->set_client_dropped_hints(last_dropped_invalidation_); |
| 192 msg->set_local_modification_nudges(local_nudge_count_); | 202 msg->set_local_modification_nudges(local_nudge_count_); |
| 193 msg->set_datatype_refresh_nudges(local_refresh_request_count_); | 203 msg->set_datatype_refresh_nudges(local_refresh_request_count_); |
| 194 msg->set_initial_sync_in_progress(initial_sync_required_); | 204 msg->set_initial_sync_in_progress(initial_sync_required_); |
| 205 msg->set_sync_for_resolve_conflict_in_progress( |
| 206 sync_required_to_resolve_conflict_); |
| 195 } | 207 } |
| 196 | 208 |
| 197 bool DataTypeTracker::IsThrottled() const { | 209 bool DataTypeTracker::IsThrottled() const { |
| 198 return !unthrottle_time_.is_null(); | 210 return !unthrottle_time_.is_null(); |
| 199 } | 211 } |
| 200 | 212 |
| 201 base::TimeDelta DataTypeTracker::GetTimeUntilUnthrottle( | 213 base::TimeDelta DataTypeTracker::GetTimeUntilUnthrottle( |
| 202 base::TimeTicks now) const { | 214 base::TimeTicks now) const { |
| 203 if (!IsThrottled()) { | 215 if (!IsThrottled()) { |
| 204 NOTREACHED(); | 216 NOTREACHED(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 218 unthrottle_time_ = base::TimeTicks(); | 230 unthrottle_time_ = base::TimeTicks(); |
| 219 } | 231 } |
| 220 } | 232 } |
| 221 | 233 |
| 222 void DataTypeTracker::UpdateLocalNudgeDelay(base::TimeDelta delay) { | 234 void DataTypeTracker::UpdateLocalNudgeDelay(base::TimeDelta delay) { |
| 223 nudge_delay_ = delay; | 235 nudge_delay_ = delay; |
| 224 } | 236 } |
| 225 | 237 |
| 226 } // namespace sessions | 238 } // namespace sessions |
| 227 } // namespace syncer | 239 } // namespace syncer |
| OLD | NEW |