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

Side by Side Diff: components/sync_driver/generic_change_processor.cc

Issue 436733002: [Sync] Use OnSingleDataTypeUnrecoverableError for all errors (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
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 "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
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
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
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
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
OLDNEW
« no previous file with comments | « components/sync_driver/fake_data_type_controller.cc ('k') | components/sync_driver/model_association_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698