diff options
Diffstat (limited to 'sync/engine')
-rw-r--r-- | sync/engine/apply_updates_command.cc | 3 | ||||
-rw-r--r-- | sync/engine/apply_updates_command_unittest.cc | 158 | ||||
-rw-r--r-- | sync/engine/process_updates_command.cc | 3 | ||||
-rw-r--r-- | sync/engine/update_applicator.cc | 69 | ||||
-rw-r--r-- | sync/engine/update_applicator.h | 35 |
5 files changed, 57 insertions, 211 deletions
diff --git a/sync/engine/apply_updates_command.cc b/sync/engine/apply_updates_command.cc index e43f071..bff83f2 100644 --- a/sync/engine/apply_updates_command.cc +++ b/sync/engine/apply_updates_command.cc @@ -71,9 +71,6 @@ SyncerError ApplyUpdatesCommand::ModelChangingExecuteImpl( session->status_controller().group_restriction()); applicator.AttemptApplications(&trans, handles, session->mutable_status_controller()); - applicator.SaveProgressIntoSessionState( - session->mutable_status_controller()->mutable_simple_conflict_ids(), - session->mutable_status_controller()->mutable_update_progress()); // This might be the first time we've fully completed a sync cycle, for // some subset of the currently synced datatypes. diff --git a/sync/engine/apply_updates_command_unittest.cc b/sync/engine/apply_updates_command_unittest.cc index 01ddd93..b261c1d 100644 --- a/sync/engine/apply_updates_command_unittest.cc +++ b/sync/engine/apply_updates_command_unittest.cc @@ -81,19 +81,14 @@ TEST_F(ApplyUpdatesCommandTest, Simple) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - - EXPECT_EQ(0, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(0, status.num_simple_conflicts()) << "Simple update shouldn't result in conflicts"; - EXPECT_EQ(0, status->num_encryption_conflicts()) + EXPECT_EQ(0, status.num_encryption_conflicts()) << "Simple update shouldn't result in conflicts"; - EXPECT_EQ(0, status->num_hierarchy_conflicts()) + EXPECT_EQ(0, status.num_hierarchy_conflicts()) << "Simple update shouldn't result in conflicts"; - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(2, status->update_progress()->SuccessfullyAppliedUpdateCount()) + EXPECT_EQ(2, status.num_updates_applied()) << "All items should have been successfully applied"; } @@ -115,14 +110,10 @@ TEST_F(ApplyUpdatesCommandTest, UpdateWithChildrenBeforeParents) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - EXPECT_EQ(0, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(0, status.num_simple_conflicts()) << "Simple update shouldn't result in conflicts, even if out-of-order"; - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(5, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(5, status->update_progress()->SuccessfullyAppliedUpdateCount()) + EXPECT_EQ(5, status.num_updates_applied()) << "All updates should have been successfully applied"; } @@ -136,8 +127,8 @@ TEST_F(ApplyUpdatesCommandTest, SimpleConflict) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - EXPECT_EQ(1, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(1, status.num_simple_conflicts()) << "Unsynced and unapplied item should be a simple conflict"; } @@ -164,15 +155,12 @@ TEST_F(ApplyUpdatesCommandTest, HierarchyAndSimpleConflict) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); + const sessions::StatusController& status = session()->status_controller(); // An update that is both a simple conflict and a hierarchy conflict should be // treated as a hierarchy conflict. - EXPECT_EQ(1, status->num_hierarchy_conflicts()); - EXPECT_EQ(0, status->num_simple_conflicts()); - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()); + EXPECT_EQ(1, status.num_hierarchy_conflicts()); + EXPECT_EQ(0, status.num_simple_conflicts()); } @@ -210,14 +198,11 @@ TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDirectoryLoop) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); + const sessions::StatusController& status = session()->status_controller(); // This should count as a hierarchy conflict. - EXPECT_EQ(1, status->num_hierarchy_conflicts()); - EXPECT_EQ(0, status->num_simple_conflicts()); - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()); + EXPECT_EQ(1, status.num_hierarchy_conflicts()); + EXPECT_EQ(0, status.num_simple_conflicts()); } // Runs the ApplyUpdatesCommand on a directory where the server sent us an @@ -247,9 +232,9 @@ TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDeletedParent) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - EXPECT_EQ(1, status->num_hierarchy_conflicts()); - EXPECT_EQ(0, status->num_simple_conflicts()); + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(1, status.num_hierarchy_conflicts()); + EXPECT_EQ(0, status.num_simple_conflicts()); } // Runs the ApplyUpdatesCommand on a directory where the server is trying to @@ -285,10 +270,10 @@ TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDeleteNonEmptyDirectory) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); + const sessions::StatusController& status = session()->status_controller(); // This should count as a hierarchy conflict. - EXPECT_EQ(1, status->num_hierarchy_conflicts()); - EXPECT_EQ(0, status->num_simple_conflicts()); + EXPECT_EQ(1, status.num_hierarchy_conflicts()); + EXPECT_EQ(0, status.num_simple_conflicts()); } // Runs the ApplyUpdatesCommand on a server-created item that has a locally @@ -304,19 +289,13 @@ TEST_F(ApplyUpdatesCommandTest, HierarchyConflictUnknownParent) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - - EXPECT_EQ(0, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(0, status.num_simple_conflicts()) << "Updates with unknown parent should not be treated as 'simple'" << " conflicts"; - EXPECT_EQ(2, status->num_hierarchy_conflicts()) + EXPECT_EQ(2, status.num_hierarchy_conflicts()) << "All updates with an unknown ancestors should be in conflict"; - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) + EXPECT_EQ(0, status.num_updates_applied()) << "No item with an unknown ancestor should be applied"; } @@ -339,16 +318,10 @@ TEST_F(ApplyUpdatesCommandTest, ItemsBothKnownAndUnknown) { ExpectGroupToChange(apply_updates_command_, GROUP_UI); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - - EXPECT_EQ(2, status->num_hierarchy_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(2, status.num_hierarchy_conflicts()) << "The updates with unknown ancestors should be in conflict"; - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(6, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(4, status->update_progress()->SuccessfullyAppliedUpdateCount()) + EXPECT_EQ(4, status.num_updates_applied()) << "The updates with known ancestors should be successfully applied"; } @@ -376,16 +349,10 @@ TEST_F(ApplyUpdatesCommandTest, DecryptablePassword) { ExpectGroupToChange(apply_updates_command_, GROUP_PASSWORD); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - - EXPECT_EQ(0, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_EQ(0, status.num_simple_conflicts()) << "No update should be in conflict because they're all decryptable"; - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) + EXPECT_EQ(1, status.num_updates_applied()) << "The updates that can be decrypted should be applied"; } @@ -405,30 +372,16 @@ TEST_F(ApplyUpdatesCommandTest, UndecryptableData) { ExpectGroupsToChange(apply_updates_command_, GROUP_UI, GROUP_PASSWORD); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - EXPECT_TRUE(status->HasConflictingUpdates()) - << "Updates that can't be decrypted should trigger the syncer to have " - << "conflicting updates."; - EXPECT_EQ(0, status->num_simple_conflicts()) + const sessions::StatusController& status = session()->status_controller(); + EXPECT_TRUE(status.HasConflictingUpdates()) + << "Updates that can't be decrypted should trigger the syncer to have " + << "conflicting updates."; + EXPECT_EQ(0, status.num_simple_conflicts()) << "Updates that can't be decrypted should not be in regular conflict"; - EXPECT_EQ(3, status->num_encryption_conflicts()) + EXPECT_EQ(3, status.num_encryption_conflicts()) << "Updates that can't be decrypted should be in encryption conflict"; - { - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) - << "No update that can't be decrypted should be applied"; - } - { - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) - << "No update that can't be decrypted should be applied"; - } + EXPECT_EQ(0, status.num_updates_applied()) + << "No update that can't be decrypted should be applied"; } TEST_F(ApplyUpdatesCommandTest, SomeUndecryptablePassword) { @@ -468,25 +421,18 @@ TEST_F(ApplyUpdatesCommandTest, SomeUndecryptablePassword) { ExpectGroupToChange(apply_updates_command_, GROUP_PASSWORD); apply_updates_command_.ExecuteImpl(session()); - sessions::StatusController* status = session()->mutable_status_controller(); - EXPECT_TRUE(status->HasConflictingUpdates()) - << "Updates that can't be decrypted should trigger the syncer to have " - << "conflicting updates."; - { - EXPECT_EQ(0, status->num_simple_conflicts()) - << "The updates that can't be decrypted should not be in regular " - << "conflict"; - EXPECT_EQ(1, status->num_encryption_conflicts()) - << "The updates that can't be decrypted should be in encryption " - << "conflict"; - - sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); - ASSERT_TRUE(status->update_progress()); - EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) - << "All updates should have been attempted"; - EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) - << "The undecryptable password update shouldn't be applied"; - } + const sessions::StatusController& status = session()->status_controller(); + EXPECT_TRUE(status.HasConflictingUpdates()) + << "Updates that can't be decrypted should trigger the syncer to have " + << "conflicting updates."; + EXPECT_EQ(0, status.num_simple_conflicts()) + << "The updates that can't be decrypted should not be in regular " + << "conflict"; + EXPECT_EQ(1, status.num_encryption_conflicts()) + << "The updates that can't be decrypted should be in encryption " + << "conflict"; + EXPECT_EQ(1, status.num_updates_applied()) + << "The undecryptable password update shouldn't be applied"; } } // namespace syncer diff --git a/sync/engine/process_updates_command.cc b/sync/engine/process_updates_command.cc index 22d465c..15a14cb 100644 --- a/sync/engine/process_updates_command.cc +++ b/sync/engine/process_updates_command.cc @@ -30,7 +30,6 @@ namespace syncer { using sessions::SyncSession; using sessions::StatusController; -using sessions::UpdateProgress; using syncable::GET_BY_ID; @@ -141,7 +140,6 @@ SyncerError ProcessUpdatesCommand::ModelChangingExecuteImpl( VerifyResult verify_result = VerifyUpdate(&trans, update, requested_types, session->routing_info()); - status->mutable_update_progress()->AddVerifyResult(verify_result, update); status->increment_num_updates_downloaded_by(1); if (!UpdateContainsNewVersion(&trans, update)) status->increment_num_reflected_updates_downloaded_by(1); @@ -158,7 +156,6 @@ SyncerError ProcessUpdatesCommand::ModelChangingExecuteImpl( process_result == SUCCESS_STORED); } - status->mutable_update_progress()->ClearVerifiedUpdates(); return SYNCER_OK; } diff --git a/sync/engine/update_applicator.cc b/sync/engine/update_applicator.cc index cb09fc7..541b68c 100644 --- a/sync/engine/update_applicator.cc +++ b/sync/engine/update_applicator.cc @@ -25,8 +25,7 @@ UpdateApplicator::UpdateApplicator(Cryptographer* cryptographer, ModelSafeGroup group_filter) : cryptographer_(cryptographer), group_filter_(group_filter), - routing_info_(routes), - application_results_() { + routing_info_(routes) { } UpdateApplicator::~UpdateApplicator() { @@ -48,6 +47,9 @@ void UpdateApplicator::AttemptApplications( const std::vector<int64>& handles, sessions::StatusController* status) { std::vector<int64> to_apply = handles; + std::set<syncable::Id>* simple_conflict_ids = + status->mutable_simple_conflict_ids(); + DVLOG(1) << "UpdateApplicator running over " << to_apply.size() << " items."; while (!to_apply.empty()) { std::vector<int64> to_reapply; @@ -64,18 +66,15 @@ void UpdateApplicator::AttemptApplications( switch (result) { case SUCCESS: - application_results_.AddSuccess(entry.Get(ID)); status->increment_num_updates_applied(); break; case CONFLICT_SIMPLE: - application_results_.AddSimpleConflict(entry.Get(ID)); + simple_conflict_ids->insert(entry.Get(ID)); break; case CONFLICT_ENCRYPTION: - application_results_.AddEncryptionConflict(entry.Get(ID)); status->increment_num_encryption_conflicts(); break; case CONFLICT_HIERARCHY: - application_results_.AddHierarchyConflict(entry.Get(ID)); // The decision to classify these as hierarchy conflcits is tentative. // If we make any progress this round, we'll clear the hierarchy // conflict count and attempt to reapply these updates. @@ -96,7 +95,6 @@ void UpdateApplicator::AttemptApplications( // We made some progress, so prepare for what might be another iteration. // If everything went well, to_reapply will be empty and we'll break out on // the while condition. - application_results_.ClearHierarchyConflicts(); to_apply.swap(to_reapply); to_reapply.clear(); } @@ -121,61 +119,4 @@ bool UpdateApplicator::SkipUpdate(const syncable::Entry& entry) { return false; } -void UpdateApplicator::SaveProgressIntoSessionState( - std::set<syncable::Id>* simple_conflict_ids, - sessions::UpdateProgress* update_progress) { - application_results_.SaveProgress(simple_conflict_ids, update_progress); -} - -UpdateApplicator::ResultTracker::ResultTracker() { -} - -UpdateApplicator::ResultTracker::~ResultTracker() { -} - -void UpdateApplicator::ResultTracker::AddSimpleConflict(syncable::Id id) { - conflicting_ids_.insert(id); -} - -void UpdateApplicator::ResultTracker::AddEncryptionConflict(syncable::Id id) { - encryption_conflict_ids_.insert(id); -} - -void UpdateApplicator::ResultTracker::AddHierarchyConflict(syncable::Id id) { - hierarchy_conflict_ids_.insert(id); -} - -void UpdateApplicator::ResultTracker::AddSuccess(syncable::Id id) { - successful_ids_.insert(id); -} - -void UpdateApplicator::ResultTracker::SaveProgress( - std::set<syncable::Id>* simple_conflict_ids, - sessions::UpdateProgress* update_progress) { - std::set<syncable::Id>::const_iterator i; - *simple_conflict_ids = conflicting_ids_; - for (i = conflicting_ids_.begin(); i != conflicting_ids_.end(); ++i) { - update_progress->AddAppliedUpdate(CONFLICT_SIMPLE, *i); - } - for (i = encryption_conflict_ids_.begin(); - i != encryption_conflict_ids_.end(); ++i) { - update_progress->AddAppliedUpdate(CONFLICT_ENCRYPTION, *i); - } - for (i = hierarchy_conflict_ids_.begin(); - i != hierarchy_conflict_ids_.end(); ++i) { - update_progress->AddAppliedUpdate(CONFLICT_HIERARCHY, *i); - } - for (i = successful_ids_.begin(); i != successful_ids_.end(); ++i) { - update_progress->AddAppliedUpdate(SUCCESS, *i); - } -} - -void UpdateApplicator::ResultTracker::ClearHierarchyConflicts() { - hierarchy_conflict_ids_.clear(); -} - -bool UpdateApplicator::ResultTracker::no_conflicts() const { - return conflicting_ids_.empty(); -} - } // namespace syncer diff --git a/sync/engine/update_applicator.h b/sync/engine/update_applicator.h index 290a76c..c5b27a2 100644 --- a/sync/engine/update_applicator.h +++ b/sync/engine/update_applicator.h @@ -23,7 +23,6 @@ namespace syncer { namespace sessions { class StatusController; -class UpdateProgress; } namespace syncable { @@ -48,38 +47,7 @@ class UpdateApplicator { const std::vector<int64>& handles, sessions::StatusController* status); - // This class does not automatically save its progress into the - // SyncSession -- to get that to happen, call this method after update - // application is finished (i.e., when AttemptOneAllocation stops returning - // true). - void SaveProgressIntoSessionState( - std::set<syncable::Id>* simple_conflict_ids, - sessions::UpdateProgress* update_progress); - private: - // Track the status of all applications. - class ResultTracker { - public: - explicit ResultTracker(); - virtual ~ResultTracker(); - void AddSimpleConflict(syncable::Id); - void AddEncryptionConflict(syncable::Id); - void AddHierarchyConflict(syncable::Id); - void AddSuccess(syncable::Id); - void SaveProgress(std::set<syncable::Id>* simple_conflict_ids, - sessions::UpdateProgress* update_progress); - void ClearHierarchyConflicts(); - - // Returns true iff conflicting_ids_ is empty. Does not check - // encryption_conflict_ids_. - bool no_conflicts() const; - private: - std::set<syncable::Id> conflicting_ids_; - std::set<syncable::Id> successful_ids_; - std::set<syncable::Id> encryption_conflict_ids_; - std::set<syncable::Id> hierarchy_conflict_ids_; - }; - // If true, AttemptOneApplication will skip over |entry| and return true. bool SkipUpdate(const syncable::Entry& entry); @@ -90,9 +58,6 @@ class UpdateApplicator { const ModelSafeRoutingInfo routing_info_; - // Track the result of the attempts to update applications. - ResultTracker application_results_; - DISALLOW_COPY_AND_ASSIGN(UpdateApplicator); }; |