| Index: chrome/browser/sync/engine/conflict_resolver.cc
|
| diff --git a/chrome/browser/sync/engine/conflict_resolver.cc b/chrome/browser/sync/engine/conflict_resolver.cc
|
| index 25c2e18e51d25a3eb20d462064a0d247138411db..d8b6848105c210799dbf11a2f04110eaa29c4430 100644
|
| --- a/chrome/browser/sync/engine/conflict_resolver.cc
|
| +++ b/chrome/browser/sync/engine/conflict_resolver.cc
|
| @@ -32,8 +32,22 @@ namespace browser_sync {
|
| using sessions::ConflictProgress;
|
| using sessions::StatusController;
|
|
|
| +namespace {
|
| +
|
| const int SYNC_CYCLES_BEFORE_ADMITTING_DEFEAT = 8;
|
|
|
| +// Enumeration of different conflict resolutions. Used for histogramming.
|
| +enum SimpleConflictResolutions {
|
| + OVERWRITE_LOCAL, // Resolved by overwriting local changes.
|
| + OVERWRITE_SERVER, // Resolved by overwriting server changes.
|
| + UNDELETE, // Resolved by undeleting local item.
|
| + IGNORE_ENCRYPTION, // Resolved by ignoring an encryption-only server
|
| + // change. TODO(zea): implement and use this.
|
| + CONFLICT_RESOLUTION_SIZE,
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| ConflictResolver::ConflictResolver() {
|
| }
|
|
|
| @@ -44,9 +58,8 @@ void ConflictResolver::IgnoreLocalChanges(MutableEntry* entry) {
|
| // An update matches local actions, merge the changes.
|
| // This is a little fishy because we don't actually merge them.
|
| // In the future we should do a 3-way merge.
|
| - VLOG(1) << "Server and local changes match, merging:" << entry;
|
| + VLOG(1) << "Resolving conflict by ignoring local changes:" << entry;
|
| // With IS_UNSYNCED false, changes should be merged.
|
| - // METRIC simple conflict resolved by merge.
|
| entry->Put(syncable::IS_UNSYNCED, false);
|
| }
|
|
|
| @@ -57,9 +70,9 @@ void ConflictResolver::OverwriteServerChanges(WriteTransaction* trans,
|
| // made our local client changes.
|
| // TODO(chron): This is really a general property clobber. We clobber
|
| // the server side property. Perhaps we should actually do property merging.
|
| + VLOG(1) << "Resolving conflict by ignoring server changes:" << entry;
|
| entry->Put(syncable::BASE_VERSION, entry->Get(syncable::SERVER_VERSION));
|
| entry->Put(syncable::IS_UNAPPLIED_UPDATE, false);
|
| - // METRIC conflict resolved by overwrite.
|
| }
|
|
|
| ConflictResolver::ProcessSimpleConflictResult
|
| @@ -119,11 +132,17 @@ ConflictResolver::ProcessSimpleConflict(WriteTransaction* trans,
|
| << entry;
|
| IgnoreLocalChanges(&entry);
|
| status->increment_num_local_overwrites();
|
| + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict",
|
| + OVERWRITE_LOCAL,
|
| + CONFLICT_RESOLUTION_SIZE);
|
| } else {
|
| VLOG(1) << "Resolving simple conflict, overwriting server changes for:"
|
| << entry;
|
| OverwriteServerChanges(trans, &entry);
|
| status->increment_num_server_overwrites();
|
| + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict",
|
| + OVERWRITE_SERVER,
|
| + CONFLICT_RESOLUTION_SIZE);
|
| }
|
| return SYNC_PROGRESS;
|
| } else { // SERVER_IS_DEL is true
|
| @@ -149,6 +168,9 @@ ConflictResolver::ProcessSimpleConflict(WriteTransaction* trans,
|
| "when server-deleted.";
|
| OverwriteServerChanges(trans, &entry);
|
| status->increment_num_server_overwrites();
|
| + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict",
|
| + OVERWRITE_SERVER,
|
| + CONFLICT_RESOLUTION_SIZE);
|
| // Clobber the versions, just in case the above DCHECK is violated.
|
| entry.Put(syncable::SERVER_VERSION, 0);
|
| entry.Put(syncable::BASE_VERSION, 0);
|
| @@ -162,6 +184,9 @@ ConflictResolver::ProcessSimpleConflict(WriteTransaction* trans,
|
| CHECK(server_update.Get(syncable::META_HANDLE) !=
|
| entry.Get(syncable::META_HANDLE))
|
| << server_update << entry;
|
| + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict",
|
| + UNDELETE,
|
| + CONFLICT_RESOLUTION_SIZE);
|
| }
|
| return SYNC_PROGRESS;
|
| }
|
|
|