| Index: chrome/browser/sync/glue/generic_change_processor.cc
|
| diff --git a/chrome/browser/sync/glue/generic_change_processor.cc b/chrome/browser/sync/glue/generic_change_processor.cc
|
| index 6c85de91ba0779b2eaa70619ff078c99d95c4c2f..d24d4779c6fb36f10b5a621664c37179e4a5b78d 100644
|
| --- a/chrome/browser/sync/glue/generic_change_processor.cc
|
| +++ b/chrome/browser/sync/glue/generic_change_processor.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/tracked.h"
|
| #include "chrome/browser/sync/api/syncable_service.h"
|
| #include "chrome/browser/sync/api/sync_change.h"
|
| +#include "chrome/browser/sync/api/sync_error.h"
|
| #include "chrome/browser/sync/engine/syncapi.h"
|
| #include "chrome/browser/sync/syncable/nigori_util.h"
|
|
|
| @@ -69,37 +70,45 @@ void GenericChangeProcessor::CommitChangesFromSyncModel() {
|
| return;
|
| if (syncer_changes_.empty())
|
| return;
|
| - local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_);
|
| + SyncError error = local_service_->ProcessSyncChanges(FROM_HERE,
|
| + syncer_changes_);
|
| syncer_changes_.clear();
|
| + if (error.IsSet()) {
|
| + error_handler()->OnUnrecoverableError(error.location(), error.message());
|
| + }
|
| }
|
|
|
| -bool GenericChangeProcessor::GetSyncDataForType(
|
| +SyncError GenericChangeProcessor::GetSyncDataForType(
|
| syncable::ModelType type,
|
| SyncDataList* current_sync_data) {
|
| std::string type_name = syncable::ModelTypeToString(type);
|
| sync_api::ReadTransaction trans(FROM_HERE, share_handle());
|
| sync_api::ReadNode root(&trans);
|
| if (!root.InitByTagLookup(syncable::ModelTypeToRootTag(type))) {
|
| - LOG(ERROR) << "Server did not create the top-level " + type_name + " node."
|
| - << " We might be running against an out-of-date server.";
|
| - return false;
|
| + SyncError error(FROM_HERE,
|
| + "Server did not create the top-level " + type_name +
|
| + " node. We might be running against an out-of-date server.",
|
| + type);
|
| + return error;
|
| }
|
|
|
| int64 sync_child_id = root.GetFirstChildId();
|
| while (sync_child_id != sync_api::kInvalidId) {
|
| sync_api::ReadNode sync_child_node(&trans);
|
| if (!sync_child_node.InitByIdLookup(sync_child_id)) {
|
| - LOG(ERROR) << "Failed to fetch child node for type " + type_name + ".";
|
| - return false;
|
| + SyncError error(FROM_HERE,
|
| + "Failed to fetch child node for type " + type_name + ".",
|
| + type);
|
| + return error;
|
| }
|
| current_sync_data->push_back(SyncData::CreateRemoteData(
|
| sync_child_node.GetEntitySpecifics()));
|
| sync_child_id = sync_child_node.GetSuccessorId();
|
| }
|
| - return true;
|
| + return SyncError();
|
| }
|
|
|
| -void GenericChangeProcessor::ProcessSyncChanges(
|
| +SyncError GenericChangeProcessor::ProcessSyncChanges(
|
| const tracked_objects::Location& from_here,
|
| const SyncChangeList& list_of_changes) {
|
| sync_api::WriteTransaction trans(from_here, share_handle());
|
| @@ -109,17 +118,20 @@ void GenericChangeProcessor::ProcessSyncChanges(
|
| ++iter) {
|
| const SyncChange& change = *iter;
|
| DCHECK_NE(change.sync_data().GetDataType(), syncable::UNSPECIFIED);
|
| - std::string type_str = syncable::ModelTypeToString(
|
| - change.sync_data().GetDataType());
|
| + syncable::ModelType type = change.sync_data().GetDataType();
|
| + std::string type_str = syncable::ModelTypeToString(type);
|
| sync_api::WriteNode sync_node(&trans);
|
| if (change.change_type() == SyncChange::ACTION_DELETE) {
|
| if (change.sync_data().GetTag() == "" ||
|
| !sync_node.InitByClientTagLookup(change.sync_data().GetDataType(),
|
| change.sync_data().GetTag())) {
|
| NOTREACHED();
|
| - error_handler()->OnUnrecoverableError(FROM_HERE,
|
| - "Failed to delete " + type_str + " node.");
|
| - return;
|
| + SyncError error(FROM_HERE,
|
| + "Failed to delete " + type_str + " node.",
|
| + type);
|
| + error_handler()->OnUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| sync_node.Remove();
|
| } else if (change.change_type() == SyncChange::ACTION_ADD) {
|
| @@ -129,16 +141,23 @@ void GenericChangeProcessor::ProcessSyncChanges(
|
| if (!root_node.InitByTagLookup(
|
| syncable::ModelTypeToRootTag(change.sync_data().GetDataType()))) {
|
| NOTREACHED();
|
| - error_handler()->OnUnrecoverableError(FROM_HERE,
|
| - "Failed to look up root node for type " + type_str);
|
| - return;
|
| + SyncError error(FROM_HERE,
|
| + "Failed to look up root node for type " + type_str,
|
| + type);
|
| + error_handler()->OnUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| if (!sync_node.InitUniqueByCreation(change.sync_data().GetDataType(),
|
| root_node,
|
| change.sync_data().GetTag())) {
|
| - error_handler()->OnUnrecoverableError(FROM_HERE,
|
| - "Failed to create " + type_str + " node.");
|
| - return;
|
| + NOTREACHED();
|
| + SyncError error(FROM_HERE,
|
| + "Failed to create " + type_str + " node.",
|
| + type);
|
| + error_handler()->OnUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle()));
|
| sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics());
|
| @@ -147,9 +166,12 @@ void GenericChangeProcessor::ProcessSyncChanges(
|
| !sync_node.InitByClientTagLookup(change.sync_data().GetDataType(),
|
| change.sync_data().GetTag())) {
|
| NOTREACHED();
|
| - error_handler()->OnUnrecoverableError(FROM_HERE,
|
| - "Failed to update " + type_str + " node");
|
| - return;
|
| + SyncError error(FROM_HERE,
|
| + "Failed to update " + type_str + " node.",
|
| + type);
|
| + error_handler()->OnUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle()));
|
| sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics());
|
| @@ -157,11 +179,15 @@ void GenericChangeProcessor::ProcessSyncChanges(
|
| // successor, parent, etc.).
|
| } else {
|
| NOTREACHED();
|
| - error_handler()->OnUnrecoverableError(FROM_HERE,
|
| - "Received unset SyncChange in the change processor.");
|
| - return;
|
| + SyncError error(FROM_HERE,
|
| + "Received unset SyncChange in the change processor.",
|
| + type);
|
| + error_handler()->OnUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| }
|
| + return SyncError();
|
| }
|
|
|
| bool GenericChangeProcessor::SyncModelHasUserCreatedNodes(
|
|
|