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

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

Issue 11428150: LoadTiming implementation in net, part 1. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Fix a header or two Created 7 years, 11 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 | Annotate | Revision Log
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 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
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/transport_client_socket_pool.h ('k') | net/socket/transport_client_socket_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698