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

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

Issue 10736066: Adding histograms showing fraction of page load times (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 5 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/http/http_cache_transaction.h" 5 #include "net/http/http_cache_transaction.h"
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 8
9 #if defined(OS_POSIX) 9 #if defined(OS_POSIX)
10 #include <unistd.h> 10 #include <unistd.h>
(...skipping 14 matching lines...) Expand all
25 #include "net/base/load_flags.h" 25 #include "net/base/load_flags.h"
26 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
27 #include "net/base/net_log.h" 27 #include "net/base/net_log.h"
28 #include "net/base/ssl_cert_request_info.h" 28 #include "net/base/ssl_cert_request_info.h"
29 #include "net/base/ssl_config_service.h" 29 #include "net/base/ssl_config_service.h"
30 #include "net/disk_cache/disk_cache.h" 30 #include "net/disk_cache/disk_cache.h"
31 #include "net/http/http_network_session.h" 31 #include "net/http/http_network_session.h"
32 #include "net/http/http_request_info.h" 32 #include "net/http/http_request_info.h"
33 #include "net/http/http_response_headers.h" 33 #include "net/http/http_response_headers.h"
34 #include "net/http/http_transaction.h" 34 #include "net/http/http_transaction.h"
35 #include "net/http/http_transaction_delegate.h"
35 #include "net/http/http_util.h" 36 #include "net/http/http_util.h"
36 #include "net/http/partial_data.h" 37 #include "net/http/partial_data.h"
37 38
38 using base::Time; 39 using base::Time;
39 40
40 namespace net { 41 namespace net {
41 42
42 struct HeaderNameAndValue { 43 struct HeaderNameAndValue {
43 const char* name; 44 const char* name;
44 const char* value; 45 const char* value;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 while (v.GetNext()) { 93 while (v.GetNext()) {
93 if (LowerCaseEqualsASCII(v.value_begin(), v.value_end(), search->value)) 94 if (LowerCaseEqualsASCII(v.value_begin(), v.value_end(), search->value))
94 return true; 95 return true;
95 } 96 }
96 } 97 }
97 return false; 98 return false;
98 } 99 }
99 100
100 //----------------------------------------------------------------------------- 101 //-----------------------------------------------------------------------------
101 102
102 HttpCache::Transaction::Transaction(HttpCache* cache) 103 HttpCache::Transaction::Transaction(HttpCache* cache,
104 HttpTransactionDelegate* delegate)
103 : next_state_(STATE_NONE), 105 : next_state_(STATE_NONE),
104 request_(NULL), 106 request_(NULL),
105 cache_(cache->AsWeakPtr()), 107 cache_(cache->AsWeakPtr()),
106 entry_(NULL), 108 entry_(NULL),
107 new_entry_(NULL), 109 new_entry_(NULL),
108 network_trans_(NULL), 110 network_trans_(NULL),
109 new_response_(NULL), 111 new_response_(NULL),
110 mode_(NONE), 112 mode_(NONE),
111 target_state_(STATE_NONE), 113 target_state_(STATE_NONE),
112 reading_(false), 114 reading_(false),
113 invalid_range_(false), 115 invalid_range_(false),
114 truncated_(false), 116 truncated_(false),
115 is_sparse_(false), 117 is_sparse_(false),
116 range_requested_(false), 118 range_requested_(false),
117 handling_206_(false), 119 handling_206_(false),
118 cache_pending_(false), 120 cache_pending_(false),
119 done_reading_(false), 121 done_reading_(false),
120 read_offset_(0), 122 read_offset_(0),
121 effective_load_flags_(0), 123 effective_load_flags_(0),
122 write_len_(0), 124 write_len_(0),
123 final_upload_progress_(0), 125 final_upload_progress_(0),
124 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), 126 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
125 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_( 127 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_(
126 base::Bind(&Transaction::OnIOComplete, 128 base::Bind(&Transaction::OnIOComplete,
127 weak_factory_.GetWeakPtr()))) { 129 weak_factory_.GetWeakPtr()))),
130 delegate_(delegate) {
128 COMPILE_ASSERT(HttpCache::Transaction::kNumValidationHeaders == 131 COMPILE_ASSERT(HttpCache::Transaction::kNumValidationHeaders ==
129 arraysize(kValidationHeaders), 132 arraysize(kValidationHeaders),
130 Invalid_number_of_validation_headers); 133 Invalid_number_of_validation_headers);
131 } 134 }
132 135
133 HttpCache::Transaction::~Transaction() { 136 HttpCache::Transaction::~Transaction() {
134 // We may have to issue another IO, but we should never invoke the callback_ 137 // We may have to issue another IO, but we should never invoke the callback_
135 // after this point. 138 // after this point.
136 callback_.Reset(); 139 callback_.Reset();
137 140
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 if (rv != ERR_IO_PENDING) 648 if (rv != ERR_IO_PENDING)
646 HandleResult(rv); 649 HandleResult(rv);
647 650
648 return rv; 651 return rv;
649 } 652 }
650 653
651 int HttpCache::Transaction::DoGetBackend() { 654 int HttpCache::Transaction::DoGetBackend() {
652 cache_pending_ = true; 655 cache_pending_ = true;
653 next_state_ = STATE_GET_BACKEND_COMPLETE; 656 next_state_ = STATE_GET_BACKEND_COMPLETE;
654 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_GET_BACKEND); 657 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_GET_BACKEND);
658 ReportCacheActionStart();
655 return cache_->GetBackendForTransaction(this); 659 return cache_->GetBackendForTransaction(this);
656 } 660 }
657 661
658 int HttpCache::Transaction::DoGetBackendComplete(int result) { 662 int HttpCache::Transaction::DoGetBackendComplete(int result) {
659 DCHECK(result == OK || result == ERR_FAILED); 663 DCHECK(result == OK || result == ERR_FAILED);
664 ReportCacheActionFinish();
660 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, 665 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_GET_BACKEND,
661 result); 666 result);
662 cache_pending_ = false; 667 cache_pending_ = false;
663 668
664 if (!ShouldPassThrough()) { 669 if (!ShouldPassThrough()) {
665 cache_key_ = cache_->GenerateCacheKey(request_); 670 cache_key_ = cache_->GenerateCacheKey(request_);
666 671
667 // Requested cache access mode. 672 // Requested cache access mode.
668 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { 673 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) {
669 mode_ = READ; 674 mode_ = READ;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 range_requested_ = (partial_.get() != NULL); 715 range_requested_ = (partial_.get() != NULL);
711 716
712 return OK; 717 return OK;
713 } 718 }
714 719
715 int HttpCache::Transaction::DoSendRequest() { 720 int HttpCache::Transaction::DoSendRequest() {
716 DCHECK(mode_ & WRITE || mode_ == NONE); 721 DCHECK(mode_ & WRITE || mode_ == NONE);
717 DCHECK(!network_trans_.get()); 722 DCHECK(!network_trans_.get());
718 723
719 // Create a network transaction. 724 // Create a network transaction.
720 int rv = cache_->network_layer_->CreateTransaction(&network_trans_); 725 int rv = cache_->network_layer_->CreateTransaction(&network_trans_, NULL);
rvargas (doing something else) 2012/07/23 22:22:36 It would be interesting to track the network activ
tburkard 2012/07/24 01:03:12 (nothing to do here). On 2012/07/23 22:22:36, rva
721 if (rv != OK) 726 if (rv != OK)
722 return rv; 727 return rv;
723 728
724 next_state_ = STATE_SEND_REQUEST_COMPLETE; 729 next_state_ = STATE_SEND_REQUEST_COMPLETE;
725 rv = network_trans_->Start(request_, io_callback_, net_log_); 730 rv = network_trans_->Start(request_, io_callback_, net_log_);
726 return rv; 731 return rv;
727 } 732 }
728 733
729 int HttpCache::Transaction::DoSendRequestComplete(int result) { 734 int HttpCache::Transaction::DoSendRequestComplete(int result) {
730 if (!cache_) 735 if (!cache_)
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 843
839 next_state_ = STATE_OPEN_ENTRY; 844 next_state_ = STATE_OPEN_ENTRY;
840 return OK; 845 return OK;
841 } 846 }
842 847
843 int HttpCache::Transaction::DoOpenEntry() { 848 int HttpCache::Transaction::DoOpenEntry() {
844 DCHECK(!new_entry_); 849 DCHECK(!new_entry_);
845 next_state_ = STATE_OPEN_ENTRY_COMPLETE; 850 next_state_ = STATE_OPEN_ENTRY_COMPLETE;
846 cache_pending_ = true; 851 cache_pending_ = true;
847 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY); 852 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY);
853 ReportCacheActionStart();
848 return cache_->OpenEntry(cache_key_, &new_entry_, this); 854 return cache_->OpenEntry(cache_key_, &new_entry_, this);
849 } 855 }
850 856
851 int HttpCache::Transaction::DoOpenEntryComplete(int result) { 857 int HttpCache::Transaction::DoOpenEntryComplete(int result) {
852 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is 858 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is
853 // OK, otherwise the cache will end up with an active entry without any 859 // OK, otherwise the cache will end up with an active entry without any
854 // transaction attached. 860 // transaction attached.
861 ReportCacheActionFinish();
855 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, result); 862 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, result);
856 cache_pending_ = false; 863 cache_pending_ = false;
857 if (result == OK) { 864 if (result == OK) {
858 next_state_ = STATE_ADD_TO_ENTRY; 865 next_state_ = STATE_ADD_TO_ENTRY;
859 return OK; 866 return OK;
860 } 867 }
861 868
862 if (result == ERR_CACHE_RACE) { 869 if (result == ERR_CACHE_RACE) {
863 next_state_ = STATE_INIT_ENTRY; 870 next_state_ = STATE_INIT_ENTRY;
864 return OK; 871 return OK;
(...skipping 23 matching lines...) Expand all
888 // The entry does not exist, and we are not permitted to create a new entry, 895 // The entry does not exist, and we are not permitted to create a new entry,
889 // so we must fail. 896 // so we must fail.
890 return ERR_CACHE_MISS; 897 return ERR_CACHE_MISS;
891 } 898 }
892 899
893 int HttpCache::Transaction::DoCreateEntry() { 900 int HttpCache::Transaction::DoCreateEntry() {
894 DCHECK(!new_entry_); 901 DCHECK(!new_entry_);
895 next_state_ = STATE_CREATE_ENTRY_COMPLETE; 902 next_state_ = STATE_CREATE_ENTRY_COMPLETE;
896 cache_pending_ = true; 903 cache_pending_ = true;
897 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY); 904 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY);
905 ReportCacheActionStart();
898 return cache_->CreateEntry(cache_key_, &new_entry_, this); 906 return cache_->CreateEntry(cache_key_, &new_entry_, this);
899 } 907 }
900 908
901 int HttpCache::Transaction::DoCreateEntryComplete(int result) { 909 int HttpCache::Transaction::DoCreateEntryComplete(int result) {
902 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is 910 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is
903 // OK, otherwise the cache will end up with an active entry without any 911 // OK, otherwise the cache will end up with an active entry without any
904 // transaction attached. 912 // transaction attached.
913 ReportCacheActionFinish();
905 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, 914 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY,
906 result); 915 result);
907 cache_pending_ = false; 916 cache_pending_ = false;
908 next_state_ = STATE_ADD_TO_ENTRY; 917 next_state_ = STATE_ADD_TO_ENTRY;
909 918
910 if (result == ERR_CACHE_RACE) { 919 if (result == ERR_CACHE_RACE) {
911 next_state_ = STATE_INIT_ENTRY; 920 next_state_ = STATE_INIT_ENTRY;
912 return OK; 921 return OK;
913 } 922 }
914 923
915 if (result != OK) { 924 if (result != OK) {
916 // We have a race here: Maybe we failed to open the entry and decided to 925 // We have a race here: Maybe we failed to open the entry and decided to
917 // create one, but by the time we called create, another transaction already 926 // create one, but by the time we called create, another transaction already
918 // created the entry. If we want to eliminate this issue, we need an atomic 927 // created the entry. If we want to eliminate this issue, we need an atomic
919 // OpenOrCreate() method exposed by the disk cache. 928 // OpenOrCreate() method exposed by the disk cache.
920 DLOG(WARNING) << "Unable to create cache entry"; 929 DLOG(WARNING) << "Unable to create cache entry";
921 mode_ = NONE; 930 mode_ = NONE;
922 if (partial_.get()) 931 if (partial_.get())
923 partial_->RestoreHeaders(&custom_request_->extra_headers); 932 partial_->RestoreHeaders(&custom_request_->extra_headers);
924 next_state_ = STATE_SEND_REQUEST; 933 next_state_ = STATE_SEND_REQUEST;
925 } 934 }
926 return OK; 935 return OK;
927 } 936 }
928 937
929 int HttpCache::Transaction::DoDoomEntry() { 938 int HttpCache::Transaction::DoDoomEntry() {
930 next_state_ = STATE_DOOM_ENTRY_COMPLETE; 939 next_state_ = STATE_DOOM_ENTRY_COMPLETE;
931 cache_pending_ = true; 940 cache_pending_ = true;
932 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY); 941 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY);
942 ReportCacheActionStart();
933 return cache_->DoomEntry(cache_key_, this); 943 return cache_->DoomEntry(cache_key_, this);
934 } 944 }
935 945
936 int HttpCache::Transaction::DoDoomEntryComplete(int result) { 946 int HttpCache::Transaction::DoDoomEntryComplete(int result) {
947 ReportCacheActionFinish();
937 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, result); 948 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, result);
938 next_state_ = STATE_CREATE_ENTRY; 949 next_state_ = STATE_CREATE_ENTRY;
939 cache_pending_ = false; 950 cache_pending_ = false;
940 if (result == ERR_CACHE_RACE) 951 if (result == ERR_CACHE_RACE)
941 next_state_ = STATE_INIT_ENTRY; 952 next_state_ = STATE_INIT_ENTRY;
942 953
943 return OK; 954 return OK;
944 } 955 }
945 956
946 int HttpCache::Transaction::DoAddToEntry() { 957 int HttpCache::Transaction::DoAddToEntry() {
947 DCHECK(new_entry_); 958 DCHECK(new_entry_);
948 cache_pending_ = true; 959 cache_pending_ = true;
949 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; 960 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE;
950 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY); 961 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY);
962 ReportCacheActionStart();
rvargas (doing something else) 2012/07/23 22:22:36 We should treat this one some other way. This is n
tburkard 2012/07/24 01:03:12 Why is the distinction important? What is the dif
rvargas (doing something else) 2012/07/24 03:10:38 No matter what we change at the disk cache layer,
tburkard 2012/07/24 22:23:26 Done.
951 DCHECK(entry_lock_waiting_since_.is_null()); 963 DCHECK(entry_lock_waiting_since_.is_null());
952 entry_lock_waiting_since_ = base::TimeTicks::Now(); 964 entry_lock_waiting_since_ = base::TimeTicks::Now();
953 return cache_->AddTransactionToEntry(new_entry_, this); 965 return cache_->AddTransactionToEntry(new_entry_, this);
954 } 966 }
955 967
956 int HttpCache::Transaction::DoAddToEntryComplete(int result) { 968 int HttpCache::Transaction::DoAddToEntryComplete(int result) {
969 ReportCacheActionFinish();
957 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, 970 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY,
958 result); 971 result);
959 972
960 const base::TimeDelta entry_lock_wait = 973 const base::TimeDelta entry_lock_wait =
961 base::TimeTicks::Now() - entry_lock_waiting_since_; 974 base::TimeTicks::Now() - entry_lock_waiting_since_;
962 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); 975 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait);
963 static const bool prefetching_fieldtrial = 976 static const bool prefetching_fieldtrial =
964 base::FieldTrialList::TrialExists("Prefetch"); 977 base::FieldTrialList::TrialExists("Prefetch");
965 if (prefetching_fieldtrial) { 978 if (prefetching_fieldtrial) {
966 UMA_HISTOGRAM_TIMES( 979 UMA_HISTOGRAM_TIMES(
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 STATE_CACHE_WRITE_RESPONSE; 1141 STATE_CACHE_WRITE_RESPONSE;
1129 return OK; 1142 return OK;
1130 } 1143 }
1131 1144
1132 int HttpCache::Transaction::DoTruncateCachedData() { 1145 int HttpCache::Transaction::DoTruncateCachedData() {
1133 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; 1146 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE;
1134 if (!entry_) 1147 if (!entry_)
1135 return OK; 1148 return OK;
1136 if (net_log_.IsLoggingAllEvents()) 1149 if (net_log_.IsLoggingAllEvents())
1137 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA); 1150 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA);
1138 1151 ReportCacheActionStart();
1139 // Truncate the stream. 1152 // Truncate the stream.
1140 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, io_callback_); 1153 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, io_callback_);
1141 } 1154 }
1142 1155
1143 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { 1156 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) {
1144 if (net_log_.IsLoggingAllEvents() && entry_) { 1157 if (entry_) {
1145 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, 1158 ReportCacheActionFinish();
1146 result); 1159 if (net_log_.IsLoggingAllEvents()) {
1160 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA,
1161 result);
1162 }
1147 } 1163 }
1148 1164
1149 next_state_ = STATE_TRUNCATE_CACHED_METADATA; 1165 next_state_ = STATE_TRUNCATE_CACHED_METADATA;
1150 return OK; 1166 return OK;
1151 } 1167 }
1152 1168
1153 int HttpCache::Transaction::DoTruncateCachedMetadata() { 1169 int HttpCache::Transaction::DoTruncateCachedMetadata() {
1154 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; 1170 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE;
1155 if (!entry_) 1171 if (!entry_)
1156 return OK; 1172 return OK;
1157 1173
1158 if (net_log_.IsLoggingAllEvents()) 1174 if (net_log_.IsLoggingAllEvents())
1159 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); 1175 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO);
1176 ReportCacheActionStart();
1160 return WriteToEntry(kMetadataIndex, 0, NULL, 0, io_callback_); 1177 return WriteToEntry(kMetadataIndex, 0, NULL, 0, io_callback_);
1161 } 1178 }
1162 1179
1163 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { 1180 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) {
1164 if (net_log_.IsLoggingAllEvents() && entry_) { 1181 if (entry_) {
1165 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, 1182 ReportCacheActionFinish();
1166 result); 1183 if (net_log_.IsLoggingAllEvents()) {
1184 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO,
1185 result);
1186 }
1167 } 1187 }
1168 1188
1169 // If this response is a redirect, then we can stop writing now. (We don't 1189 // If this response is a redirect, then we can stop writing now. (We don't
1170 // need to cache the response body of a redirect.) 1190 // need to cache the response body of a redirect.)
1171 if (response_.headers->IsRedirect(NULL)) 1191 if (response_.headers->IsRedirect(NULL))
1172 DoneWritingToEntry(true); 1192 DoneWritingToEntry(true);
1173 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; 1193 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED;
1174 return OK; 1194 return OK;
1175 } 1195 }
1176 1196
(...skipping 21 matching lines...) Expand all
1198 } 1218 }
1199 1219
1200 int HttpCache::Transaction::DoCacheReadResponse() { 1220 int HttpCache::Transaction::DoCacheReadResponse() {
1201 DCHECK(entry_); 1221 DCHECK(entry_);
1202 next_state_ = STATE_CACHE_READ_RESPONSE_COMPLETE; 1222 next_state_ = STATE_CACHE_READ_RESPONSE_COMPLETE;
1203 1223
1204 io_buf_len_ = entry_->disk_entry->GetDataSize(kResponseInfoIndex); 1224 io_buf_len_ = entry_->disk_entry->GetDataSize(kResponseInfoIndex);
1205 read_buf_ = new IOBuffer(io_buf_len_); 1225 read_buf_ = new IOBuffer(io_buf_len_);
1206 1226
1207 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO); 1227 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO);
1228 ReportCacheActionStart();
rvargas (doing something else) 2012/07/23 22:22:36 This is where we start getting confusing results.
tburkard 2012/07/24 01:03:12 That doesn't matter for the purpose of what I'm tr
rvargas (doing something else) 2012/07/24 03:10:38 I think it matters. If we only care about a singl
tburkard 2012/07/24 22:23:26 Per discussion on the phone, we are in agreement o
1208 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_, 1229 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_,
1209 io_buf_len_, io_callback_); 1230 io_buf_len_, io_callback_);
1210 } 1231 }
1211 1232
1212 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { 1233 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
1234 ReportCacheActionFinish();
1213 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); 1235 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result);
1214 if (result != io_buf_len_ || 1236 if (result != io_buf_len_ ||
1215 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, 1237 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_,
1216 &response_, &truncated_)) { 1238 &response_, &truncated_)) {
1217 return OnCacheReadError(result, true); 1239 return OnCacheReadError(result, true);
1218 } 1240 }
1219 1241
1220 // Some resources may have slipped in as truncated when they're not. 1242 // Some resources may have slipped in as truncated when they're not.
1221 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); 1243 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex);
1222 if (response_.headers->GetContentLength() == current_size) 1244 if (response_.headers->GetContentLength() == current_size)
(...skipping 24 matching lines...) Expand all
1247 break; 1269 break;
1248 case WRITE: 1270 case WRITE:
1249 default: 1271 default:
1250 NOTREACHED(); 1272 NOTREACHED();
1251 result = ERR_FAILED; 1273 result = ERR_FAILED;
1252 } 1274 }
1253 return result; 1275 return result;
1254 } 1276 }
1255 1277
1256 int HttpCache::Transaction::DoCacheWriteResponse() { 1278 int HttpCache::Transaction::DoCacheWriteResponse() {
1257 if (net_log_.IsLoggingAllEvents() && entry_) 1279 if (entry_) {
1258 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); 1280 if (net_log_.IsLoggingAllEvents())
1281 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO);
1282 ReportCacheActionStart();
1283 }
1259 return WriteResponseInfoToEntry(false); 1284 return WriteResponseInfoToEntry(false);
1260 } 1285 }
1261 1286
1262 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() { 1287 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() {
1263 if (net_log_.IsLoggingAllEvents() && entry_) 1288 if (entry_) {
1264 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); 1289 if (net_log_.IsLoggingAllEvents() && entry_)
1290 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO);
1291 ReportCacheActionStart();
1292 }
1265 return WriteResponseInfoToEntry(true); 1293 return WriteResponseInfoToEntry(true);
1266 } 1294 }
1267 1295
1268 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { 1296 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) {
1269 next_state_ = target_state_; 1297 next_state_ = target_state_;
1270 target_state_ = STATE_NONE; 1298 target_state_ = STATE_NONE;
1271 if (!entry_) 1299 if (!entry_)
1272 return OK; 1300 return OK;
1301 ReportCacheActionFinish();
1273 if (net_log_.IsLoggingAllEvents()) { 1302 if (net_log_.IsLoggingAllEvents()) {
1274 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, 1303 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO,
1275 result); 1304 result);
1276 } 1305 }
1277 1306
1278 // Balance the AddRef from WriteResponseInfoToEntry. 1307 // Balance the AddRef from WriteResponseInfoToEntry.
1279 if (result != io_buf_len_) { 1308 if (result != io_buf_len_) {
1280 DLOG(ERROR) << "failed to write response info to cache"; 1309 DLOG(ERROR) << "failed to write response info to cache";
1281 DoneWritingToEntry(false); 1310 DoneWritingToEntry(false);
1282 } 1311 }
1283 return OK; 1312 return OK;
1284 } 1313 }
1285 1314
1286 int HttpCache::Transaction::DoCacheReadMetadata() { 1315 int HttpCache::Transaction::DoCacheReadMetadata() {
1287 DCHECK(entry_); 1316 DCHECK(entry_);
1288 DCHECK(!response_.metadata); 1317 DCHECK(!response_.metadata);
1289 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; 1318 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE;
1290 1319
1291 response_.metadata = 1320 response_.metadata =
1292 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); 1321 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex));
1293 1322
1294 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO); 1323 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO);
1324 ReportCacheActionStart();
1295 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata, 1325 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata,
1296 response_.metadata->size(), 1326 response_.metadata->size(),
1297 io_callback_); 1327 io_callback_);
1298 } 1328 }
1299 1329
1300 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { 1330 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) {
1331 ReportCacheActionFinish();
1301 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); 1332 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result);
1302 if (result != response_.metadata->size()) 1333 if (result != response_.metadata->size())
1303 return OnCacheReadError(result, false); 1334 return OnCacheReadError(result, false);
1304 1335
1305 return OK; 1336 return OK;
1306 } 1337 }
1307 1338
1308 int HttpCache::Transaction::DoCacheQueryData() { 1339 int HttpCache::Transaction::DoCacheQueryData() {
1309 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; 1340 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE;
1310 1341
1311 // Balanced in DoCacheQueryDataComplete. 1342 // Balanced in DoCacheQueryDataComplete.
1312 return entry_->disk_entry->ReadyForSparseIO(io_callback_); 1343 return entry_->disk_entry->ReadyForSparseIO(io_callback_);
1313 } 1344 }
1314 1345
1315 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) { 1346 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) {
1316 DCHECK_EQ(OK, result); 1347 DCHECK_EQ(OK, result);
1317 if (!cache_) 1348 if (!cache_)
1318 return ERR_UNEXPECTED; 1349 return ERR_UNEXPECTED;
1319 1350
1320 return ValidateEntryHeadersAndContinue(); 1351 return ValidateEntryHeadersAndContinue();
1321 } 1352 }
1322 1353
1323 int HttpCache::Transaction::DoCacheReadData() { 1354 int HttpCache::Transaction::DoCacheReadData() {
1324 DCHECK(entry_); 1355 DCHECK(entry_);
1325 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; 1356 next_state_ = STATE_CACHE_READ_DATA_COMPLETE;
1326 1357
1327 if (net_log_.IsLoggingAllEvents()) 1358 if (net_log_.IsLoggingAllEvents())
1328 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA); 1359 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA);
1360 ReportCacheActionStart();
1329 if (partial_.get()) { 1361 if (partial_.get()) {
1330 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_, 1362 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_,
1331 io_callback_); 1363 io_callback_);
1332 } 1364 }
1333 1365
1334 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, 1366 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_,
1335 read_buf_, io_buf_len_, io_callback_); 1367 read_buf_, io_buf_len_, io_callback_);
1336 } 1368 }
1337 1369
1338 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { 1370 int HttpCache::Transaction::DoCacheReadDataComplete(int result) {
1371 ReportCacheActionFinish();
1339 if (net_log_.IsLoggingAllEvents()) { 1372 if (net_log_.IsLoggingAllEvents()) {
1340 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_DATA, 1373 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_DATA,
1341 result); 1374 result);
1342 } 1375 }
1343 1376
1344 if (!cache_) 1377 if (!cache_)
1345 return ERR_UNEXPECTED; 1378 return ERR_UNEXPECTED;
1346 1379
1347 if (partial_.get()) 1380 if (partial_.get())
1348 return DoPartialCacheReadCompleted(result); 1381 return DoPartialCacheReadCompleted(result);
1349 1382
1350 if (result > 0) { 1383 if (result > 0) {
1351 read_offset_ += result; 1384 read_offset_ += result;
1352 } else if (result == 0) { // End of file. 1385 } else if (result == 0) { // End of file.
1353 cache_->DoneReadingFromEntry(entry_, this); 1386 cache_->DoneReadingFromEntry(entry_, this);
1354 entry_ = NULL; 1387 entry_ = NULL;
1355 } else { 1388 } else {
1356 return OnCacheReadError(result, false); 1389 return OnCacheReadError(result, false);
1357 } 1390 }
1358 return result; 1391 return result;
1359 } 1392 }
1360 1393
1361 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { 1394 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) {
1362 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; 1395 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE;
1363 write_len_ = num_bytes; 1396 write_len_ = num_bytes;
1364 if (net_log_.IsLoggingAllEvents() && entry_) 1397 if (entry_) {
1365 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA); 1398 if (net_log_.IsLoggingAllEvents())
1399 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA);
1400 ReportCacheActionStart();
1401 }
1366 1402
1367 return AppendResponseDataToEntry(read_buf_, num_bytes, io_callback_); 1403 return AppendResponseDataToEntry(read_buf_, num_bytes, io_callback_);
1368 } 1404 }
1369 1405
1370 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { 1406 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) {
1371 if (net_log_.IsLoggingAllEvents() && entry_) { 1407 if (entry_) {
1372 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, 1408 ReportCacheActionFinish();
1373 result); 1409 if (net_log_.IsLoggingAllEvents()) {
1410 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA,
1411 result);
1412 }
1374 } 1413 }
1375 // Balance the AddRef from DoCacheWriteData. 1414 // Balance the AddRef from DoCacheWriteData.
1376 if (!cache_) 1415 if (!cache_)
1377 return ERR_UNEXPECTED; 1416 return ERR_UNEXPECTED;
1378 1417
1379 if (result != write_len_) { 1418 if (result != write_len_) {
1380 DLOG(ERROR) << "failed to write response data to cache"; 1419 DLOG(ERROR) << "failed to write response data to cache";
1381 DoneWritingToEntry(false); 1420 DoneWritingToEntry(false);
1382 1421
1383 // We want to ignore errors writing to disk and just keep reading from 1422 // We want to ignore errors writing to disk and just keep reading from
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
2103 !response_.headers->HasStrongValidators()) 2142 !response_.headers->HasStrongValidators())
2104 return false; 2143 return false;
2105 2144
2106 return true; 2145 return true;
2107 } 2146 }
2108 2147
2109 void HttpCache::Transaction::OnIOComplete(int result) { 2148 void HttpCache::Transaction::OnIOComplete(int result) {
2110 DoLoop(result); 2149 DoLoop(result);
2111 } 2150 }
2112 2151
2152 void HttpCache::Transaction::ReportCacheActionStart() {
2153 if (delegate_)
2154 delegate_->OnCacheActionStart();
2155 }
2156
2157 void HttpCache::Transaction::ReportCacheActionFinish() {
2158 if (delegate_)
2159 delegate_->OnCacheActionFinish();
2160 }
2161
2113 } // namespace net 2162 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698