1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncer.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/apply_updates_command.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/build_and_process_conflict_sets_command.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/build_commit_command.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/cleanup_disabled_types_command.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sync/engine/clear_data_command.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/conflict_resolver.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/download_updates_command.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/get_commit_ids_command.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/net/server_connection_manager.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/post_commit_message_command.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/process_commit_response_command.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/process_updates_command.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/resolve_conflicts_command.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/store_timestamps_command.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncer_end_command.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncer_types.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncer_util.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncproto.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/verify_updates_command.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/directory_manager.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/syncable-inl.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/syncable.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::TimeDelta; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing sync_pb::ClientCommand; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::Blob; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::IS_UNAPPLIED_UPDATE; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_CTIME; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_IS_DEL; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_IS_DIR; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_MTIME; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_NON_UNIQUE_NAME; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_PARENT_ID; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_POSITION_IN_PARENT; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_SPECIFICS; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SERVER_VERSION; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::SYNCER; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::ScopedDirLookup; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing syncable::WriteTransaction; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing sessions::ScopedSessionContextConflictResolver; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing sessions::StatusController; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing sessions::SyncSession; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing sessions::ConflictProgress; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochSyncer::Syncer() 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : early_exit_requested_(false), 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pre_conflict_resolution_closure_(NULL) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSyncer::~Syncer() {} 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool Syncer::ExitRequested() { 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(early_exit_requested_lock_); 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return early_exit_requested_; 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid Syncer::RequestEarlyExit() { 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(early_exit_requested_lock_); 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick early_exit_requested_ = true; 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(tim): Deprecated. 74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid Syncer::SyncShare(sessions::SyncSession* session) { 75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ScopedDirLookup dir(session->context()->directory_manager(), 76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch session->context()->account_name()); 77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The directory must be good here. 78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK(dir.good()); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sessions::SyncSourceInfo& source(session->source()); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (sync_pb::GetUpdatesCallerInfo::CLEAR_PRIVATE_DATA == 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen source.updates_source) { 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SyncShare(session, CLEAR_PRIVATE_DATA, SYNCER_END); 84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SyncShare(session, SYNCER_BEGIN, SYNCER_END); 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Syncer::SyncShare(sessions::SyncSession* session, 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SyncerStep first_step, 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SyncerStep last_step) { 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ScopedDirLookup dir(session->context()->directory_manager(), 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session->context()->account_name()); 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The directory must be good here. 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CHECK(dir.good()); 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ScopedSessionContextConflictResolver scoped(session->context(), 99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &resolver_); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncerStep current_step = first_step; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncerStep next_step = current_step; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (!ExitRequested()) { 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (current_step) { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SYNCER_BEGIN: 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Syncer Begin"; 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This isn't perfect, as we can end up bundling extensions activity 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // intended for the next session into the current one. We could do a 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // test-and-reset as with the source, but note that also falls short if 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // the commit request fails (e.g. due to lost connection), as we will 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // fall all the way back to the syncer thread main loop in that case, 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // creating a new session when a connection is established, losing the 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // records set here on the original attempt. This should provide us 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // with the right data "most of the time", and we're only using this 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // for analysis purposes, so Law of Large Numbers FTW. 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session->context()->extensions_monitor()->GetAndClearRecords( 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session->mutable_extensions_activity()); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = CLEANUP_DISABLED_TYPES; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case CLEANUP_DISABLED_TYPES: { 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Cleaning up disabled types"; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CleanupDisabledTypesCommand cleanup; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cleanup.Execute(session); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = DOWNLOAD_UPDATES; 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case DOWNLOAD_UPDATES: { 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Downloading Updates"; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadUpdatesCommand download_updates; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch download_updates.Execute(session); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = PROCESS_CLIENT_COMMAND; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case PROCESS_CLIENT_COMMAND: { 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Processing Client Command"; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProcessClientCommand(session); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = VERIFY_UPDATES; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case VERIFY_UPDATES: { 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Verifying Updates"; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VerifyUpdatesCommand verify_updates; 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch verify_updates.Execute(session); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = PROCESS_UPDATES; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case PROCESS_UPDATES: { 1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch VLOG(1) << "Processing Updates"; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProcessUpdatesCommand process_updates; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_updates.Execute(session); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = STORE_TIMESTAMPS; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case STORE_TIMESTAMPS: { 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Storing timestamps"; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StoreTimestampsCommand store_timestamps; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch store_timestamps.Execute(session); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should download all of the updates before attempting to process 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // them. 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (session->status_controller()->ServerSaysNothingMoreToDownload() || 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !session->status_controller()->download_updates_succeeded()) { 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = APPLY_UPDATES; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = DOWNLOAD_UPDATES; 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case APPLY_UPDATES: { 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Applying Updates"; 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ApplyUpdatesCommand apply_updates; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch apply_updates.Execute(session); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = BUILD_COMMIT_REQUEST; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These two steps are combined since they are executed within the same 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // write transaction. 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case BUILD_COMMIT_REQUEST: { 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch session->status_controller()->set_syncing(true); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Processing Commit Request"; 181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ScopedDirLookup dir(session->context()->directory_manager(), 182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch session->context()->account_name()); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dir.good()) { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Scoped dir lookup failed!"; 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteTransaction trans(dir, SYNCER, __FILE__, __LINE__); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sessions::ScopedSetSessionWriteTransaction set_trans(session, &trans); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Getting the Commit IDs"; 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetCommitIdsCommand get_commit_ids_command( 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session->context()->max_commit_batch_size()); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch get_commit_ids_command.Execute(session); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!session->status_controller()->commit_ids().empty()) { 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Building a commit message"; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BuildCommitCommand build_commit_command; 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch build_commit_command.Execute(session); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = POST_COMMIT_MESSAGE; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = BUILD_AND_PROCESS_CONFLICT_SETS; 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case POST_COMMIT_MESSAGE: { 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Posting a commit request"; 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PostCommitMessageCommand post_commit_command; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch post_commit_command.Execute(session); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = PROCESS_COMMIT_RESPONSE; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case PROCESS_COMMIT_RESPONSE: { 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Processing the commit response"; 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch session->status_controller()->reset_num_conflicting_commits(); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProcessCommitResponseCommand process_response_command; 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_response_command.Execute(session); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = BUILD_AND_PROCESS_CONFLICT_SETS; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case BUILD_AND_PROCESS_CONFLICT_SETS: { 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Building and Processing Conflict Sets"; 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BuildAndProcessConflictSetsCommand build_process_conflict_sets; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch build_process_conflict_sets.Execute(session); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (session->status_controller()->conflict_sets_built()) 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = SYNCER_END; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = RESOLVE_CONFLICTS; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case RESOLVE_CONFLICTS: { 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Resolving Conflicts"; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Trigger the pre_conflict_resolution_closure_, which is a testing 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // hook for the unit tests, if it is non-NULL. 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (pre_conflict_resolution_closure_) { 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pre_conflict_resolution_closure_->Run(); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StatusController* status = session->status_controller(); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status->reset_conflicts_resolved(); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResolveConflictsCommand resolve_conflicts_command; 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resolve_conflicts_command.Execute(session); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (status->HasConflictingUpdates()) 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = APPLY_UPDATES_TO_RESOLVE_CONFLICTS; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = SYNCER_END; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case APPLY_UPDATES_TO_RESOLVE_CONFLICTS: { 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StatusController* status = session->status_controller(); 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Applying updates to resolve conflicts"; 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ApplyUpdatesCommand apply_updates; 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int before_conflicting_updates = status->TotalNumConflictingItems(); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch apply_updates.Execute(session); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int after_conflicting_updates = status->TotalNumConflictingItems(); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status->update_conflicts_resolved(before_conflicting_updates > 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch after_conflicting_updates); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (status->conflicts_resolved()) 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = RESOLVE_CONFLICTS; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_step = SYNCER_END; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case CLEAR_PRIVATE_DATA: { 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Clear Private Data"; 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ClearDataCommand clear_data_command; 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick clear_data_command.Execute(session); 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick next_step = SYNCER_END; 271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen break; 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SYNCER_END: { 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen break; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Unknown command: " << current_step; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (last_step == current_step) 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_step = next_step; 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Syncer End"; 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncerEndCommand syncer_end_command; 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncer_end_command.Execute(session); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Syncer::ProcessClientCommand(sessions::SyncSession* session) { 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ClientToServerResponse& response = 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch session->status_controller()->updates_response(); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!response.has_client_command()) 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ClientCommand& command = response.client_command(); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The server limits the number of items a client can commit in one batch. 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (command.has_max_commit_batch_size()) { 29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session->context()->set_max_commit_batch_size( 30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen command.max_commit_batch_size()); 30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (command.has_set_sync_long_poll_interval()) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch session->delegate()->OnReceivedLongPollIntervalUpdate( 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TimeDelta::FromSeconds(command.set_sync_long_poll_interval())); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (command.has_set_sync_poll_interval()) { 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch session->delegate()->OnReceivedShortPollIntervalUpdate( 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TimeDelta::FromSeconds(command.set_sync_poll_interval())); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest) { 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_NON_UNIQUE_NAME, src->Get(SERVER_NON_UNIQUE_NAME)); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_PARENT_ID, src->Get(SERVER_PARENT_ID)); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_MTIME, src->Get(SERVER_MTIME)); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_CTIME, src->Get(SERVER_CTIME)); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_VERSION, src->Get(SERVER_VERSION)); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_IS_DIR, src->Get(SERVER_IS_DIR)); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_IS_DEL, src->Get(SERVER_IS_DEL)); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(IS_UNAPPLIED_UPDATE, src->Get(IS_UNAPPLIED_UPDATE)); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_SPECIFICS, src->Get(SERVER_SPECIFICS)); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest->Put(SERVER_POSITION_IN_PARENT, src->Get(SERVER_POSITION_IN_PARENT)); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ClearServerData(syncable::MutableEntry* entry) { 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_NON_UNIQUE_NAME, ""); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_PARENT_ID, syncable::kNullId); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_MTIME, 0); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_CTIME, 0); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_VERSION, 0); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_IS_DIR, false); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_IS_DEL, false); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(IS_UNAPPLIED_UPDATE, false); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_SPECIFICS, sync_pb::EntitySpecifics::default_instance()); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->Put(SERVER_POSITION_IN_PARENT, 0); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 339