Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: sync/internal_api/sync_manager_impl.cc

Issue 23189021: sync: Gracefully handle very early shutdown (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Retry: sync non-blocking early shutdown Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sync/internal_api/sync_manager_impl.h ('k') | sync/internal_api/sync_manager_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "sync/internal_api/sync_manager_impl.h" 5 #include "sync/internal_api/sync_manager_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/json/json_writer.h" 13 #include "base/json/json_writer.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/observer_list.h" 16 #include "base/observer_list.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "sync/engine/sync_scheduler.h" 19 #include "sync/engine/sync_scheduler.h"
20 #include "sync/engine/syncer_types.h" 20 #include "sync/engine/syncer_types.h"
21 #include "sync/internal_api/change_reorder_buffer.h" 21 #include "sync/internal_api/change_reorder_buffer.h"
22 #include "sync/internal_api/public/base/cancelation_signal.h"
22 #include "sync/internal_api/public/base/model_type.h" 23 #include "sync/internal_api/public/base/model_type.h"
23 #include "sync/internal_api/public/base_node.h" 24 #include "sync/internal_api/public/base_node.h"
24 #include "sync/internal_api/public/configure_reason.h" 25 #include "sync/internal_api/public/configure_reason.h"
25 #include "sync/internal_api/public/engine/polling_constants.h" 26 #include "sync/internal_api/public/engine/polling_constants.h"
26 #include "sync/internal_api/public/http_post_provider_factory.h" 27 #include "sync/internal_api/public/http_post_provider_factory.h"
27 #include "sync/internal_api/public/internal_components_factory.h" 28 #include "sync/internal_api/public/internal_components_factory.h"
28 #include "sync/internal_api/public/read_node.h" 29 #include "sync/internal_api/public/read_node.h"
29 #include "sync/internal_api/public/read_transaction.h" 30 #include "sync/internal_api/public/read_transaction.h"
30 #include "sync/internal_api/public/user_share.h" 31 #include "sync/internal_api/public/user_share.h"
31 #include "sync/internal_api/public/util/experiments.h" 32 #include "sync/internal_api/public/util/experiments.h"
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 ExtensionsActivity* extensions_activity, 348 ExtensionsActivity* extensions_activity,
348 SyncManager::ChangeDelegate* change_delegate, 349 SyncManager::ChangeDelegate* change_delegate,
349 const SyncCredentials& credentials, 350 const SyncCredentials& credentials,
350 const std::string& invalidator_client_id, 351 const std::string& invalidator_client_id,
351 const std::string& restored_key_for_bootstrapping, 352 const std::string& restored_key_for_bootstrapping,
352 const std::string& restored_keystore_key_for_bootstrapping, 353 const std::string& restored_keystore_key_for_bootstrapping,
353 InternalComponentsFactory* internal_components_factory, 354 InternalComponentsFactory* internal_components_factory,
354 Encryptor* encryptor, 355 Encryptor* encryptor,
355 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler, 356 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
356 ReportUnrecoverableErrorFunction report_unrecoverable_error_function, 357 ReportUnrecoverableErrorFunction report_unrecoverable_error_function,
357 bool use_oauth2_token) { 358 bool use_oauth2_token,
359 CancelationSignal* cancelation_signal) {
358 CHECK(!initialized_); 360 CHECK(!initialized_);
359 DCHECK(thread_checker_.CalledOnValidThread()); 361 DCHECK(thread_checker_.CalledOnValidThread());
360 DCHECK(post_factory.get()); 362 DCHECK(post_factory.get());
361 DCHECK(!credentials.email.empty()); 363 DCHECK(!credentials.email.empty());
362 DCHECK(!credentials.sync_token.empty()); 364 DCHECK(!credentials.sync_token.empty());
365 DCHECK(cancelation_signal);
363 DVLOG(1) << "SyncManager starting Init..."; 366 DVLOG(1) << "SyncManager starting Init...";
364 367
365 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); 368 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr());
366 369
367 change_delegate_ = change_delegate; 370 change_delegate_ = change_delegate;
368 371
369 AddObserver(&js_sync_manager_observer_); 372 AddObserver(&js_sync_manager_observer_);
370 SetJsEventHandler(event_handler); 373 SetJsEventHandler(event_handler);
371 374
372 AddObserver(&debug_info_event_listener_); 375 AddObserver(&debug_info_event_listener_);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()), 415 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()),
413 MakeWeakHandle( 416 MakeWeakHandle(
414 debug_info_event_listener_.GetWeakPtr()), 417 debug_info_event_listener_.GetWeakPtr()),
415 false, ModelTypeSet())); 418 false, ModelTypeSet()));
416 LOG(ERROR) << "Sync manager initialization failed!"; 419 LOG(ERROR) << "Sync manager initialization failed!";
417 return; 420 return;
418 } 421 }
419 422
420 connection_manager_.reset(new SyncAPIServerConnectionManager( 423 connection_manager_.reset(new SyncAPIServerConnectionManager(
421 sync_server_and_path, port, use_ssl, use_oauth2_token, 424 sync_server_and_path, port, use_ssl, use_oauth2_token,
422 post_factory.release())); 425 post_factory.release(), cancelation_signal));
423 connection_manager_->set_client_id(directory()->cache_guid()); 426 connection_manager_->set_client_id(directory()->cache_guid());
424 connection_manager_->AddListener(this); 427 connection_manager_->AddListener(this);
425 428
426 std::string sync_id = directory()->cache_guid(); 429 std::string sync_id = directory()->cache_guid();
427 430
428 allstatus_.SetSyncId(sync_id); 431 allstatus_.SetSyncId(sync_id);
429 allstatus_.SetInvalidatorClientId(invalidator_client_id); 432 allstatus_.SetInvalidatorClientId(invalidator_client_id);
430 433
431 DVLOG(1) << "Setting sync client ID: " << sync_id; 434 DVLOG(1) << "Setting sync client ID: " << sync_id;
432 DVLOG(1) << "Setting invalidator client ID: " << invalidator_client_id; 435 DVLOG(1) << "Setting invalidator client ID: " << invalidator_client_id;
433 436
434 // Build a SyncSessionContext and store the worker in it. 437 // Build a SyncSessionContext and store the worker in it.
435 DVLOG(1) << "Sync is bringing up SyncSessionContext."; 438 DVLOG(1) << "Sync is bringing up SyncSessionContext.";
436 std::vector<SyncEngineEventListener*> listeners; 439 std::vector<SyncEngineEventListener*> listeners;
437 listeners.push_back(&allstatus_); 440 listeners.push_back(&allstatus_);
438 listeners.push_back(this); 441 listeners.push_back(this);
439 session_context_ = internal_components_factory->BuildContext( 442 session_context_ = internal_components_factory->BuildContext(
440 connection_manager_.get(), 443 connection_manager_.get(),
441 directory(), 444 directory(),
442 workers, 445 workers,
443 extensions_activity, 446 extensions_activity,
444 listeners, 447 listeners,
445 &debug_info_event_listener_, 448 &debug_info_event_listener_,
446 &traffic_recorder_, 449 &traffic_recorder_,
447 invalidator_client_id).Pass(); 450 invalidator_client_id).Pass();
448 session_context_->set_account_name(credentials.email); 451 session_context_->set_account_name(credentials.email);
449 scheduler_ = internal_components_factory->BuildScheduler( 452 scheduler_ = internal_components_factory->BuildScheduler(
450 name_, session_context_.get()).Pass(); 453 name_, session_context_.get(), cancelation_signal).Pass();
451 454
452 scheduler_->Start(SyncScheduler::CONFIGURATION_MODE); 455 scheduler_->Start(SyncScheduler::CONFIGURATION_MODE);
453 456
454 initialized_ = true; 457 initialized_ = true;
455 458
456 net::NetworkChangeNotifier::AddIPAddressObserver(this); 459 net::NetworkChangeNotifier::AddIPAddressObserver(this);
457 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 460 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
458 observing_network_connectivity_changes_ = true; 461 observing_network_connectivity_changes_ = true;
459 462
460 UpdateCredentials(credentials); 463 UpdateCredentials(credentials);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) { 614 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) {
612 DCHECK(thread_checker_.CalledOnValidThread()); 615 DCHECK(thread_checker_.CalledOnValidThread());
613 observers_.AddObserver(observer); 616 observers_.AddObserver(observer);
614 } 617 }
615 618
616 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) { 619 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) {
617 DCHECK(thread_checker_.CalledOnValidThread()); 620 DCHECK(thread_checker_.CalledOnValidThread());
618 observers_.RemoveObserver(observer); 621 observers_.RemoveObserver(observer);
619 } 622 }
620 623
621 void SyncManagerImpl::StopSyncingForShutdown() {
622 DVLOG(2) << "StopSyncingForShutdown";
623 scheduler_->RequestStop();
624 if (connection_manager_)
625 connection_manager_->TerminateAllIO();
626 }
627
628 void SyncManagerImpl::ShutdownOnSyncThread() { 624 void SyncManagerImpl::ShutdownOnSyncThread() {
629 DCHECK(thread_checker_.CalledOnValidThread()); 625 DCHECK(thread_checker_.CalledOnValidThread());
630 626
631 // Prevent any in-flight method calls from running. Also 627 // Prevent any in-flight method calls from running. Also
632 // invalidates |weak_handle_this_| and |change_observer_|. 628 // invalidates |weak_handle_this_| and |change_observer_|.
633 weak_ptr_factory_.InvalidateWeakPtrs(); 629 weak_ptr_factory_.InvalidateWeakPtrs();
634 js_mutation_event_observer_.InvalidateWeakPtrs(); 630 js_mutation_event_observer_.InvalidateWeakPtrs();
635 631
636 scheduler_.reset(); 632 scheduler_.reset();
637 session_context_.reset(); 633 session_context_.reset();
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 int SyncManagerImpl::GetDefaultNudgeDelay() { 1327 int SyncManagerImpl::GetDefaultNudgeDelay() {
1332 return kDefaultNudgeDelayMilliseconds; 1328 return kDefaultNudgeDelayMilliseconds;
1333 } 1329 }
1334 1330
1335 // static. 1331 // static.
1336 int SyncManagerImpl::GetPreferencesNudgeDelay() { 1332 int SyncManagerImpl::GetPreferencesNudgeDelay() {
1337 return kPreferencesNudgeDelayMilliseconds; 1333 return kPreferencesNudgeDelayMilliseconds;
1338 } 1334 }
1339 1335
1340 } // namespace syncer 1336 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/internal_api/sync_manager_impl.h ('k') | sync/internal_api/sync_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698