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/directory_update_handler.h" | 5 #include "sync/engine/directory_update_handler.h" |
6 | 6 |
7 #include "sync/engine/conflict_resolver.h" | 7 #include "sync/engine/conflict_resolver.h" |
8 #include "sync/engine/process_updates_util.h" | 8 #include "sync/engine/process_updates_util.h" |
9 #include "sync/engine/update_applicator.h" | 9 #include "sync/engine/update_applicator.h" |
10 #include "sync/sessions/directory_type_debug_info_emitter.h" | 10 #include "sync/sessions/directory_type_debug_info_emitter.h" |
11 #include "sync/syncable/directory.h" | 11 #include "sync/syncable/directory.h" |
12 #include "sync/syncable/model_neutral_mutable_entry.h" | 12 #include "sync/syncable/model_neutral_mutable_entry.h" |
| 13 #include "sync/syncable/syncable_changes_version.h" |
13 #include "sync/syncable/syncable_model_neutral_write_transaction.h" | 14 #include "sync/syncable/syncable_model_neutral_write_transaction.h" |
14 #include "sync/syncable/syncable_write_transaction.h" | 15 #include "sync/syncable/syncable_write_transaction.h" |
15 #include "sync/util/data_type_histogram.h" | 16 #include "sync/util/data_type_histogram.h" |
16 | 17 |
17 namespace syncer { | 18 namespace syncer { |
18 | 19 |
19 using syncable::SYNCER; | 20 using syncable::SYNCER; |
20 | 21 |
21 DirectoryUpdateHandler::DirectoryUpdateHandler( | 22 DirectoryUpdateHandler::DirectoryUpdateHandler( |
22 syncable::Directory* dir, | 23 syncable::Directory* dir, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 DVLOG(1) << "Type root folder " << ModelTypeToRootTag(type_) | 103 DVLOG(1) << "Type root folder " << ModelTypeToRootTag(type_) |
103 << " already exists."; | 104 << " already exists."; |
104 return; | 105 return; |
105 } | 106 } |
106 | 107 |
107 entry.PutServerIsDir(true); | 108 entry.PutServerIsDir(true); |
108 entry.PutUniqueServerTag(ModelTypeToRootTag(type_)); | 109 entry.PutUniqueServerTag(ModelTypeToRootTag(type_)); |
109 } | 110 } |
110 | 111 |
111 void DirectoryUpdateHandler::ApplyUpdates(sessions::StatusController* status) { | 112 void DirectoryUpdateHandler::ApplyUpdates(sessions::StatusController* status) { |
112 if (!IsApplyUpdatesRequired()) { | 113 if (IsApplyUpdatesRequired()) { |
113 return; | 114 // This will invoke handlers that belong to the model and its thread, so we |
| 115 // switch to the appropriate thread before we start this work. |
| 116 WorkCallback c = |
| 117 base::Bind(&DirectoryUpdateHandler::ApplyUpdatesImpl, |
| 118 // We wait until the callback is executed. We can safely use |
| 119 // Unretained. |
| 120 base::Unretained(this), base::Unretained(status)); |
| 121 worker_->DoWorkAndWaitUntilDone(c); |
| 122 |
| 123 debug_info_emitter_->EmitUpdateCountersUpdate(); |
| 124 debug_info_emitter_->EmitStatusCountersUpdate(); |
114 } | 125 } |
115 | 126 |
116 // This will invoke handlers that belong to the model and its thread, so we | 127 PostApplyUpdates(); |
117 // switch to the appropriate thread before we start this work. | |
118 WorkCallback c = base::Bind( | |
119 &DirectoryUpdateHandler::ApplyUpdatesImpl, | |
120 // We wait until the callback is executed. We can safely use Unretained. | |
121 base::Unretained(this), | |
122 base::Unretained(status)); | |
123 worker_->DoWorkAndWaitUntilDone(c); | |
124 | |
125 debug_info_emitter_->EmitUpdateCountersUpdate(); | |
126 debug_info_emitter_->EmitStatusCountersUpdate(); | |
127 } | 128 } |
128 | 129 |
129 void DirectoryUpdateHandler::PassiveApplyUpdates( | 130 void DirectoryUpdateHandler::PassiveApplyUpdates( |
130 sessions::StatusController* status) { | 131 sessions::StatusController* status) { |
131 if (!IsApplyUpdatesRequired()) { | 132 if (IsApplyUpdatesRequired()) { |
132 return; | 133 // Just do the work here instead of deferring to another thread. |
| 134 ApplyUpdatesImpl(status); |
| 135 |
| 136 debug_info_emitter_->EmitUpdateCountersUpdate(); |
| 137 debug_info_emitter_->EmitStatusCountersUpdate(); |
133 } | 138 } |
134 | 139 |
135 // Just do the work here instead of deferring to another thread. | 140 PostApplyUpdates(); |
136 ApplyUpdatesImpl(status); | |
137 | |
138 debug_info_emitter_->EmitUpdateCountersUpdate(); | |
139 debug_info_emitter_->EmitStatusCountersUpdate(); | |
140 } | 141 } |
141 | 142 |
142 SyncerError DirectoryUpdateHandler::ApplyUpdatesImpl( | 143 SyncerError DirectoryUpdateHandler::ApplyUpdatesImpl( |
143 sessions::StatusController* status) { | 144 sessions::StatusController* status) { |
144 syncable::WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir_); | 145 syncable::WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir_); |
145 | 146 |
146 std::vector<int64> handles; | 147 std::vector<int64> handles; |
147 dir_->GetUnappliedUpdateMetaHandles( | 148 dir_->GetUnappliedUpdateMetaHandles( |
148 &trans, | 149 &trans, |
149 FullModelTypeSet(type_), | 150 FullModelTypeSet(type_), |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 // There should be no simple conflicts remaining. We know this because the | 212 // There should be no simple conflicts remaining. We know this because the |
212 // resolver should have resolved all the conflicts we detected last time | 213 // resolver should have resolved all the conflicts we detected last time |
213 // and, by the two previous assertions, that no conflicts have been | 214 // and, by the two previous assertions, that no conflicts have been |
214 // downgraded from encryption or hierarchy down to simple. | 215 // downgraded from encryption or hierarchy down to simple. |
215 DCHECK(conflict_applicator.simple_conflict_ids().empty()); | 216 DCHECK(conflict_applicator.simple_conflict_ids().empty()); |
216 } | 217 } |
217 | 218 |
218 return SYNCER_OK; | 219 return SYNCER_OK; |
219 } | 220 } |
220 | 221 |
| 222 void DirectoryUpdateHandler::PostApplyUpdates() { |
| 223 // If this is a type with client generated root, the root node has been |
| 224 // created locally and didn't go through ApplyUpdatesImpl. |
| 225 // Mark it as having the initial download completed so that the type |
| 226 // reports as properly initialized (which is done by changing the root's |
| 227 // base version to a value other than CHANGES_VERSION). |
| 228 // This does nothing if the root's base version is already other than |
| 229 // CHANGES_VERSION. |
| 230 if (IsTypeWithClientGeneratedRoot(type_)) { |
| 231 syncable::ModelNeutralWriteTransaction trans(FROM_HERE, SYNCER, dir_); |
| 232 dir_->MarkInitialSyncEndedForType(&trans, type_); |
| 233 } |
| 234 } |
| 235 |
221 bool DirectoryUpdateHandler::IsApplyUpdatesRequired() { | 236 bool DirectoryUpdateHandler::IsApplyUpdatesRequired() { |
222 if (IsControlType(type_)) { | 237 if (IsControlType(type_)) { |
223 return false; // We don't process control types here. | 238 return false; // We don't process control types here. |
224 } | 239 } |
225 | 240 |
226 return dir_->TypeHasUnappliedUpdates(type_); | 241 return dir_->TypeHasUnappliedUpdates(type_); |
227 } | 242 } |
228 | 243 |
229 void DirectoryUpdateHandler::UpdateSyncEntities( | 244 void DirectoryUpdateHandler::UpdateSyncEntities( |
230 syncable::ModelNeutralWriteTransaction* trans, | 245 syncable::ModelNeutralWriteTransaction* trans, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 new_gc_directive.version_watermark())) { | 303 new_gc_directive.version_watermark())) { |
289 ExpireEntriesByVersion(dir_, trans, type_, | 304 ExpireEntriesByVersion(dir_, trans, type_, |
290 new_gc_directive.version_watermark()); | 305 new_gc_directive.version_watermark()); |
291 } | 306 } |
292 | 307 |
293 cached_gc_directive_.reset( | 308 cached_gc_directive_.reset( |
294 new sync_pb::GarbageCollectionDirective(new_gc_directive)); | 309 new sync_pb::GarbageCollectionDirective(new_gc_directive)); |
295 } | 310 } |
296 | 311 |
297 } // namespace syncer | 312 } // namespace syncer |
OLD | NEW |