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..3b830ec29606d640fb5356789b73afe9b39df44d 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,19 +70,25 @@ void GenericChangeProcessor::CommitChangesFromSyncModel() { |
return; |
if (syncer_changes_.empty()) |
return; |
- local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); |
+ SyncError error; |
+ if (!local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_, &error)) { |
+ error_handler()->OnUnrecoverableError(error.location(), error.message()); |
+ } |
syncer_changes_.clear(); |
} |
bool GenericChangeProcessor::GetSyncDataForType( |
syncable::ModelType type, |
- SyncDataList* current_sync_data) { |
+ SyncDataList* current_sync_data, |
+ SyncError* error) { |
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."; |
+ error->reset(FROM_HERE, |
+ "Server did not create the top-level " + type_name + " node." |
+ " We might be running against an out-of-date server.", |
+ type); |
return false; |
} |
@@ -89,7 +96,9 @@ bool GenericChangeProcessor::GetSyncDataForType( |
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 + "."; |
+ error->reset(FROM_HERE, |
+ "Failed to fetch child node for type " + type_name + ".", |
+ type); |
return false; |
} |
current_sync_data->push_back(SyncData::CreateRemoteData( |
@@ -99,9 +108,10 @@ bool GenericChangeProcessor::GetSyncDataForType( |
return true; |
} |
-void GenericChangeProcessor::ProcessSyncChanges( |
+bool GenericChangeProcessor::ProcessSyncChanges( |
const tracked_objects::Location& from_here, |
- const SyncChangeList& list_of_changes) { |
+ const SyncChangeList& list_of_changes, |
+ SyncError* error) { |
sync_api::WriteTransaction trans(from_here, share_handle()); |
for (SyncChangeList::const_iterator iter = list_of_changes.begin(); |
@@ -109,17 +119,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; |
+ error->reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error->location(), |
+ error->message()); |
+ return false; |
} |
sync_node.Remove(); |
} else if (change.change_type() == SyncChange::ACTION_ADD) { |
@@ -129,16 +142,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; |
+ error->reset(FROM_HERE, |
+ "Failed to look up root node for type " + type_str, |
+ type); |
+ error_handler()->OnUnrecoverableError(error->location(), |
+ error->message()); |
+ return false; |
} |
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(); |
+ error->reset(FROM_HERE, |
+ "Failed to create " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error->location(), |
+ error->message()); |
+ return false; |
} |
sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
@@ -147,9 +167,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; |
+ error->reset(FROM_HERE, |
+ "Failed to update " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error->location(), |
+ error->message()); |
+ return false; |
} |
sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
@@ -157,11 +180,15 @@ void GenericChangeProcessor::ProcessSyncChanges( |
// successor, parent, etc.). |
} else { |
NOTREACHED(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Received unset SyncChange in the change processor."); |
- return; |
+ error->reset(FROM_HERE, |
+ "Received unset SyncChange in the change processor.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error->location(), |
+ error->message()); |
+ return false; |
} |
} |
+ return true; |
} |
bool GenericChangeProcessor::SyncModelHasUserCreatedNodes( |