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 f307e2aac70b2acfd9a784a3f7a7b220bc42b45b..f7a1c65131abda4e1533975f1128977aa73dedc2 100644 |
--- a/net/quic/chromium/quic_chromium_client_session.cc |
+++ b/net/quic/chromium/quic_chromium_client_session.cc |
@@ -219,6 +219,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, |
@@ -234,7 +235,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), |
@@ -266,6 +266,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() { |
@@ -627,13 +629,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. |
@@ -646,8 +650,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; |
@@ -797,8 +803,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 |
@@ -815,10 +827,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(); |
@@ -1387,4 +1399,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_; |
+} |
+ |
} // namespace net |