Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: chrome/browser/sync/engine/get_commit_ids_command.h

Issue 8922015: [Sync] Don't commit items with predecessors/parents in conflict. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments + rebase Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/sync/engine/get_commit_ids_command.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_ 5 #ifndef CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_
6 #define CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_ 6 #define CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_
7 #pragma once 7 #pragma once
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 13 matching lines...) Expand all
24 friend class SyncerTest; 24 friend class SyncerTest;
25 25
26 public: 26 public:
27 explicit GetCommitIdsCommand(int commit_batch_size); 27 explicit GetCommitIdsCommand(int commit_batch_size);
28 virtual ~GetCommitIdsCommand(); 28 virtual ~GetCommitIdsCommand();
29 29
30 // SyncerCommand implementation. 30 // SyncerCommand implementation.
31 virtual SyncerError ExecuteImpl(sessions::SyncSession* session) OVERRIDE; 31 virtual SyncerError ExecuteImpl(sessions::SyncSession* session) OVERRIDE;
32 32
33 // Builds a vector of IDs that should be committed. 33 // Builds a vector of IDs that should be committed.
34 void BuildCommitIds(const vector<int64>& unsynced_handles, 34 void BuildCommitIds(syncable::WriteTransaction* write_transaction,
35 syncable::WriteTransaction* write_transaction,
36 const ModelSafeRoutingInfo& routes, 35 const ModelSafeRoutingInfo& routes,
37 syncable::ModelTypeSet throttled_types); 36 const std::set<int64>& ready_unsynced_set);
38 37
39 // TODO(chron): Remove writes from this iterator. As a warning, this 38 // Fill |ready_unsynced_set| with all entries from |unsynced_handles| that
40 // iterator causes writes to entries and so isn't a pure iterator. 39 // are ready to commit.
41 // It will do Put(IS_UNSYNCED). Refactor this out later. 40 // An entry is not considered ready for commit if any are true:
42 class CommitMetahandleIterator { 41 // 1. It's in conflict.
43 public: 42 // 2. It requires encryption (either the type is encrypted but a passphrase
44 // TODO(chron): Cache ValidateCommitEntry responses across iterators to save 43 // is missing from the cryptographer, or the entry itself wasn't properly
45 // UTF8 conversion and filename checking 44 // encrypted).
46 CommitMetahandleIterator(const vector<int64>& unsynced_handles, 45 // 3. It's type is currently throttled.
47 syncable::WriteTransaction* write_transaction, 46 // 4. It's a delete but has not been committed.
48 sessions::OrderedCommitSet* commit_set)
49 : write_transaction_(write_transaction),
50 handle_iterator_(unsynced_handles.begin()),
51 unsynced_handles_end_(unsynced_handles.end()),
52 commit_set_(commit_set) {
53
54 // TODO(chron): Remove writes from this iterator.
55 DCHECK(write_transaction_);
56
57 if (Valid() && !ValidateMetahandleForCommit(*handle_iterator_))
58 Increment();
59 }
60 ~CommitMetahandleIterator() {}
61
62 int64 Current() const {
63 DCHECK(Valid());
64 return *handle_iterator_;
65 }
66
67 bool Increment() {
68 if (!Valid())
69 return false;
70
71 for (++handle_iterator_;
72 handle_iterator_ != unsynced_handles_end_;
73 ++handle_iterator_) {
74 if (ValidateMetahandleForCommit(*handle_iterator_))
75 return true;
76 }
77
78 return false;
79 }
80
81 bool Valid() const {
82 return !(handle_iterator_ == unsynced_handles_end_);
83 }
84
85 private:
86 bool ValidateMetahandleForCommit(int64 metahandle) {
87 if (commit_set_->HaveCommitItem(metahandle))
88 return false;
89
90 // We should really not WRITE in this iterator, but we can fix that
91 // later. We should move that somewhere else later.
92 syncable::MutableEntry entry(write_transaction_,
93 syncable::GET_BY_HANDLE, metahandle);
94 VerifyCommitResult verify_result =
95 SyncerUtil::ValidateCommitEntry(&entry);
96 if (verify_result == VERIFY_UNSYNCABLE) {
97 // Drop unsyncable entries.
98 entry.Put(syncable::IS_UNSYNCED, false);
99 }
100 return verify_result == VERIFY_OK;
101 }
102
103 syncable::WriteTransaction* const write_transaction_;
104 vector<int64>::const_iterator handle_iterator_;
105 vector<int64>::const_iterator unsynced_handles_end_;
106 sessions::OrderedCommitSet* commit_set_;
107
108 DISALLOW_COPY_AND_ASSIGN(CommitMetahandleIterator);
109 };
110
111 private:
112 // Removes all entries not ready for commit from |unsynced_handles|.
113 // An entry is considered unready for commit if:
114 // 1. It's in conflict or requires (re)encryption. Any datatype requiring
115 // encryption while the cryptographer is missing a passphrase is
116 // considered unready for commit.
117 // 2. Its type is currently throttled.
118 void FilterUnreadyEntries( 47 void FilterUnreadyEntries(
119 syncable::BaseTransaction* trans, 48 syncable::BaseTransaction* trans,
120 syncable::ModelTypeSet throttled_types, 49 syncable::ModelTypeSet throttled_types,
121 syncable::Directory::UnsyncedMetaHandles* unsynced_handles); 50 syncable::ModelTypeSet encrypted_types,
51 bool passphrase_missing,
52 const syncable::Directory::UnsyncedMetaHandles& unsynced_handles,
53 std::set<int64>* ready_unsynced_set);
122 54
123 void AddUncommittedParentsAndTheirPredecessors( 55 private:
56 // Add all the uncommitted parents (and their predecessors) of |item| to
57 // |result| if they are ready to commit. Entries are added in root->child
58 // order and predecessor->successor order.
59 // Returns values:
60 // False: if a dependent item was in conflict, and hence no child cannot be
61 // committed.
62 // True: if all parents and their predecessors were checked for commit
63 // readiness and were added to |result| as necessary.
64 bool AddUncommittedParentsAndTheirPredecessors(
124 syncable::BaseTransaction* trans, 65 syncable::BaseTransaction* trans,
125 syncable::Id parent_id,
126 const ModelSafeRoutingInfo& routes, 66 const ModelSafeRoutingInfo& routes,
127 syncable::ModelTypeSet throttled_types); 67 const std::set<int64>& ready_unsynced_set,
68 const syncable::Entry& item,
69 sessions::OrderedCommitSet* result) const;
128 70
129 // OrderedCommitSet helpers for adding predecessors in order. 71 // OrderedCommitSet helpers for adding predecessors in order.
130 // TODO(ncarter): Refactor these so that the |result| parameter goes away, 72
131 // and AddItem doesn't need to consider two OrderedCommitSets. 73 // Adds |item| to |result| if it's ready for committing and was not already
132 bool AddItem(syncable::Entry* item, 74 // present.
133 syncable::ModelTypeSet throttled_types, 75 // Prereq: |item| is unsynced.
134 sessions::OrderedCommitSet* result); 76 // Returns values:
77 // False: if |item| was in conflict.
78 // True: if |item| was checked for commit readiness and added to |result|
79 // as necessary.
80 bool AddItem(const std::set<int64>& ready_unsynced_set,
81 const syncable::Entry& item,
82 sessions::OrderedCommitSet* result) const;
83
84 // Adds item and all it's unsynced predecessors to |result| as necessary, as
85 // long as no item was in conflict.
86 // Return values:
87 // False: if there was an entry in conflict.
88 // True: if all entries were checked for commit readiness and added to
89 // |result| as necessary.
135 bool AddItemThenPredecessors(syncable::BaseTransaction* trans, 90 bool AddItemThenPredecessors(syncable::BaseTransaction* trans,
136 syncable::ModelTypeSet throttled_types, 91 const std::set<int64>& ready_unsynced_set,
137 syncable::Entry* item, 92 const syncable::Entry& item,
138 syncable::IndexedBitField inclusion_filter, 93 sessions::OrderedCommitSet* result) const;
139 sessions::OrderedCommitSet* result);
140 void AddPredecessorsThenItem(syncable::BaseTransaction* trans,
141 syncable::ModelTypeSet throttled_types,
142 syncable::Entry* item,
143 syncable::IndexedBitField inclusion_filter,
144 const ModelSafeRoutingInfo& routes);
145 94
146 bool IsCommitBatchFull(); 95 // Appends all commit ready predecessors of |item|, followed by |item| itself,
96 // to |ordered_commit_set_|, iff item and all its predecessors not in
97 // conflict.
98 // Return values:
99 // False: if there was an entry in conflict.
100 // True: if all entries were checked for commit readiness and added to
101 // |result| as necessary.
102 bool AddPredecessorsThenItem(syncable::BaseTransaction* trans,
103 const ModelSafeRoutingInfo& routes,
104 const std::set<int64>& ready_unsynced_set,
105 const syncable::Entry& item,
106 sessions::OrderedCommitSet* result) const;
147 107
148 void AddCreatesAndMoves(const vector<int64>& unsynced_handles, 108 bool IsCommitBatchFull() const;
149 syncable::WriteTransaction* write_transaction, 109
110 void AddCreatesAndMoves(syncable::WriteTransaction* write_transaction,
150 const ModelSafeRoutingInfo& routes, 111 const ModelSafeRoutingInfo& routes,
151 syncable::ModelTypeSet throttled_types); 112 const std::set<int64>& ready_unsynced_set);
152 113
153 void AddDeletes(const vector<int64>& unsynced_handles, 114 void AddDeletes(syncable::WriteTransaction* write_transaction,
154 syncable::WriteTransaction* write_transaction); 115 const std::set<int64>& ready_unsynced_set);
155 116
156 scoped_ptr<sessions::OrderedCommitSet> ordered_commit_set_; 117 scoped_ptr<sessions::OrderedCommitSet> ordered_commit_set_;
157 118
158 int requested_commit_batch_size_; 119 int requested_commit_batch_size_;
159 bool passphrase_missing_;
160 syncable::ModelTypeSet encrypted_types_;
161 120
162 DISALLOW_COPY_AND_ASSIGN(GetCommitIdsCommand); 121 DISALLOW_COPY_AND_ASSIGN(GetCommitIdsCommand);
163 }; 122 };
164 123
165 } // namespace browser_sync 124 } // namespace browser_sync
166 125
167 #endif // CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_ 126 #endif // CHROME_BROWSER_SYNC_ENGINE_GET_COMMIT_IDS_COMMAND_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/sync/engine/get_commit_ids_command.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698