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 "base/location.h" | 7 #include "base/location.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "components/sync_driver/sync_api_component_factory.h" | 10 #include "components/sync_driver/sync_api_component_factory.h" |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 base::Time(), | 137 base::Time(), |
138 empty_list_of_attachment_ids, | 138 empty_list_of_attachment_ids, |
139 attachment_service_proxy_))); | 139 attachment_service_proxy_))); |
140 } else { | 140 } else { |
141 syncer::SyncChange::SyncChangeType action = | 141 syncer::SyncChange::SyncChangeType action = |
142 (it->action == syncer::ChangeRecord::ACTION_ADD) ? | 142 (it->action == syncer::ChangeRecord::ACTION_ADD) ? |
143 syncer::SyncChange::ACTION_ADD : syncer::SyncChange::ACTION_UPDATE; | 143 syncer::SyncChange::ACTION_ADD : syncer::SyncChange::ACTION_UPDATE; |
144 // Need to load specifics from node. | 144 // Need to load specifics from node. |
145 syncer::ReadNode read_node(trans); | 145 syncer::ReadNode read_node(trans); |
146 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { | 146 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { |
147 syncer::SyncError error( | 147 error_handler()->OnSingleDatatypeUnrecoverableError( |
148 FROM_HERE, | 148 FROM_HERE, |
149 syncer::SyncError::DATATYPE_ERROR, | |
150 "Failed to look up data for received change with id " + | 149 "Failed to look up data for received change with id " + |
151 base::Int64ToString(it->id), | 150 base::Int64ToString(it->id)); |
152 syncer::GetModelTypeFromSpecifics(it->specifics)); | |
153 error_handler()->OnSingleDataTypeUnrecoverableError(error); | |
154 return; | 151 return; |
155 } | 152 } |
156 syncer_changes_.push_back(syncer::SyncChange( | 153 syncer_changes_.push_back(syncer::SyncChange( |
157 FROM_HERE, | 154 FROM_HERE, |
158 action, | 155 action, |
159 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); | 156 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); |
160 } | 157 } |
161 } | 158 } |
162 } | 159 } |
163 | 160 |
164 void GenericChangeProcessor::CommitChangesFromSyncModel() { | 161 void GenericChangeProcessor::CommitChangesFromSyncModel() { |
165 DCHECK(CalledOnValidThread()); | 162 DCHECK(CalledOnValidThread()); |
166 if (syncer_changes_.empty()) | 163 if (syncer_changes_.empty()) |
167 return; | 164 return; |
168 if (!local_service_.get()) { | 165 if (!local_service_.get()) { |
169 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); | 166 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); |
170 syncer::SyncError error(FROM_HERE, | 167 syncer::SyncError error(FROM_HERE, |
171 syncer::SyncError::DATATYPE_ERROR, | 168 syncer::SyncError::DATATYPE_ERROR, |
172 "Local service destroyed.", | 169 "Local service destroyed.", |
173 type); | 170 type); |
174 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 171 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), |
| 172 error.message()); |
175 return; | 173 return; |
176 } | 174 } |
177 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, | 175 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, |
178 syncer_changes_); | 176 syncer_changes_); |
179 syncer_changes_.clear(); | 177 syncer_changes_.clear(); |
180 if (error.IsSet()) | 178 if (error.IsSet()) { |
181 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 179 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 180 error.location(), error.message()); |
| 181 } |
182 } | 182 } |
183 | 183 |
184 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( | 184 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( |
185 syncer::ModelType type) const { | 185 syncer::ModelType type) const { |
186 // This is slow / memory intensive. Should be used sparingly by datatypes. | 186 // This is slow / memory intensive. Should be used sparingly by datatypes. |
187 syncer::SyncDataList data; | 187 syncer::SyncDataList data; |
188 GetAllSyncDataReturnError(type, &data); | 188 GetAllSyncDataReturnError(type, &data); |
189 return data; | 189 return data; |
190 } | 190 } |
191 | 191 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 syncer::ReadNode root(&trans); | 278 syncer::ReadNode root(&trans); |
279 if (root.InitTypeRoot(type) != syncer::BaseNode::INIT_OK) | 279 if (root.InitTypeRoot(type) != syncer::BaseNode::INIT_OK) |
280 return 0; | 280 return 0; |
281 | 281 |
282 // Subtract one to account for type's root node. | 282 // Subtract one to account for type's root node. |
283 return root.GetTotalNodeCount() - 1; | 283 return root.GetTotalNodeCount() - 1; |
284 } | 284 } |
285 | 285 |
286 namespace { | 286 namespace { |
287 | 287 |
| 288 // TODO(isherman): Investigating http://crbug.com/121592 |
288 // WARNING: this code is sensitive to compiler optimizations. Be careful | 289 // WARNING: this code is sensitive to compiler optimizations. Be careful |
289 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 290 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else |
290 // the compiler attempts to merge it with other calls, losing useful information | 291 // the compiler attempts to merge it with other calls, losing useful information |
291 // in breakpad uploads. | 292 // in breakpad uploads. |
292 syncer::SyncError LogLookupFailure( | 293 syncer::SyncError LogLookupFailure( |
293 syncer::BaseNode::InitByLookupResult lookup_result, | 294 syncer::BaseNode::InitByLookupResult lookup_result, |
294 const tracked_objects::Location& from_here, | 295 const tracked_objects::Location& from_here, |
295 const std::string& error_prefix, | 296 const std::string& error_prefix, |
296 syncer::ModelType type, | 297 syncer::ModelType type, |
297 DataTypeErrorHandler* error_handler) { | 298 DataTypeErrorHandler* error_handler) { |
298 switch (lookup_result) { | 299 switch (lookup_result) { |
299 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { | 300 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { |
300 syncer::SyncError error; | 301 syncer::SyncError error; |
301 error.Reset(from_here, | 302 error.Reset(from_here, |
302 error_prefix + | 303 error_prefix + |
303 "could not find entry matching the lookup criteria.", | 304 "could not find entry matching the lookup criteria.", |
304 type); | 305 type); |
305 error_handler->OnSingleDataTypeUnrecoverableError(error); | 306 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 307 error.message()); |
306 LOG(ERROR) << "Delete: Bad entry."; | 308 LOG(ERROR) << "Delete: Bad entry."; |
307 return error; | 309 return error; |
308 } | 310 } |
309 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { | 311 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { |
310 syncer::SyncError error; | 312 syncer::SyncError error; |
311 error.Reset(from_here, error_prefix + "entry is already deleted.", type); | 313 error.Reset(from_here, error_prefix + "entry is already deleted.", type); |
312 error_handler->OnSingleDataTypeUnrecoverableError(error); | 314 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 315 error.message()); |
313 LOG(ERROR) << "Delete: Deleted entry."; | 316 LOG(ERROR) << "Delete: Deleted entry."; |
314 return error; | 317 return error; |
315 } | 318 } |
316 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { | 319 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { |
317 syncer::SyncError error; | 320 syncer::SyncError error; |
318 error.Reset(from_here, error_prefix + "unable to decrypt", type); | 321 error.Reset(from_here, error_prefix + "unable to decrypt", type); |
319 error_handler->OnSingleDataTypeUnrecoverableError(error); | 322 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 323 error.message()); |
320 LOG(ERROR) << "Delete: Undecryptable entry."; | 324 LOG(ERROR) << "Delete: Undecryptable entry."; |
321 return error; | 325 return error; |
322 } | 326 } |
323 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { | 327 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { |
324 syncer::SyncError error; | 328 syncer::SyncError error; |
325 error.Reset(from_here, | 329 error.Reset(from_here, |
326 error_prefix + "a precondition was not met for calling init.", | 330 error_prefix + "a precondition was not met for calling init.", |
327 type); | 331 type); |
328 error_handler->OnSingleDataTypeUnrecoverableError(error); | 332 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 333 error.message()); |
329 LOG(ERROR) << "Delete: Failed precondition."; | 334 LOG(ERROR) << "Delete: Failed precondition."; |
330 return error; | 335 return error; |
331 } | 336 } |
332 default: { | 337 default: { |
333 syncer::SyncError error; | 338 syncer::SyncError error; |
334 // Should have listed all the possible error cases above. | 339 // Should have listed all the possible error cases above. |
335 error.Reset(from_here, error_prefix + "unknown error", type); | 340 error.Reset(from_here, error_prefix + "unknown error", type); |
336 error_handler->OnSingleDataTypeUnrecoverableError(error); | 341 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 342 error.message()); |
337 LOG(ERROR) << "Delete: Unknown error."; | 343 LOG(ERROR) << "Delete: Unknown error."; |
338 return error; | 344 return error; |
339 } | 345 } |
340 } | 346 } |
341 } | 347 } |
342 | 348 |
343 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, | 349 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, |
344 syncer::ModelType type, | 350 syncer::ModelType type, |
345 const std::string& type_str, | 351 const std::string& type_str, |
346 syncer::WriteNode* node, | 352 syncer::WriteNode* node, |
347 DataTypeErrorHandler* error_handler) { | 353 DataTypeErrorHandler* error_handler) { |
348 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); | 354 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); |
349 if (change.sync_data().IsLocal()) { | 355 if (change.sync_data().IsLocal()) { |
350 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); | 356 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); |
351 if (tag.empty()) { | 357 if (tag.empty()) { |
352 syncer::SyncError error( | 358 syncer::SyncError error( |
353 FROM_HERE, | 359 FROM_HERE, |
354 syncer::SyncError::DATATYPE_ERROR, | 360 syncer::SyncError::DATATYPE_ERROR, |
355 "Failed to delete " + type_str + " node. Local data, empty tag. " + | 361 "Failed to delete " + type_str + " node. Local data, empty tag. " + |
356 change.location().ToString(), | 362 change.location().ToString(), |
357 type); | 363 type); |
358 error_handler->OnSingleDataTypeUnrecoverableError(error); | 364 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
| 365 error.message()); |
359 NOTREACHED(); | 366 NOTREACHED(); |
360 return error; | 367 return error; |
361 } | 368 } |
362 | 369 |
363 syncer::BaseNode::InitByLookupResult result = | 370 syncer::BaseNode::InitByLookupResult result = |
364 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); | 371 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); |
365 if (result != syncer::BaseNode::INIT_OK) { | 372 if (result != syncer::BaseNode::INIT_OK) { |
366 return LogLookupFailure( | 373 return LogLookupFailure( |
367 result, FROM_HERE, | 374 result, FROM_HERE, |
368 "Failed to delete " + type_str + " node. Local data. " + | 375 "Failed to delete " + type_str + " node. Local data. " + |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 if (error.IsSet()) { | 457 if (error.IsSet()) { |
451 return error; | 458 return error; |
452 } | 459 } |
453 } else { | 460 } else { |
454 syncer::SyncError error( | 461 syncer::SyncError error( |
455 FROM_HERE, | 462 FROM_HERE, |
456 syncer::SyncError::DATATYPE_ERROR, | 463 syncer::SyncError::DATATYPE_ERROR, |
457 "Received unset SyncChange in the change processor, " + | 464 "Received unset SyncChange in the change processor, " + |
458 change.location().ToString(), | 465 change.location().ToString(), |
459 type); | 466 type); |
460 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 467 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 468 error.message()); |
461 NOTREACHED(); | 469 NOTREACHED(); |
462 LOG(ERROR) << "Unset sync change."; | 470 LOG(ERROR) << "Unset sync change."; |
463 return error; | 471 return error; |
464 } | 472 } |
465 } | 473 } |
466 | 474 |
467 if (!new_attachments.empty()) { | 475 if (!new_attachments.empty()) { |
468 StoreAttachments(attachment_service_.get(), new_attachments); | 476 StoreAttachments(attachment_service_.get(), new_attachments); |
469 } | 477 } |
470 | 478 |
471 return syncer::SyncError(); | 479 return syncer::SyncError(); |
472 } | 480 } |
473 | 481 |
474 // WARNING: this code is sensitive to compiler optimizations. Be careful | 482 // WARNING: this code is sensitive to compiler optimizations. Be careful |
475 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 483 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else |
476 // the compiler attempts to merge it with other calls, losing useful information | 484 // the compiler attempts to merge it with other calls, losing useful information |
477 // in breakpad uploads. | 485 // in breakpad uploads. |
478 syncer::SyncError GenericChangeProcessor::HandleActionAdd( | 486 syncer::SyncError GenericChangeProcessor::HandleActionAdd( |
479 const syncer::SyncChange& change, | 487 const syncer::SyncChange& change, |
480 const std::string& type_str, | 488 const std::string& type_str, |
481 const syncer::ModelType& type, | 489 const syncer::ModelType& type, |
482 const syncer::WriteTransaction& trans, | 490 const syncer::WriteTransaction& trans, |
483 syncer::WriteNode* sync_node, | 491 syncer::WriteNode* sync_node, |
484 syncer::AttachmentList* new_attachments) { | 492 syncer::AttachmentList* new_attachments) { |
485 // TODO(sync): Handle other types of creation (custom parents, folders, | 493 // TODO(sync): Handle other types of creation (custom parents, folders, |
486 // etc.). | 494 // etc.). |
487 syncer::ReadNode root_node(&trans); | 495 syncer::ReadNode root_node(&trans); |
488 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 496 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
489 if (root_node.InitTypeRoot(sync_data_local.GetDataType()) != | 497 if (root_node.InitTypeRoot(sync_data_local.GetDataType()) != |
490 syncer::BaseNode::INIT_OK) { | 498 syncer::BaseNode::INIT_OK) { |
491 syncer::SyncError error(FROM_HERE, | 499 syncer::SyncError error(FROM_HERE, |
492 syncer::SyncError::DATATYPE_ERROR, | 500 syncer::SyncError::DATATYPE_ERROR, |
493 "Failed to look up root node for type " + type_str, | 501 "Failed to look up root node for type " + type_str, |
494 type); | 502 type); |
495 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 503 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 504 error.message()); |
496 NOTREACHED(); | 505 NOTREACHED(); |
497 LOG(ERROR) << "Create: no root node."; | 506 LOG(ERROR) << "Create: no root node."; |
498 return error; | 507 return error; |
499 } | 508 } |
500 syncer::WriteNode::InitUniqueByCreationResult result = | 509 syncer::WriteNode::InitUniqueByCreationResult result = |
501 sync_node->InitUniqueByCreation( | 510 sync_node->InitUniqueByCreation( |
502 sync_data_local.GetDataType(), root_node, sync_data_local.GetTag()); | 511 sync_data_local.GetDataType(), root_node, sync_data_local.GetTag()); |
503 if (result != syncer::WriteNode::INIT_SUCCESS) { | 512 if (result != syncer::WriteNode::INIT_SUCCESS) { |
504 std::string error_prefix = "Failed to create " + type_str + " node: " + | 513 std::string error_prefix = "Failed to create " + type_str + " node: " + |
505 change.location().ToString() + ", "; | 514 change.location().ToString() + ", "; |
506 switch (result) { | 515 switch (result) { |
507 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { | 516 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { |
508 syncer::SyncError error; | 517 syncer::SyncError error; |
509 error.Reset(FROM_HERE, error_prefix + "empty tag", type); | 518 error.Reset(FROM_HERE, error_prefix + "empty tag", type); |
510 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 519 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 520 error.message()); |
511 LOG(ERROR) << "Create: Empty tag."; | 521 LOG(ERROR) << "Create: Empty tag."; |
512 return error; | 522 return error; |
513 } | 523 } |
514 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { | 524 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { |
515 syncer::SyncError error; | 525 syncer::SyncError error; |
516 error.Reset(FROM_HERE, error_prefix + "entry already exists", type); | 526 error.Reset(FROM_HERE, error_prefix + "entry already exists", type); |
517 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 527 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 528 error.message()); |
518 LOG(ERROR) << "Create: Entry exists."; | 529 LOG(ERROR) << "Create: Entry exists."; |
519 return error; | 530 return error; |
520 } | 531 } |
521 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { | 532 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { |
522 syncer::SyncError error; | 533 syncer::SyncError error; |
523 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type); | 534 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type); |
524 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 535 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 536 error.message()); |
525 LOG(ERROR) << "Create: Could not create entry."; | 537 LOG(ERROR) << "Create: Could not create entry."; |
526 return error; | 538 return error; |
527 } | 539 } |
528 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { | 540 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { |
529 syncer::SyncError error; | 541 syncer::SyncError error; |
530 error.Reset( | 542 error.Reset( |
531 FROM_HERE, error_prefix + "failed to set predecessor", type); | 543 FROM_HERE, error_prefix + "failed to set predecessor", type); |
532 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 544 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 545 error.message()); |
533 LOG(ERROR) << "Create: Bad predecessor."; | 546 LOG(ERROR) << "Create: Bad predecessor."; |
534 return error; | 547 return error; |
535 } | 548 } |
536 default: { | 549 default: { |
537 syncer::SyncError error; | 550 syncer::SyncError error; |
538 error.Reset(FROM_HERE, error_prefix + "unknown error", type); | 551 error.Reset(FROM_HERE, error_prefix + "unknown error", type); |
539 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 552 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 553 error.message()); |
540 LOG(ERROR) << "Create: Unknown error."; | 554 LOG(ERROR) << "Create: Unknown error."; |
541 return error; | 555 return error; |
542 } | 556 } |
543 } | 557 } |
544 } | 558 } |
545 sync_node->SetTitle(change.sync_data().GetTitle()); | 559 sync_node->SetTitle(change.sync_data().GetTitle()); |
546 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 560 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
547 | 561 |
548 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); | 562 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); |
549 SetAttachmentMetadata(attachment_ids, sync_node); | 563 SetAttachmentMetadata(attachment_ids, sync_node); |
550 | 564 |
551 // Return any newly added attachments. | 565 // Return any newly added attachments. |
552 const syncer::AttachmentList& local_attachments_for_upload = | 566 const syncer::AttachmentList& local_attachments_for_upload = |
553 sync_data_local.GetLocalAttachmentsForUpload(); | 567 sync_data_local.GetLocalAttachmentsForUpload(); |
554 new_attachments->insert(new_attachments->end(), | 568 new_attachments->insert(new_attachments->end(), |
555 local_attachments_for_upload.begin(), | 569 local_attachments_for_upload.begin(), |
556 local_attachments_for_upload.end()); | 570 local_attachments_for_upload.end()); |
557 | 571 |
558 if (merge_result_.get()) { | 572 if (merge_result_.get()) { |
559 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); | 573 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); |
560 } | 574 } |
561 return syncer::SyncError(); | 575 return syncer::SyncError(); |
562 } | 576 } |
563 // WARNING: this code is sensitive to compiler optimizations. Be careful | 577 // WARNING: this code is sensitive to compiler optimizations. Be careful |
564 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 578 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else |
565 // the compiler attempts to merge it with other calls, losing useful information | 579 // the compiler attempts to merge it with other calls, losing useful information |
566 // in breakpad uploads. | 580 // in breakpad uploads. |
567 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( | 581 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( |
568 const syncer::SyncChange& change, | 582 const syncer::SyncChange& change, |
569 const std::string& type_str, | 583 const std::string& type_str, |
570 const syncer::ModelType& type, | 584 const syncer::ModelType& type, |
571 const syncer::WriteTransaction& trans, | 585 const syncer::WriteTransaction& trans, |
572 syncer::WriteNode* sync_node, | 586 syncer::WriteNode* sync_node, |
573 syncer::AttachmentList* new_attachments) { | 587 syncer::AttachmentList* new_attachments) { |
574 // TODO(zea): consider having this logic for all possible changes? | 588 // TODO(zea): consider having this logic for all possible changes? |
575 | 589 |
576 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 590 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
577 syncer::BaseNode::InitByLookupResult result = | 591 syncer::BaseNode::InitByLookupResult result = |
578 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), | 592 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), |
579 sync_data_local.GetTag()); | 593 sync_data_local.GetTag()); |
580 if (result != syncer::BaseNode::INIT_OK) { | 594 if (result != syncer::BaseNode::INIT_OK) { |
581 std::string error_prefix = "Failed to load " + type_str + " node. " + | 595 std::string error_prefix = "Failed to load " + type_str + " node. " + |
582 change.location().ToString() + ", "; | 596 change.location().ToString() + ", "; |
583 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { | 597 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { |
584 syncer::SyncError error; | 598 syncer::SyncError error; |
585 error.Reset(FROM_HERE, error_prefix + "empty tag", type); | 599 error.Reset(FROM_HERE, error_prefix + "empty tag", type); |
586 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 600 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 601 error.message()); |
587 LOG(ERROR) << "Update: Empty tag."; | 602 LOG(ERROR) << "Update: Empty tag."; |
588 return error; | 603 return error; |
589 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { | 604 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { |
590 syncer::SyncError error; | 605 syncer::SyncError error; |
591 error.Reset(FROM_HERE, error_prefix + "bad entry", type); | 606 error.Reset(FROM_HERE, error_prefix + "bad entry", type); |
592 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 607 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 608 error.message()); |
593 LOG(ERROR) << "Update: bad entry."; | 609 LOG(ERROR) << "Update: bad entry."; |
594 return error; | 610 return error; |
595 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { | 611 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { |
596 syncer::SyncError error; | 612 syncer::SyncError error; |
597 error.Reset(FROM_HERE, error_prefix + "deleted entry", type); | 613 error.Reset(FROM_HERE, error_prefix + "deleted entry", type); |
598 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 614 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 615 error.message()); |
599 LOG(ERROR) << "Update: deleted entry."; | 616 LOG(ERROR) << "Update: deleted entry."; |
600 return error; | 617 return error; |
601 } else { | 618 } else { |
602 syncer::Cryptographer* crypto = trans.GetCryptographer(); | 619 syncer::Cryptographer* crypto = trans.GetCryptographer(); |
603 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes()); | 620 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes()); |
604 const sync_pb::EntitySpecifics& specifics = | 621 const sync_pb::EntitySpecifics& specifics = |
605 sync_node->GetEntry()->GetSpecifics(); | 622 sync_node->GetEntry()->GetSpecifics(); |
606 CHECK(specifics.has_encrypted()); | 623 CHECK(specifics.has_encrypted()); |
607 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted()); | 624 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted()); |
608 const bool agreement = encrypted_types.Has(type); | 625 const bool agreement = encrypted_types.Has(type); |
609 if (!agreement && !can_decrypt) { | 626 if (!agreement && !can_decrypt) { |
610 syncer::SyncError error; | 627 syncer::SyncError error; |
611 error.Reset(FROM_HERE, | 628 error.Reset(FROM_HERE, |
612 "Failed to load encrypted entry, missing key and " | 629 "Failed to load encrypted entry, missing key and " |
613 "nigori mismatch for " + | 630 "nigori mismatch for " + |
614 type_str + ".", | 631 type_str + ".", |
615 type); | 632 type); |
616 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 633 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 634 error.message()); |
617 LOG(ERROR) << "Update: encr case 1."; | 635 LOG(ERROR) << "Update: encr case 1."; |
618 return error; | 636 return error; |
619 } else if (agreement && can_decrypt) { | 637 } else if (agreement && can_decrypt) { |
620 syncer::SyncError error; | 638 syncer::SyncError error; |
621 error.Reset(FROM_HERE, | 639 error.Reset(FROM_HERE, |
622 "Failed to load encrypted entry, we have the key " | 640 "Failed to load encrypted entry, we have the key " |
623 "and the nigori matches (?!) for " + | 641 "and the nigori matches (?!) for " + |
624 type_str + ".", | 642 type_str + ".", |
625 type); | 643 type); |
626 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 644 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 645 error.message()); |
627 LOG(ERROR) << "Update: encr case 2."; | 646 LOG(ERROR) << "Update: encr case 2."; |
628 return error; | 647 return error; |
629 } else if (agreement) { | 648 } else if (agreement) { |
630 syncer::SyncError error; | 649 syncer::SyncError error; |
631 error.Reset(FROM_HERE, | 650 error.Reset(FROM_HERE, |
632 "Failed to load encrypted entry, missing key and " | 651 "Failed to load encrypted entry, missing key and " |
633 "the nigori matches for " + | 652 "the nigori matches for " + |
634 type_str + ".", | 653 type_str + ".", |
635 type); | 654 type); |
636 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 655 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 656 error.message()); |
637 LOG(ERROR) << "Update: encr case 3."; | 657 LOG(ERROR) << "Update: encr case 3."; |
638 return error; | 658 return error; |
639 } else { | 659 } else { |
640 syncer::SyncError error; | 660 syncer::SyncError error; |
641 error.Reset(FROM_HERE, | 661 error.Reset(FROM_HERE, |
642 "Failed to load encrypted entry, we have the key" | 662 "Failed to load encrypted entry, we have the key" |
643 "(?!) and nigori mismatch for " + | 663 "(?!) and nigori mismatch for " + |
644 type_str + ".", | 664 type_str + ".", |
645 type); | 665 type); |
646 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 666 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 667 error.message()); |
647 LOG(ERROR) << "Update: encr case 4."; | 668 LOG(ERROR) << "Update: encr case 4."; |
648 return error; | 669 return error; |
649 } | 670 } |
650 } | 671 } |
651 } | 672 } |
652 | 673 |
653 sync_node->SetTitle(change.sync_data().GetTitle()); | 674 sync_node->SetTitle(change.sync_data().GetTitle()); |
654 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 675 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
655 SetAttachmentMetadata(sync_data_local.GetAttachmentIds(), sync_node); | 676 SetAttachmentMetadata(sync_data_local.GetAttachmentIds(), sync_node); |
656 | 677 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 | 726 |
706 void GenericChangeProcessor::StartImpl() { | 727 void GenericChangeProcessor::StartImpl() { |
707 } | 728 } |
708 | 729 |
709 syncer::UserShare* GenericChangeProcessor::share_handle() const { | 730 syncer::UserShare* GenericChangeProcessor::share_handle() const { |
710 DCHECK(CalledOnValidThread()); | 731 DCHECK(CalledOnValidThread()); |
711 return share_handle_; | 732 return share_handle_; |
712 } | 733 } |
713 | 734 |
714 } // namespace sync_driver | 735 } // namespace sync_driver |
OLD | NEW |