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

Side by Side Diff: net/socket/transport_client_socket_pool.cc

Issue 1376473003: Notify NQE of TCP RTT values (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased, addressed sleevi comments Created 4 years, 9 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
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 "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 #include <utility> 8 #include <utility>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
15 #include "base/profiler/scoped_tracker.h" 15 #include "base/profiler/scoped_tracker.h"
16 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
17 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "net/base/ip_endpoint.h" 20 #include "net/base/ip_endpoint.h"
21 #include "net/base/net_errors.h" 21 #include "net/base/net_errors.h"
22 #include "net/base/socket_performance_watcher.h"
23 #include "net/base/socket_performance_watcher_factory.h"
22 #include "net/log/net_log.h" 24 #include "net/log/net_log.h"
23 #include "net/socket/client_socket_factory.h" 25 #include "net/socket/client_socket_factory.h"
24 #include "net/socket/client_socket_handle.h" 26 #include "net/socket/client_socket_handle.h"
25 #include "net/socket/client_socket_pool_base.h" 27 #include "net/socket/client_socket_pool_base.h"
26 #include "net/socket/socket_net_log_params.h" 28 #include "net/socket/socket_net_log_params.h"
27 #include "net/socket/tcp_client_socket.h" 29 #include "net/socket/tcp_client_socket.h"
28 30
29 using base::TimeDelta; 31 using base::TimeDelta;
30 32
31 namespace net { 33 namespace net {
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 return connect_duration; 193 return connect_duration;
192 } 194 }
193 195
194 TransportConnectJob::TransportConnectJob( 196 TransportConnectJob::TransportConnectJob(
195 const std::string& group_name, 197 const std::string& group_name,
196 RequestPriority priority, 198 RequestPriority priority,
197 ClientSocketPool::RespectLimits respect_limits, 199 ClientSocketPool::RespectLimits respect_limits,
198 const scoped_refptr<TransportSocketParams>& params, 200 const scoped_refptr<TransportSocketParams>& params,
199 base::TimeDelta timeout_duration, 201 base::TimeDelta timeout_duration,
200 ClientSocketFactory* client_socket_factory, 202 ClientSocketFactory* client_socket_factory,
203 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
201 HostResolver* host_resolver, 204 HostResolver* host_resolver,
202 Delegate* delegate, 205 Delegate* delegate,
203 NetLog* net_log) 206 NetLog* net_log)
204 : ConnectJob(group_name, 207 : ConnectJob(group_name,
205 timeout_duration, 208 timeout_duration,
206 priority, 209 priority,
207 respect_limits, 210 respect_limits,
208 delegate, 211 delegate,
209 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 212 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
210 helper_(params, client_socket_factory, host_resolver, &connect_timing_), 213 helper_(params, client_socket_factory, host_resolver, &connect_timing_),
214 socket_performance_watcher_factory_(socket_performance_watcher_factory),
211 interval_between_connects_(CONNECT_INTERVAL_GT_20MS), 215 interval_between_connects_(CONNECT_INTERVAL_GT_20MS),
212 resolve_result_(OK) { 216 resolve_result_(OK) {
213 helper_.SetOnIOComplete(this); 217 helper_.SetOnIOComplete(this);
214 } 218 }
215 219
216 TransportConnectJob::~TransportConnectJob() { 220 TransportConnectJob::~TransportConnectJob() {
217 // We don't worry about cancelling the host resolution and TCP connect, since 221 // We don't worry about cancelling the host resolution and TCP connect, since
218 // ~SingleRequestHostResolver and ~StreamSocket will take care of it. 222 // ~SingleRequestHostResolver and ~StreamSocket will take care of it.
219 } 223 }
220 224
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 if (interval <= 10) 291 if (interval <= 10)
288 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS; 292 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS;
289 else if (interval <= 20) 293 else if (interval <= 20)
290 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; 294 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS;
291 else 295 else
292 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; 296 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS;
293 } 297 }
294 298
295 helper_.set_next_state( 299 helper_.set_next_state(
296 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE); 300 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE);
301 // Create a |SocketPerformanceWatcher|, and pass the ownership.
302 scoped_ptr<SocketPerformanceWatcher> socket_performance_watcher;
303 if (socket_performance_watcher_factory_) {
304 socket_performance_watcher =
305 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher(
306 SocketPerformanceWatcherFactory::PROTOCOL_TCP);
307 }
297 transport_socket_ = 308 transport_socket_ =
298 helper_.client_socket_factory()->CreateTransportClientSocket( 309 helper_.client_socket_factory()->CreateTransportClientSocket(
299 helper_.addresses(), net_log().net_log(), net_log().source()); 310 helper_.addresses(), std::move(socket_performance_watcher),
311 net_log().net_log(), net_log().source());
300 312
301 // If the list contains IPv6 and IPv4 addresses, the first address will 313 // If the list contains IPv6 and IPv4 addresses, the first address will
302 // be IPv6, and the IPv4 addresses will be tried as fallback addresses, 314 // be IPv6, and the IPv4 addresses will be tried as fallback addresses,
303 // per "Happy Eyeballs" (RFC 6555). 315 // per "Happy Eyeballs" (RFC 6555).
304 bool try_ipv6_connect_with_ipv4_fallback = 316 bool try_ipv6_connect_with_ipv4_fallback =
305 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 && 317 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 &&
306 !AddressListOnlyContainsIPv6(helper_.addresses()); 318 !AddressListOnlyContainsIPv6(helper_.addresses());
307 319
308 // Enable TCP FastOpen if indicated by transport socket params. 320 // Enable TCP FastOpen if indicated by transport socket params.
309 // Note: We currently do not turn on TCP FastOpen for destinations where 321 // Note: We currently do not turn on TCP FastOpen for destinations where
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 // succeed. 416 // succeed.
405 if (helper_.next_state() != 417 if (helper_.next_state() !=
406 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE) { 418 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE) {
407 NOTREACHED(); 419 NOTREACHED();
408 return; 420 return;
409 } 421 }
410 422
411 DCHECK(!fallback_transport_socket_.get()); 423 DCHECK(!fallback_transport_socket_.get());
412 DCHECK(!fallback_addresses_.get()); 424 DCHECK(!fallback_addresses_.get());
413 425
426 // Create a |SocketPerformanceWatcher|, and pass the ownership.
427 scoped_ptr<SocketPerformanceWatcher> socket_performance_watcher;
428 if (socket_performance_watcher_factory_) {
429 socket_performance_watcher =
430 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher(
431 SocketPerformanceWatcherFactory::PROTOCOL_TCP);
432 }
433
414 fallback_addresses_.reset(new AddressList(helper_.addresses())); 434 fallback_addresses_.reset(new AddressList(helper_.addresses()));
415 MakeAddressListStartWithIPv4(fallback_addresses_.get()); 435 MakeAddressListStartWithIPv4(fallback_addresses_.get());
416 fallback_transport_socket_ = 436 fallback_transport_socket_ =
417 helper_.client_socket_factory()->CreateTransportClientSocket( 437 helper_.client_socket_factory()->CreateTransportClientSocket(
418 *fallback_addresses_, net_log().net_log(), net_log().source()); 438 *fallback_addresses_, std::move(socket_performance_watcher),
439 net_log().net_log(), net_log().source());
419 fallback_connect_start_time_ = base::TimeTicks::Now(); 440 fallback_connect_start_time_ = base::TimeTicks::Now();
420 int rv = fallback_transport_socket_->Connect( 441 int rv = fallback_transport_socket_->Connect(
421 base::Bind( 442 base::Bind(
422 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete, 443 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete,
423 base::Unretained(this))); 444 base::Unretained(this)));
424 if (rv != ERR_IO_PENDING) 445 if (rv != ERR_IO_PENDING)
425 DoIPv6FallbackTransportConnectComplete(rv); 446 DoIPv6FallbackTransportConnectComplete(rv);
426 } 447 }
427 448
428 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) { 449 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 } 504 }
484 505
485 scoped_ptr<ConnectJob> 506 scoped_ptr<ConnectJob>
486 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob( 507 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob(
487 const std::string& group_name, 508 const std::string& group_name,
488 const PoolBase::Request& request, 509 const PoolBase::Request& request,
489 ConnectJob::Delegate* delegate) const { 510 ConnectJob::Delegate* delegate) const {
490 return scoped_ptr<ConnectJob>(new TransportConnectJob( 511 return scoped_ptr<ConnectJob>(new TransportConnectJob(
491 group_name, request.priority(), request.respect_limits(), 512 group_name, request.priority(), request.respect_limits(),
492 request.params(), ConnectionTimeout(), client_socket_factory_, 513 request.params(), ConnectionTimeout(), client_socket_factory_,
493 host_resolver_, delegate, net_log_)); 514 socket_performance_watcher_factory_, host_resolver_, delegate, net_log_));
494 } 515 }
495 516
496 base::TimeDelta 517 base::TimeDelta
497 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout() 518 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout()
498 const { 519 const {
499 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds); 520 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds);
500 } 521 }
501 522
502 TransportClientSocketPool::TransportClientSocketPool( 523 TransportClientSocketPool::TransportClientSocketPool(
503 int max_sockets, 524 int max_sockets,
504 int max_sockets_per_group, 525 int max_sockets_per_group,
505 HostResolver* host_resolver, 526 HostResolver* host_resolver,
506 ClientSocketFactory* client_socket_factory, 527 ClientSocketFactory* client_socket_factory,
528 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
507 NetLog* net_log) 529 NetLog* net_log)
508 : base_(NULL, 530 : base_(NULL,
509 max_sockets, 531 max_sockets,
510 max_sockets_per_group, 532 max_sockets_per_group,
511 ClientSocketPool::unused_idle_socket_timeout(), 533 ClientSocketPool::unused_idle_socket_timeout(),
512 ClientSocketPool::used_idle_socket_timeout(), 534 ClientSocketPool::used_idle_socket_timeout(),
513 new TransportConnectJobFactory(client_socket_factory, 535 new TransportConnectJobFactory(client_socket_factory,
514 host_resolver, 536 host_resolver,
537 socket_performance_watcher_factory,
515 net_log)) { 538 net_log)) {
516 base_.EnableConnectBackupJobs(); 539 base_.EnableConnectBackupJobs();
517 } 540 }
518 541
519 TransportClientSocketPool::~TransportClientSocketPool() {} 542 TransportClientSocketPool::~TransportClientSocketPool() {}
520 543
521 int TransportClientSocketPool::RequestSocket(const std::string& group_name, 544 int TransportClientSocketPool::RequestSocket(const std::string& group_name,
522 const void* params, 545 const void* params,
523 RequestPriority priority, 546 RequestPriority priority,
524 RespectLimits respect_limits, 547 RespectLimits respect_limits,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 HigherLayeredPool* higher_pool) { 642 HigherLayeredPool* higher_pool) {
620 base_.AddHigherLayeredPool(higher_pool); 643 base_.AddHigherLayeredPool(higher_pool);
621 } 644 }
622 645
623 void TransportClientSocketPool::RemoveHigherLayeredPool( 646 void TransportClientSocketPool::RemoveHigherLayeredPool(
624 HigherLayeredPool* higher_pool) { 647 HigherLayeredPool* higher_pool) {
625 base_.RemoveHigherLayeredPool(higher_pool); 648 base_.RemoveHigherLayeredPool(higher_pool);
626 } 649 }
627 650
628 } // namespace net 651 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698