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 |