| 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/build_and_process_conflict_sets_command.h" | 5 #include "chrome/browser/sync/engine/build_and_process_conflict_sets_command.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 using sessions::UpdateProgress; | 25 using sessions::UpdateProgress; |
| 26 using std::set; | 26 using std::set; |
| 27 using std::string; | 27 using std::string; |
| 28 using std::vector; | 28 using std::vector; |
| 29 | 29 |
| 30 BuildAndProcessConflictSetsCommand::BuildAndProcessConflictSetsCommand() {} | 30 BuildAndProcessConflictSetsCommand::BuildAndProcessConflictSetsCommand() {} |
| 31 BuildAndProcessConflictSetsCommand::~BuildAndProcessConflictSetsCommand() {} | 31 BuildAndProcessConflictSetsCommand::~BuildAndProcessConflictSetsCommand() {} |
| 32 | 32 |
| 33 void BuildAndProcessConflictSetsCommand::ModelChangingExecuteImpl( | 33 void BuildAndProcessConflictSetsCommand::ModelChangingExecuteImpl( |
| 34 SyncSession* session) { | 34 SyncSession* session) { |
| 35 session->status_controller()->update_conflict_sets_built( | 35 session->mutable_status_controller()->update_conflict_sets_built( |
| 36 BuildAndProcessConflictSets(session)); | 36 BuildAndProcessConflictSets(session)); |
| 37 } | 37 } |
| 38 | 38 |
| 39 bool BuildAndProcessConflictSetsCommand::BuildAndProcessConflictSets( | 39 bool BuildAndProcessConflictSetsCommand::BuildAndProcessConflictSets( |
| 40 SyncSession* session) { | 40 SyncSession* session) { |
| 41 syncable::ScopedDirLookup dir(session->context()->directory_manager(), | 41 syncable::ScopedDirLookup dir(session->context()->directory_manager(), |
| 42 session->context()->account_name()); | 42 session->context()->account_name()); |
| 43 if (!dir.good()) | 43 if (!dir.good()) |
| 44 return false; | 44 return false; |
| 45 bool had_single_direction_sets = false; | 45 bool had_single_direction_sets = false; |
| 46 { // Scope for transaction. | 46 { // Scope for transaction. |
| 47 syncable::WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); | 47 syncable::WriteTransaction trans(FROM_HERE, syncable::SYNCER, dir); |
| 48 BuildConflictSets(&trans, | 48 BuildConflictSets(&trans, |
| 49 session->status_controller()->mutable_conflict_progress()); | 49 session->mutable_status_controller()->mutable_conflict_progress()); |
| 50 had_single_direction_sets = ProcessSingleDirectionConflictSets(&trans, | 50 had_single_direction_sets = ProcessSingleDirectionConflictSets(&trans, |
| 51 session->context()->resolver(), | 51 session->context()->resolver(), |
| 52 session->context()->directory_manager()->GetCryptographer(&trans), | 52 session->context()->directory_manager()->GetCryptographer(&trans), |
| 53 session->status_controller(), session->routing_info()); | 53 session->mutable_status_controller(), session->routing_info()); |
| 54 // We applied some updates transactionally, lets try syncing again. | 54 // We applied some updates transactionally, lets try syncing again. |
| 55 if (had_single_direction_sets) | 55 if (had_single_direction_sets) |
| 56 return true; | 56 return true; |
| 57 } | 57 } |
| 58 return false; | 58 return false; |
| 59 } | 59 } |
| 60 | 60 |
| 61 bool BuildAndProcessConflictSetsCommand::ProcessSingleDirectionConflictSets( | 61 bool BuildAndProcessConflictSetsCommand::ProcessSingleDirectionConflictSets( |
| 62 syncable::WriteTransaction* trans, ConflictResolver* resolver, | 62 syncable::WriteTransaction* trans, ConflictResolver* resolver, |
| 63 Cryptographer* cryptographer, StatusController* status, | 63 Cryptographer* cryptographer, StatusController* status, |
| 64 const ModelSafeRoutingInfo& routes) { | 64 const ModelSafeRoutingInfo& routes) { |
| 65 if (!status->conflict_progress()) |
| 66 return false; |
| 65 bool rv = false; | 67 bool rv = false; |
| 66 set<ConflictSet*>::const_iterator all_sets_iterator; | 68 set<ConflictSet*>::const_iterator all_sets_iterator; |
| 67 for (all_sets_iterator = status->conflict_progress().ConflictSetsBegin(); | 69 for (all_sets_iterator = status->conflict_progress()->ConflictSetsBegin(); |
| 68 all_sets_iterator != status->conflict_progress().ConflictSetsEnd();) { | 70 all_sets_iterator != status->conflict_progress()->ConflictSetsEnd();) { |
| 69 const ConflictSet* conflict_set = *all_sets_iterator; | 71 const ConflictSet* conflict_set = *all_sets_iterator; |
| 70 CHECK_GE(conflict_set->size(), 2U); | 72 CHECK_GE(conflict_set->size(), 2U); |
| 71 // We scan the set to see if it consists of changes of only one type. | 73 // We scan the set to see if it consists of changes of only one type. |
| 72 ConflictSet::const_iterator i; | 74 ConflictSet::const_iterator i; |
| 73 size_t unsynced_count = 0, unapplied_count = 0; | 75 size_t unsynced_count = 0, unapplied_count = 0; |
| 74 for (i = conflict_set->begin(); i != conflict_set->end(); ++i) { | 76 for (i = conflict_set->begin(); i != conflict_set->end(); ++i) { |
| 75 syncable::Entry entry(trans, syncable::GET_BY_ID, *i); | 77 syncable::Entry entry(trans, syncable::GET_BY_ID, *i); |
| 76 CHECK(entry.good()); | 78 CHECK(entry.good()); |
| 77 if (entry.Get(syncable::IS_UNSYNCED)) | 79 if (entry.Get(syncable::IS_UNSYNCED)) |
| 78 unsynced_count++; | 80 unsynced_count++; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 222 } |
| 221 applicator.SaveProgressIntoSessionState(status->mutable_conflict_progress(), | 223 applicator.SaveProgressIntoSessionState(status->mutable_conflict_progress(), |
| 222 status->mutable_update_progress()); | 224 status->mutable_update_progress()); |
| 223 return true; | 225 return true; |
| 224 } | 226 } |
| 225 | 227 |
| 226 void BuildAndProcessConflictSetsCommand::BuildConflictSets( | 228 void BuildAndProcessConflictSetsCommand::BuildConflictSets( |
| 227 syncable::BaseTransaction* trans, | 229 syncable::BaseTransaction* trans, |
| 228 ConflictProgress* conflict_progress) { | 230 ConflictProgress* conflict_progress) { |
| 229 conflict_progress->CleanupSets(); | 231 conflict_progress->CleanupSets(); |
| 230 set<syncable::Id>::iterator i = conflict_progress->ConflictingItemsBegin(); | 232 set<syncable::Id>::const_iterator i = |
| 233 conflict_progress->ConflictingItemsBegin(); |
| 231 while (i != conflict_progress->ConflictingItemsEnd()) { | 234 while (i != conflict_progress->ConflictingItemsEnd()) { |
| 232 syncable::Entry entry(trans, syncable::GET_BY_ID, *i); | 235 syncable::Entry entry(trans, syncable::GET_BY_ID, *i); |
| 233 if (!entry.good() || | 236 if (!entry.good() || |
| 234 (!entry.Get(syncable::IS_UNSYNCED) && | 237 (!entry.Get(syncable::IS_UNSYNCED) && |
| 235 !entry.Get(syncable::IS_UNAPPLIED_UPDATE))) { | 238 !entry.Get(syncable::IS_UNAPPLIED_UPDATE))) { |
| 236 // This can happen very rarely. It means we had a simply conflicting item | 239 // This can happen very rarely. It means we had a simply conflicting item |
| 237 // that randomly committed; its ID could have changed during the commit. | 240 // that randomly committed; its ID could have changed during the commit. |
| 238 // We drop the entry as it's no longer conflicting. | 241 // We drop the entry as it's no longer conflicting. |
| 239 conflict_progress->EraseConflictingItemById(*(i++)); | 242 conflict_progress->EraseConflictingItemById(*(i++)); |
| 240 continue; | 243 continue; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 LocallyDeletedPathChecker checker; | 405 LocallyDeletedPathChecker checker; |
| 403 if (!checker.CausingConflict(parent, *entry)) | 406 if (!checker.CausingConflict(parent, *entry)) |
| 404 return; | 407 return; |
| 405 conflict_progress->MergeSets(entry->Get(syncable::ID), | 408 conflict_progress->MergeSets(entry->Get(syncable::ID), |
| 406 parent.Get(syncable::ID)); | 409 parent.Get(syncable::ID)); |
| 407 CrawlDeletedTreeMergingSets(trans, parent, conflict_progress, checker); | 410 CrawlDeletedTreeMergingSets(trans, parent, conflict_progress, checker); |
| 408 } | 411 } |
| 409 } | 412 } |
| 410 | 413 |
| 411 } // namespace browser_sync | 414 } // namespace browser_sync |
| OLD | NEW |