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