Index: chrome/browser/sync/engine/syncer.cc |
diff --git a/chrome/browser/sync/engine/syncer.cc b/chrome/browser/sync/engine/syncer.cc |
deleted file mode 100644 |
index 3fe46dc45c91246a5ab8f5ab5a97ce945667c158..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/engine/syncer.cc |
+++ /dev/null |
@@ -1,345 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/sync/engine/syncer.h" |
- |
-#include "base/debug/trace_event.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/message_loop.h" |
-#include "base/time.h" |
-#include "build/build_config.h" |
-#include "chrome/browser/sync/engine/apply_updates_command.h" |
-#include "chrome/browser/sync/engine/build_commit_command.h" |
-#include "chrome/browser/sync/engine/cleanup_disabled_types_command.h" |
-#include "chrome/browser/sync/engine/clear_data_command.h" |
-#include "chrome/browser/sync/engine/conflict_resolver.h" |
-#include "chrome/browser/sync/engine/download_updates_command.h" |
-#include "chrome/browser/sync/engine/get_commit_ids_command.h" |
-#include "chrome/browser/sync/engine/net/server_connection_manager.h" |
-#include "chrome/browser/sync/engine/post_commit_message_command.h" |
-#include "chrome/browser/sync/engine/process_commit_response_command.h" |
-#include "chrome/browser/sync/engine/process_updates_command.h" |
-#include "chrome/browser/sync/engine/resolve_conflicts_command.h" |
-#include "chrome/browser/sync/engine/store_timestamps_command.h" |
-#include "chrome/browser/sync/engine/syncer_types.h" |
-#include "chrome/browser/sync/engine/syncproto.h" |
-#include "chrome/browser/sync/engine/verify_updates_command.h" |
-#include "chrome/browser/sync/syncable/syncable-inl.h" |
-#include "chrome/browser/sync/syncable/syncable.h" |
- |
-using base::Time; |
-using base::TimeDelta; |
-using sync_pb::ClientCommand; |
-using syncable::Blob; |
-using syncable::IS_UNAPPLIED_UPDATE; |
-using syncable::SERVER_CTIME; |
-using syncable::SERVER_IS_DEL; |
-using syncable::SERVER_IS_DIR; |
-using syncable::SERVER_MTIME; |
-using syncable::SERVER_NON_UNIQUE_NAME; |
-using syncable::SERVER_PARENT_ID; |
-using syncable::SERVER_POSITION_IN_PARENT; |
-using syncable::SERVER_SPECIFICS; |
-using syncable::SERVER_VERSION; |
-using syncable::SYNCER; |
-using syncable::WriteTransaction; |
- |
-namespace browser_sync { |
- |
-using sessions::ScopedSessionContextConflictResolver; |
-using sessions::StatusController; |
-using sessions::SyncSession; |
-using sessions::ConflictProgress; |
- |
-#define ENUM_CASE(x) case x: return #x |
-const char* SyncerStepToString(const SyncerStep step) |
-{ |
- switch (step) { |
- ENUM_CASE(SYNCER_BEGIN); |
- ENUM_CASE(CLEANUP_DISABLED_TYPES); |
- ENUM_CASE(DOWNLOAD_UPDATES); |
- ENUM_CASE(PROCESS_CLIENT_COMMAND); |
- ENUM_CASE(VERIFY_UPDATES); |
- ENUM_CASE(PROCESS_UPDATES); |
- ENUM_CASE(STORE_TIMESTAMPS); |
- ENUM_CASE(APPLY_UPDATES); |
- ENUM_CASE(BUILD_COMMIT_REQUEST); |
- ENUM_CASE(POST_COMMIT_MESSAGE); |
- ENUM_CASE(PROCESS_COMMIT_RESPONSE); |
- ENUM_CASE(RESOLVE_CONFLICTS); |
- ENUM_CASE(APPLY_UPDATES_TO_RESOLVE_CONFLICTS); |
- ENUM_CASE(CLEAR_PRIVATE_DATA); |
- ENUM_CASE(SYNCER_END); |
- } |
- NOTREACHED(); |
- return ""; |
-} |
-#undef ENUM_CASE |
- |
-Syncer::Syncer() |
- : early_exit_requested_(false) { |
-} |
- |
-Syncer::~Syncer() {} |
- |
-bool Syncer::ExitRequested() { |
- base::AutoLock lock(early_exit_requested_lock_); |
- return early_exit_requested_; |
-} |
- |
-void Syncer::RequestEarlyExit() { |
- base::AutoLock lock(early_exit_requested_lock_); |
- early_exit_requested_ = true; |
-} |
- |
-void Syncer::SyncShare(sessions::SyncSession* session, |
- SyncerStep first_step, |
- SyncerStep last_step) { |
- ScopedSessionContextConflictResolver scoped(session->context(), |
- &resolver_); |
- session->mutable_status_controller()->UpdateStartTime(); |
- SyncerStep current_step = first_step; |
- |
- SyncerStep next_step = current_step; |
- while (!ExitRequested()) { |
- TRACE_EVENT1("sync", "SyncerStateMachine", |
- "state", SyncerStepToString(current_step)); |
- DVLOG(1) << "Syncer step:" << SyncerStepToString(current_step); |
- |
- switch (current_step) { |
- case SYNCER_BEGIN: |
- // This isn't perfect, as we can end up bundling extensions activity |
- // intended for the next session into the current one. We could do a |
- // test-and-reset as with the source, but note that also falls short if |
- // the commit request fails (e.g. due to lost connection), as we will |
- // fall all the way back to the syncer thread main loop in that case, |
- // creating a new session when a connection is established, losing the |
- // records set here on the original attempt. This should provide us |
- // with the right data "most of the time", and we're only using this |
- // for analysis purposes, so Law of Large Numbers FTW. |
- session->context()->extensions_monitor()->GetAndClearRecords( |
- session->mutable_extensions_activity()); |
- session->context()->PruneUnthrottledTypes(base::TimeTicks::Now()); |
- session->SendEventNotification(SyncEngineEvent::SYNC_CYCLE_BEGIN); |
- |
- next_step = CLEANUP_DISABLED_TYPES; |
- break; |
- case CLEANUP_DISABLED_TYPES: { |
- CleanupDisabledTypesCommand cleanup; |
- cleanup.Execute(session); |
- next_step = DOWNLOAD_UPDATES; |
- break; |
- } |
- case DOWNLOAD_UPDATES: { |
- // TODO(akalin): We may want to propagate this switch up |
- // eventually. |
-#if defined(OS_ANDROID) |
- const bool kCreateMobileBookmarksFolder = true; |
-#else |
- const bool kCreateMobileBookmarksFolder = false; |
-#endif |
- DownloadUpdatesCommand download_updates(kCreateMobileBookmarksFolder); |
- session->mutable_status_controller()->set_last_download_updates_result( |
- download_updates.Execute(session)); |
- next_step = PROCESS_CLIENT_COMMAND; |
- break; |
- } |
- case PROCESS_CLIENT_COMMAND: { |
- ProcessClientCommand(session); |
- next_step = VERIFY_UPDATES; |
- break; |
- } |
- case VERIFY_UPDATES: { |
- VerifyUpdatesCommand verify_updates; |
- verify_updates.Execute(session); |
- next_step = PROCESS_UPDATES; |
- break; |
- } |
- case PROCESS_UPDATES: { |
- ProcessUpdatesCommand process_updates; |
- process_updates.Execute(session); |
- next_step = STORE_TIMESTAMPS; |
- break; |
- } |
- case STORE_TIMESTAMPS: { |
- StoreTimestampsCommand store_timestamps; |
- store_timestamps.Execute(session); |
- // We should download all of the updates before attempting to process |
- // them. |
- if (session->status_controller().ServerSaysNothingMoreToDownload() || |
- !session->status_controller().download_updates_succeeded()) { |
- next_step = APPLY_UPDATES; |
- } else { |
- next_step = DOWNLOAD_UPDATES; |
- } |
- break; |
- } |
- case APPLY_UPDATES: { |
- ApplyUpdatesCommand apply_updates; |
- apply_updates.Execute(session); |
- if (last_step == APPLY_UPDATES) { |
- // We're in configuration mode, but we still need to run the |
- // SYNCER_END step. |
- last_step = SYNCER_END; |
- next_step = SYNCER_END; |
- } else { |
- next_step = BUILD_COMMIT_REQUEST; |
- } |
- break; |
- } |
- // These two steps are combined since they are executed within the same |
- // write transaction. |
- case BUILD_COMMIT_REQUEST: { |
- syncable::Directory* dir = session->context()->directory(); |
- WriteTransaction trans(FROM_HERE, SYNCER, dir); |
- sessions::ScopedSetSessionWriteTransaction set_trans(session, &trans); |
- |
- DVLOG(1) << "Getting the Commit IDs"; |
- GetCommitIdsCommand get_commit_ids_command( |
- session->context()->max_commit_batch_size()); |
- get_commit_ids_command.Execute(session); |
- |
- if (!session->status_controller().commit_ids().empty()) { |
- DVLOG(1) << "Building a commit message"; |
- BuildCommitCommand build_commit_command; |
- build_commit_command.Execute(session); |
- |
- next_step = POST_COMMIT_MESSAGE; |
- } else { |
- next_step = RESOLVE_CONFLICTS; |
- } |
- |
- break; |
- } |
- case POST_COMMIT_MESSAGE: { |
- PostCommitMessageCommand post_commit_command; |
- session->mutable_status_controller()->set_last_post_commit_result( |
- post_commit_command.Execute(session)); |
- next_step = PROCESS_COMMIT_RESPONSE; |
- break; |
- } |
- case PROCESS_COMMIT_RESPONSE: { |
- ProcessCommitResponseCommand process_response_command; |
- session->mutable_status_controller()-> |
- set_last_process_commit_response_result( |
- process_response_command.Execute(session)); |
- next_step = RESOLVE_CONFLICTS; |
- break; |
- } |
- case RESOLVE_CONFLICTS: { |
- StatusController* status = session->mutable_status_controller(); |
- status->reset_conflicts_resolved(); |
- ResolveConflictsCommand resolve_conflicts_command; |
- resolve_conflicts_command.Execute(session); |
- |
- // Has ConflictingUpdates includes both resolvable and unresolvable |
- // conflicts. If we have either, we want to attempt to reapply. |
- if (status->HasConflictingUpdates()) |
- next_step = APPLY_UPDATES_TO_RESOLVE_CONFLICTS; |
- else |
- next_step = SYNCER_END; |
- break; |
- } |
- case APPLY_UPDATES_TO_RESOLVE_CONFLICTS: { |
- StatusController* status = session->mutable_status_controller(); |
- DVLOG(1) << "Applying updates to resolve conflicts"; |
- ApplyUpdatesCommand apply_updates; |
- |
- // We only care to resolve conflicts again if we made progress on the |
- // simple conflicts. |
- int before_blocking_conflicting_updates = |
- status->TotalNumSimpleConflictingItems(); |
- apply_updates.Execute(session); |
- int after_blocking_conflicting_updates = |
- status->TotalNumSimpleConflictingItems(); |
- // If the following call sets the conflicts_resolved value to true, |
- // SyncSession::HasMoreToSync() will send us into another sync cycle |
- // after this one completes. |
- // |
- // TODO(rlarocque, 109072): Make conflict resolution not require |
- // extra sync cycles/GetUpdates. |
- status->update_conflicts_resolved(before_blocking_conflicting_updates > |
- after_blocking_conflicting_updates); |
- next_step = SYNCER_END; |
- break; |
- } |
- case CLEAR_PRIVATE_DATA: { |
- ClearDataCommand clear_data_command; |
- clear_data_command.Execute(session); |
- next_step = SYNCER_END; |
- break; |
- } |
- case SYNCER_END: { |
- session->SendEventNotification(SyncEngineEvent::SYNC_CYCLE_ENDED); |
- next_step = SYNCER_END; |
- break; |
- } |
- default: |
- LOG(ERROR) << "Unknown command: " << current_step; |
- } |
- DVLOG(2) << "last step: " << SyncerStepToString(last_step) << ", " |
- << "current step: " << SyncerStepToString(current_step) << ", " |
- << "next step: " << SyncerStepToString(next_step) << ", " |
- << "snapshot: " << session->TakeSnapshot().ToString(); |
- if (last_step == current_step) |
- break; |
- current_step = next_step; |
- } |
-} |
- |
-void Syncer::ProcessClientCommand(sessions::SyncSession* session) { |
- const ClientToServerResponse& response = |
- session->status_controller().updates_response(); |
- if (!response.has_client_command()) |
- return; |
- const ClientCommand& command = response.client_command(); |
- |
- // The server limits the number of items a client can commit in one batch. |
- if (command.has_max_commit_batch_size()) { |
- session->context()->set_max_commit_batch_size( |
- command.max_commit_batch_size()); |
- } |
- if (command.has_set_sync_long_poll_interval()) { |
- session->delegate()->OnReceivedLongPollIntervalUpdate( |
- TimeDelta::FromSeconds(command.set_sync_long_poll_interval())); |
- } |
- if (command.has_set_sync_poll_interval()) { |
- session->delegate()->OnReceivedShortPollIntervalUpdate( |
- TimeDelta::FromSeconds(command.set_sync_poll_interval())); |
- } |
- |
- if (command.has_sessions_commit_delay_seconds()) { |
- session->delegate()->OnReceivedSessionsCommitDelay( |
- TimeDelta::FromSeconds(command.sessions_commit_delay_seconds())); |
- } |
-} |
- |
-void CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest) { |
- dest->Put(SERVER_NON_UNIQUE_NAME, src->Get(SERVER_NON_UNIQUE_NAME)); |
- dest->Put(SERVER_PARENT_ID, src->Get(SERVER_PARENT_ID)); |
- dest->Put(SERVER_MTIME, src->Get(SERVER_MTIME)); |
- dest->Put(SERVER_CTIME, src->Get(SERVER_CTIME)); |
- dest->Put(SERVER_VERSION, src->Get(SERVER_VERSION)); |
- dest->Put(SERVER_IS_DIR, src->Get(SERVER_IS_DIR)); |
- dest->Put(SERVER_IS_DEL, src->Get(SERVER_IS_DEL)); |
- dest->Put(IS_UNAPPLIED_UPDATE, src->Get(IS_UNAPPLIED_UPDATE)); |
- dest->Put(SERVER_SPECIFICS, src->Get(SERVER_SPECIFICS)); |
- dest->Put(SERVER_POSITION_IN_PARENT, src->Get(SERVER_POSITION_IN_PARENT)); |
-} |
- |
-void ClearServerData(syncable::MutableEntry* entry) { |
- entry->Put(SERVER_NON_UNIQUE_NAME, ""); |
- entry->Put(SERVER_PARENT_ID, syncable::GetNullId()); |
- entry->Put(SERVER_MTIME, Time()); |
- entry->Put(SERVER_CTIME, Time()); |
- entry->Put(SERVER_VERSION, 0); |
- entry->Put(SERVER_IS_DIR, false); |
- entry->Put(SERVER_IS_DEL, false); |
- entry->Put(IS_UNAPPLIED_UPDATE, false); |
- entry->Put(SERVER_SPECIFICS, sync_pb::EntitySpecifics::default_instance()); |
- entry->Put(SERVER_POSITION_IN_PARENT, 0); |
-} |
- |
-} // namespace browser_sync |