| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/engine/conflict_resolver.h" | 5 #include "chrome/browser/sync/engine/conflict_resolver.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 | 448 |
| 449 status->set_syncer_stuck(true); | 449 status->set_syncer_stuck(true); |
| 450 UMA_HISTOGRAM_COUNTS("Sync.SyncerConflictStuck", 1); | 450 UMA_HISTOGRAM_COUNTS("Sync.SyncerConflictStuck", 1); |
| 451 | 451 |
| 452 return true; | 452 return true; |
| 453 // TODO(sync): If we're stuck for a while we need to alert the user, clear | 453 // TODO(sync): If we're stuck for a while we need to alert the user, clear |
| 454 // cache or reset syncing. At the very least we should stop trying something | 454 // cache or reset syncing. At the very least we should stop trying something |
| 455 // that's obviously not working. | 455 // that's obviously not working. |
| 456 } | 456 } |
| 457 | 457 |
| 458 bool ConflictResolver::ResolveSimpleConflicts(const ScopedDirLookup& dir, | 458 bool ConflictResolver::ResolveSimpleConflicts( |
| 459 StatusController* status) { | 459 const ScopedDirLookup& dir, |
| 460 const ConflictProgress& progress, |
| 461 sessions::StatusController* status) { |
| 460 WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); | 462 WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); |
| 461 bool forward_progress = false; | 463 bool forward_progress = false; |
| 462 const ConflictProgress& progress = status->conflict_progress(); | |
| 463 // First iterate over simple conflict items (those that belong to no set). | 464 // First iterate over simple conflict items (those that belong to no set). |
| 464 set<Id>::const_iterator conflicting_item_it; | 465 set<Id>::const_iterator conflicting_item_it; |
| 465 for (conflicting_item_it = progress.ConflictingItemsBeginConst(); | 466 for (conflicting_item_it = progress.ConflictingItemsBegin(); |
| 466 conflicting_item_it != progress.ConflictingItemsEnd(); | 467 conflicting_item_it != progress.ConflictingItemsEnd(); |
| 467 ++conflicting_item_it) { | 468 ++conflicting_item_it) { |
| 468 Id id = *conflicting_item_it; | 469 Id id = *conflicting_item_it; |
| 469 map<Id, ConflictSet*>::const_iterator item_set_it = | 470 map<Id, ConflictSet*>::const_iterator item_set_it = |
| 470 progress.IdToConflictSetFind(id); | 471 progress.IdToConflictSetFind(id); |
| 471 if (item_set_it == progress.IdToConflictSetEnd() || | 472 if (item_set_it == progress.IdToConflictSetEnd() || |
| 472 0 == item_set_it->second) { | 473 0 == item_set_it->second) { |
| 473 // We have a simple conflict. | 474 // We have a simple conflict. |
| 474 switch (ProcessSimpleConflict(&trans, id, status)) { | 475 switch (ProcessSimpleConflict(&trans, id, status)) { |
| 475 case NO_SYNC_PROGRESS: | 476 case NO_SYNC_PROGRESS: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 490 while (i != simple_conflict_count_map_.end()) { | 491 while (i != simple_conflict_count_map_.end()) { |
| 491 if (0 == --(i->second)) | 492 if (0 == --(i->second)) |
| 492 simple_conflict_count_map_.erase(i++); | 493 simple_conflict_count_map_.erase(i++); |
| 493 else | 494 else |
| 494 ++i; | 495 ++i; |
| 495 } | 496 } |
| 496 return forward_progress; | 497 return forward_progress; |
| 497 } | 498 } |
| 498 | 499 |
| 499 bool ConflictResolver::ResolveConflicts(const ScopedDirLookup& dir, | 500 bool ConflictResolver::ResolveConflicts(const ScopedDirLookup& dir, |
| 500 StatusController* status) { | 501 const ConflictProgress& progress, |
| 501 const ConflictProgress& progress = status->conflict_progress(); | 502 sessions::StatusController* status) { |
| 502 bool rv = false; | 503 bool rv = false; |
| 503 if (ResolveSimpleConflicts(dir, status)) | 504 if (ResolveSimpleConflicts(dir, progress, status)) |
| 504 rv = true; | 505 rv = true; |
| 505 WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); | 506 WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); |
| 506 set<ConflictSet*>::const_iterator set_it; | 507 set<ConflictSet*>::const_iterator set_it; |
| 507 for (set_it = progress.ConflictSetsBegin(); | 508 for (set_it = progress.ConflictSetsBegin(); |
| 508 set_it != progress.ConflictSetsEnd(); | 509 set_it != progress.ConflictSetsEnd(); |
| 509 set_it++) { | 510 set_it++) { |
| 510 ConflictSet* conflict_set = *set_it; | 511 ConflictSet* conflict_set = *set_it; |
| 511 ConflictSetCountMapKey key = GetSetKey(conflict_set); | 512 ConflictSetCountMapKey key = GetSetKey(conflict_set); |
| 512 conflict_set_count_map_[key] += 2; | 513 conflict_set_count_map_[key] += 2; |
| 513 int conflict_count = conflict_set_count_map_[key]; | 514 int conflict_count = conflict_set_count_map_[key]; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 538 conflict_set_count_map_.erase(i++); | 539 conflict_set_count_map_.erase(i++); |
| 539 // METRIC self resolved conflict sets ++. | 540 // METRIC self resolved conflict sets ++. |
| 540 } else { | 541 } else { |
| 541 ++i; | 542 ++i; |
| 542 } | 543 } |
| 543 } | 544 } |
| 544 return rv; | 545 return rv; |
| 545 } | 546 } |
| 546 | 547 |
| 547 } // namespace browser_sync | 548 } // namespace browser_sync |
| OLD | NEW |