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

Side by Side Diff: components/cronet/android/cronet_url_request_adapter.cc

Issue 2844803002: [Cronet] Make metrics reporting happen after terminal callbacks. (Closed)
Patch Set: address comments Created 3 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/cronet/android/cronet_url_request_adapter.h" 5 #include "components/cronet/android/cronet_url_request_adapter.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 const GURL& url, 85 const GURL& url,
86 net::RequestPriority priority, 86 net::RequestPriority priority,
87 jboolean jdisable_cache, 87 jboolean jdisable_cache,
88 jboolean jdisable_connection_migration, 88 jboolean jdisable_connection_migration,
89 jboolean jenable_metrics) 89 jboolean jenable_metrics)
90 : context_(context), 90 : context_(context),
91 initial_url_(url), 91 initial_url_(url),
92 initial_priority_(priority), 92 initial_priority_(priority),
93 initial_method_("GET"), 93 initial_method_("GET"),
94 load_flags_(context->default_load_flags()), 94 load_flags_(context->default_load_flags()),
95 enable_metrics_(jenable_metrics == JNI_TRUE) { 95 enable_metrics_(jenable_metrics == JNI_TRUE),
96 metrics_reported_(false) {
96 DCHECK(!context_->IsOnNetworkThread()); 97 DCHECK(!context_->IsOnNetworkThread());
97 owner_.Reset(env, jurl_request); 98 owner_.Reset(env, jurl_request);
98 if (jdisable_cache == JNI_TRUE) 99 if (jdisable_cache == JNI_TRUE)
99 load_flags_ |= net::LOAD_DISABLE_CACHE; 100 load_flags_ |= net::LOAD_DISABLE_CACHE;
100 if (jdisable_connection_migration == JNI_TRUE) 101 if (jdisable_connection_migration == JNI_TRUE)
101 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION; 102 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION;
102 } 103 }
103 104
104 CronetURLRequestAdapter::~CronetURLRequestAdapter() { 105 CronetURLRequestAdapter::~CronetURLRequestAdapter() {
105 DCHECK(context_->IsOnNetworkThread()); 106 DCHECK(context_->IsOnNetworkThread());
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 request->ContinueWithCertificate(nullptr, nullptr); 239 request->ContinueWithCertificate(nullptr, nullptr);
239 } 240 }
240 241
241 void CronetURLRequestAdapter::OnSSLCertificateError( 242 void CronetURLRequestAdapter::OnSSLCertificateError(
242 net::URLRequest* request, 243 net::URLRequest* request,
243 const net::SSLInfo& ssl_info, 244 const net::SSLInfo& ssl_info,
244 bool fatal) { 245 bool fatal) {
245 DCHECK(context_->IsOnNetworkThread()); 246 DCHECK(context_->IsOnNetworkThread());
246 request->Cancel(); 247 request->Cancel();
247 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status); 248 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status);
248 JNIEnv* env = base::android::AttachCurrentThread(); 249 ReportError(request, net_error);
249 cronet::Java_CronetUrlRequest_onError(
250 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
251 net::QUIC_NO_ERROR,
252 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
253 request->GetTotalReceivedBytes());
254 } 250 }
255 251
256 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request, 252 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request,
257 int net_error) { 253 int net_error) {
258 DCHECK_NE(net::ERR_IO_PENDING, net_error); 254 DCHECK_NE(net::ERR_IO_PENDING, net_error);
259 DCHECK(context_->IsOnNetworkThread()); 255 DCHECK(context_->IsOnNetworkThread());
260 256
261 if (net_error != net::OK) { 257 if (net_error != net::OK) {
262 ReportError(request, net_error); 258 ReportError(request, net_error);
263 return; 259 return;
(...skipping 15 matching lines...) Expand all
279 int bytes_read) { 275 int bytes_read) {
280 DCHECK(context_->IsOnNetworkThread()); 276 DCHECK(context_->IsOnNetworkThread());
281 277
282 if (bytes_read < 0) { 278 if (bytes_read < 0) {
283 ReportError(request, bytes_read); 279 ReportError(request, bytes_read);
284 return; 280 return;
285 } 281 }
286 282
287 if (bytes_read == 0) { 283 if (bytes_read == 0) {
288 JNIEnv* env = base::android::AttachCurrentThread(); 284 JNIEnv* env = base::android::AttachCurrentThread();
285 MaybeReportMetrics(env);
289 cronet::Java_CronetUrlRequest_onSucceeded( 286 cronet::Java_CronetUrlRequest_onSucceeded(
290 env, owner_.obj(), url_request_->GetTotalReceivedBytes()); 287 env, owner_.obj(), url_request_->GetTotalReceivedBytes());
291 } else { 288 } else {
292 JNIEnv* env = base::android::AttachCurrentThread(); 289 JNIEnv* env = base::android::AttachCurrentThread();
293 cronet::Java_CronetUrlRequest_onReadCompleted( 290 cronet::Java_CronetUrlRequest_onReadCompleted(
294 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read, 291 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read,
295 read_buffer_->initial_position(), read_buffer_->initial_limit(), 292 read_buffer_->initial_position(), read_buffer_->initial_limit(),
296 request->GetTotalReceivedBytes()); 293 request->GetTotalReceivedBytes());
297 // Free the read buffer. This lets the Java ByteBuffer be freed, if the 294 // Free the read buffer. This lets the Java ByteBuffer be freed, if the
298 // embedder releases it, too. 295 // embedder releases it, too.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 // If IO is pending, wait for the URLRequest to call OnReadCompleted. 366 // If IO is pending, wait for the URLRequest to call OnReadCompleted.
370 if (result == net::ERR_IO_PENDING) 367 if (result == net::ERR_IO_PENDING)
371 return; 368 return;
372 369
373 OnReadCompleted(url_request_.get(), result); 370 OnReadCompleted(url_request_.get(), result);
374 } 371 }
375 372
376 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { 373 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) {
377 DCHECK(context_->IsOnNetworkThread()); 374 DCHECK(context_->IsOnNetworkThread());
378 JNIEnv* env = base::android::AttachCurrentThread(); 375 JNIEnv* env = base::android::AttachCurrentThread();
379 if (send_on_canceled) { 376 MaybeReportMetrics(env);
377 if (send_on_canceled)
380 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); 378 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
381 } 379 cronet::Java_CronetUrlRequest_onNativeAdapterDestroyed(env, owner_.obj());
382 MaybeReportMetrics(env);
383 delete this; 380 delete this;
384 } 381 }
385 382
386 void CronetURLRequestAdapter::ReportError(net::URLRequest* request, 383 void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
387 int net_error) { 384 int net_error) {
388 DCHECK_NE(net::ERR_IO_PENDING, net_error); 385 DCHECK_NE(net::ERR_IO_PENDING, net_error);
389 DCHECK_LT(net_error, 0); 386 DCHECK_LT(net_error, 0);
390 DCHECK_EQ(request, url_request_.get()); 387 DCHECK_EQ(request, url_request_.get());
391 388
392 net::NetErrorDetails net_error_details; 389 net::NetErrorDetails net_error_details;
393 url_request_->PopulateNetErrorDetails(&net_error_details); 390 url_request_->PopulateNetErrorDetails(&net_error_details);
394 VLOG(1) << "Error " << net::ErrorToString(net_error) 391 VLOG(1) << "Error " << net::ErrorToString(net_error)
395 << " on chromium request: " << initial_url_.possibly_invalid_spec(); 392 << " on chromium request: " << initial_url_.possibly_invalid_spec();
396 JNIEnv* env = base::android::AttachCurrentThread(); 393 JNIEnv* env = base::android::AttachCurrentThread();
397 cronet::Java_CronetUrlRequest_onError( 394 cronet::Java_CronetUrlRequest_onError(
398 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, 395 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
399 net_error_details.quic_connection_error, 396 net_error_details.quic_connection_error,
400 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), 397 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
401 request->GetTotalReceivedBytes()); 398 request->GetTotalReceivedBytes());
402 } 399 }
403 400
404 void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const { 401 void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) {
405 // If there was an exception while starting the CronetUrlRequest, there won't 402 // If there was an exception while starting the CronetUrlRequest, there won't
406 // be a native URLRequest. In this case, the caller gets the exception 403 // be a native URLRequest. In this case, the caller gets the exception
407 // immediately, and the onFailed callback isn't called, so don't report 404 // immediately, and the onFailed callback isn't called, so don't report
408 // metrics either. 405 // metrics either.
409 if (!enable_metrics_ || !url_request_) { 406 if (!enable_metrics_ || metrics_reported_ || !url_request_) {
410 return; 407 return;
411 } 408 }
409 metrics_reported_ = true;
412 net::LoadTimingInfo metrics; 410 net::LoadTimingInfo metrics;
413 url_request_->GetLoadTimingInfo(&metrics); 411 url_request_->GetLoadTimingInfo(&metrics);
414 base::Time start_time = metrics.request_start_time; 412 base::Time start_time = metrics.request_start_time;
415 base::TimeTicks start_ticks = metrics.request_start; 413 base::TimeTicks start_ticks = metrics.request_start;
416 Java_CronetUrlRequest_onMetricsCollected( 414 Java_CronetUrlRequest_onMetricsCollected(
417 env, owner_.obj(), 415 env, owner_.obj(),
418 metrics_util::ConvertTime(start_ticks, start_ticks, start_time), 416 metrics_util::ConvertTime(start_ticks, start_ticks, start_time),
419 metrics_util::ConvertTime(metrics.connect_timing.dns_start, start_ticks, 417 metrics_util::ConvertTime(metrics.connect_timing.dns_start, start_ticks,
420 start_time), 418 start_time),
421 metrics_util::ConvertTime(metrics.connect_timing.dns_end, start_ticks, 419 metrics_util::ConvertTime(metrics.connect_timing.dns_end, start_ticks,
(...skipping 12 matching lines...) Expand all
434 metrics_util::ConvertTime(metrics.push_end, start_ticks, start_time), 432 metrics_util::ConvertTime(metrics.push_end, start_ticks, start_time),
435 metrics_util::ConvertTime(metrics.receive_headers_end, start_ticks, 433 metrics_util::ConvertTime(metrics.receive_headers_end, start_ticks,
436 start_time), 434 start_time),
437 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks, 435 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks,
438 start_time), 436 start_time),
439 metrics.socket_reused, url_request_->GetTotalSentBytes(), 437 metrics.socket_reused, url_request_->GetTotalSentBytes(),
440 url_request_->GetTotalReceivedBytes()); 438 url_request_->GetTotalReceivedBytes());
441 } 439 }
442 440
443 } // namespace cronet 441 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698