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

Side by Side Diff: components/sync/driver/shared_change_processor.cc

Issue 2257523003: [Sync] Move StartAssociation from NonUIDataTypeController to SharedChangeProcessor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move local_service_ WeakPtr to SharedChangeProcessor. Created 4 years, 4 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
OLDNEW
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 "components/sync/driver/shared_change_processor.h" 5 #include "components/sync/driver/shared_change_processor.h"
6 6
7 #include <memory>
7 #include <utility> 8 #include <utility>
8 9
9 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
10 #include "components/sync/api/sync_change.h" 11 #include "components/sync/api/sync_change.h"
11 #include "components/sync/api/syncable_service.h" 12 #include "components/sync/api/syncable_service.h"
13 #include "components/sync/base/data_type_histogram.h"
12 #include "components/sync/core/data_type_error_handler.h" 14 #include "components/sync/core/data_type_error_handler.h"
13 #include "components/sync/driver/generic_change_processor.h" 15 #include "components/sync/driver/generic_change_processor.h"
14 #include "components/sync/driver/generic_change_processor_factory.h" 16 #include "components/sync/driver/generic_change_processor_factory.h"
17 #include "components/sync/driver/shared_change_processor_ref.h"
15 #include "components/sync/driver/sync_client.h" 18 #include "components/sync/driver/sync_client.h"
16 19
17 using base::AutoLock; 20 using base::AutoLock;
18 21
19 namespace syncer { 22 namespace syncer {
20 class AttachmentService; 23 class AttachmentService;
21 } 24 }
22 25
23 namespace sync_driver { 26 namespace sync_driver {
24 27
25 SharedChangeProcessor::SharedChangeProcessor() 28 SharedChangeProcessor::SharedChangeProcessor(syncer::ModelType type)
26 : disconnected_(false), 29 : disconnected_(false),
27 type_(syncer::UNSPECIFIED), 30 type_(type),
28 frontend_task_runner_(base::ThreadTaskRunnerHandle::Get()), 31 frontend_task_runner_(base::ThreadTaskRunnerHandle::Get()),
29 generic_change_processor_(NULL), 32 generic_change_processor_(NULL),
30 error_handler_(NULL) {} 33 error_handler_(NULL) {
34 DCHECK_NE(type_, syncer::UNSPECIFIED);
35 }
31 36
32 SharedChangeProcessor::~SharedChangeProcessor() { 37 SharedChangeProcessor::~SharedChangeProcessor() {
33 // We can either be deleted when the DTC is destroyed (on UI 38 // We can either be deleted when the DTC is destroyed (on UI
34 // thread), or when the syncer::SyncableService stops syncing (datatype 39 // thread), or when the syncer::SyncableService stops syncing (datatype
35 // thread). |generic_change_processor_|, if non-NULL, must be 40 // thread). |generic_change_processor_|, if non-NULL, must be
36 // deleted on |backend_loop_|. 41 // deleted on |backend_loop_|.
37 if (backend_task_runner_.get()) { 42 if (backend_task_runner_.get()) {
38 if (backend_task_runner_->BelongsToCurrentThread()) { 43 if (backend_task_runner_->BelongsToCurrentThread()) {
39 delete generic_change_processor_; 44 delete generic_change_processor_;
40 } else { 45 } else {
41 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); 46 DCHECK(frontend_task_runner_->BelongsToCurrentThread());
42 if (!backend_task_runner_->DeleteSoon(FROM_HERE, 47 if (!backend_task_runner_->DeleteSoon(FROM_HERE,
43 generic_change_processor_)) { 48 generic_change_processor_)) {
44 NOTREACHED(); 49 NOTREACHED();
45 } 50 }
46 } 51 }
47 } else { 52 } else {
48 DCHECK(!generic_change_processor_); 53 DCHECK(!generic_change_processor_);
49 } 54 }
50 } 55 }
51 56
57 void SharedChangeProcessor::StartAssociation(
58 StartDoneCallback start_done,
59 SyncClient* const sync_client,
60 syncer::UserShare* user_share,
61 syncer::DataTypeErrorHandler* error_handler) {
62 DCHECK(user_share);
63 syncer::SyncMergeResult local_merge_result(type_);
64 syncer::SyncMergeResult syncer_merge_result(type_);
65 base::WeakPtrFactory<syncer::SyncMergeResult> weak_ptr_factory(
66 &syncer_merge_result);
67
68 // Connect |shared_change_processor| to the syncer and get the
69 // syncer::SyncableService associated with type_.
70 // Note that it's possible the shared_change_processor has already been
71 // disconnected at this point, so all our accesses to the syncer from this
72 // point on are through it.
73 GenericChangeProcessorFactory factory;
74 local_service_ = Connect(sync_client, &factory, user_share, error_handler,
75 weak_ptr_factory.GetWeakPtr());
76 if (!local_service_.get()) {
77 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
78 "Failed to connect to syncer.", type_);
79 local_merge_result.set_error(error);
80 start_done.Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
81 syncer_merge_result);
82 return;
83 }
84
85 if (!CryptoReadyIfNecessary()) {
86 syncer::SyncError error(FROM_HERE, syncer::SyncError::CRYPTO_ERROR, "",
87 type_);
88 local_merge_result.set_error(error);
89 start_done.Run(DataTypeController::NEEDS_CRYPTO, local_merge_result,
90 syncer_merge_result);
91 return;
92 }
93
94 bool sync_has_nodes = false;
95 if (!SyncModelHasUserCreatedNodes(&sync_has_nodes)) {
96 syncer::SyncError error(FROM_HERE, syncer::SyncError::UNRECOVERABLE_ERROR,
97 "Failed to load sync nodes", type_);
98 local_merge_result.set_error(error);
99 start_done.Run(DataTypeController::UNRECOVERABLE_ERROR, local_merge_result,
100 syncer_merge_result);
101 return;
102 }
103
104 // Scope for |initial_sync_data| which might be expensive, so we don't want
105 // to keep it in memory longer than necessary.
106 {
107 syncer::SyncDataList initial_sync_data;
108
109 base::TimeTicks start_time = base::TimeTicks::Now();
110 syncer::SyncError error =
111 GetAllSyncDataReturnError(type_, &initial_sync_data);
112 if (error.IsSet()) {
113 local_merge_result.set_error(error);
114 start_done.Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
115 syncer_merge_result);
116 return;
117 }
118
119 std::string datatype_context;
120 if (GetDataTypeContext(&datatype_context)) {
121 local_service_->UpdateDataTypeContext(
122 type_, syncer::SyncChangeProcessor::NO_REFRESH, datatype_context);
123 }
124
125 syncer_merge_result.set_num_items_before_association(
126 initial_sync_data.size());
127 // Passes a reference to |shared_change_processor|.
128 local_merge_result = local_service_->MergeDataAndStartSyncing(
129 type_, initial_sync_data, std::unique_ptr<syncer::SyncChangeProcessor>(
130 new SharedChangeProcessorRef(this)),
131 std::unique_ptr<syncer::SyncErrorFactory>(
132 new SharedChangeProcessorRef(this)));
133 RecordAssociationTime(base::TimeTicks::Now() - start_time);
134 if (local_merge_result.error().IsSet()) {
135 start_done.Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
136 syncer_merge_result);
137 return;
138 }
139 }
140
141 syncer_merge_result.set_num_items_after_association(GetSyncCount());
142
143 start_done.Run(!sync_has_nodes ? DataTypeController::OK_FIRST_RUN
144 : DataTypeController::OK,
145 local_merge_result, syncer_merge_result);
146 }
147
52 base::WeakPtr<syncer::SyncableService> SharedChangeProcessor::Connect( 148 base::WeakPtr<syncer::SyncableService> SharedChangeProcessor::Connect(
53 SyncClient* sync_client, 149 SyncClient* sync_client,
54 GenericChangeProcessorFactory* processor_factory, 150 GenericChangeProcessorFactory* processor_factory,
55 syncer::UserShare* user_share, 151 syncer::UserShare* user_share,
56 syncer::DataTypeErrorHandler* error_handler, 152 syncer::DataTypeErrorHandler* error_handler,
57 syncer::ModelType type,
58 const base::WeakPtr<syncer::SyncMergeResult>& merge_result) { 153 const base::WeakPtr<syncer::SyncMergeResult>& merge_result) {
59 DCHECK(sync_client); 154 DCHECK(sync_client);
60 DCHECK(error_handler); 155 DCHECK(error_handler);
61 DCHECK_NE(type, syncer::UNSPECIFIED);
62 backend_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 156 backend_task_runner_ = base::ThreadTaskRunnerHandle::Get();
63 AutoLock lock(monitor_lock_); 157 AutoLock lock(monitor_lock_);
64 if (disconnected_) 158 if (disconnected_)
65 return base::WeakPtr<syncer::SyncableService>(); 159 return base::WeakPtr<syncer::SyncableService>();
66 type_ = type;
67 error_handler_ = error_handler; 160 error_handler_ = error_handler;
68 base::WeakPtr<syncer::SyncableService> local_service = 161 base::WeakPtr<syncer::SyncableService> local_service =
69 sync_client->GetSyncableServiceForType(type); 162 sync_client->GetSyncableServiceForType(type_);
70 if (!local_service.get()) { 163 if (!local_service.get()) {
71 LOG(WARNING) << "SyncableService destroyed before DTC was stopped."; 164 LOG(WARNING) << "SyncableService destroyed before DTC was stopped.";
72 disconnected_ = true; 165 disconnected_ = true;
73 return base::WeakPtr<syncer::SyncableService>(); 166 return base::WeakPtr<syncer::SyncableService>();
74 } 167 }
75 168
76 generic_change_processor_ = processor_factory 169 generic_change_processor_ = processor_factory
77 ->CreateGenericChangeProcessor( 170 ->CreateGenericChangeProcessor(
78 type, user_share, error_handler, 171 type_, user_share, error_handler,
79 local_service, merge_result, sync_client) 172 local_service, merge_result, sync_client)
80 .release(); 173 .release();
81 // If available, propagate attachment service to the syncable service. 174 // If available, propagate attachment service to the syncable service.
82 std::unique_ptr<syncer::AttachmentService> attachment_service = 175 std::unique_ptr<syncer::AttachmentService> attachment_service =
83 generic_change_processor_->GetAttachmentService(); 176 generic_change_processor_->GetAttachmentService();
84 if (attachment_service) { 177 if (attachment_service) {
85 local_service->SetAttachmentService(std::move(attachment_service)); 178 local_service->SetAttachmentService(std::move(attachment_service));
86 } 179 }
87 return local_service; 180 return local_service;
88 } 181 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 const std::string& message) { 297 const std::string& message) {
205 AutoLock lock(monitor_lock_); 298 AutoLock lock(monitor_lock_);
206 if (!disconnected_) { 299 if (!disconnected_) {
207 return error_handler_->CreateAndUploadError(location, message, type_); 300 return error_handler_->CreateAndUploadError(location, message, type_);
208 } else { 301 } else {
209 return syncer::SyncError(location, syncer::SyncError::DATATYPE_ERROR, 302 return syncer::SyncError(location, syncer::SyncError::DATATYPE_ERROR,
210 message, type_); 303 message, type_);
211 } 304 }
212 } 305 }
213 306
307 void SharedChangeProcessor::RecordAssociationTime(base::TimeDelta time) {
308 #define PER_DATA_TYPE_MACRO(type_str) \
309 UMA_HISTOGRAM_TIMES("Sync." type_str "AssociationTime", time);
310 SYNC_DATA_TYPE_HISTOGRAM(type_);
311 #undef PER_DATA_TYPE_MACRO
312 }
313
314 void SharedChangeProcessor::StopLocalService() {
315 if (local_service_.get())
316 local_service_->StopSyncing(type_);
317 local_service_.reset();
318 }
319
214 } // namespace sync_driver 320 } // namespace sync_driver
OLDNEW
« no previous file with comments | « components/sync/driver/shared_change_processor.h ('k') | components/sync/driver/shared_change_processor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698