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

Side by Side Diff: net/http/http_cache_transaction.cc

Issue 1969663003: [HttpCache] Measure causes for cache validation requests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nits Created 4 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 (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/http/http_cache_transaction.h" 5 #include "net/http/http_cache_transaction.h"
6 6
7 #include "build/build_config.h" // For OS_POSIX 7 #include "build/build_config.h" // For OS_POSIX
8 8
9 #if defined(OS_POSIX) 9 #if defined(OS_POSIX)
10 #include <unistd.h> 10 #include <unistd.h>
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 done_reading_(false), 159 done_reading_(false),
160 vary_mismatch_(false), 160 vary_mismatch_(false),
161 couldnt_conditionalize_request_(false), 161 couldnt_conditionalize_request_(false),
162 bypass_lock_for_test_(false), 162 bypass_lock_for_test_(false),
163 fail_conditionalization_for_test_(false), 163 fail_conditionalization_for_test_(false),
164 io_buf_len_(0), 164 io_buf_len_(0),
165 read_offset_(0), 165 read_offset_(0),
166 effective_load_flags_(0), 166 effective_load_flags_(0),
167 write_len_(0), 167 write_len_(0),
168 transaction_pattern_(PATTERN_UNDEFINED), 168 transaction_pattern_(PATTERN_UNDEFINED),
169 validation_cause_(VALIDATION_CAUSE_UNDEFINED),
169 total_received_bytes_(0), 170 total_received_bytes_(0),
170 total_sent_bytes_(0), 171 total_sent_bytes_(0),
171 websocket_handshake_stream_base_create_helper_(NULL), 172 websocket_handshake_stream_base_create_helper_(NULL),
172 weak_factory_(this) { 173 weak_factory_(this) {
173 static_assert(HttpCache::Transaction::kNumValidationHeaders == 174 static_assert(HttpCache::Transaction::kNumValidationHeaders ==
174 arraysize(kValidationHeaders), 175 arraysize(kValidationHeaders),
175 "invalid number of validation headers"); 176 "invalid number of validation headers");
176 177
177 io_callback_ = base::Bind(&Transaction::OnIOComplete, 178 io_callback_ = base::Bind(&Transaction::OnIOComplete,
178 weak_factory_.GetWeakPtr()); 179 weak_factory_.GetWeakPtr());
(...skipping 1972 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 2152
2152 ValidationType HttpCache::Transaction::RequiresValidation() { 2153 ValidationType HttpCache::Transaction::RequiresValidation() {
2153 // TODO(darin): need to do more work here: 2154 // TODO(darin): need to do more work here:
2154 // - make sure we have a matching request method 2155 // - make sure we have a matching request method
2155 // - watch out for cached responses that depend on authentication 2156 // - watch out for cached responses that depend on authentication
2156 2157
2157 if (response_.vary_data.is_valid() && 2158 if (response_.vary_data.is_valid() &&
2158 !response_.vary_data.MatchesRequest(*request_, 2159 !response_.vary_data.MatchesRequest(*request_,
2159 *response_.headers.get())) { 2160 *response_.headers.get())) {
2160 vary_mismatch_ = true; 2161 vary_mismatch_ = true;
2162 validation_cause_ = VALIDATION_CAUSE_VARY_MISMATCH;
2161 return VALIDATION_SYNCHRONOUS; 2163 return VALIDATION_SYNCHRONOUS;
2162 } 2164 }
2163 2165
2164 if (effective_load_flags_ & LOAD_PREFERRING_CACHE) 2166 if (effective_load_flags_ & LOAD_PREFERRING_CACHE)
2165 return VALIDATION_NONE; 2167 return VALIDATION_NONE;
2166 2168
2167 if (response_.unused_since_prefetch && 2169 if (response_.unused_since_prefetch &&
2168 !(effective_load_flags_ & LOAD_PREFETCH) && 2170 !(effective_load_flags_ & LOAD_PREFETCH) &&
2169 response_.headers->GetCurrentAge( 2171 response_.headers->GetCurrentAge(
2170 response_.request_time, response_.response_time, 2172 response_.request_time, response_.response_time,
2171 cache_->clock_->Now()) < TimeDelta::FromMinutes(kPrefetchReuseMins)) { 2173 cache_->clock_->Now()) < TimeDelta::FromMinutes(kPrefetchReuseMins)) {
2172 // The first use of a resource after prefetch within a short window skips 2174 // The first use of a resource after prefetch within a short window skips
2173 // validation. 2175 // validation.
2174 return VALIDATION_NONE; 2176 return VALIDATION_NONE;
2175 } 2177 }
2176 2178
2177 if (effective_load_flags_ & LOAD_VALIDATE_CACHE) 2179 if (effective_load_flags_ & LOAD_VALIDATE_CACHE) {
2180 validation_cause_ = VALIDATION_CAUSE_VALIDATE_FLAG;
2178 return VALIDATION_SYNCHRONOUS; 2181 return VALIDATION_SYNCHRONOUS;
2182 }
2179 2183
2180 if (request_->method == "PUT" || request_->method == "DELETE") 2184 if (request_->method == "PUT" || request_->method == "DELETE")
2181 return VALIDATION_SYNCHRONOUS; 2185 return VALIDATION_SYNCHRONOUS;
2182 2186
2183 ValidationType validation_required_by_headers = 2187 ValidationType validation_required_by_headers =
2184 response_.headers->RequiresValidation(response_.request_time, 2188 response_.headers->RequiresValidation(response_.request_time,
2185 response_.response_time, 2189 response_.response_time,
2186 cache_->clock_->Now()); 2190 cache_->clock_->Now());
2187 2191
2192 if (validation_required_by_headers != VALIDATION_NONE) {
2193 validation_cause_ =
2194 response_.headers->GetFreshnessLifetimes(response_.response_time)
2195 .freshness == base::TimeDelta()
2196 ? VALIDATION_CAUSE_ZERO_FRESHNESS
2197 : VALIDATION_CAUSE_STALE;
2198 }
2199
2188 if (validation_required_by_headers == VALIDATION_ASYNCHRONOUS) { 2200 if (validation_required_by_headers == VALIDATION_ASYNCHRONOUS) {
2189 // Asynchronous revalidation is only supported for GET methods. 2201 // Asynchronous revalidation is only supported for GET methods.
2190 if (request_->method != "GET") 2202 if (request_->method != "GET")
2191 return VALIDATION_SYNCHRONOUS; 2203 return VALIDATION_SYNCHRONOUS;
2192 } 2204 }
2193 2205
2194 return validation_required_by_headers; 2206 return validation_required_by_headers;
2195 } 2207 }
2196 2208
2197 bool HttpCache::Transaction::ConditionalizeRequest() { 2209 bool HttpCache::Transaction::ConditionalizeRequest() {
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after
2698 } 2710 }
2699 2711
2700 void HttpCache::Transaction::RecordHistograms() { 2712 void HttpCache::Transaction::RecordHistograms() {
2701 DCHECK_NE(PATTERN_UNDEFINED, transaction_pattern_); 2713 DCHECK_NE(PATTERN_UNDEFINED, transaction_pattern_);
2702 if (!cache_.get() || !cache_->GetCurrentBackend() || 2714 if (!cache_.get() || !cache_->GetCurrentBackend() ||
2703 cache_->GetCurrentBackend()->GetCacheType() != DISK_CACHE || 2715 cache_->GetCurrentBackend()->GetCacheType() != DISK_CACHE ||
2704 cache_->mode() != NORMAL || request_->method != "GET") { 2716 cache_->mode() != NORMAL || request_->method != "GET") {
2705 return; 2717 return;
2706 } 2718 }
2707 2719
2720 bool validation_request =
2721 transaction_pattern_ == PATTERN_ENTRY_VALIDATED ||
2722 transaction_pattern_ == PATTERN_ENTRY_UPDATED ||
2723 transaction_pattern_ == PATTERN_ENTRY_CANT_CONDITIONALIZE;
2708 std::string mime_type; 2724 std::string mime_type;
2709 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); 2725 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get();
2710 if (response_headers && response_headers->GetMimeType(&mime_type)) { 2726 if (response_headers && response_headers->GetMimeType(&mime_type)) {
2711 // Record the cache pattern by resource type. The type is inferred by 2727 // Record the cache pattern by resource type. The type is inferred by
2712 // response header mime type, which could be incorrect, so this is just an 2728 // response header mime type, which could be incorrect, so this is just an
2713 // estimate. 2729 // estimate.
2714 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { 2730 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) {
2715 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.MainFrameHTML"), 2731 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.MainFrameHTML",
gavinp 2016/05/12 15:02:01 What was this stuff?
jkarlin 2016/05/13 15:06:51 Why was std::string there? It's leftover cruft fro
2716 transaction_pattern_, PATTERN_MAX); 2732 transaction_pattern_, PATTERN_MAX);
2733 if (validation_request) {
2734 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.MainFrameHTML",
2735 validation_cause_, VALIDATION_CAUSE_MAX);
2736 }
2717 } else if (mime_type == "text/html") { 2737 } else if (mime_type == "text/html") {
2718 UMA_HISTOGRAM_ENUMERATION( 2738 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonMainFrameHTML",
2719 std::string("HttpCache.Pattern.NonMainFrameHTML"), 2739 transaction_pattern_, PATTERN_MAX);
2720 transaction_pattern_, PATTERN_MAX); 2740 if (validation_request) {
2741 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonMainFrameHTML",
2742 validation_cause_, VALIDATION_CAUSE_MAX);
2743 }
2721 } else if (mime_type == "text/css") { 2744 } else if (mime_type == "text/css") {
2722 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.CSS"), 2745 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.CSS", transaction_pattern_,
2723 transaction_pattern_, PATTERN_MAX); 2746 PATTERN_MAX);
2747 if (validation_request) {
2748 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.CSS",
2749 validation_cause_, VALIDATION_CAUSE_MAX);
2750 }
2724 } else if (base::StartsWith(mime_type, "image/", 2751 } else if (base::StartsWith(mime_type, "image/",
2725 base::CompareCase::SENSITIVE)) { 2752 base::CompareCase::SENSITIVE)) {
2726 int64_t content_length = response_headers->GetContentLength(); 2753 int64_t content_length = response_headers->GetContentLength();
2727 if (content_length >= 0 && content_length < 100) { 2754 if (content_length >= 0 && content_length < 100) {
2728 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.TinyImage"), 2755 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.TinyImage",
2729 transaction_pattern_, PATTERN_MAX); 2756 transaction_pattern_, PATTERN_MAX);
2757 if (validation_request) {
2758 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.TinyImage",
2759 validation_cause_, VALIDATION_CAUSE_MAX);
2760 }
2730 } else if (content_length >= 100) { 2761 } else if (content_length >= 100) {
2731 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.NonTinyImage"), 2762 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonTinyImage",
2732 transaction_pattern_, PATTERN_MAX); 2763 transaction_pattern_, PATTERN_MAX);
2764 if (validation_request) {
2765 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonTinyImage",
2766 validation_cause_, VALIDATION_CAUSE_MAX);
2767 }
2733 } 2768 }
2734 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Image"), 2769 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Image", transaction_pattern_,
2735 transaction_pattern_, PATTERN_MAX); 2770 PATTERN_MAX);
2771 if (validation_request) {
2772 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Image",
2773 validation_cause_, VALIDATION_CAUSE_MAX);
2774 }
2736 } else if (base::EndsWith(mime_type, "javascript", 2775 } else if (base::EndsWith(mime_type, "javascript",
2737 base::CompareCase::SENSITIVE) || 2776 base::CompareCase::SENSITIVE) ||
2738 base::EndsWith(mime_type, "ecmascript", 2777 base::EndsWith(mime_type, "ecmascript",
2739 base::CompareCase::SENSITIVE)) { 2778 base::CompareCase::SENSITIVE)) {
2740 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.JavaScript"), 2779 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.JavaScript",
2741 transaction_pattern_, PATTERN_MAX); 2780 transaction_pattern_, PATTERN_MAX);
2781 if (validation_request) {
2782 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.JavaScript",
2783 validation_cause_, VALIDATION_CAUSE_MAX);
2784 }
2742 } else if (mime_type.find("font") != std::string::npos) { 2785 } else if (mime_type.find("font") != std::string::npos) {
2743 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Font"), 2786 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Font", transaction_pattern_,
2744 transaction_pattern_, PATTERN_MAX); 2787 PATTERN_MAX);
2788 if (validation_request) {
2789 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Font",
2790 validation_cause_, VALIDATION_CAUSE_MAX);
2791 }
2745 } 2792 }
2746 } 2793 }
2747 2794
2748 UMA_HISTOGRAM_ENUMERATION( 2795 UMA_HISTOGRAM_ENUMERATION(
2749 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); 2796 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX);
2797
2798 if (validation_request) {
2799 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_,
2800 VALIDATION_CAUSE_MAX);
2801 }
2802
2750 if (transaction_pattern_ == PATTERN_NOT_COVERED) 2803 if (transaction_pattern_ == PATTERN_NOT_COVERED)
2751 return; 2804 return;
2752 DCHECK(!range_requested_); 2805 DCHECK(!range_requested_);
2753 DCHECK(!first_cache_access_since_.is_null()); 2806 DCHECK(!first_cache_access_since_.is_null());
2754 2807
2755 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; 2808 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_;
2756 2809
2757 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); 2810 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time);
2758 2811
2759 bool did_send_request = !send_request_since_.is_null(); 2812 bool did_send_request = !send_request_since_.is_null();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2815 default: 2868 default:
2816 NOTREACHED(); 2869 NOTREACHED();
2817 } 2870 }
2818 } 2871 }
2819 2872
2820 void HttpCache::Transaction::OnIOComplete(int result) { 2873 void HttpCache::Transaction::OnIOComplete(int result) {
2821 DoLoop(result); 2874 DoLoop(result);
2822 } 2875 }
2823 2876
2824 } // namespace net 2877 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698