OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/engine/entity_tracker.h" | 5 #include "sync/engine/entity_tracker.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "sync/internal_api/public/base/model_type.h" | 8 #include "sync/internal_api/public/base/model_type.h" |
9 #include "sync/internal_api/public/non_blocking_sync_common.h" | 9 #include "sync/internal_api/public/non_blocking_sync_common.h" |
10 #include "sync/syncable/syncable_util.h" | 10 #include "sync/syncable/syncable_util.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 highest_commit_response_version_ = response_version; | 186 highest_commit_response_version_ = response_version; |
187 | 187 |
188 // Because an in-progress commit blocks the sync thread, we can assume that | 188 // Because an in-progress commit blocks the sync thread, we can assume that |
189 // the item we just committed successfully is exactly the one we have now. | 189 // the item we just committed successfully is exactly the one we have now. |
190 // Nothing changed it while the commit was happening. Since we're now in | 190 // Nothing changed it while the commit was happening. Since we're now in |
191 // sync with the server, we can clear the pending commit. | 191 // sync with the server, we can clear the pending commit. |
192 ClearPendingCommit(); | 192 ClearPendingCommit(); |
193 } | 193 } |
194 | 194 |
195 void EntityTracker::ReceiveUpdate(int64 version) { | 195 void EntityTracker::ReceiveUpdate(int64 version) { |
196 highest_gu_response_version_ = | 196 if (version <= highest_gu_response_version_) |
197 std::max(highest_gu_response_version_, version); | 197 return; |
| 198 |
| 199 highest_gu_response_version_ = version; |
| 200 |
| 201 // Got an applicable update newer than any pending updates. It must be safe |
| 202 // to discard the old pending update, if there was one. |
| 203 ClearPendingUpdate(); |
198 | 204 |
199 if (IsInConflict()) { | 205 if (IsInConflict()) { |
200 // Incoming update clobbers the pending commit on the sync thread. | 206 // Incoming update clobbers the pending commit on the sync thread. |
201 // The model thread can re-request this commit later if it wants to. | 207 // The model thread can re-request this commit later if it wants to. |
202 ClearPendingCommit(); | 208 ClearPendingCommit(); |
203 } | 209 } |
204 } | 210 } |
205 | 211 |
| 212 bool EntityTracker::ReceivePendingUpdate(const UpdateResponseData& data) { |
| 213 if (data.response_version < highest_gu_response_version_) |
| 214 return false; |
| 215 |
| 216 highest_gu_response_version_ = data.response_version; |
| 217 pending_update_.reset(new UpdateResponseData(data)); |
| 218 ClearPendingCommit(); |
| 219 return true; |
| 220 } |
| 221 |
| 222 bool EntityTracker::HasPendingUpdate() const { |
| 223 return !!pending_update_; |
| 224 } |
| 225 |
| 226 UpdateResponseData EntityTracker::GetPendingUpdate() const { |
| 227 return *pending_update_; |
| 228 } |
| 229 |
| 230 void EntityTracker::ClearPendingUpdate() { |
| 231 pending_update_.reset(); |
| 232 } |
| 233 |
206 bool EntityTracker::IsInConflict() const { | 234 bool EntityTracker::IsInConflict() const { |
207 if (!is_commit_pending_) | 235 if (!is_commit_pending_) |
208 return false; | 236 return false; |
209 | 237 |
| 238 if (HasPendingUpdate()) |
| 239 return true; |
| 240 |
210 if (highest_gu_response_version_ <= highest_commit_response_version_) { | 241 if (highest_gu_response_version_ <= highest_commit_response_version_) { |
211 // The most recent server state was created in a commit made by this | 242 // The most recent server state was created in a commit made by this |
212 // client. We're fully up to date, and therefore not in conflict. | 243 // client. We're fully up to date, and therefore not in conflict. |
213 return false; | 244 return false; |
214 } else { | 245 } else { |
215 // The most recent server state was written by someone else. | 246 // The most recent server state was written by someone else. |
216 // Did the model thread have the most up to date version when it issued the | 247 // Did the model thread have the most up to date version when it issued the |
217 // commit request? | 248 // commit request? |
218 if (base_version_ >= highest_gu_response_version_) { | 249 if (base_version_ >= highest_gu_response_version_) { |
219 return false; // Yes. | 250 return false; // Yes. |
220 } else { | 251 } else { |
221 return true; // No. | 252 return true; // No. |
222 } | 253 } |
223 } | 254 } |
224 } | 255 } |
225 | 256 |
226 bool EntityTracker::IsServerKnown() const { | 257 bool EntityTracker::IsServerKnown() const { |
227 return base_version_ != kUncommittedVersion; | 258 return base_version_ != kUncommittedVersion; |
228 } | 259 } |
229 | 260 |
230 void EntityTracker::ClearPendingCommit() { | 261 void EntityTracker::ClearPendingCommit() { |
231 is_commit_pending_ = false; | 262 is_commit_pending_ = false; |
232 | 263 |
233 // Clearing the specifics might free up some memory. It can't hurt to try. | 264 // Clearing the specifics might free up some memory. It can't hurt to try. |
234 specifics_.Clear(); | 265 specifics_.Clear(); |
235 } | 266 } |
236 | 267 |
237 } // namespace syncer | 268 } // namespace syncer |
OLD | NEW |