diff options
-rw-r--r-- | chrome/browser/browser_main.cc | 9 | ||||
-rw-r--r-- | net/http/http_network_transaction.cc | 55 | ||||
-rw-r--r-- | net/http/http_network_transaction.h | 6 |
3 files changed, 57 insertions, 13 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 0ffe724..f4e139b 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -60,6 +60,7 @@ #include "net/base/cookie_monster.h" #include "net/base/net_module.h" #include "net/http/http_network_session.h" +#include "net/socket/client_socket_pool_base.h" #if defined(OS_POSIX) // TODO(port): get rid of this include. It's used just to provide declarations @@ -629,6 +630,14 @@ int BrowserMain(const MainFunctionParams& parameters) { ResourceDispatcherHost::DisableHttpPrioritization(); } + scoped_refptr<FieldTrial> socket_late_binding_trial = + new FieldTrial("SocketLateBinding", 100); + socket_late_binding_trial->AppendGroup("_disable_late_binding", 50); + const int late_binding_group = + socket_late_binding_trial->AppendGroup("_enable_late_binding", 50); + if (socket_late_binding_trial->group() == late_binding_group) + net::ClientSocketPoolBase::EnableLateBindingOfSockets(true); + #if defined(OS_WIN) // Init common control sex. INITCOMMONCONTROLSEX config; diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index f705541..0ccaf79 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -617,6 +617,8 @@ int HttpNetworkTransaction::DoInitConnection() { resolve_info.set_allow_cached_response(false); } + transport_socket_request_time_ = base::TimeTicks::Now(); + int rv = connection_.Init(connection_group, resolve_info, request_->priority, &io_callback_); return rv; @@ -632,12 +634,12 @@ int HttpNetworkTransaction::DoInitConnectionComplete(int result) { // connection. This flag is used to handle errors that occur while we are // trying to reuse a keep-alive connection. reused_socket_ = connection_.is_reused(); + LogTCPConnectedMetrics(reused_socket_); if (reused_socket_) { next_state_ = STATE_WRITE_HEADERS; } else { // Now we have a TCP connected socket. Perform other connection setup as // needed. - LogTCPConnectedMetrics(); if (proxy_mode_ == kSOCKSProxy) next_state_ = STATE_SOCKS_CONNECT; else if (using_ssl_ && proxy_mode_ == kDirectConnection) { @@ -1085,20 +1087,40 @@ int HttpNetworkTransaction::DoDrainBodyForAuthRestartComplete(int result) { return OK; } -void HttpNetworkTransaction::LogTCPConnectedMetrics() const { - base::TimeDelta host_resolution_and_tcp_connection_latency = - base::Time::Now() - host_resolution_start_time_; +void HttpNetworkTransaction::LogTCPConnectedMetrics(bool reused_socket) const { + base::TimeDelta time_to_obtain_connected_socket = + base::TimeTicks::Now() - transport_socket_request_time_; + + if (!reused_socket) { + UMA_HISTOGRAM_CLIPPED_TIMES( + "Net.Dns_Resolution_And_TCP_Connection_Latency", + time_to_obtain_connected_socket, + base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), + 100); + + UMA_HISTOGRAM_COUNTS_100( + "Net.TCP_Connection_Idle_Sockets", + session_->connection_pool()->IdleSocketCountInGroup( + connection_.group_name())); + } UMA_HISTOGRAM_CLIPPED_TIMES( - "Net.Dns_Resolution_And_TCP_Connection_Latency", - host_resolution_and_tcp_connection_latency, + "Net.TransportSocketRequestTime", + time_to_obtain_connected_socket, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), 100); - UMA_HISTOGRAM_COUNTS_100( - "Net.TCP_Connection_Idle_Sockets", - session_->connection_pool()->IdleSocketCountInGroup( - connection_.group_name())); + static const bool use_late_binding_histogram = + !FieldTrial::MakeName("", "SocketLateBinding").empty(); + + if (use_late_binding_histogram) { + UMA_HISTOGRAM_CUSTOM_TIMES( + FieldTrial::MakeName("Net.TransportSocketRequestTime", + "SocketLateBinding").data(), + time_to_obtain_connected_socket, + base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), + 100); + } } void HttpNetworkTransaction::LogTransactionConnectedMetrics() const { @@ -1109,6 +1131,19 @@ void HttpNetworkTransaction::LogTransactionConnectedMetrics() const { total_duration, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), 100); + + static const bool use_late_binding_histogram = + !FieldTrial::MakeName("", "SocketLateBinding").empty(); + + if (use_late_binding_histogram) { + UMA_HISTOGRAM_CUSTOM_TIMES( + FieldTrial::MakeName("Net.Transaction_Connected_Under_10", + "SocketLateBinding").data(), + total_duration, + base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), + 100); + } + if (!reused_socket_) UMA_HISTOGRAM_CLIPPED_TIMES( "Net.Transaction_Connected_New", diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h index 63ac243..83524c4 100644 --- a/net/http/http_network_transaction.h +++ b/net/http/http_network_transaction.h @@ -153,7 +153,7 @@ class HttpNetworkTransaction : public HttpTransaction { int DoDrainBodyForAuthRestartComplete(int result); // Record histograms of latency until Connect() completes. - void LogTCPConnectedMetrics() const; + void LogTCPConnectedMetrics(bool reused_socket) const; // Record histogram of time until first byte of header is received. void LogTransactionConnectedMetrics() const; @@ -394,8 +394,8 @@ class HttpNetworkTransaction : public HttpTransaction { // The time the Connect() method was called (if it got called). base::Time connect_start_time_; - // The time the host resolution started (if it indeed got started). - base::Time host_resolution_start_time_; + // The time that we request the ClientSocketPool for a connected socket. + base::TimeTicks transport_socket_request_time_; // The next state in the state machine. State next_state_; |