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

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

Issue 15580002: Make use of InvalidationService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years, 5 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
« 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"
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 const base::FilePath& database_location, 342 const base::FilePath& database_location,
343 const WeakHandle<JsEventHandler>& event_handler, 343 const WeakHandle<JsEventHandler>& event_handler,
344 const std::string& sync_server_and_path, 344 const std::string& sync_server_and_path,
345 int port, 345 int port,
346 bool use_ssl, 346 bool use_ssl,
347 scoped_ptr<HttpPostProviderFactory> post_factory, 347 scoped_ptr<HttpPostProviderFactory> post_factory,
348 const std::vector<ModelSafeWorker*>& workers, 348 const std::vector<ModelSafeWorker*>& workers,
349 ExtensionsActivityMonitor* extensions_activity_monitor, 349 ExtensionsActivityMonitor* extensions_activity_monitor,
350 SyncManager::ChangeDelegate* change_delegate, 350 SyncManager::ChangeDelegate* change_delegate,
351 const SyncCredentials& credentials, 351 const SyncCredentials& credentials,
352 scoped_ptr<Invalidator> invalidator,
353 const std::string& invalidator_client_id, 352 const std::string& invalidator_client_id,
354 const std::string& restored_key_for_bootstrapping, 353 const std::string& restored_key_for_bootstrapping,
355 const std::string& restored_keystore_key_for_bootstrapping, 354 const std::string& restored_keystore_key_for_bootstrapping,
356 scoped_ptr<InternalComponentsFactory> internal_components_factory, 355 scoped_ptr<InternalComponentsFactory> internal_components_factory,
357 Encryptor* encryptor, 356 Encryptor* encryptor,
358 UnrecoverableErrorHandler* unrecoverable_error_handler, 357 UnrecoverableErrorHandler* unrecoverable_error_handler,
359 ReportUnrecoverableErrorFunction report_unrecoverable_error_function, 358 ReportUnrecoverableErrorFunction report_unrecoverable_error_function,
360 bool use_oauth2_token) { 359 bool use_oauth2_token) {
361 CHECK(!initialized_); 360 CHECK(!initialized_);
362 DCHECK(thread_checker_.CalledOnValidThread()); 361 DCHECK(thread_checker_.CalledOnValidThread());
363 DCHECK(post_factory.get()); 362 DCHECK(post_factory.get());
364 DCHECK(!credentials.email.empty()); 363 DCHECK(!credentials.email.empty());
365 DCHECK(!credentials.sync_token.empty()); 364 DCHECK(!credentials.sync_token.empty());
366 DVLOG(1) << "SyncManager starting Init..."; 365 DVLOG(1) << "SyncManager starting Init...";
367 366
368 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); 367 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr());
369 368
370 change_delegate_ = change_delegate; 369 change_delegate_ = change_delegate;
371 370
372 invalidator_ = invalidator.Pass();
373 invalidator_->RegisterHandler(this);
374
375 AddObserver(&js_sync_manager_observer_); 371 AddObserver(&js_sync_manager_observer_);
376 SetJsEventHandler(event_handler); 372 SetJsEventHandler(event_handler);
377 373
378 AddObserver(&debug_info_event_listener_); 374 AddObserver(&debug_info_event_listener_);
379 375
380 database_path_ = database_location.Append( 376 database_path_ = database_location.Append(
381 syncable::Directory::kSyncDatabaseFilename); 377 syncable::Directory::kSyncDatabaseFilename);
382 encryptor_ = encryptor; 378 encryptor_ = encryptor;
383 unrecoverable_error_handler_ = unrecoverable_error_handler; 379 unrecoverable_error_handler_ = unrecoverable_error_handler;
384 report_unrecoverable_error_function_ = report_unrecoverable_error_function; 380 report_unrecoverable_error_function_ = report_unrecoverable_error_function;
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) { 598 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) {
603 DCHECK(thread_checker_.CalledOnValidThread()); 599 DCHECK(thread_checker_.CalledOnValidThread());
604 DCHECK(initialized_); 600 DCHECK(initialized_);
605 DCHECK(!credentials.email.empty()); 601 DCHECK(!credentials.email.empty());
606 DCHECK(!credentials.sync_token.empty()); 602 DCHECK(!credentials.sync_token.empty());
607 603
608 observing_network_connectivity_changes_ = true; 604 observing_network_connectivity_changes_ = true;
609 if (!connection_manager_->SetAuthToken(credentials.sync_token)) 605 if (!connection_manager_->SetAuthToken(credentials.sync_token))
610 return; // Auth token is known to be invalid, so exit early. 606 return; // Auth token is known to be invalid, so exit early.
611 607
612 invalidator_->UpdateCredentials(credentials.email, credentials.sync_token);
613 scheduler_->OnCredentialsUpdated(); 608 scheduler_->OnCredentialsUpdated();
614 609
615 // TODO(zea): pass the credential age to the debug info event listener. 610 // TODO(zea): pass the credential age to the debug info event listener.
616 } 611 }
617 612
618 void SyncManagerImpl::UpdateEnabledTypes(ModelTypeSet enabled_types) {
619 DCHECK(thread_checker_.CalledOnValidThread());
620 DCHECK(initialized_);
621 invalidator_->UpdateRegisteredIds(
622 this,
623 ModelTypeSetToObjectIdSet(enabled_types));
624 }
625
626 void SyncManagerImpl::RegisterInvalidationHandler(
627 InvalidationHandler* handler) {
628 DCHECK(thread_checker_.CalledOnValidThread());
629 DCHECK(initialized_);
630 invalidator_->RegisterHandler(handler);
631 }
632
633 void SyncManagerImpl::UpdateRegisteredInvalidationIds(
634 InvalidationHandler* handler,
635 const ObjectIdSet& ids) {
636 DCHECK(thread_checker_.CalledOnValidThread());
637 DCHECK(initialized_);
638 invalidator_->UpdateRegisteredIds(handler, ids);
639 }
640
641 void SyncManagerImpl::UnregisterInvalidationHandler(
642 InvalidationHandler* handler) {
643 DCHECK(thread_checker_.CalledOnValidThread());
644 DCHECK(initialized_);
645 invalidator_->UnregisterHandler(handler);
646 }
647
648 void SyncManagerImpl::AcknowledgeInvalidation(
649 const invalidation::ObjectId& id, const syncer::AckHandle& ack_handle) {
650 DCHECK(thread_checker_.CalledOnValidThread());
651 DCHECK(initialized_);
652 invalidator_->Acknowledge(id, ack_handle);
653 }
654
655 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) { 613 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) {
656 DCHECK(thread_checker_.CalledOnValidThread()); 614 DCHECK(thread_checker_.CalledOnValidThread());
657 observers_.AddObserver(observer); 615 observers_.AddObserver(observer);
658 } 616 }
659 617
660 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) { 618 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) {
661 DCHECK(thread_checker_.CalledOnValidThread()); 619 DCHECK(thread_checker_.CalledOnValidThread());
662 observers_.RemoveObserver(observer); 620 observers_.RemoveObserver(observer);
663 } 621 }
664 622
(...skipping 18 matching lines...) Expand all
683 if (sync_encryption_handler_) { 641 if (sync_encryption_handler_) {
684 sync_encryption_handler_->RemoveObserver(&debug_info_event_listener_); 642 sync_encryption_handler_->RemoveObserver(&debug_info_event_listener_);
685 sync_encryption_handler_->RemoveObserver(this); 643 sync_encryption_handler_->RemoveObserver(this);
686 } 644 }
687 645
688 SetJsEventHandler(WeakHandle<JsEventHandler>()); 646 SetJsEventHandler(WeakHandle<JsEventHandler>());
689 RemoveObserver(&js_sync_manager_observer_); 647 RemoveObserver(&js_sync_manager_observer_);
690 648
691 RemoveObserver(&debug_info_event_listener_); 649 RemoveObserver(&debug_info_event_listener_);
692 650
693 // |invalidator_| and |connection_manager_| may end up being NULL here in 651 // |connection_manager_| may end up being NULL here in tests (in synchronous
694 // tests (in synchronous initialization mode). 652 // initialization mode).
695 // 653 //
696 // TODO(akalin): Fix this behavior. 654 // TODO(akalin): Fix this behavior.
697
698 if (invalidator_)
699 invalidator_->UnregisterHandler(this);
700 invalidator_.reset();
701
702 if (connection_manager_) 655 if (connection_manager_)
703 connection_manager_->RemoveListener(this); 656 connection_manager_->RemoveListener(this);
704 connection_manager_.reset(); 657 connection_manager_.reset();
705 658
706 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); 659 net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
707 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 660 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
708 observing_network_connectivity_changes_ = false; 661 observing_network_connectivity_changes_ = false;
709 662
710 if (initialized_ && directory()) { 663 if (initialized_ && directory()) {
711 directory()->SaveChanges(); 664 directory()->SaveChanges();
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { 934 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) {
982 if (!initialized_) { 935 if (!initialized_) {
983 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " 936 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not "
984 << "initialized"; 937 << "initialized";
985 return; 938 return;
986 } 939 }
987 940
988 DVLOG(1) << "Sending OnSyncCycleCompleted"; 941 DVLOG(1) << "Sending OnSyncCycleCompleted";
989 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 942 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
990 OnSyncCycleCompleted(event.snapshot)); 943 OnSyncCycleCompleted(event.snapshot));
991
992 // This is here for tests, which are still using p2p notifications.
993 bool is_notifiable_commit =
994 (event.snapshot.model_neutral_state().num_successful_commits > 0);
995 if (is_notifiable_commit) {
996 if (invalidator_) {
997 const ObjectIdInvalidationMap& invalidation_map =
998 ModelTypeInvalidationMapToObjectIdInvalidationMap(
999 event.snapshot.source().types);
1000 invalidator_->SendInvalidation(invalidation_map);
1001 } else {
1002 DVLOG(1) << "Not sending invalidation: invalidator_ is NULL";
1003 }
1004 }
1005 } 944 }
1006 945
1007 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { 946 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) {
1008 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 947 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
1009 OnStopSyncingPermanently()); 948 OnStopSyncingPermanently());
1010 return; 949 return;
1011 } 950 }
1012 951
1013 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { 952 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) {
1014 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 953 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 const ModelTypeInvalidationMap& invalidation_map) { 1156 const ModelTypeInvalidationMap& invalidation_map) {
1218 for (ModelTypeInvalidationMap::const_iterator it = invalidation_map.begin(); 1157 for (ModelTypeInvalidationMap::const_iterator it = invalidation_map.begin();
1219 it != invalidation_map.end(); ++it) { 1158 it != invalidation_map.end(); ++it) {
1220 NotificationInfo* info = &notification_info_map_[it->first]; 1159 NotificationInfo* info = &notification_info_map_[it->first];
1221 info->total_count++; 1160 info->total_count++;
1222 info->payload = it->second.payload; 1161 info->payload = it->second.payload;
1223 } 1162 }
1224 } 1163 }
1225 1164
1226 void SyncManagerImpl::OnInvalidatorStateChange(InvalidatorState state) { 1165 void SyncManagerImpl::OnInvalidatorStateChange(InvalidatorState state) {
1166 DCHECK(thread_checker_.CalledOnValidThread());
1167
1227 const std::string& state_str = InvalidatorStateToString(state); 1168 const std::string& state_str = InvalidatorStateToString(state);
1228 invalidator_state_ = state; 1169 invalidator_state_ = state;
1229 DVLOG(1) << "Invalidator state changed to: " << state_str; 1170 DVLOG(1) << "Invalidator state changed to: " << state_str;
1230 const bool notifications_enabled = 1171 const bool notifications_enabled =
1231 (invalidator_state_ == INVALIDATIONS_ENABLED); 1172 (invalidator_state_ == INVALIDATIONS_ENABLED);
1232 allstatus_.SetNotificationsEnabled(notifications_enabled); 1173 allstatus_.SetNotificationsEnabled(notifications_enabled);
1233 scheduler_->SetNotificationsEnabled(notifications_enabled); 1174 scheduler_->SetNotificationsEnabled(notifications_enabled);
1234 1175
1235 if (invalidator_state_ == syncer::INVALIDATION_CREDENTIALS_REJECTED) {
1236 // If the invalidator's credentials were rejected, that means that
1237 // our sync credentials are also bad, so invalidate those.
1238 connection_manager_->OnInvalidationCredentialsRejected();
1239 }
1240
1241 if (js_event_handler_.IsInitialized()) { 1176 if (js_event_handler_.IsInitialized()) {
1242 base::DictionaryValue details; 1177 base::DictionaryValue details;
1243 details.SetString("state", state_str); 1178 details.SetString("state", state_str);
1244 js_event_handler_.Call(FROM_HERE, 1179 js_event_handler_.Call(FROM_HERE,
1245 &JsEventHandler::HandleJsEvent, 1180 &JsEventHandler::HandleJsEvent,
1246 "onNotificationStateChange", 1181 "onNotificationStateChange",
1247 JsEventDetails(&details)); 1182 JsEventDetails(&details));
1248 } 1183 }
1249 } 1184 }
1250 1185
1251 void SyncManagerImpl::OnIncomingInvalidation( 1186 void SyncManagerImpl::OnIncomingInvalidation(
1252 const ObjectIdInvalidationMap& invalidation_map) { 1187 const ObjectIdInvalidationMap& invalidation_map) {
1253 DCHECK(thread_checker_.CalledOnValidThread()); 1188 DCHECK(thread_checker_.CalledOnValidThread());
1254 1189
1255 // TODO(dcheng): Acknowledge immediately for now. Fix this once the
1256 // invalidator doesn't repeatedly ping for unacknowledged invaliations, since
1257 // it conflicts with the sync scheduler's internal backoff algorithm.
1258 // See http://crbug.com/124149 for more information.
1259 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin();
1260 it != invalidation_map.end(); ++it) {
1261 invalidator_->Acknowledge(it->first, it->second.ack_handle);
1262 }
1263
1264 const ModelTypeInvalidationMap& type_invalidation_map = 1190 const ModelTypeInvalidationMap& type_invalidation_map =
1265 ObjectIdInvalidationMapToModelTypeInvalidationMap(invalidation_map); 1191 ObjectIdInvalidationMapToModelTypeInvalidationMap(invalidation_map);
1266 if (type_invalidation_map.empty()) { 1192 if (type_invalidation_map.empty()) {
1267 LOG(WARNING) << "Sync received invalidation without any type information."; 1193 LOG(WARNING) << "Sync received invalidation without any type information.";
1268 } else { 1194 } else {
1269 allstatus_.IncrementNudgeCounter(NUDGE_SOURCE_NOTIFICATION); 1195 allstatus_.IncrementNudgeCounter(NUDGE_SOURCE_NOTIFICATION);
1270 scheduler_->ScheduleInvalidationNudge( 1196 scheduler_->ScheduleInvalidationNudge(
1271 TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec), 1197 TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec),
1272 type_invalidation_map, FROM_HERE); 1198 type_invalidation_map, FROM_HERE);
1273 allstatus_.IncrementNotificationsReceived(); 1199 allstatus_.IncrementNotificationsReceived();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 int SyncManagerImpl::GetDefaultNudgeDelay() { 1322 int SyncManagerImpl::GetDefaultNudgeDelay() {
1397 return kDefaultNudgeDelayMilliseconds; 1323 return kDefaultNudgeDelayMilliseconds;
1398 } 1324 }
1399 1325
1400 // static. 1326 // static.
1401 int SyncManagerImpl::GetPreferencesNudgeDelay() { 1327 int SyncManagerImpl::GetPreferencesNudgeDelay() {
1402 return kPreferencesNudgeDelayMilliseconds; 1328 return kPreferencesNudgeDelayMilliseconds;
1403 } 1329 }
1404 1330
1405 } // namespace syncer 1331 } // 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