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

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: Treat unconditionalizable requests separately 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
« no previous file with comments | « net/http/http_cache_transaction.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 = transaction_pattern_ == PATTERN_ENTRY_VALIDATED ||
2721 transaction_pattern_ == PATTERN_ENTRY_UPDATED;
2708 std::string mime_type; 2722 std::string mime_type;
2709 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); 2723 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get();
2710 if (response_headers && response_headers->GetMimeType(&mime_type)) { 2724 if (response_headers && response_headers->GetMimeType(&mime_type)) {
2711 // Record the cache pattern by resource type. The type is inferred by 2725 // 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 2726 // response header mime type, which could be incorrect, so this is just an
2713 // estimate. 2727 // estimate.
2714 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { 2728 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) {
2715 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.MainFrameHTML"), 2729 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.MainFrameHTML",
2716 transaction_pattern_, PATTERN_MAX); 2730 transaction_pattern_, PATTERN_MAX);
2731 if (validation_request) {
2732 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.MainFrameHTML",
2733 validation_cause_, VALIDATION_CAUSE_MAX);
2734 }
2717 } else if (mime_type == "text/html") { 2735 } else if (mime_type == "text/html") {
2718 UMA_HISTOGRAM_ENUMERATION( 2736 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonMainFrameHTML",
2719 std::string("HttpCache.Pattern.NonMainFrameHTML"), 2737 transaction_pattern_, PATTERN_MAX);
2720 transaction_pattern_, PATTERN_MAX); 2738 if (validation_request) {
2739 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonMainFrameHTML",
2740 validation_cause_, VALIDATION_CAUSE_MAX);
2741 }
2721 } else if (mime_type == "text/css") { 2742 } else if (mime_type == "text/css") {
2722 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.CSS"), 2743 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.CSS", transaction_pattern_,
2723 transaction_pattern_, PATTERN_MAX); 2744 PATTERN_MAX);
2745 if (validation_request) {
2746 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.CSS",
2747 validation_cause_, VALIDATION_CAUSE_MAX);
2748 }
2724 } else if (base::StartsWith(mime_type, "image/", 2749 } else if (base::StartsWith(mime_type, "image/",
2725 base::CompareCase::SENSITIVE)) { 2750 base::CompareCase::SENSITIVE)) {
2726 int64_t content_length = response_headers->GetContentLength(); 2751 int64_t content_length = response_headers->GetContentLength();
2727 if (content_length >= 0 && content_length < 100) { 2752 if (content_length >= 0 && content_length < 100) {
2728 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.TinyImage"), 2753 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.TinyImage",
2729 transaction_pattern_, PATTERN_MAX); 2754 transaction_pattern_, PATTERN_MAX);
2755 if (validation_request) {
2756 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.TinyImage",
2757 validation_cause_, VALIDATION_CAUSE_MAX);
2758 }
2730 } else if (content_length >= 100) { 2759 } else if (content_length >= 100) {
2731 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.NonTinyImage"), 2760 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonTinyImage",
2732 transaction_pattern_, PATTERN_MAX); 2761 transaction_pattern_, PATTERN_MAX);
2762 if (validation_request) {
2763 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonTinyImage",
2764 validation_cause_, VALIDATION_CAUSE_MAX);
2765 }
2733 } 2766 }
2734 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Image"), 2767 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Image", transaction_pattern_,
2735 transaction_pattern_, PATTERN_MAX); 2768 PATTERN_MAX);
2769 if (validation_request) {
2770 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Image",
2771 validation_cause_, VALIDATION_CAUSE_MAX);
2772 }
2736 } else if (base::EndsWith(mime_type, "javascript", 2773 } else if (base::EndsWith(mime_type, "javascript",
2737 base::CompareCase::SENSITIVE) || 2774 base::CompareCase::SENSITIVE) ||
2738 base::EndsWith(mime_type, "ecmascript", 2775 base::EndsWith(mime_type, "ecmascript",
2739 base::CompareCase::SENSITIVE)) { 2776 base::CompareCase::SENSITIVE)) {
2740 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.JavaScript"), 2777 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.JavaScript",
2741 transaction_pattern_, PATTERN_MAX); 2778 transaction_pattern_, PATTERN_MAX);
2779 if (validation_request) {
2780 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.JavaScript",
2781 validation_cause_, VALIDATION_CAUSE_MAX);
2782 }
2742 } else if (mime_type.find("font") != std::string::npos) { 2783 } else if (mime_type.find("font") != std::string::npos) {
2743 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Font"), 2784 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Font", transaction_pattern_,
2744 transaction_pattern_, PATTERN_MAX); 2785 PATTERN_MAX);
2786 if (validation_request) {
2787 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Font",
2788 validation_cause_, VALIDATION_CAUSE_MAX);
2789 }
2745 } 2790 }
2746 } 2791 }
2747 2792
2748 UMA_HISTOGRAM_ENUMERATION( 2793 UMA_HISTOGRAM_ENUMERATION(
2749 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); 2794 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX);
2795
2796 if (validation_request) {
2797 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_,
2798 VALIDATION_CAUSE_MAX);
2799 }
2800
2801 if (transaction_pattern_ == PATTERN_ENTRY_CANT_CONDITIONALIZE) {
2802 UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause",
2803 validation_cause_, VALIDATION_CAUSE_MAX);
2804 }
2805
2750 if (transaction_pattern_ == PATTERN_NOT_COVERED) 2806 if (transaction_pattern_ == PATTERN_NOT_COVERED)
2751 return; 2807 return;
2752 DCHECK(!range_requested_); 2808 DCHECK(!range_requested_);
2753 DCHECK(!first_cache_access_since_.is_null()); 2809 DCHECK(!first_cache_access_since_.is_null());
2754 2810
2755 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; 2811 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_;
2756 2812
2757 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); 2813 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time);
2758 2814
2759 bool did_send_request = !send_request_since_.is_null(); 2815 bool did_send_request = !send_request_since_.is_null();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2815 default: 2871 default:
2816 NOTREACHED(); 2872 NOTREACHED();
2817 } 2873 }
2818 } 2874 }
2819 2875
2820 void HttpCache::Transaction::OnIOComplete(int result) { 2876 void HttpCache::Transaction::OnIOComplete(int result) {
2821 DoLoop(result); 2877 DoLoop(result);
2822 } 2878 }
2823 2879
2824 } // namespace net 2880 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_cache_transaction.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698