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

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

Issue 2774603003: Doom and create new entry when validation is not a match (Closed)
Patch Set: Used TransitionToState in DoSuccessfulSendRequest Created 3 years, 9 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 mode_(NONE), 173 mode_(NONE),
174 original_mode_(NONE), 174 original_mode_(NONE),
175 reading_(false), 175 reading_(false),
176 invalid_range_(false), 176 invalid_range_(false),
177 truncated_(false), 177 truncated_(false),
178 is_sparse_(false), 178 is_sparse_(false),
179 range_requested_(false), 179 range_requested_(false),
180 handling_206_(false), 180 handling_206_(false),
181 cache_pending_(false), 181 cache_pending_(false),
182 done_reading_(false), 182 done_reading_(false),
183 done_headers_(false),
183 vary_mismatch_(false), 184 vary_mismatch_(false),
184 couldnt_conditionalize_request_(false), 185 couldnt_conditionalize_request_(false),
185 bypass_lock_for_test_(false), 186 bypass_lock_for_test_(false),
186 fail_conditionalization_for_test_(false), 187 fail_conditionalization_for_test_(false),
187 validating_cannot_proceed_(false), 188 validating_cannot_proceed_(false),
188 io_buf_len_(0), 189 io_buf_len_(0),
189 read_offset_(0), 190 read_offset_(0),
190 effective_load_flags_(0), 191 effective_load_flags_(0),
191 write_len_(0), 192 write_len_(0),
192 cache_entry_status_(CacheEntryStatus::ENTRY_UNDEFINED), 193 cache_entry_status_(CacheEntryStatus::ENTRY_UNDEFINED),
(...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 case ERR_CACHE_RACE: 1130 case ERR_CACHE_RACE:
1130 TransitionToState(STATE_INIT_ENTRY); 1131 TransitionToState(STATE_INIT_ENTRY);
1131 break; 1132 break;
1132 1133
1133 default: 1134 default:
1134 // We have a race here: Maybe we failed to open the entry and decided to 1135 // We have a race here: Maybe we failed to open the entry and decided to
1135 // create one, but by the time we called create, another transaction 1136 // create one, but by the time we called create, another transaction
1136 // already created the entry. If we want to eliminate this issue, we 1137 // already created the entry. If we want to eliminate this issue, we
1137 // need an atomic OpenOrCreate() method exposed by the disk cache. 1138 // need an atomic OpenOrCreate() method exposed by the disk cache.
1138 DLOG(WARNING) << "Unable to create cache entry"; 1139 DLOG(WARNING) << "Unable to create cache entry";
1139 mode_ = NONE; 1140 mode_ = NONE;
Randy Smith (Not in Mondays) 2017/04/04 21:54:03 I presume this means we're transitioning into a mo
shivanisha 2017/04/07 23:24:13 done
1140 if (partial_) 1141 if (done_headers_) {
1141 partial_->RestoreHeaders(&custom_request_->extra_headers); 1142 TransitionToState(STATE_OVERWRITE_CACHED_RESPONSE);
1142 TransitionToState(STATE_SEND_REQUEST); 1143 } else {
1144 if (partial_)
1145 partial_->RestoreHeaders(&custom_request_->extra_headers);
1146 TransitionToState(STATE_SEND_REQUEST);
1147 }
1143 } 1148 }
1144 return OK; 1149 return OK;
1145 } 1150 }
1146 1151
1147 int HttpCache::Transaction::DoAddToEntry() { 1152 int HttpCache::Transaction::DoAddToEntry() {
1148 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntry"); 1153 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntry");
1149 DCHECK(new_entry_); 1154 DCHECK(new_entry_);
1150 cache_pending_ = true; 1155 cache_pending_ = true;
1151 TransitionToState(STATE_ADD_TO_ENTRY_COMPLETE); 1156 TransitionToState(STATE_ADD_TO_ENTRY_COMPLETE);
1152 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY); 1157 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 entry_lock_waiting_since_ = TimeTicks(); 1205 entry_lock_waiting_since_ = TimeTicks();
1201 DCHECK(new_entry_); 1206 DCHECK(new_entry_);
1202 cache_pending_ = false; 1207 cache_pending_ = false;
1203 1208
1204 if (result == OK) 1209 if (result == OK)
1205 entry_ = new_entry_; 1210 entry_ = new_entry_;
1206 1211
1207 // If there is a failure, the cache should have taken care of new_entry_. 1212 // If there is a failure, the cache should have taken care of new_entry_.
1208 new_entry_ = NULL; 1213 new_entry_ = NULL;
1209 1214
1215 // If this entry creation was a result of validation not matching, then this
1216 // transaction should be the headers_transaction.
1217 if (done_headers_) {
1218 DCHECK_EQ(result, OK);
1219 DCHECK_EQ(entry_->headers_transaction, this);
1220 TransitionToState(STATE_OVERWRITE_CACHED_RESPONSE);
1221 return OK;
1222 }
1223
1210 if (result == ERR_CACHE_RACE) { 1224 if (result == ERR_CACHE_RACE) {
1211 TransitionToState(STATE_INIT_ENTRY); 1225 TransitionToState(STATE_INIT_ENTRY);
1212 return OK; 1226 return OK;
1213 } 1227 }
1214 1228
1215 if (result == ERR_CACHE_LOCK_TIMEOUT) { 1229 if (result == ERR_CACHE_LOCK_TIMEOUT) {
1216 if (mode_ == READ) { 1230 if (mode_ == READ) {
1217 TransitionToState(STATE_NONE); 1231 TransitionToState(STATE_NONE);
1218 return ERR_CACHE_MISS; 1232 return ERR_CACHE_MISS;
1219 } 1233 }
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 if (mode_ == READ_WRITE || mode_ == UPDATE) { 1610 if (mode_ == READ_WRITE || mode_ == UPDATE) {
1597 if (new_response->headers->response_code() == 304 || handling_206_) { 1611 if (new_response->headers->response_code() == 304 || handling_206_) {
1598 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_VALIDATED); 1612 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_VALIDATED);
1599 TransitionToState(STATE_UPDATE_CACHED_RESPONSE); 1613 TransitionToState(STATE_UPDATE_CACHED_RESPONSE);
1600 return OK; 1614 return OK;
1601 } 1615 }
1602 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_UPDATED); 1616 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_UPDATED);
1603 mode_ = WRITE; 1617 mode_ = WRITE;
1604 } 1618 }
1605 1619
1606 TransitionToState(STATE_OVERWRITE_CACHED_RESPONSE); 1620 if (!entry_) {
Randy Smith (Not in Mondays) 2017/04/04 21:54:03 Could this conditional be more succinctly implemen
shivanisha 2017/04/07 23:24:13 N/A now that this code is implemented in DoCacheWr
1607 1621 TransitionToState(STATE_OVERWRITE_CACHED_RESPONSE);
1608 if (!entry_)
1609 return OK; 1622 return OK;
1623 }
1610 1624
1611 // Invalidate any current entry with a successful response if this transaction 1625 // Invalidate any current entry with a successful response if this transaction
1612 // cannot write to this entry. 1626 // cannot write to this entry.
1613 if (new_response->headers->response_code() != 304 && 1627 if (new_response->headers->response_code() != 304 &&
1614 (entry_->writer || !entry_->readers.empty())) { 1628 (entry_->writer || !entry_->readers.empty())) {
1615 DCHECK_EQ(entry_->headers_transaction, this); 1629 DCHECK_EQ(entry_->headers_transaction, this);
1616 cache_->DoneResponseHeaders(entry_, this, false); 1630 cache_->DoneResponseHeaders(entry_, this, false);
1617 entry_ = nullptr; 1631 entry_ = nullptr;
1618 mode_ = NONE; 1632 TransitionToState(STATE_CREATE_ENTRY);
Randy Smith (Not in Mondays) 2017/04/04 21:54:03 As I understand the logic that follows on from thi
shivanisha 2017/04/07 23:24:13 Note that the state OVERWRITE_CACHED_RESPONSE bein
1633 done_headers_ = true;
1619 return OK; 1634 return OK;
1620 } 1635 }
1621 1636
1637 TransitionToState(STATE_OVERWRITE_CACHED_RESPONSE);
1622 return OK; 1638 return OK;
1623 } 1639 }
1624 1640
1625 // We received 304 or 206 and we want to update the cached response headers. 1641 // We received 304 or 206 and we want to update the cached response headers.
1626 int HttpCache::Transaction::DoUpdateCachedResponse() { 1642 int HttpCache::Transaction::DoUpdateCachedResponse() {
1627 TRACE_EVENT0("io", "HttpCacheTransaction::DoUpdateCachedResponse"); 1643 TRACE_EVENT0("io", "HttpCacheTransaction::DoUpdateCachedResponse");
1628 int rv = OK; 1644 int rv = OK;
1629 // Update the cached response based on the headers and properties of 1645 // Update the cached response based on the headers and properties of
1630 // new_response_. 1646 // new_response_.
1631 response_.headers->Update(*new_response_->headers.get()); 1647 response_.headers->Update(*new_response_->headers.get());
(...skipping 1599 matching lines...) Expand 10 before | Expand all | Expand 10 after
3231 } 3247 }
3232 3248
3233 void HttpCache::Transaction::TransitionToState(State state) { 3249 void HttpCache::Transaction::TransitionToState(State state) {
3234 // Ensure that the state is only set once per Do* state. 3250 // Ensure that the state is only set once per Do* state.
3235 DCHECK(in_do_loop_); 3251 DCHECK(in_do_loop_);
3236 DCHECK_EQ(STATE_UNSET, next_state_) << "Next state is " << state; 3252 DCHECK_EQ(STATE_UNSET, next_state_) << "Next state is " << state;
3237 next_state_ = state; 3253 next_state_ = state;
3238 } 3254 }
3239 3255
3240 } // namespace net 3256 } // namespace net
OLDNEW
« net/http/http_cache_transaction.h ('K') | « net/http/http_cache_transaction.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698