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/engine/get_commit_ids.h" | 5 #include "components/sync/engine_impl/get_commit_ids.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <set> | 10 #include <set> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "sync/engine/syncer_util.h" | 14 #include "components/sync/base/cryptographer.h" |
15 #include "sync/syncable/directory.h" | 15 #include "components/sync/engine_impl/syncer_util.h" |
16 #include "sync/syncable/entry.h" | 16 #include "components/sync/syncable/directory.h" |
17 #include "sync/syncable/nigori_handler.h" | 17 #include "components/sync/syncable/entry.h" |
18 #include "sync/syncable/nigori_util.h" | 18 #include "components/sync/syncable/nigori_handler.h" |
19 #include "sync/syncable/syncable_base_transaction.h" | 19 #include "components/sync/syncable/nigori_util.h" |
20 #include "sync/syncable/syncable_util.h" | 20 #include "components/sync/syncable/syncable_base_transaction.h" |
21 #include "sync/util/cryptographer.h" | 21 #include "components/sync/syncable/syncable_util.h" |
22 | 22 |
23 using std::set; | 23 using std::set; |
24 using std::vector; | 24 using std::vector; |
25 | 25 |
26 namespace syncer { | 26 namespace syncer { |
27 | 27 |
28 namespace { | 28 namespace { |
29 | 29 |
30 // Forward-declare some helper functions. This gives us more options for | 30 // Forward-declare some helper functions. This gives us more options for |
31 // ordering the function defintions within this file. | 31 // ordering the function defintions within this file. |
(...skipping 13 matching lines...) Expand all Loading... |
45 // |max_entries| of them in the output parameter |out|. | 45 // |max_entries| of them in the output parameter |out|. |
46 // | 46 // |
47 // See the header file for an explanation of commit ordering. | 47 // See the header file for an explanation of commit ordering. |
48 void OrderCommitIds(syncable::BaseTransaction* trans, | 48 void OrderCommitIds(syncable::BaseTransaction* trans, |
49 size_t max_entries, | 49 size_t max_entries, |
50 const std::set<int64_t>& ready_unsynced_set, | 50 const std::set<int64_t>& ready_unsynced_set, |
51 std::vector<int64_t>* out); | 51 std::vector<int64_t>* out); |
52 | 52 |
53 } // namespace | 53 } // namespace |
54 | 54 |
55 void GetCommitIdsForType( | 55 void GetCommitIdsForType(syncable::BaseTransaction* trans, |
56 syncable::BaseTransaction* trans, | 56 ModelType type, |
57 ModelType type, | 57 size_t max_entries, |
58 size_t max_entries, | 58 syncable::Directory::Metahandles* out) { |
59 syncable::Directory::Metahandles* out) { | |
60 syncable::Directory* dir = trans->directory(); | 59 syncable::Directory* dir = trans->directory(); |
61 | 60 |
62 // Gather the full set of unsynced items and store it in the session. They | 61 // Gather the full set of unsynced items and store it in the session. They |
63 // are not in the correct order for commit. | 62 // are not in the correct order for commit. |
64 std::set<int64_t> ready_unsynced_set; | 63 std::set<int64_t> ready_unsynced_set; |
65 syncable::Directory::Metahandles all_unsynced_handles; | 64 syncable::Directory::Metahandles all_unsynced_handles; |
66 GetUnsyncedEntries(trans, &all_unsynced_handles); | 65 GetUnsyncedEntries(trans, &all_unsynced_handles); |
67 | 66 |
68 ModelTypeSet encrypted_types; | 67 ModelTypeSet encrypted_types; |
69 bool passphrase_missing = false; | 68 bool passphrase_missing = false; |
70 Cryptographer* cryptographer = dir->GetCryptographer(trans); | 69 Cryptographer* cryptographer = dir->GetCryptographer(trans); |
71 if (cryptographer) { | 70 if (cryptographer) { |
72 encrypted_types = dir->GetNigoriHandler()->GetEncryptedTypes(trans); | 71 encrypted_types = dir->GetNigoriHandler()->GetEncryptedTypes(trans); |
73 passphrase_missing = cryptographer->has_pending_keys(); | 72 passphrase_missing = cryptographer->has_pending_keys(); |
74 } | 73 } |
75 | 74 |
76 // We filter out all unready entries from the set of unsynced handles. This | 75 // We filter out all unready entries from the set of unsynced handles. This |
77 // new set of ready and unsynced items is then what we use to determine what | 76 // new set of ready and unsynced items is then what we use to determine what |
78 // is a candidate for commit. The caller is responsible for ensuring that no | 77 // is a candidate for commit. The caller is responsible for ensuring that no |
79 // throttled types are included among the requested_types. | 78 // throttled types are included among the requested_types. |
80 FilterUnreadyEntries(trans, | 79 FilterUnreadyEntries(trans, ModelTypeSet(type), encrypted_types, |
81 ModelTypeSet(type), | 80 passphrase_missing, all_unsynced_handles, |
82 encrypted_types, | |
83 passphrase_missing, | |
84 all_unsynced_handles, | |
85 &ready_unsynced_set); | 81 &ready_unsynced_set); |
86 | 82 |
87 OrderCommitIds(trans, max_entries, ready_unsynced_set, out); | 83 OrderCommitIds(trans, max_entries, ready_unsynced_set, out); |
88 | 84 |
89 for (size_t i = 0; i < out->size(); i++) { | 85 for (size_t i = 0; i < out->size(); i++) { |
90 DVLOG(1) << "Debug commit batch result:" << (*out)[i]; | 86 DVLOG(1) << "Debug commit batch result:" << (*out)[i]; |
91 } | 87 } |
92 } | 88 } |
93 | 89 |
94 namespace { | 90 namespace { |
95 | 91 |
96 bool IsEntryInConflict(const syncable::Entry& entry) { | 92 bool IsEntryInConflict(const syncable::Entry& entry) { |
97 if (entry.GetIsUnsynced() && | 93 if (entry.GetIsUnsynced() && entry.GetServerVersion() > 0 && |
98 entry.GetServerVersion() > 0 && | |
99 (entry.GetServerVersion() > entry.GetBaseVersion())) { | 94 (entry.GetServerVersion() > entry.GetBaseVersion())) { |
100 // The local and server versions don't match. The item must be in | 95 // The local and server versions don't match. The item must be in |
101 // conflict, so there's no point in attempting to commit. | 96 // conflict, so there's no point in attempting to commit. |
102 DCHECK(entry.GetIsUnappliedUpdate()); | 97 DCHECK(entry.GetIsUnappliedUpdate()); |
103 DVLOG(1) << "Excluding entry from commit due to version mismatch " | 98 DVLOG(1) << "Excluding entry from commit due to version mismatch " << entry; |
104 << entry; | |
105 return true; | 99 return true; |
106 } | 100 } |
107 return false; | 101 return false; |
108 } | 102 } |
109 | 103 |
110 // Return true if this entry has any attachments that haven't yet been uploaded | 104 // Return true if this entry has any attachments that haven't yet been uploaded |
111 // to the server. | 105 // to the server. |
112 bool HasAttachmentNotOnServer(const syncable::Entry& entry) { | 106 bool HasAttachmentNotOnServer(const syncable::Entry& entry) { |
113 const sync_pb::AttachmentMetadata& metadata = entry.GetAttachmentMetadata(); | 107 const sync_pb::AttachmentMetadata& metadata = entry.GetAttachmentMetadata(); |
114 for (int i = 0; i < metadata.record_size(); ++i) { | 108 for (int i = 0; i < metadata.record_size(); ++i) { |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 | 483 |
490 void Traversal::AddCreatesAndMoves( | 484 void Traversal::AddCreatesAndMoves( |
491 const std::set<int64_t>& ready_unsynced_set) { | 485 const std::set<int64_t>& ready_unsynced_set) { |
492 // Add moves and creates, and prepend their uncommitted parents. | 486 // Add moves and creates, and prepend their uncommitted parents. |
493 for (std::set<int64_t>::const_iterator iter = ready_unsynced_set.begin(); | 487 for (std::set<int64_t>::const_iterator iter = ready_unsynced_set.begin(); |
494 !IsFull() && iter != ready_unsynced_set.end(); ++iter) { | 488 !IsFull() && iter != ready_unsynced_set.end(); ++iter) { |
495 int64_t metahandle = *iter; | 489 int64_t metahandle = *iter; |
496 if (HaveItem(metahandle)) | 490 if (HaveItem(metahandle)) |
497 continue; | 491 continue; |
498 | 492 |
499 syncable::Entry entry(trans_, | 493 syncable::Entry entry(trans_, syncable::GET_BY_HANDLE, metahandle); |
500 syncable::GET_BY_HANDLE, | |
501 metahandle); | |
502 if (!entry.GetIsDel()) { | 494 if (!entry.GetIsDel()) { |
503 if (SupportsHierarchy(entry)) { | 495 if (SupportsHierarchy(entry)) { |
504 // We only commit an item + its dependencies if it and all its | 496 // We only commit an item + its dependencies if it and all its |
505 // dependencies are not in conflict. | 497 // dependencies are not in conflict. |
506 syncable::Directory::Metahandles item_dependencies; | 498 syncable::Directory::Metahandles item_dependencies; |
507 AddUncommittedParents(ready_unsynced_set, entry, &item_dependencies); | 499 AddUncommittedParents(ready_unsynced_set, entry, &item_dependencies); |
508 TryAddItem(ready_unsynced_set, entry, &item_dependencies); | 500 TryAddItem(ready_unsynced_set, entry, &item_dependencies); |
509 AppendManyToTraversal(item_dependencies); | 501 AppendManyToTraversal(item_dependencies); |
510 } else { | 502 } else { |
511 // No hierarchy dependencies, just commit the item itself. | 503 // No hierarchy dependencies, just commit the item itself. |
(...skipping 19 matching lines...) Expand all Loading... |
531 int64_t metahandle = *iter; | 523 int64_t metahandle = *iter; |
532 | 524 |
533 if (HaveItem(metahandle)) | 525 if (HaveItem(metahandle)) |
534 continue; | 526 continue; |
535 | 527 |
536 if (std::find(deletion_list.begin(), deletion_list.end(), metahandle) != | 528 if (std::find(deletion_list.begin(), deletion_list.end(), metahandle) != |
537 deletion_list.end()) { | 529 deletion_list.end()) { |
538 continue; | 530 continue; |
539 } | 531 } |
540 | 532 |
541 syncable::Entry entry(trans_, syncable::GET_BY_HANDLE, | 533 syncable::Entry entry(trans_, syncable::GET_BY_HANDLE, metahandle); |
542 metahandle); | |
543 | 534 |
544 if (entry.GetIsDel()) { | 535 if (entry.GetIsDel()) { |
545 if (SupportsHierarchy(entry)) { | 536 if (SupportsHierarchy(entry)) { |
546 syncable::Directory::Metahandles parents; | 537 syncable::Directory::Metahandles parents; |
547 AddDeletedParents(ready_unsynced_set, entry, deletion_list, &parents); | 538 AddDeletedParents(ready_unsynced_set, entry, deletion_list, &parents); |
548 // Append parents and chilren in top to bottom order. | 539 // Append parents and chilren in top to bottom order. |
549 deletion_list.insert(deletion_list.end(), parents.begin(), | 540 deletion_list.insert(deletion_list.end(), parents.begin(), |
550 parents.end()); | 541 parents.end()); |
551 } | 542 } |
552 deletion_list.push_back(metahandle); | 543 deletion_list.push_back(metahandle); |
(...skipping 28 matching lines...) Expand all Loading... |
581 // Add moves and creates, and prepend their uncommitted parents. | 572 // Add moves and creates, and prepend their uncommitted parents. |
582 traversal.AddCreatesAndMoves(ready_unsynced_set); | 573 traversal.AddCreatesAndMoves(ready_unsynced_set); |
583 | 574 |
584 // Add all deletes. | 575 // Add all deletes. |
585 traversal.AddDeletes(ready_unsynced_set); | 576 traversal.AddDeletes(ready_unsynced_set); |
586 } | 577 } |
587 | 578 |
588 } // namespace | 579 } // namespace |
589 | 580 |
590 } // namespace syncer | 581 } // namespace syncer |
OLD | NEW |