| OLD | NEW |
| 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/base/invalidation.h" | 8 #include "sync/internal_api/public/base/invalidation.h" |
| 9 #include "sync/notifier/invalidation_util.h" | 9 #include "sync/notifier/invalidation_util.h" |
| 10 #include "sync/notifier/object_id_invalidation_map.h" | 10 #include "sync/notifier/object_id_invalidation_map.h" |
| 11 #include "sync/protocol/sync.pb.h" | 11 #include "sync/protocol/sync.pb.h" |
| 12 | 12 |
| 13 namespace syncer { | 13 namespace syncer { |
| 14 namespace sessions { | 14 namespace sessions { |
| 15 | 15 |
| 16 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; | 16 size_t NudgeTracker::kDefaultMaxPayloadsPerType = 10; |
| 17 | 17 |
| 18 NudgeTracker::NudgeTracker() | 18 NudgeTracker::NudgeTracker() |
| 19 : invalidations_enabled_(false), | 19 : type_tracker_deleter_(&type_trackers_), |
| 20 invalidations_enabled_(false), |
| 20 invalidations_out_of_sync_(true) { | 21 invalidations_out_of_sync_(true) { |
| 21 ModelTypeSet protocol_types = ProtocolTypes(); | 22 ModelTypeSet protocol_types = ProtocolTypes(); |
| 22 // Default initialize all the type trackers. | 23 // Default initialize all the type trackers. |
| 23 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); | 24 for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); |
| 24 it.Inc()) { | 25 it.Inc()) { |
| 25 invalidation::ObjectId id; | 26 type_trackers_.insert(std::make_pair(it.Get(), new DataTypeTracker())); |
| 26 if (!RealModelTypeToObjectId(it.Get(), &id)) { | |
| 27 NOTREACHED(); | |
| 28 } else { | |
| 29 type_trackers_.insert(std::make_pair(it.Get(), DataTypeTracker(id))); | |
| 30 } | |
| 31 } | 27 } |
| 32 } | 28 } |
| 33 | 29 |
| 34 NudgeTracker::~NudgeTracker() { } | 30 NudgeTracker::~NudgeTracker() { } |
| 35 | 31 |
| 36 bool NudgeTracker::IsSyncRequired() const { | 32 bool NudgeTracker::IsSyncRequired() const { |
| 37 if (IsRetryRequired()) | 33 if (IsRetryRequired()) |
| 38 return true; | 34 return true; |
| 39 | 35 |
| 40 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 36 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 41 it != type_trackers_.end(); ++it) { | 37 it != type_trackers_.end(); ++it) { |
| 42 if (it->second.IsSyncRequired()) { | 38 if (it->second->IsSyncRequired()) { |
| 43 return true; | 39 return true; |
| 44 } | 40 } |
| 45 } | 41 } |
| 46 | 42 |
| 47 return false; | 43 return false; |
| 48 } | 44 } |
| 49 | 45 |
| 50 bool NudgeTracker::IsGetUpdatesRequired() const { | 46 bool NudgeTracker::IsGetUpdatesRequired() const { |
| 51 if (invalidations_out_of_sync_) | 47 if (invalidations_out_of_sync_) |
| 52 return true; | 48 return true; |
| 53 | 49 |
| 54 if (IsRetryRequired()) | 50 if (IsRetryRequired()) |
| 55 return true; | 51 return true; |
| 56 | 52 |
| 57 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 53 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 58 it != type_trackers_.end(); ++it) { | 54 it != type_trackers_.end(); ++it) { |
| 59 if (it->second.IsGetUpdatesRequired()) { | 55 if (it->second->IsGetUpdatesRequired()) { |
| 60 return true; | 56 return true; |
| 61 } | 57 } |
| 62 } | 58 } |
| 63 return false; | 59 return false; |
| 64 } | 60 } |
| 65 | 61 |
| 66 bool NudgeTracker::IsRetryRequired() const { | 62 bool NudgeTracker::IsRetryRequired() const { |
| 67 if (sync_cycle_start_time_.is_null()) | 63 if (sync_cycle_start_time_.is_null()) |
| 68 return false; | 64 return false; |
| 69 | 65 |
| 70 if (current_retry_time_.is_null()) | 66 if (current_retry_time_.is_null()) |
| 71 return false; | 67 return false; |
| 72 | 68 |
| 73 return current_retry_time_ < sync_cycle_start_time_; | 69 return current_retry_time_ < sync_cycle_start_time_; |
| 74 } | 70 } |
| 75 | 71 |
| 76 void NudgeTracker::RecordSuccessfulSyncCycle() { | 72 void NudgeTracker::RecordSuccessfulSyncCycle() { |
| 77 // If a retry was required, we've just serviced it. Unset the flag. | 73 // If a retry was required, we've just serviced it. Unset the flag. |
| 78 if (IsRetryRequired()) | 74 if (IsRetryRequired()) |
| 79 current_retry_time_ = base::TimeTicks(); | 75 current_retry_time_ = base::TimeTicks(); |
| 80 | 76 |
| 81 // A successful cycle while invalidations are enabled puts us back into sync. | 77 // A successful cycle while invalidations are enabled puts us back into sync. |
| 82 invalidations_out_of_sync_ = !invalidations_enabled_; | 78 invalidations_out_of_sync_ = !invalidations_enabled_; |
| 83 | 79 |
| 84 for (TypeTrackerMap::iterator it = type_trackers_.begin(); | 80 for (TypeTrackerMap::iterator it = type_trackers_.begin(); |
| 85 it != type_trackers_.end(); ++it) { | 81 it != type_trackers_.end(); ++it) { |
| 86 it->second.RecordSuccessfulSyncCycle(); | 82 it->second->RecordSuccessfulSyncCycle(); |
| 87 } | 83 } |
| 88 } | 84 } |
| 89 | 85 |
| 90 void NudgeTracker::RecordLocalChange(ModelTypeSet types) { | 86 void NudgeTracker::RecordLocalChange(ModelTypeSet types) { |
| 91 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); | 87 for (ModelTypeSet::Iterator type_it = types.First(); type_it.Good(); |
| 92 type_it.Inc()) { | 88 type_it.Inc()) { |
| 93 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type_it.Get()); | 89 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type_it.Get()); |
| 94 DCHECK(tracker_it != type_trackers_.end()); | 90 DCHECK(tracker_it != type_trackers_.end()); |
| 95 tracker_it->second.RecordLocalChange(); | 91 tracker_it->second->RecordLocalChange(); |
| 96 } | 92 } |
| 97 } | 93 } |
| 98 | 94 |
| 99 void NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { | 95 void NudgeTracker::RecordLocalRefreshRequest(ModelTypeSet types) { |
| 100 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | 96 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { |
| 101 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); | 97 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); |
| 102 DCHECK(tracker_it != type_trackers_.end()); | 98 DCHECK(tracker_it != type_trackers_.end()); |
| 103 tracker_it->second.RecordLocalRefreshRequest(); | 99 tracker_it->second->RecordLocalRefreshRequest(); |
| 104 } | 100 } |
| 105 } | 101 } |
| 106 | 102 |
| 107 void NudgeTracker::RecordRemoteInvalidation( | 103 void NudgeTracker::RecordRemoteInvalidation( |
| 108 const ObjectIdInvalidationMap& invalidation_map) { | 104 syncer::ModelType type, |
| 109 // Be very careful here. The invalidations acknowledgement system requires a | 105 scoped_ptr<InvalidationInterface> invalidation) { |
| 110 // sort of manual memory management. We'll leak a small amount of memory if | 106 // Forward the invalidations to the proper recipient. |
| 111 // we fail to acknowledge or drop any of these incoming invalidations. | 107 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); |
| 112 | 108 DCHECK(tracker_it != type_trackers_.end()); |
| 113 ObjectIdSet id_set = invalidation_map.GetObjectIds(); | 109 tracker_it->second->RecordRemoteInvalidation(invalidation.Pass()); |
| 114 for (ObjectIdSet::iterator it = id_set.begin(); it != id_set.end(); ++it) { | |
| 115 ModelType type; | |
| 116 | |
| 117 // This should never happen. If it does, we'll start to leak memory. | |
| 118 if (!ObjectIdToRealModelType(*it, &type)) { | |
| 119 NOTREACHED() | |
| 120 << "Object ID " << ObjectIdToString(*it) | |
| 121 << " does not map to valid model type"; | |
| 122 continue; | |
| 123 } | |
| 124 | |
| 125 // Forward the invalidations to the proper recipient. | |
| 126 TypeTrackerMap::iterator tracker_it = type_trackers_.find(type); | |
| 127 DCHECK(tracker_it != type_trackers_.end()); | |
| 128 tracker_it->second.RecordRemoteInvalidations( | |
| 129 invalidation_map.ForObject(*it)); | |
| 130 } | |
| 131 } | 110 } |
| 132 | 111 |
| 133 void NudgeTracker::OnInvalidationsEnabled() { | 112 void NudgeTracker::OnInvalidationsEnabled() { |
| 134 invalidations_enabled_ = true; | 113 invalidations_enabled_ = true; |
| 135 } | 114 } |
| 136 | 115 |
| 137 void NudgeTracker::OnInvalidationsDisabled() { | 116 void NudgeTracker::OnInvalidationsDisabled() { |
| 138 invalidations_enabled_ = false; | 117 invalidations_enabled_ = false; |
| 139 invalidations_out_of_sync_ = true; | 118 invalidations_out_of_sync_ = true; |
| 140 } | 119 } |
| 141 | 120 |
| 142 void NudgeTracker::SetTypesThrottledUntil( | 121 void NudgeTracker::SetTypesThrottledUntil( |
| 143 ModelTypeSet types, | 122 ModelTypeSet types, |
| 144 base::TimeDelta length, | 123 base::TimeDelta length, |
| 145 base::TimeTicks now) { | 124 base::TimeTicks now) { |
| 146 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | 125 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { |
| 147 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); | 126 TypeTrackerMap::iterator tracker_it = type_trackers_.find(it.Get()); |
| 148 tracker_it->second.ThrottleType(length, now); | 127 tracker_it->second->ThrottleType(length, now); |
| 149 } | 128 } |
| 150 } | 129 } |
| 151 | 130 |
| 152 void NudgeTracker::UpdateTypeThrottlingState(base::TimeTicks now) { | 131 void NudgeTracker::UpdateTypeThrottlingState(base::TimeTicks now) { |
| 153 for (TypeTrackerMap::iterator it = type_trackers_.begin(); | 132 for (TypeTrackerMap::iterator it = type_trackers_.begin(); |
| 154 it != type_trackers_.end(); ++it) { | 133 it != type_trackers_.end(); ++it) { |
| 155 it->second.UpdateThrottleState(now); | 134 it->second->UpdateThrottleState(now); |
| 156 } | 135 } |
| 157 } | 136 } |
| 158 | 137 |
| 159 bool NudgeTracker::IsAnyTypeThrottled() const { | 138 bool NudgeTracker::IsAnyTypeThrottled() const { |
| 160 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 139 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 161 it != type_trackers_.end(); ++it) { | 140 it != type_trackers_.end(); ++it) { |
| 162 if (it->second.IsThrottled()) { | 141 if (it->second->IsThrottled()) { |
| 163 return true; | 142 return true; |
| 164 } | 143 } |
| 165 } | 144 } |
| 166 return false; | 145 return false; |
| 167 } | 146 } |
| 168 | 147 |
| 169 bool NudgeTracker::IsTypeThrottled(ModelType type) const { | 148 bool NudgeTracker::IsTypeThrottled(ModelType type) const { |
| 170 DCHECK(type_trackers_.find(type) != type_trackers_.end()); | 149 DCHECK(type_trackers_.find(type) != type_trackers_.end()); |
| 171 return type_trackers_.find(type)->second.IsThrottled(); | 150 return type_trackers_.find(type)->second->IsThrottled(); |
| 172 } | 151 } |
| 173 | 152 |
| 174 base::TimeDelta NudgeTracker::GetTimeUntilNextUnthrottle( | 153 base::TimeDelta NudgeTracker::GetTimeUntilNextUnthrottle( |
| 175 base::TimeTicks now) const { | 154 base::TimeTicks now) const { |
| 176 DCHECK(IsAnyTypeThrottled()) << "This function requires a pending unthrottle"; | 155 DCHECK(IsAnyTypeThrottled()) << "This function requires a pending unthrottle"; |
| 177 | 156 |
| 178 // Return min of GetTimeUntilUnthrottle() values for all IsThrottled() types. | 157 // Return min of GetTimeUntilUnthrottle() values for all IsThrottled() types. |
| 179 base::TimeDelta time_until_next_unthrottle = base::TimeDelta::Max(); | 158 base::TimeDelta time_until_next_unthrottle = base::TimeDelta::Max(); |
| 180 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 159 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 181 it != type_trackers_.end(); ++it) { | 160 it != type_trackers_.end(); ++it) { |
| 182 if (it->second.IsThrottled()) { | 161 if (it->second->IsThrottled()) { |
| 183 time_until_next_unthrottle = | 162 time_until_next_unthrottle = std::min( |
| 184 std::min(time_until_next_unthrottle, | 163 time_until_next_unthrottle, it->second->GetTimeUntilUnthrottle(now)); |
| 185 it->second.GetTimeUntilUnthrottle(now)); | |
| 186 } | 164 } |
| 187 } | 165 } |
| 188 DCHECK(!time_until_next_unthrottle.is_max()); | 166 DCHECK(!time_until_next_unthrottle.is_max()); |
| 189 | 167 |
| 190 return time_until_next_unthrottle; | 168 return time_until_next_unthrottle; |
| 191 } | 169 } |
| 192 | 170 |
| 193 ModelTypeSet NudgeTracker::GetThrottledTypes() const { | 171 ModelTypeSet NudgeTracker::GetThrottledTypes() const { |
| 194 ModelTypeSet result; | 172 ModelTypeSet result; |
| 195 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 173 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 196 it != type_trackers_.end(); ++it) { | 174 it != type_trackers_.end(); ++it) { |
| 197 if (it->second.IsThrottled()) { | 175 if (it->second->IsThrottled()) { |
| 198 result.Put(it->first); | 176 result.Put(it->first); |
| 199 } | 177 } |
| 200 } | 178 } |
| 201 return result; | 179 return result; |
| 202 } | 180 } |
| 203 | 181 |
| 204 ModelTypeSet NudgeTracker::GetNudgedTypes() const { | 182 ModelTypeSet NudgeTracker::GetNudgedTypes() const { |
| 205 ModelTypeSet result; | 183 ModelTypeSet result; |
| 206 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 184 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 207 it != type_trackers_.end(); ++it) { | 185 it != type_trackers_.end(); ++it) { |
| 208 if (it->second.HasLocalChangePending()) { | 186 if (it->second->HasLocalChangePending()) { |
| 209 result.Put(it->first); | 187 result.Put(it->first); |
| 210 } | 188 } |
| 211 } | 189 } |
| 212 return result; | 190 return result; |
| 213 } | 191 } |
| 214 | 192 |
| 215 ModelTypeSet NudgeTracker::GetNotifiedTypes() const { | 193 ModelTypeSet NudgeTracker::GetNotifiedTypes() const { |
| 216 ModelTypeSet result; | 194 ModelTypeSet result; |
| 217 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 195 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 218 it != type_trackers_.end(); ++it) { | 196 it != type_trackers_.end(); ++it) { |
| 219 if (it->second.HasPendingInvalidation()) { | 197 if (it->second->HasPendingInvalidation()) { |
| 220 result.Put(it->first); | 198 result.Put(it->first); |
| 221 } | 199 } |
| 222 } | 200 } |
| 223 return result; | 201 return result; |
| 224 } | 202 } |
| 225 | 203 |
| 226 ModelTypeSet NudgeTracker::GetRefreshRequestedTypes() const { | 204 ModelTypeSet NudgeTracker::GetRefreshRequestedTypes() const { |
| 227 ModelTypeSet result; | 205 ModelTypeSet result; |
| 228 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 206 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 229 it != type_trackers_.end(); ++it) { | 207 it != type_trackers_.end(); ++it) { |
| 230 if (it->second.HasRefreshRequestPending()) { | 208 if (it->second->HasRefreshRequestPending()) { |
| 231 result.Put(it->first); | 209 result.Put(it->first); |
| 232 } | 210 } |
| 233 } | 211 } |
| 234 return result; | 212 return result; |
| 235 } | 213 } |
| 236 | 214 |
| 237 void NudgeTracker::SetLegacyNotificationHint( | 215 void NudgeTracker::SetLegacyNotificationHint( |
| 238 ModelType type, | 216 ModelType type, |
| 239 sync_pb::DataTypeProgressMarker* progress) const { | 217 sync_pb::DataTypeProgressMarker* progress) const { |
| 240 DCHECK(type_trackers_.find(type) != type_trackers_.end()); | 218 DCHECK(type_trackers_.find(type) != type_trackers_.end()); |
| 241 type_trackers_.find(type)->second.SetLegacyNotificationHint(progress); | 219 type_trackers_.find(type)->second->SetLegacyNotificationHint(progress); |
| 242 } | 220 } |
| 243 | 221 |
| 244 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource NudgeTracker::GetLegacySource() | 222 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource NudgeTracker::GetLegacySource() |
| 245 const { | 223 const { |
| 246 // There's an order to these sources: NOTIFICATION, DATATYPE_REFRESH, LOCAL, | 224 // There's an order to these sources: NOTIFICATION, DATATYPE_REFRESH, LOCAL, |
| 247 // RETRY. The server makes optimization decisions based on this field, so | 225 // RETRY. The server makes optimization decisions based on this field, so |
| 248 // it's important to get this right. Setting it wrong could lead to missed | 226 // it's important to get this right. Setting it wrong could lead to missed |
| 249 // updates. | 227 // updates. |
| 250 // | 228 // |
| 251 // This complexity is part of the reason why we're deprecating 'source' in | 229 // This complexity is part of the reason why we're deprecating 'source' in |
| 252 // favor of 'origin'. | 230 // favor of 'origin'. |
| 253 bool has_invalidation_pending = false; | 231 bool has_invalidation_pending = false; |
| 254 bool has_refresh_request_pending = false; | 232 bool has_refresh_request_pending = false; |
| 255 bool has_commit_pending = false; | 233 bool has_commit_pending = false; |
| 256 bool has_retry = IsRetryRequired(); | 234 bool has_retry = IsRetryRequired(); |
| 257 | 235 |
| 258 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); | 236 for (TypeTrackerMap::const_iterator it = type_trackers_.begin(); |
| 259 it != type_trackers_.end(); ++it) { | 237 it != type_trackers_.end(); ++it) { |
| 260 const DataTypeTracker& tracker = it->second; | 238 const DataTypeTracker& tracker = *it->second; |
| 261 if (!tracker.IsThrottled() && tracker.HasPendingInvalidation()) { | 239 if (!tracker.IsThrottled() && tracker.HasPendingInvalidation()) { |
| 262 has_invalidation_pending = true; | 240 has_invalidation_pending = true; |
| 263 } | 241 } |
| 264 if (!tracker.IsThrottled() && tracker.HasRefreshRequestPending()) { | 242 if (!tracker.IsThrottled() && tracker.HasRefreshRequestPending()) { |
| 265 has_refresh_request_pending = true; | 243 has_refresh_request_pending = true; |
| 266 } | 244 } |
| 267 if (!tracker.IsThrottled() && tracker.HasLocalChangePending()) { | 245 if (!tracker.IsThrottled() && tracker.HasLocalChangePending()) { |
| 268 has_commit_pending = true; | 246 has_commit_pending = true; |
| 269 } | 247 } |
| 270 } | 248 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 284 | 262 |
| 285 void NudgeTracker::FillProtoMessage( | 263 void NudgeTracker::FillProtoMessage( |
| 286 ModelType type, | 264 ModelType type, |
| 287 sync_pb::GetUpdateTriggers* msg) const { | 265 sync_pb::GetUpdateTriggers* msg) const { |
| 288 DCHECK(type_trackers_.find(type) != type_trackers_.end()); | 266 DCHECK(type_trackers_.find(type) != type_trackers_.end()); |
| 289 | 267 |
| 290 // Fill what we can from the global data. | 268 // Fill what we can from the global data. |
| 291 msg->set_invalidations_out_of_sync(invalidations_out_of_sync_); | 269 msg->set_invalidations_out_of_sync(invalidations_out_of_sync_); |
| 292 | 270 |
| 293 // Delegate the type-specific work to the DataTypeTracker class. | 271 // Delegate the type-specific work to the DataTypeTracker class. |
| 294 type_trackers_.find(type)->second.FillGetUpdatesTriggersMessage(msg); | 272 type_trackers_.find(type)->second->FillGetUpdatesTriggersMessage(msg); |
| 295 } | 273 } |
| 296 | 274 |
| 297 void NudgeTracker::SetSyncCycleStartTime(base::TimeTicks now) { | 275 void NudgeTracker::SetSyncCycleStartTime(base::TimeTicks now) { |
| 298 sync_cycle_start_time_ = now; | 276 sync_cycle_start_time_ = now; |
| 299 | 277 |
| 300 // If current_retry_time_ is still set, that means we have an old retry time | 278 // If current_retry_time_ is still set, that means we have an old retry time |
| 301 // left over from a previous cycle. For example, maybe we tried to perform | 279 // left over from a previous cycle. For example, maybe we tried to perform |
| 302 // this retry, hit a network connection error, and now we're in exponential | 280 // this retry, hit a network connection error, and now we're in exponential |
| 303 // backoff. In that case, we want this sync cycle to include the GU retry | 281 // backoff. In that case, we want this sync cycle to include the GU retry |
| 304 // flag so we leave this variable set regardless of whether or not there is an | 282 // flag so we leave this variable set regardless of whether or not there is an |
| 305 // overwrite pending. | 283 // overwrite pending. |
| 306 if (!current_retry_time_.is_null()) { | 284 if (!current_retry_time_.is_null()) { |
| 307 return; | 285 return; |
| 308 } | 286 } |
| 309 | 287 |
| 310 // If do not have a current_retry_time_, but we do have a next_retry_time_ and | 288 // If do not have a current_retry_time_, but we do have a next_retry_time_ and |
| 311 // it is ready to go, then we set it as the current_retry_time_. It will stay | 289 // it is ready to go, then we set it as the current_retry_time_. It will stay |
| 312 // there until a GU retry has succeeded. | 290 // there until a GU retry has succeeded. |
| 313 if (!next_retry_time_.is_null() && | 291 if (!next_retry_time_.is_null() && |
| 314 next_retry_time_ < sync_cycle_start_time_) { | 292 next_retry_time_ < sync_cycle_start_time_) { |
| 315 current_retry_time_ = next_retry_time_; | 293 current_retry_time_ = next_retry_time_; |
| 316 next_retry_time_ = base::TimeTicks(); | 294 next_retry_time_ = base::TimeTicks(); |
| 317 } | 295 } |
| 318 } | 296 } |
| 319 | 297 |
| 320 void NudgeTracker::SetHintBufferSize(size_t size) { | 298 void NudgeTracker::SetHintBufferSize(size_t size) { |
| 321 for (TypeTrackerMap::iterator it = type_trackers_.begin(); | 299 for (TypeTrackerMap::iterator it = type_trackers_.begin(); |
| 322 it != type_trackers_.end(); ++it) { | 300 it != type_trackers_.end(); ++it) { |
| 323 it->second.UpdatePayloadBufferSize(size); | 301 it->second->UpdatePayloadBufferSize(size); |
| 324 } | 302 } |
| 325 } | 303 } |
| 326 | 304 |
| 327 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { | 305 void NudgeTracker::SetNextRetryTime(base::TimeTicks retry_time) { |
| 328 next_retry_time_ = retry_time; | 306 next_retry_time_ = retry_time; |
| 329 } | 307 } |
| 330 | 308 |
| 331 } // namespace sessions | 309 } // namespace sessions |
| 332 } // namespace syncer | 310 } // namespace syncer |
| OLD | NEW |