Index: sync/engine/conflict_resolver.cc |
diff --git a/sync/engine/conflict_resolver.cc b/sync/engine/conflict_resolver.cc |
index 163062032e6e03dc9f7e76238076a88a5bd000bc..f914403a276fd585bfde873fa45c194213af53f1 100644 |
--- a/sync/engine/conflict_resolver.cc |
+++ b/sync/engine/conflict_resolver.cc |
@@ -30,6 +30,39 @@ using syncable::Id; |
using syncable::MutableEntry; |
using syncable::WriteTransaction; |
+namespace { |
+ |
+// Returns true iff the set of attachment ids contained in attachment_metadata |
+// matches the set of ids contained in server_attachment_metadata. |
+bool AttachmentMetadataMatches(const MutableEntry& entity) { |
+ const sync_pb::AttachmentMetadata& local = entity.GetAttachmentMetadata(); |
+ const sync_pb::AttachmentMetadata& server = |
+ entity.GetServerAttachmentMetadata(); |
+ if (local.record_size() != server.record_size()) { |
+ return false; |
+ } |
+ |
+ // The order of records in local and server may be different so use a std::set |
+ // to determine if they are equivalent. |
+ std::set<std::string> local_ids; |
+ for (int i = 0; i < local.record_size(); ++i) { |
+ const sync_pb::AttachmentMetadataRecord& record = local.record(i); |
+ DCHECK(record.is_on_server()); |
+ local_ids.insert(record.id().SerializeAsString()); |
+ } |
+ for (int i = 0; i < server.record_size(); ++i) { |
+ const sync_pb::AttachmentMetadataRecord& record = server.record(i); |
+ DCHECK(record.is_on_server()); |
+ if (local_ids.find(record.id().SerializeAsString()) == local_ids.end()) { |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
+} // namespace |
+ |
ConflictResolver::ConflictResolver() { |
} |
@@ -148,8 +181,9 @@ void ConflictResolver::ProcessSimpleConflict(WriteTransaction* trans, |
base_server_specifics_match = true; |
} |
+ bool attachment_metadata_matches = AttachmentMetadataMatches(entry); |
if (!entry_deleted && name_matches && parent_matches && specifics_match && |
- position_matches) { |
+ position_matches && attachment_metadata_matches) { |
DVLOG(1) << "Resolving simple conflict, everything matches, ignoring " |
<< "changes for: " << entry; |
conflict_util::IgnoreConflict(&entry); |