Index: net/quic/chromium/quic_chromium_client_session.cc |
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc |
index e2759c459a9413fa5c352c19277d39ffa5276102..ce5c456e9db7ce32c3d1c8212a37b84bb718df3c 100644 |
--- a/net/quic/chromium/quic_chromium_client_session.cc |
+++ b/net/quic/chromium/quic_chromium_client_session.cc |
@@ -213,6 +213,7 @@ QuicChromiumClientSession::QuicChromiumClientSession( |
const QuicConfig& config, |
QuicCryptoClientConfig* crypto_config, |
const char* const connection_description, |
+ base::TimeTicks dns_resolution_start_time, |
base::TimeTicks dns_resolution_end_time, |
QuicClientPushPromiseIndex* push_promise_index, |
base::TaskRunner* task_runner, |
@@ -228,7 +229,6 @@ QuicChromiumClientSession::QuicChromiumClientSession( |
num_total_streams_(0), |
task_runner_(task_runner), |
net_log_(BoundNetLog::Make(net_log, NetLogSourceType::QUIC_SESSION)), |
- dns_resolution_end_time_(dns_resolution_end_time), |
logger_(new QuicConnectionLogger(this, |
connection_description, |
std::move(socket_performance_watcher), |
@@ -262,6 +262,8 @@ QuicChromiumClientSession::QuicChromiumClientSession( |
connection->SetMaxPacketLength(connection->max_packet_length() - |
kAdditionalOverheadForIPv6); |
} |
+ connect_timing_.dns_start = dns_resolution_start_time; |
+ connect_timing_.dns_end = dns_resolution_end_time; |
} |
QuicChromiumClientSession::~QuicChromiumClientSession() { |
@@ -602,13 +604,15 @@ int QuicChromiumClientSession::CryptoConnect( |
bool require_confirmation, |
const CompletionCallback& callback) { |
require_confirmation_ = require_confirmation; |
- handshake_start_ = base::TimeTicks::Now(); |
+ connect_timing_.connect_start = base::TimeTicks::Now(); |
RecordHandshakeState(STATE_STARTED); |
DCHECK(flow_controller()); |
crypto_stream_->CryptoConnect(); |
- if (IsCryptoHandshakeConfirmed()) |
+ if (IsCryptoHandshakeConfirmed()) { |
+ connect_timing_.connect_end = base::TimeTicks::Now(); |
return OK; |
+ } |
// Unless we require handshake confirmation, activate the session if |
// we have established initial encryption. |
@@ -621,8 +625,10 @@ int QuicChromiumClientSession::CryptoConnect( |
int QuicChromiumClientSession::ResumeCryptoConnect( |
const CompletionCallback& callback) { |
- if (IsCryptoHandshakeConfirmed()) |
+ if (IsCryptoHandshakeConfirmed()) { |
+ connect_timing_.connect_end = base::TimeTicks::Now(); |
return OK; |
+ } |
if (!connection()->connected()) |
return ERR_QUIC_HANDSHAKE_FAILED; |
@@ -773,8 +779,14 @@ void QuicChromiumClientSession::OnCryptoHandshakeEvent( |
base::ResetAndReturn(&callback_).Run(OK); |
} |
if (event == HANDSHAKE_CONFIRMED) { |
- UMA_HISTOGRAM_TIMES("Net.QuicSession.HandshakeConfirmedTime", |
- base::TimeTicks::Now() - handshake_start_); |
+ // Update |connect_end| only when handshake is confirmed. This should also |
+ // take care of any failed 0-RTT request. |
+ connect_timing_.connect_end = base::TimeTicks::Now(); |
+ DCHECK(connect_timing_.connect_start < connect_timing_.connect_end); |
+ UMA_HISTOGRAM_TIMES( |
+ "Net.QuicSession.HandshakeConfirmedTime", |
+ connect_timing_.connect_end - connect_timing_.connect_start); |
+ |
if (server_info_) { |
// TODO(rtenneti): Should we delete this histogram? |
// Track how long it has taken to finish handshake once we start waiting |
@@ -791,10 +803,10 @@ void QuicChromiumClientSession::OnCryptoHandshakeEvent( |
} |
// Track how long it has taken to finish handshake after we have finished |
// DNS host resolution. |
- if (!dns_resolution_end_time_.is_null()) { |
+ if (!connect_timing_.dns_end.is_null()) { |
UMA_HISTOGRAM_TIMES( |
"Net.QuicSession.HostResolution.HandshakeConfirmedTime", |
- base::TimeTicks::Now() - dns_resolution_end_time_); |
+ base::TimeTicks::Now() - connect_timing_.dns_end); |
} |
ObserverSet::iterator it = observers_.begin(); |
@@ -1235,4 +1247,11 @@ void QuicChromiumClientSession::DeletePromised( |
QuicClientSessionBase::DeletePromised(promised); |
} |
+const LoadTimingInfo::ConnectTiming& |
+QuicChromiumClientSession::GetConnectTiming() { |
+ connect_timing_.ssl_start = connect_timing_.connect_start; |
+ connect_timing_.ssl_end = connect_timing_.connect_end; |
+ return connect_timing_; |
+} |
+ |
Ryan Hamilton
2016/09/09 22:05:39
Should we have some unit tests for the various cas
|
} // namespace net |