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

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

Issue 465113002: Revert 288557 "[Sync] Use OnSingleDataTypeUnrecoverableError for..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698