Home | History | Annotate | Download | only in engine
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/sync/engine/cleanup_disabled_types_command.h"
      6 
      7 #include "chrome/browser/sync/sessions/sync_session.h"
      8 #include "chrome/browser/sync/sessions/sync_session_context.h"
      9 #include "chrome/browser/sync/syncable/directory_manager.h"
     10 #include "chrome/browser/sync/syncable/model_type.h"
     11 #include "chrome/browser/sync/syncable/syncable.h"
     12 
     13 namespace browser_sync {
     14 
     15 CleanupDisabledTypesCommand::CleanupDisabledTypesCommand() {}
     16 CleanupDisabledTypesCommand::~CleanupDisabledTypesCommand() {}
     17 
     18 void CleanupDisabledTypesCommand::ExecuteImpl(sessions::SyncSession* session) {
     19   syncable::ModelTypeSet to_cleanup;
     20   for (int i = syncable::FIRST_REAL_MODEL_TYPE;
     21        i < syncable::MODEL_TYPE_COUNT; i++) {
     22     syncable::ModelType model_type = syncable::ModelTypeFromInt(i);
     23 
     24     if (session->routing_info().count(model_type))
     25       continue;
     26 
     27     // The type isn't currently desired.  Because a full directory purge is
     28     // slow, we avoid purging undesired types unless we have reason to believe
     29     // they were previously enabled.  Because purging could theoretically fail,
     30     // on the first sync session (when there's no previous routing info) we pay
     31     // the full directory scan price once and do a "deep clean" of types that
     32     // may potentially need cleanup so that we converge to the correct state.
     33     //
     34     //                          in_previous  |   !in_previous
     35     //                                       |
     36     //   initial_sync_ended     should clean |  may have attempted cleanup
     37     //  !initial_sync_ended     should clean |  may have never been enabled, or
     38     //                                       |  could have been disabled before
     39     //                                       |  initial sync ended and cleanup
     40     //                                       |  may not have happened yet
     41     //                                       |  (failure, browser restart
     42     //                                       |  before another sync session,..)
     43     const ModelSafeRoutingInfo& previous_routing =
     44         session->context()->previous_session_routing_info();
     45     if (previous_routing.empty() || previous_routing.count(model_type))
     46       to_cleanup.insert(model_type);
     47   }
     48 
     49   if (to_cleanup.empty())
     50     return;
     51 
     52   syncable::ScopedDirLookup dir(session->context()->directory_manager(),
     53                                 session->context()->account_name());
     54   if (!dir.good()) {
     55     LOG(ERROR) << "Scoped dir lookup failed!";
     56     return;
     57   }
     58 
     59   dir->PurgeEntriesWithTypeIn(to_cleanup);
     60 }
     61 
     62 }  // namespace browser_sync
     63 
     64