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

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

Issue 2289143003: [Sync] Convert DTCs to be not RefCounted and NonThreadSafe. (Closed)
Patch Set: Rebase. Created 4 years, 3 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/generic_change_processor.h" 5 #include "components/sync/driver/generic_change_processor.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <string> 10 #include <string>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/location.h" 13 #include "base/location.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "base/threading/thread_task_runner_handle.h" 16 #include "base/threading/thread_task_runner_handle.h"
17 #include "components/sync/api/data_type_error_handler.h"
17 #include "components/sync/api/sync_change.h" 18 #include "components/sync/api/sync_change.h"
18 #include "components/sync/api/sync_error.h" 19 #include "components/sync/api/sync_error.h"
19 #include "components/sync/api/syncable_service.h" 20 #include "components/sync/api/syncable_service.h"
20 #include "components/sync/base/unrecoverable_error_handler.h" 21 #include "components/sync/base/unrecoverable_error_handler.h"
21 #include "components/sync/core/base_node.h" 22 #include "components/sync/core/base_node.h"
22 #include "components/sync/core/change_record.h" 23 #include "components/sync/core/change_record.h"
23 #include "components/sync/core/data_type_error_handler.h"
24 #include "components/sync/core/read_node.h" 24 #include "components/sync/core/read_node.h"
25 #include "components/sync/core/read_transaction.h" 25 #include "components/sync/core/read_transaction.h"
26 #include "components/sync/core/write_node.h" 26 #include "components/sync/core/write_node.h"
27 #include "components/sync/core/write_transaction.h" 27 #include "components/sync/core/write_transaction.h"
28 #include "components/sync/driver/sync_api_component_factory.h" 28 #include "components/sync/driver/sync_api_component_factory.h"
29 #include "components/sync/driver/sync_client.h" 29 #include "components/sync/driver/sync_client.h"
30 #include "components/sync/syncable/entry.h" // TODO(tim): Bug 123674. 30 #include "components/sync/syncable/entry.h" // TODO(tim): Bug 123674.
31 31
32 namespace sync_driver { 32 namespace sync_driver {
33 33
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 sync_id, read_node.GetEntitySpecifics(), 101 sync_id, read_node.GetEntitySpecifics(),
102 read_node.GetModificationTime(), attachment_ids, 102 read_node.GetModificationTime(), attachment_ids,
103 attachment_service_proxy); 103 attachment_service_proxy);
104 } 104 }
105 } 105 }
106 106
107 } // namespace 107 } // namespace
108 108
109 GenericChangeProcessor::GenericChangeProcessor( 109 GenericChangeProcessor::GenericChangeProcessor(
110 syncer::ModelType type, 110 syncer::ModelType type,
111 syncer::DataTypeErrorHandler* error_handler, 111 std::unique_ptr<syncer::DataTypeErrorHandler> error_handler,
112 const base::WeakPtr<syncer::SyncableService>& local_service, 112 const base::WeakPtr<syncer::SyncableService>& local_service,
113 const base::WeakPtr<syncer::SyncMergeResult>& merge_result, 113 const base::WeakPtr<syncer::SyncMergeResult>& merge_result,
114 syncer::UserShare* user_share, 114 syncer::UserShare* user_share,
115 SyncClient* sync_client, 115 SyncClient* sync_client,
116 std::unique_ptr<syncer::AttachmentStoreForSync> attachment_store) 116 std::unique_ptr<syncer::AttachmentStoreForSync> attachment_store)
117 : ChangeProcessor(error_handler), 117 : ChangeProcessor(std::move(error_handler)),
118 type_(type), 118 type_(type),
119 local_service_(local_service), 119 local_service_(local_service),
120 merge_result_(merge_result), 120 merge_result_(merge_result),
121 share_handle_(user_share), 121 share_handle_(user_share),
122 weak_ptr_factory_(this) { 122 weak_ptr_factory_(this) {
123 DCHECK(CalledOnValidThread()); 123 DCHECK(CalledOnValidThread());
124 DCHECK_NE(type_, syncer::UNSPECIFIED); 124 DCHECK_NE(type_, syncer::UNSPECIFIED);
125 if (attachment_store) { 125 if (attachment_store) {
126 std::string store_birthday; 126 std::string store_birthday;
127 { 127 {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 ? syncer::SyncChange::ACTION_ADD 179 ? syncer::SyncChange::ACTION_ADD
180 : syncer::SyncChange::ACTION_UPDATE; 180 : syncer::SyncChange::ACTION_UPDATE;
181 // Need to load specifics from node. 181 // Need to load specifics from node.
182 syncer::ReadNode read_node(trans); 182 syncer::ReadNode read_node(trans);
183 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { 183 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) {
184 syncer::SyncError error( 184 syncer::SyncError error(
185 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 185 FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
186 "Failed to look up data for received change with id " + 186 "Failed to look up data for received change with id " +
187 base::Int64ToString(it->id), 187 base::Int64ToString(it->id),
188 syncer::GetModelTypeFromSpecifics(it->specifics)); 188 syncer::GetModelTypeFromSpecifics(it->specifics));
189 error_handler()->OnSingleDataTypeUnrecoverableError(error); 189 error_handler()->OnUnrecoverableError(error);
190 return; 190 return;
191 } 191 }
192 syncer_changes_.push_back(syncer::SyncChange( 192 syncer_changes_.push_back(syncer::SyncChange(
193 FROM_HERE, action, 193 FROM_HERE, action,
194 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); 194 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_)));
195 } 195 }
196 } 196 }
197 } 197 }
198 198
199 void GenericChangeProcessor::CommitChangesFromSyncModel() { 199 void GenericChangeProcessor::CommitChangesFromSyncModel() {
200 DCHECK(CalledOnValidThread()); 200 DCHECK(CalledOnValidThread());
201 if (syncer_changes_.empty()) 201 if (syncer_changes_.empty())
202 return; 202 return;
203 if (!local_service_.get()) { 203 if (!local_service_.get()) {
204 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); 204 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType();
205 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 205 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
206 "Local service destroyed.", type); 206 "Local service destroyed.", type);
207 error_handler()->OnSingleDataTypeUnrecoverableError(error); 207 error_handler()->OnUnrecoverableError(error);
208 return; 208 return;
209 } 209 }
210 syncer::SyncError error = 210 syncer::SyncError error =
211 local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); 211 local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_);
212 syncer_changes_.clear(); 212 syncer_changes_.clear();
213 if (error.IsSet()) 213 if (error.IsSet())
214 error_handler()->OnSingleDataTypeUnrecoverableError(error); 214 error_handler()->OnUnrecoverableError(error);
215 } 215 }
216 216
217 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( 217 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData(
218 syncer::ModelType type) const { 218 syncer::ModelType type) const {
219 DCHECK_EQ(type_, type); 219 DCHECK_EQ(type_, type);
220 // This is slow / memory intensive. Should be used sparingly by datatypes. 220 // This is slow / memory intensive. Should be used sparingly by datatypes.
221 syncer::SyncDataList data; 221 syncer::SyncDataList data;
222 GetAllSyncDataReturnError(&data); 222 GetAllSyncDataReturnError(&data);
223 return data; 223 return data;
224 } 224 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 if (root.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK) 305 if (root.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK)
306 return 0; 306 return 0;
307 307
308 // Subtract one to account for type's root node. 308 // Subtract one to account for type's root node.
309 return root.GetTotalNodeCount() - 1; 309 return root.GetTotalNodeCount() - 1;
310 } 310 }
311 311
312 namespace { 312 namespace {
313 313
314 // WARNING: this code is sensitive to compiler optimizations. Be careful 314 // WARNING: this code is sensitive to compiler optimizations. Be careful
315 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else 315 // modifying any code around an OnUnrecoverableError call, else the compiler
316 // the compiler attempts to merge it with other calls, losing useful information 316 // attempts to merge it with other calls, losing useful information in
317 // in breakpad uploads. 317 // breakpad uploads.
318 syncer::SyncError LogLookupFailure( 318 syncer::SyncError LogLookupFailure(
319 syncer::BaseNode::InitByLookupResult lookup_result, 319 syncer::BaseNode::InitByLookupResult lookup_result,
320 const tracked_objects::Location& from_here, 320 const tracked_objects::Location& from_here,
321 const std::string& error_prefix, 321 const std::string& error_prefix,
322 syncer::ModelType type, 322 syncer::ModelType type,
323 syncer::DataTypeErrorHandler* error_handler) { 323 syncer::DataTypeErrorHandler* error_handler) {
324 switch (lookup_result) { 324 switch (lookup_result) {
325 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { 325 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: {
326 syncer::SyncError error; 326 syncer::SyncError error;
327 error.Reset( 327 error.Reset(
328 from_here, 328 from_here,
329 error_prefix + "could not find entry matching the lookup criteria.", 329 error_prefix + "could not find entry matching the lookup criteria.",
330 type); 330 type);
331 error_handler->OnSingleDataTypeUnrecoverableError(error); 331 error_handler->OnUnrecoverableError(error);
332 LOG(ERROR) << "Delete: Bad entry."; 332 LOG(ERROR) << "Delete: Bad entry.";
333 return error; 333 return error;
334 } 334 }
335 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { 335 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: {
336 syncer::SyncError error; 336 syncer::SyncError error;
337 error.Reset(from_here, error_prefix + "entry is already deleted.", type); 337 error.Reset(from_here, error_prefix + "entry is already deleted.", type);
338 error_handler->OnSingleDataTypeUnrecoverableError(error); 338 error_handler->OnUnrecoverableError(error);
339 LOG(ERROR) << "Delete: Deleted entry."; 339 LOG(ERROR) << "Delete: Deleted entry.";
340 return error; 340 return error;
341 } 341 }
342 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { 342 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: {
343 syncer::SyncError error; 343 syncer::SyncError error;
344 error.Reset(from_here, error_prefix + "unable to decrypt", type); 344 error.Reset(from_here, error_prefix + "unable to decrypt", type);
345 error_handler->OnSingleDataTypeUnrecoverableError(error); 345 error_handler->OnUnrecoverableError(error);
346 LOG(ERROR) << "Delete: Undecryptable entry."; 346 LOG(ERROR) << "Delete: Undecryptable entry.";
347 return error; 347 return error;
348 } 348 }
349 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { 349 case syncer::BaseNode::INIT_FAILED_PRECONDITION: {
350 syncer::SyncError error; 350 syncer::SyncError error;
351 error.Reset(from_here, 351 error.Reset(from_here,
352 error_prefix + "a precondition was not met for calling init.", 352 error_prefix + "a precondition was not met for calling init.",
353 type); 353 type);
354 error_handler->OnSingleDataTypeUnrecoverableError(error); 354 error_handler->OnUnrecoverableError(error);
355 LOG(ERROR) << "Delete: Failed precondition."; 355 LOG(ERROR) << "Delete: Failed precondition.";
356 return error; 356 return error;
357 } 357 }
358 default: { 358 default: {
359 syncer::SyncError error; 359 syncer::SyncError error;
360 // Should have listed all the possible error cases above. 360 // Should have listed all the possible error cases above.
361 error.Reset(from_here, error_prefix + "unknown error", type); 361 error.Reset(from_here, error_prefix + "unknown error", type);
362 error_handler->OnSingleDataTypeUnrecoverableError(error); 362 error_handler->OnUnrecoverableError(error);
363 LOG(ERROR) << "Delete: Unknown error."; 363 LOG(ERROR) << "Delete: Unknown error.";
364 return error; 364 return error;
365 } 365 }
366 } 366 }
367 } 367 }
368 368
369 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, 369 syncer::SyncError AttemptDelete(const syncer::SyncChange& change,
370 syncer::ModelType type, 370 syncer::ModelType type,
371 const std::string& type_str, 371 const std::string& type_str,
372 syncer::WriteNode* node, 372 syncer::WriteNode* node,
373 syncer::DataTypeErrorHandler* error_handler) { 373 syncer::DataTypeErrorHandler* error_handler) {
374 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); 374 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE);
375 if (change.sync_data().IsLocal()) { 375 if (change.sync_data().IsLocal()) {
376 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); 376 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag();
377 if (tag.empty()) { 377 if (tag.empty()) {
378 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 378 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
379 "Failed to delete " + type_str + 379 "Failed to delete " + type_str +
380 " node. Local data, empty tag. " + 380 " node. Local data, empty tag. " +
381 change.location().ToString(), 381 change.location().ToString(),
382 type); 382 type);
383 error_handler->OnSingleDataTypeUnrecoverableError(error); 383 error_handler->OnUnrecoverableError(error);
384 NOTREACHED(); 384 NOTREACHED();
385 return error; 385 return error;
386 } 386 }
387 387
388 syncer::BaseNode::InitByLookupResult result = 388 syncer::BaseNode::InitByLookupResult result =
389 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); 389 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag);
390 if (result != syncer::BaseNode::INIT_OK) { 390 if (result != syncer::BaseNode::INIT_OK) {
391 return LogLookupFailure(result, FROM_HERE, 391 return LogLookupFailure(result, FROM_HERE,
392 "Failed to delete " + type_str + 392 "Failed to delete " + type_str +
393 " node. Local data. " + 393 " node. Local data. " +
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 change, type_str, trans, &sync_node, &new_attachments); 458 change, type_str, trans, &sync_node, &new_attachments);
459 if (error.IsSet()) { 459 if (error.IsSet()) {
460 return error; 460 return error;
461 } 461 }
462 } else { 462 } else {
463 syncer::SyncError error( 463 syncer::SyncError error(
464 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 464 FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
465 "Received unset SyncChange in the change processor, " + 465 "Received unset SyncChange in the change processor, " +
466 change.location().ToString(), 466 change.location().ToString(),
467 type_); 467 type_);
468 error_handler()->OnSingleDataTypeUnrecoverableError(error); 468 error_handler()->OnUnrecoverableError(error);
469 NOTREACHED(); 469 NOTREACHED();
470 LOG(ERROR) << "Unset sync change."; 470 LOG(ERROR) << "Unset sync change.";
471 return error; 471 return error;
472 } 472 }
473 } 473 }
474 474
475 if (!new_attachments.empty()) { 475 if (!new_attachments.empty()) {
476 // If datatype uses attachments it should have supplied attachment store 476 // If datatype uses attachments it should have supplied attachment store
477 // which would initialize attachment_service_. Fail if it isn't so. 477 // which would initialize attachment_service_. Fail if it isn't so.
478 if (!attachment_service_.get()) { 478 if (!attachment_service_.get()) {
479 syncer::SyncError error( 479 syncer::SyncError error(
480 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 480 FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
481 "Datatype performs attachment operation without initializing " 481 "Datatype performs attachment operation without initializing "
482 "attachment store", 482 "attachment store",
483 type_); 483 type_);
484 error_handler()->OnSingleDataTypeUnrecoverableError(error); 484 error_handler()->OnUnrecoverableError(error);
485 NOTREACHED(); 485 NOTREACHED();
486 return error; 486 return error;
487 } 487 }
488 syncer::AttachmentIdList ids_to_upload; 488 syncer::AttachmentIdList ids_to_upload;
489 ids_to_upload.reserve(new_attachments.size()); 489 ids_to_upload.reserve(new_attachments.size());
490 std::copy(new_attachments.begin(), new_attachments.end(), 490 std::copy(new_attachments.begin(), new_attachments.end(),
491 std::back_inserter(ids_to_upload)); 491 std::back_inserter(ids_to_upload));
492 attachment_service_->UploadAttachments(ids_to_upload); 492 attachment_service_->UploadAttachments(ids_to_upload);
493 } 493 }
494 494
495 return syncer::SyncError(); 495 return syncer::SyncError();
496 } 496 }
497 497
498 // WARNING: this code is sensitive to compiler optimizations. Be careful 498 // WARNING: this code is sensitive to compiler optimizations. Be careful
499 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else 499 // modifying any code around an OnUnrecoverableError call, else the compiler
500 // the compiler attempts to merge it with other calls, losing useful information 500 // attempts to merge it with other calls, losing useful information in
501 // in breakpad uploads. 501 // breakpad uploads.
502 syncer::SyncError GenericChangeProcessor::HandleActionAdd( 502 syncer::SyncError GenericChangeProcessor::HandleActionAdd(
503 const syncer::SyncChange& change, 503 const syncer::SyncChange& change,
504 const std::string& type_str, 504 const std::string& type_str,
505 const syncer::WriteTransaction& trans, 505 const syncer::WriteTransaction& trans,
506 syncer::WriteNode* sync_node, 506 syncer::WriteNode* sync_node,
507 syncer::AttachmentIdSet* new_attachments) { 507 syncer::AttachmentIdSet* new_attachments) {
508 // TODO(sync): Handle other types of creation (custom parents, folders, 508 // TODO(sync): Handle other types of creation (custom parents, folders,
509 // etc.). 509 // etc.).
510 const syncer::SyncDataLocal sync_data_local(change.sync_data()); 510 const syncer::SyncDataLocal sync_data_local(change.sync_data());
511 syncer::WriteNode::InitUniqueByCreationResult result = 511 syncer::WriteNode::InitUniqueByCreationResult result =
512 sync_node->InitUniqueByCreation(sync_data_local.GetDataType(), 512 sync_node->InitUniqueByCreation(sync_data_local.GetDataType(),
513 sync_data_local.GetTag()); 513 sync_data_local.GetTag());
514 if (result != syncer::WriteNode::INIT_SUCCESS) { 514 if (result != syncer::WriteNode::INIT_SUCCESS) {
515 std::string error_prefix = "Failed to create " + type_str + " node: " + 515 std::string error_prefix = "Failed to create " + type_str + " node: " +
516 change.location().ToString() + ", "; 516 change.location().ToString() + ", ";
517 switch (result) { 517 switch (result) {
518 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { 518 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: {
519 syncer::SyncError error; 519 syncer::SyncError error;
520 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); 520 error.Reset(FROM_HERE, error_prefix + "empty tag", type_);
521 error_handler()->OnSingleDataTypeUnrecoverableError(error); 521 error_handler()->OnUnrecoverableError(error);
522 LOG(ERROR) << "Create: Empty tag."; 522 LOG(ERROR) << "Create: Empty tag.";
523 return error; 523 return error;
524 } 524 }
525 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { 525 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: {
526 syncer::SyncError error; 526 syncer::SyncError error;
527 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_); 527 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_);
528 error_handler()->OnSingleDataTypeUnrecoverableError(error); 528 error_handler()->OnUnrecoverableError(error);
529 LOG(ERROR) << "Create: Could not create entry."; 529 LOG(ERROR) << "Create: Could not create entry.";
530 return error; 530 return error;
531 } 531 }
532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { 532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: {
533 syncer::SyncError error; 533 syncer::SyncError error;
534 error.Reset(FROM_HERE, error_prefix + "failed to set predecessor", 534 error.Reset(FROM_HERE, error_prefix + "failed to set predecessor",
535 type_); 535 type_);
536 error_handler()->OnSingleDataTypeUnrecoverableError(error); 536 error_handler()->OnUnrecoverableError(error);
537 LOG(ERROR) << "Create: Bad predecessor."; 537 LOG(ERROR) << "Create: Bad predecessor.";
538 return error; 538 return error;
539 } 539 }
540 case syncer::WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: { 540 case syncer::WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: {
541 syncer::SyncError error; 541 syncer::SyncError error;
542 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); 542 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_);
543 error_handler()->OnSingleDataTypeUnrecoverableError(error); 543 error_handler()->OnUnrecoverableError(error);
544 LOG(ERROR) << "Create: Failed to decrypt."; 544 LOG(ERROR) << "Create: Failed to decrypt.";
545 return error; 545 return error;
546 } 546 }
547 default: { 547 default: {
548 syncer::SyncError error; 548 syncer::SyncError error;
549 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); 549 error.Reset(FROM_HERE, error_prefix + "unknown error", type_);
550 error_handler()->OnSingleDataTypeUnrecoverableError(error); 550 error_handler()->OnUnrecoverableError(error);
551 LOG(ERROR) << "Create: Unknown error."; 551 LOG(ERROR) << "Create: Unknown error.";
552 return error; 552 return error;
553 } 553 }
554 } 554 }
555 } 555 }
556 sync_node->SetTitle(change.sync_data().GetTitle()); 556 sync_node->SetTitle(change.sync_data().GetTitle());
557 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); 557 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
558 558
559 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); 559 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds();
560 SetAttachmentMetadata(attachment_ids, sync_node); 560 SetAttachmentMetadata(attachment_ids, sync_node);
561 561
562 // Return any newly added attachments. 562 // Return any newly added attachments.
563 new_attachments->insert(attachment_ids.begin(), attachment_ids.end()); 563 new_attachments->insert(attachment_ids.begin(), attachment_ids.end());
564 if (merge_result_.get()) { 564 if (merge_result_.get()) {
565 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); 565 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1);
566 } 566 }
567 return syncer::SyncError(); 567 return syncer::SyncError();
568 } 568 }
569 // WARNING: this code is sensitive to compiler optimizations. Be careful 569 // WARNING: this code is sensitive to compiler optimizations. Be careful
570 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else 570 // modifying any code around an OnUnrecoverableError call, else the compiler
571 // the compiler attempts to merge it with other calls, losing useful information 571 // attempts to merge it with other calls, losing useful information in
572 // in breakpad uploads. 572 // breakpad uploads.
573 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( 573 syncer::SyncError GenericChangeProcessor::HandleActionUpdate(
574 const syncer::SyncChange& change, 574 const syncer::SyncChange& change,
575 const std::string& type_str, 575 const std::string& type_str,
576 const syncer::WriteTransaction& trans, 576 const syncer::WriteTransaction& trans,
577 syncer::WriteNode* sync_node, 577 syncer::WriteNode* sync_node,
578 syncer::AttachmentIdSet* new_attachments) { 578 syncer::AttachmentIdSet* new_attachments) {
579 const syncer::SyncDataLocal sync_data_local(change.sync_data()); 579 const syncer::SyncDataLocal sync_data_local(change.sync_data());
580 syncer::BaseNode::InitByLookupResult result = 580 syncer::BaseNode::InitByLookupResult result =
581 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), 581 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(),
582 sync_data_local.GetTag()); 582 sync_data_local.GetTag());
583 if (result != syncer::BaseNode::INIT_OK) { 583 if (result != syncer::BaseNode::INIT_OK) {
584 std::string error_prefix = "Failed to load " + type_str + " node. " + 584 std::string error_prefix = "Failed to load " + type_str + " node. " +
585 change.location().ToString() + ", "; 585 change.location().ToString() + ", ";
586 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { 586 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) {
587 syncer::SyncError error; 587 syncer::SyncError error;
588 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); 588 error.Reset(FROM_HERE, error_prefix + "empty tag", type_);
589 error_handler()->OnSingleDataTypeUnrecoverableError(error); 589 error_handler()->OnUnrecoverableError(error);
590 LOG(ERROR) << "Update: Empty tag."; 590 LOG(ERROR) << "Update: Empty tag.";
591 return error; 591 return error;
592 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { 592 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) {
593 syncer::SyncError error; 593 syncer::SyncError error;
594 error.Reset(FROM_HERE, error_prefix + "bad entry", type_); 594 error.Reset(FROM_HERE, error_prefix + "bad entry", type_);
595 error_handler()->OnSingleDataTypeUnrecoverableError(error); 595 error_handler()->OnUnrecoverableError(error);
596 LOG(ERROR) << "Update: bad entry."; 596 LOG(ERROR) << "Update: bad entry.";
597 return error; 597 return error;
598 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { 598 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) {
599 syncer::SyncError error; 599 syncer::SyncError error;
600 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_); 600 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_);
601 error_handler()->OnSingleDataTypeUnrecoverableError(error); 601 error_handler()->OnUnrecoverableError(error);
602 LOG(ERROR) << "Update: deleted entry."; 602 LOG(ERROR) << "Update: deleted entry.";
603 return error; 603 return error;
604 } else if (result == syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) { 604 } else if (result == syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) {
605 syncer::SyncError error; 605 syncer::SyncError error;
606 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); 606 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_);
607 error_handler()->OnSingleDataTypeUnrecoverableError(error); 607 error_handler()->OnUnrecoverableError(error);
608 LOG(ERROR) << "Update: Failed to decrypt."; 608 LOG(ERROR) << "Update: Failed to decrypt.";
609 return error; 609 return error;
610 } else { 610 } else {
611 NOTREACHED(); 611 NOTREACHED();
612 syncer::SyncError error; 612 syncer::SyncError error;
613 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); 613 error.Reset(FROM_HERE, error_prefix + "unknown error", type_);
614 error_handler()->OnSingleDataTypeUnrecoverableError(error); 614 error_handler()->OnUnrecoverableError(error);
615 LOG(ERROR) << "Update: Unknown error."; 615 LOG(ERROR) << "Update: Unknown error.";
616 return error; 616 return error;
617 } 617 }
618 } 618 }
619 619
620 sync_node->SetTitle(change.sync_data().GetTitle()); 620 sync_node->SetTitle(change.sync_data().GetTitle());
621 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); 621 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
622 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); 622 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds();
623 SetAttachmentMetadata(attachment_ids, sync_node); 623 SetAttachmentMetadata(attachment_ids, sync_node);
624 624
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 } 683 }
684 } 684 }
685 685
686 std::unique_ptr<syncer::AttachmentService> 686 std::unique_ptr<syncer::AttachmentService>
687 GenericChangeProcessor::GetAttachmentService() const { 687 GenericChangeProcessor::GetAttachmentService() const {
688 return std::unique_ptr<syncer::AttachmentService>( 688 return std::unique_ptr<syncer::AttachmentService>(
689 new syncer::AttachmentServiceProxy(attachment_service_proxy_)); 689 new syncer::AttachmentServiceProxy(attachment_service_proxy_));
690 } 690 }
691 691
692 } // namespace sync_driver 692 } // namespace sync_driver
OLDNEW
« no previous file with comments | « components/sync/driver/generic_change_processor.h ('k') | components/sync/driver/generic_change_processor_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698