diff options
Diffstat (limited to 'chrome/browser/sync/notifier')
6 files changed, 61 insertions, 181 deletions
diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.cc b/chrome/browser/sync/notifier/chrome_invalidation_client.cc index 606eb4f..563b132 100644 --- a/chrome/browser/sync/notifier/chrome_invalidation_client.cc +++ b/chrome/browser/sync/notifier/chrome_invalidation_client.cc @@ -128,6 +128,28 @@ void ChromeInvalidationClient::InvalidateAll( RunAndDeleteClosure(callback); } +void ChromeInvalidationClient::RegistrationStateChanged( + const invalidation::ObjectId& object_id, + invalidation::RegistrationState new_state, + const invalidation::UnknownHint& unknown_hint) { + DCHECK(non_thread_safe_.CalledOnValidThread()); + VLOG(1) << "RegistrationStateChanged to " << new_state; + if (new_state == invalidation::RegistrationState_UNKNOWN) { + VLOG(1) << "is_transient=" << unknown_hint.is_transient() + << ", message=" << unknown_hint.message(); + } + // TODO(akalin): Figure out something else to do if the failure + // isn't transient. Even if it is transient, we may still want to + // add exponential back-off or limit the number of attempts. + syncable::ModelType model_type; + if (ObjectIdToRealModelType(object_id, &model_type) && + (new_state != invalidation::RegistrationState_REGISTERED)) { + registration_manager_->MarkRegistrationLost(model_type); + } else { + LOG(WARNING) << "Could not get object id model type; ignoring"; + } +} + void ChromeInvalidationClient::AllRegistrationsLost( invalidation::Closure* callback) { DCHECK(non_thread_safe_.CalledOnValidThread()); diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.h b/chrome/browser/sync/notifier/chrome_invalidation_client.h index 7cbc3f8..53e37f8 100644 --- a/chrome/browser/sync/notifier/chrome_invalidation_client.h +++ b/chrome/browser/sync/notifier/chrome_invalidation_client.h @@ -73,6 +73,11 @@ class ChromeInvalidationClient virtual void InvalidateAll(invalidation::Closure* callback); + virtual void RegistrationStateChanged( + const invalidation::ObjectId& object_id, + invalidation::RegistrationState new_state, + const invalidation::UnknownHint& unknown_hint); + virtual void AllRegistrationsLost(invalidation::Closure* callback); virtual void RegistrationLost(const invalidation::ObjectId& object_id, diff --git a/chrome/browser/sync/notifier/chrome_system_resources.cc b/chrome/browser/sync/notifier/chrome_system_resources.cc index d23f90b..2bc4897 100644 --- a/chrome/browser/sync/notifier/chrome_system_resources.cc +++ b/chrome/browser/sync/notifier/chrome_system_resources.cc @@ -93,7 +93,7 @@ void ChromeSystemResources::Log( case WARNING_LEVEL: log_severity = logging::LOG_WARNING; break; - case ERROR_LEVEL: + case SEVERE_LEVEL: log_severity = logging::LOG_ERROR; break; } diff --git a/chrome/browser/sync/notifier/registration_manager.cc b/chrome/browser/sync/notifier/registration_manager.cc index 5b98902..c03c07c 100644 --- a/chrome/browser/sync/notifier/registration_manager.cc +++ b/chrome/browser/sync/notifier/registration_manager.cc @@ -8,7 +8,6 @@ #include "chrome/browser/sync/notifier/invalidation_util.h" #include "chrome/browser/sync/syncable/model_type.h" -#include "google/cacheinvalidation/invalidation-client.h" namespace sync_notifier { @@ -22,20 +21,21 @@ RegistrationManager::~RegistrationManager() { DCHECK(non_thread_safe_.CalledOnValidThread()); } -bool RegistrationManager::RegisterType(syncable::ModelType model_type) { +void RegistrationManager::RegisterType(syncable::ModelType model_type) { DCHECK(non_thread_safe_.CalledOnValidThread()); invalidation::ObjectId object_id; if (!RealModelTypeToObjectId(model_type, &object_id)) { - LOG(ERROR) << "Invalid model type: " << model_type; - return false; + LOG(DFATAL) << "Invalid model type: " << model_type; + return; } RegistrationStatusMap::iterator it = registration_status_.insert( - std::make_pair(model_type, UNREGISTERED)).first; - if (it->second == UNREGISTERED) { + std::make_pair( + model_type, + invalidation::RegistrationState_UNREGISTERED)).first; + if (it->second == invalidation::RegistrationState_UNREGISTERED) { RegisterObject(object_id, it); } - return true; } bool RegistrationManager::IsRegistered( @@ -46,7 +46,7 @@ bool RegistrationManager::IsRegistered( if (it == registration_status_.end()) { return false; } - return it->second == REGISTERED; + return it->second == invalidation::RegistrationState_REGISTERED; } void RegistrationManager::MarkRegistrationLost( @@ -63,7 +63,7 @@ void RegistrationManager::MarkRegistrationLost( LOG(ERROR) << "Unknown model type: " << model_type; return; } - it->second = UNREGISTERED; + it->second = invalidation::RegistrationState_UNREGISTERED; RegisterObject(object_id, it); } @@ -77,7 +77,7 @@ void RegistrationManager::MarkAllRegistrationsLost() { LOG(DFATAL) << "Invalid model type: " << it->first; continue; } - it->second = UNREGISTERED; + it->second = invalidation::RegistrationState_UNREGISTERED; RegisterObject(object_id, it); } } @@ -85,49 +85,9 @@ void RegistrationManager::MarkAllRegistrationsLost() { void RegistrationManager::RegisterObject( const invalidation::ObjectId& object_id, RegistrationStatusMap::iterator it) { - DCHECK_EQ(it->second, UNREGISTERED); - invalidation_client_->Register( - object_id, - invalidation::NewPermanentCallback( - this, &RegistrationManager::OnRegister)); - it->second = PENDING; -} - -void RegistrationManager::OnRegister( - const invalidation::RegistrationUpdateResult& result) { - DCHECK(non_thread_safe_.CalledOnValidThread()); - LOG(INFO) << "OnRegister: " << RegistrationUpdateResultToString(result); - if (result.operation().type() != - invalidation::RegistrationUpdate::REGISTER) { - LOG(ERROR) << "Got non-register result"; - return; - } - syncable::ModelType model_type; - if (!ObjectIdToRealModelType(result.operation().object_id(), - &model_type)) { - LOG(ERROR) << "Could not get model type"; - return; - } - RegistrationStatusMap::iterator it = - registration_status_.find(model_type); - if (it == registration_status_.end()) { - LOG(ERROR) << "Unknown model type: " << model_type; - return; - } - invalidation::Status::Code code = result.status().code(); - switch (code) { - case invalidation::Status::SUCCESS: - it->second = REGISTERED; - break; - case invalidation::Status::TRANSIENT_FAILURE: - // TODO(akalin): Add retry logic. For now, just fall through. - default: - // Treat everything else as a permanent failure. - if (VLOG_IS_ON(1)) { - LOG(ERROR) << "Registration failed with code: " << code; - } - break; - } + DCHECK_EQ(it->second, invalidation::RegistrationState_UNREGISTERED); + invalidation_client_->Register(object_id); + it->second = invalidation::RegistrationState_REGISTERED; } } // namespace sync_notifier diff --git a/chrome/browser/sync/notifier/registration_manager.h b/chrome/browser/sync/notifier/registration_manager.h index 06acc89..1b1a534 100644 --- a/chrome/browser/sync/notifier/registration_manager.h +++ b/chrome/browser/sync/notifier/registration_manager.h @@ -14,12 +14,7 @@ #include "base/basictypes.h" #include "base/non_thread_safe.h" #include "chrome/browser/sync/syncable/model_type.h" - -namespace invalidation { -class InvalidationClient; -class ObjectId; -class RegistrationUpdateResult; -} // namespace +#include "google/cacheinvalidation/invalidation-client.h" namespace sync_notifier { @@ -31,13 +26,10 @@ class RegistrationManager { ~RegistrationManager(); - // If |model_type| is valid, starts the process to register it and - // returns true. Otherwise, returns false. - bool RegisterType(syncable::ModelType model_type); + // Registers the given |model_type|, which must be valid. + void RegisterType(syncable::ModelType model_type); - // Returns true iff |model_type| has been successfully registered. - // Note that IsRegistered(model_type) may not immediately (or ever) - // return true after calling RegisterType(model_type). + // Returns true iff |model_type| is currently registered. // // Currently only used by unit tests. bool IsRegistered(syncable::ModelType model_type) const; @@ -52,16 +44,7 @@ class RegistrationManager { void MarkAllRegistrationsLost(); private: - enum RegistrationStatus { - // Registration request has not yet been sent. - UNREGISTERED, - // Registration request has been sent; waiting on confirmation. - PENDING, - // Registration has been confirmed. - REGISTERED, - }; - - typedef std::map<syncable::ModelType, RegistrationStatus> + typedef std::map<syncable::ModelType, invalidation::RegistrationState> RegistrationStatusMap; // Calls invalidation_client_->Register() on |object_id|. sets diff --git a/chrome/browser/sync/notifier/registration_manager_unittest.cc b/chrome/browser/sync/notifier/registration_manager_unittest.cc index de773f6..5307d46 100644 --- a/chrome/browser/sync/notifier/registration_manager_unittest.cc +++ b/chrome/browser/sync/notifier/registration_manager_unittest.cc @@ -21,38 +21,15 @@ namespace { // Register(). class FakeInvalidationClient : public invalidation::InvalidationClient { public: - struct Args { - Args() : callback(NULL) {} - - Args(const invalidation::ObjectId& oid, - invalidation::RegistrationCallback* callback) - : oid(oid), callback(callback) {} - - invalidation::ObjectId oid; - invalidation::RegistrationCallback* callback; - }; - FakeInvalidationClient() {} - virtual ~FakeInvalidationClient() { - for (std::deque<Args>::iterator it = register_calls.begin(); - it != register_calls.end(); ++it) { - delete it->callback; - } - } - - virtual void Register(const invalidation::ObjectId& oid, - invalidation::RegistrationCallback* callback) { - register_calls.push_back(Args(oid, callback)); - } + virtual ~FakeInvalidationClient() {} - virtual void Unregister(const invalidation::ObjectId& oid, - invalidation::RegistrationCallback* callback) { - ADD_FAILURE(); - delete callback; + virtual void Register(const invalidation::ObjectId& oid) { + registered_oids.push_back(oid); } - virtual void PermanentShutdown() { + virtual void Unregister(const invalidation::ObjectId& oid) { ADD_FAILURE(); } @@ -61,7 +38,7 @@ class FakeInvalidationClient : public invalidation::InvalidationClient { return NULL; } - std::deque<Args> register_calls; + std::deque<invalidation::ObjectId> registered_oids; private: DISALLOW_COPY_AND_ASSIGN(FakeInvalidationClient); @@ -124,48 +101,18 @@ TEST_F(RegistrationManagerTest, RegisterType) { } ASSERT_EQ(kModelTypeCount, - fake_invalidation_client_.register_calls.size()); + fake_invalidation_client_.registered_oids.size()); - // Nothing should be registered yet. + // Everything should be registered. for (size_t i = 0; i < kModelTypeCount; ++i) { - EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i])); + EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i])); } // Check object IDs. for (size_t i = 0; i < kModelTypeCount; ++i) { EXPECT_EQ(kModelTypes[i], ObjectIdToModelType( - fake_invalidation_client_.register_calls[i].oid)); - } - - // Prepare results. - std::vector<invalidation::RegistrationUpdateResult> results( - kModelTypeCount); - for (size_t i = 0; i < kModelTypeCount; ++i) { - results[i] = MakeRegistrationUpdateResult(kModelTypes[i]); - } - - // Generate a variety of error conditions in all but the first - // result. - results[1].mutable_operation()->set_type( - invalidation::RegistrationUpdate::UNREGISTER); - results[2].mutable_operation()->mutable_object_id()-> - mutable_name()->set_string_value("garbage"); - results[3].mutable_status()-> - set_code(invalidation::Status::PERMANENT_FAILURE); - *results[4].mutable_operation()->mutable_object_id() = - ModelTypeToObjectId(syncable::TYPED_URLS); - - - // Send the registration results back. - for (size_t i = 0; i < kModelTypeCount; ++i) { - fake_invalidation_client_.register_calls[i].callback->Run(results[i]); - } - - // Only the first one should be registered. - EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0])); - for (size_t i = 1; i < kModelTypeCount; ++i) { - EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i])); + fake_invalidation_client_.registered_oids[i])); } } @@ -185,13 +132,7 @@ TEST_F(RegistrationManagerTest, MarkRegistrationLost) { } ASSERT_EQ(kModelTypeCount, - fake_invalidation_client_.register_calls.size()); - - // Send the registration results back. - for (size_t i = 0; i < kModelTypeCount; ++i) { - fake_invalidation_client_.register_calls[i].callback->Run( - MakeRegistrationUpdateResult(kModelTypes[i])); - } + fake_invalidation_client_.registered_oids.size()); // All should be registered. for (size_t i = 0; i < kModelTypeCount; ++i) { @@ -204,22 +145,9 @@ TEST_F(RegistrationManagerTest, MarkRegistrationLost) { } ASSERT_EQ(2 * kModelTypeCount - 1, - fake_invalidation_client_.register_calls.size()); - - // Only the first one should be registered. - EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0])); - for (size_t i = 1; i < kModelTypeCount; ++i) { - EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i])); - } + fake_invalidation_client_.registered_oids.size()); - // Send more registration results back. - for (size_t i = 1; i < kModelTypeCount; ++i) { - fake_invalidation_client_.register_calls[kModelTypeCount + i - 1]. - callback->Run( - MakeRegistrationUpdateResult(kModelTypes[i])); - } - - // All should be registered. + // All should still be registered. for (size_t i = 0; i < kModelTypeCount; ++i) { EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i])); } @@ -241,13 +169,7 @@ TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) { } ASSERT_EQ(kModelTypeCount, - fake_invalidation_client_.register_calls.size()); - - // Send the registration results back. - for (size_t i = 0; i < kModelTypeCount; ++i) { - fake_invalidation_client_.register_calls[i].callback->Run( - MakeRegistrationUpdateResult(kModelTypes[i])); - } + fake_invalidation_client_.registered_oids.size()); // All should be registered. for (size_t i = 0; i < kModelTypeCount; ++i) { @@ -262,21 +184,9 @@ TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) { registration_manager_.MarkAllRegistrationsLost(); ASSERT_EQ(3 * kModelTypeCount - 1, - fake_invalidation_client_.register_calls.size()); - - // None should be registered. - for (size_t i = 0; i < kModelTypeCount; ++i) { - EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i])); - } + fake_invalidation_client_.registered_oids.size()); - // Send more registration results back. - for (size_t i = 0; i < kModelTypeCount; ++i) { - fake_invalidation_client_.register_calls[2 * kModelTypeCount + i - 1]. - callback->Run( - MakeRegistrationUpdateResult(kModelTypes[i])); - } - - // All should be registered. + // All should still be registered. for (size_t i = 0; i < kModelTypeCount; ++i) { EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i])); } |