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

Unified Diff: google_apis/gcm/engine/connection_factory_impl.cc

Issue 336473003: [GCM] Suppress connection attempts when there is no valid connection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Self review Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: google_apis/gcm/engine/connection_factory_impl.cc
diff --git a/google_apis/gcm/engine/connection_factory_impl.cc b/google_apis/gcm/engine/connection_factory_impl.cc
index 9f71b9015ff3d6e6102d15e368e0ffc22433cabd..be549c319b4b2627fd5522f6f531ea706725ffff 100644
--- a/google_apis/gcm/engine/connection_factory_impl.cc
+++ b/google_apis/gcm/engine/connection_factory_impl.cc
@@ -57,6 +57,7 @@ ConnectionFactoryImpl::ConnectionFactoryImpl(
pac_request_(NULL),
connecting_(false),
waiting_for_backoff_(false),
+ waiting_for_network_change_(false),
logging_in_(false),
recorder_(recorder),
listener_(NULL),
@@ -65,8 +66,7 @@ ConnectionFactoryImpl::ConnectionFactoryImpl(
}
ConnectionFactoryImpl::~ConnectionFactoryImpl() {
- net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
- net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
+ net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
if (pac_request_) {
network_session_->proxy_service()->CancelPacRequest(pac_request_);
pac_request_ = NULL;
@@ -83,8 +83,8 @@ void ConnectionFactoryImpl::Initialize(
backoff_entry_ = CreateBackoffEntry(&backoff_policy_);
request_builder_ = request_builder;
- net::NetworkChangeNotifier::AddIPAddressObserver(this);
- net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
+ net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
+ waiting_for_network_change_ = net::NetworkChangeNotifier::IsOffline();
connection_handler_ = CreateConnectionHandler(
base::TimeDelta::FromMilliseconds(kReadTimeoutMs),
read_callback,
@@ -150,6 +150,8 @@ std::string ConnectionFactoryImpl::GetConnectionStateString() const {
return "CONNECTING";
if (waiting_for_backoff_)
return "WAITING FOR BACKOFF";
+ if (waiting_for_network_change_)
+ return "WAITING FOR NETWORK CHANGE";
return "NOT CONNECTED";
}
@@ -182,6 +184,9 @@ void ConnectionFactoryImpl::SignalConnectionReset(
CloseSocket();
DCHECK(!IsEndpointReachable());
+ if (waiting_for_network_change_)
+ return;
+
// Network changes get special treatment as they can trigger a one-off canary
// request that bypasses backoff (but does nothing if a connection is in
// progress). Other connection reset events can be ignored as a connection
@@ -208,8 +213,6 @@ void ConnectionFactoryImpl::SignalConnectionReset(
// We shouldn't be in backoff in thise case.
DCHECK_EQ(0, backoff_entry_->failure_count());
}
- DCHECK(!connecting_);
- DCHECK(!waiting_for_backoff_);
// At this point the last login time has been consumed or deemed irrelevant,
// reset it.
@@ -229,21 +232,19 @@ base::TimeTicks ConnectionFactoryImpl::NextRetryAttempt() const {
return backoff_entry_->GetReleaseTime();
}
-void ConnectionFactoryImpl::OnConnectionTypeChanged(
+void ConnectionFactoryImpl::OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) {
- if (type == net::NetworkChangeNotifier::CONNECTION_NONE)
+ if (type == net::NetworkChangeNotifier::CONNECTION_NONE) {
+ DVLOG(1) << "Network lost, resettion connection.";
+ waiting_for_network_change_ = true;
+
+ // Will do nothing due to |waiting_for_network_change_ == true|.
+ SignalConnectionReset(NETWORK_CHANGE);
return;
+ }
DVLOG(1) << "Connection type changed to " << type << ", reconnecting.";
-
- // The connection may have been silently dropped, attempt to reconnect.
- SignalConnectionReset(NETWORK_CHANGE);
-}
-
-void ConnectionFactoryImpl::OnIPAddressChanged() {
- DVLOG(1) << "IP Address changed, reconnecting.";
-
- // The connection may have been silently dropped, attempt to reconnect.
+ waiting_for_network_change_ = false;
SignalConnectionReset(NETWORK_CHANGE);
}
@@ -271,6 +272,9 @@ void ConnectionFactoryImpl::ConnectImpl() {
DCHECK(!IsEndpointReachable());
DCHECK(!socket_handle_.socket());
+ if (waiting_for_network_change_)
+ return;
+
connecting_ = true;
GURL current_endpoint = GetCurrentEndpoint();
recorder_->RecordConnectionInitiated(current_endpoint.host());

Powered by Google App Engine
This is Rietveld 408576698