| OLD | NEW |
| 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 "net/socket/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 rv = ERR_FAILED; | 156 rv = ERR_FAILED; |
| 157 break; | 157 break; |
| 158 } | 158 } |
| 159 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); | 159 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); |
| 160 | 160 |
| 161 return rv; | 161 return rv; |
| 162 } | 162 } |
| 163 | 163 |
| 164 int TransportConnectJob::DoResolveHost() { | 164 int TransportConnectJob::DoResolveHost() { |
| 165 next_state_ = STATE_RESOLVE_HOST_COMPLETE; | 165 next_state_ = STATE_RESOLVE_HOST_COMPLETE; |
| 166 connect_timing_.dns_start = base::TimeTicks::Now(); |
| 167 |
| 166 return resolver_.Resolve( | 168 return resolver_.Resolve( |
| 167 params_->destination(), &addresses_, | 169 params_->destination(), &addresses_, |
| 168 base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this)), | 170 base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this)), |
| 169 net_log()); | 171 net_log()); |
| 170 } | 172 } |
| 171 | 173 |
| 172 int TransportConnectJob::DoResolveHostComplete(int result) { | 174 int TransportConnectJob::DoResolveHostComplete(int result) { |
| 175 connect_timing_.dns_end = base::TimeTicks::Now(); |
| 176 // Overwrite connection start time, since for connections that do not go |
| 177 // through proxies, |connect_start| should not include dns lookup time. |
| 178 connect_timing_.connect_start = connect_timing_.dns_end; |
| 179 |
| 173 if (result == OK) { | 180 if (result == OK) { |
| 174 // Invoke callback, and abort if it fails. | 181 // Invoke callback, and abort if it fails. |
| 175 if (!params_->host_resolution_callback().is_null()) | 182 if (!params_->host_resolution_callback().is_null()) |
| 176 result = params_->host_resolution_callback().Run(addresses_, net_log()); | 183 result = params_->host_resolution_callback().Run(addresses_, net_log()); |
| 177 | 184 |
| 178 if (result == OK) | 185 if (result == OK) |
| 179 next_state_ = STATE_TRANSPORT_CONNECT; | 186 next_state_ = STATE_TRANSPORT_CONNECT; |
| 180 } | 187 } |
| 181 return result; | 188 return result; |
| 182 } | 189 } |
| 183 | 190 |
| 184 int TransportConnectJob::DoTransportConnect() { | 191 int TransportConnectJob::DoTransportConnect() { |
| 185 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; | 192 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; |
| 186 transport_socket_.reset(client_socket_factory_->CreateTransportClientSocket( | 193 transport_socket_.reset(client_socket_factory_->CreateTransportClientSocket( |
| 187 addresses_, net_log().net_log(), net_log().source())); | 194 addresses_, net_log().net_log(), net_log().source())); |
| 188 connect_start_time_ = base::TimeTicks::Now(); | |
| 189 int rv = transport_socket_->Connect( | 195 int rv = transport_socket_->Connect( |
| 190 base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this))); | 196 base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this))); |
| 191 if (rv == ERR_IO_PENDING && | 197 if (rv == ERR_IO_PENDING && |
| 192 addresses_.front().GetFamily() == ADDRESS_FAMILY_IPV6 && | 198 addresses_.front().GetFamily() == ADDRESS_FAMILY_IPV6 && |
| 193 !AddressListOnlyContainsIPv6(addresses_)) { | 199 !AddressListOnlyContainsIPv6(addresses_)) { |
| 194 fallback_timer_.Start(FROM_HERE, | 200 fallback_timer_.Start(FROM_HERE, |
| 195 base::TimeDelta::FromMilliseconds(kIPv6FallbackTimerInMs), | 201 base::TimeDelta::FromMilliseconds(kIPv6FallbackTimerInMs), |
| 196 this, &TransportConnectJob::DoIPv6FallbackTransportConnect); | 202 this, &TransportConnectJob::DoIPv6FallbackTransportConnect); |
| 197 } | 203 } |
| 198 return rv; | 204 return rv; |
| 199 } | 205 } |
| 200 | 206 |
| 201 int TransportConnectJob::DoTransportConnectComplete(int result) { | 207 int TransportConnectJob::DoTransportConnectComplete(int result) { |
| 202 if (result == OK) { | 208 if (result == OK) { |
| 203 bool is_ipv4 = addresses_.front().GetFamily() == ADDRESS_FAMILY_IPV4; | 209 bool is_ipv4 = addresses_.front().GetFamily() == ADDRESS_FAMILY_IPV4; |
| 204 DCHECK(connect_start_time_ != base::TimeTicks()); | 210 DCHECK(!connect_timing_.connect_start.is_null()); |
| 205 DCHECK(start_time_ != base::TimeTicks()); | 211 DCHECK(!connect_timing_.dns_start.is_null()); |
| 206 base::TimeTicks now = base::TimeTicks::Now(); | 212 base::TimeTicks now = base::TimeTicks::Now(); |
| 207 base::TimeDelta total_duration = now - start_time_; | 213 base::TimeDelta total_duration = now - connect_timing_.dns_start; |
| 208 UMA_HISTOGRAM_CUSTOM_TIMES( | 214 UMA_HISTOGRAM_CUSTOM_TIMES( |
| 209 "Net.DNS_Resolution_And_TCP_Connection_Latency2", | 215 "Net.DNS_Resolution_And_TCP_Connection_Latency2", |
| 210 total_duration, | 216 total_duration, |
| 211 base::TimeDelta::FromMilliseconds(1), | 217 base::TimeDelta::FromMilliseconds(1), |
| 212 base::TimeDelta::FromMinutes(10), | 218 base::TimeDelta::FromMinutes(10), |
| 213 100); | 219 100); |
| 214 | 220 |
| 215 base::TimeDelta connect_duration = now - connect_start_time_; | 221 base::TimeDelta connect_duration = now - connect_timing_.connect_start; |
| 216 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", | 222 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", |
| 217 connect_duration, | 223 connect_duration, |
| 218 base::TimeDelta::FromMilliseconds(1), | 224 base::TimeDelta::FromMilliseconds(1), |
| 219 base::TimeDelta::FromMinutes(10), | 225 base::TimeDelta::FromMinutes(10), |
| 220 100); | 226 100); |
| 221 | 227 |
| 222 if (is_ipv4) { | 228 if (is_ipv4) { |
| 223 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency_IPv4_No_Race", | 229 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency_IPv4_No_Race", |
| 224 connect_duration, | 230 connect_duration, |
| 225 base::TimeDelta::FromMilliseconds(1), | 231 base::TimeDelta::FromMilliseconds(1), |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { | 287 if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { |
| 282 NOTREACHED(); | 288 NOTREACHED(); |
| 283 return; | 289 return; |
| 284 } | 290 } |
| 285 | 291 |
| 286 DCHECK_NE(ERR_IO_PENDING, result); | 292 DCHECK_NE(ERR_IO_PENDING, result); |
| 287 DCHECK(fallback_transport_socket_.get()); | 293 DCHECK(fallback_transport_socket_.get()); |
| 288 DCHECK(fallback_addresses_.get()); | 294 DCHECK(fallback_addresses_.get()); |
| 289 | 295 |
| 290 if (result == OK) { | 296 if (result == OK) { |
| 291 DCHECK(fallback_connect_start_time_ != base::TimeTicks()); | 297 DCHECK(!fallback_connect_start_time_.is_null()); |
| 292 DCHECK(start_time_ != base::TimeTicks()); | 298 DCHECK(!connect_timing_.dns_start.is_null()); |
| 293 base::TimeTicks now = base::TimeTicks::Now(); | 299 base::TimeTicks now = base::TimeTicks::Now(); |
| 294 base::TimeDelta total_duration = now - start_time_; | 300 base::TimeDelta total_duration = now - connect_timing_.dns_start; |
| 295 UMA_HISTOGRAM_CUSTOM_TIMES( | 301 UMA_HISTOGRAM_CUSTOM_TIMES( |
| 296 "Net.DNS_Resolution_And_TCP_Connection_Latency2", | 302 "Net.DNS_Resolution_And_TCP_Connection_Latency2", |
| 297 total_duration, | 303 total_duration, |
| 298 base::TimeDelta::FromMilliseconds(1), | 304 base::TimeDelta::FromMilliseconds(1), |
| 299 base::TimeDelta::FromMinutes(10), | 305 base::TimeDelta::FromMinutes(10), |
| 300 100); | 306 100); |
| 301 | 307 |
| 302 base::TimeDelta connect_duration = now - fallback_connect_start_time_; | 308 base::TimeDelta connect_duration = now - fallback_connect_start_time_; |
| 303 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", | 309 UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", |
| 304 connect_duration, | 310 connect_duration, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 317 } else { | 323 } else { |
| 318 // Be a bit paranoid and kill off the fallback members to prevent reuse. | 324 // Be a bit paranoid and kill off the fallback members to prevent reuse. |
| 319 fallback_transport_socket_.reset(); | 325 fallback_transport_socket_.reset(); |
| 320 fallback_addresses_.reset(); | 326 fallback_addresses_.reset(); |
| 321 } | 327 } |
| 322 NotifyDelegateOfCompletion(result); // Deletes |this| | 328 NotifyDelegateOfCompletion(result); // Deletes |this| |
| 323 } | 329 } |
| 324 | 330 |
| 325 int TransportConnectJob::ConnectInternal() { | 331 int TransportConnectJob::ConnectInternal() { |
| 326 next_state_ = STATE_RESOLVE_HOST; | 332 next_state_ = STATE_RESOLVE_HOST; |
| 327 start_time_ = base::TimeTicks::Now(); | |
| 328 return DoLoop(OK); | 333 return DoLoop(OK); |
| 329 } | 334 } |
| 330 | 335 |
| 331 ConnectJob* | 336 ConnectJob* |
| 332 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob( | 337 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob( |
| 333 const std::string& group_name, | 338 const std::string& group_name, |
| 334 const PoolBase::Request& request, | 339 const PoolBase::Request& request, |
| 335 ConnectJob::Delegate* delegate) const { | 340 ConnectJob::Delegate* delegate) const { |
| 336 return new TransportConnectJob(group_name, | 341 return new TransportConnectJob(group_name, |
| 337 request.params(), | 342 request.params(), |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 | 467 |
| 463 base::TimeDelta TransportClientSocketPool::ConnectionTimeout() const { | 468 base::TimeDelta TransportClientSocketPool::ConnectionTimeout() const { |
| 464 return base_.ConnectionTimeout(); | 469 return base_.ConnectionTimeout(); |
| 465 } | 470 } |
| 466 | 471 |
| 467 ClientSocketPoolHistograms* TransportClientSocketPool::histograms() const { | 472 ClientSocketPoolHistograms* TransportClientSocketPool::histograms() const { |
| 468 return base_.histograms(); | 473 return base_.histograms(); |
| 469 } | 474 } |
| 470 | 475 |
| 471 } // namespace net | 476 } // namespace net |
| OLD | NEW |