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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |