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

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: Rebased with parent branch 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 (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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 mode_(NONE), 158 mode_(NONE),
159 original_mode_(NONE), 159 original_mode_(NONE),
160 reading_(false), 160 reading_(false),
161 invalid_range_(false), 161 invalid_range_(false),
162 truncated_(false), 162 truncated_(false),
163 is_sparse_(false), 163 is_sparse_(false),
164 range_requested_(false), 164 range_requested_(false),
165 handling_206_(false), 165 handling_206_(false),
166 cache_pending_(false), 166 cache_pending_(false),
167 done_reading_(false), 167 done_reading_(false),
168 done_headers_create_new_entry_(false),
168 vary_mismatch_(false), 169 vary_mismatch_(false),
169 couldnt_conditionalize_request_(false), 170 couldnt_conditionalize_request_(false),
170 bypass_lock_for_test_(false), 171 bypass_lock_for_test_(false),
171 fail_conditionalization_for_test_(false), 172 fail_conditionalization_for_test_(false),
172 io_buf_len_(0), 173 io_buf_len_(0),
173 read_offset_(0), 174 read_offset_(0),
174 effective_load_flags_(0), 175 effective_load_flags_(0),
175 write_len_(0), 176 write_len_(0),
176 cache_entry_status_(CacheEntryStatus::ENTRY_UNDEFINED), 177 cache_entry_status_(CacheEntryStatus::ENTRY_UNDEFINED),
177 validation_cause_(VALIDATION_CAUSE_UNDEFINED), 178 validation_cause_(VALIDATION_CAUSE_UNDEFINED),
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 case STATE_CREATE_ENTRY_COMPLETE: 748 case STATE_CREATE_ENTRY_COMPLETE:
748 rv = DoCreateEntryComplete(rv); 749 rv = DoCreateEntryComplete(rv);
749 break; 750 break;
750 case STATE_ADD_TO_ENTRY: 751 case STATE_ADD_TO_ENTRY:
751 DCHECK_EQ(OK, rv); 752 DCHECK_EQ(OK, rv);
752 rv = DoAddToEntry(); 753 rv = DoAddToEntry();
753 break; 754 break;
754 case STATE_ADD_TO_ENTRY_COMPLETE: 755 case STATE_ADD_TO_ENTRY_COMPLETE:
755 rv = DoAddToEntryComplete(rv); 756 rv = DoAddToEntryComplete(rv);
756 break; 757 break;
758 case STATE_DONE_HEADERS_ADD_TO_ENTRY_COMPLETE:
759 rv = DoDoneHeadersAddToEntryComplete(rv);
760 break;
757 case STATE_CACHE_READ_RESPONSE: 761 case STATE_CACHE_READ_RESPONSE:
758 DCHECK_EQ(OK, rv); 762 DCHECK_EQ(OK, rv);
759 rv = DoCacheReadResponse(); 763 rv = DoCacheReadResponse();
760 break; 764 break;
761 case STATE_CACHE_READ_RESPONSE_COMPLETE: 765 case STATE_CACHE_READ_RESPONSE_COMPLETE:
762 rv = DoCacheReadResponseComplete(rv); 766 rv = DoCacheReadResponseComplete(rv);
763 break; 767 break;
764 case STATE_TOGGLE_UNUSED_SINCE_PREFETCH: 768 case STATE_TOGGLE_UNUSED_SINCE_PREFETCH:
765 DCHECK_EQ(OK, rv); 769 DCHECK_EQ(OK, rv);
766 rv = DoCacheToggleUnusedSincePrefetch(); 770 rv = DoCacheToggleUnusedSincePrefetch();
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 // transaction attached. 1026 // transaction attached.
1023 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_OPEN_ENTRY, 1027 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_OPEN_ENTRY,
1024 result); 1028 result);
1025 cache_pending_ = false; 1029 cache_pending_ = false;
1026 if (result == OK) { 1030 if (result == OK) {
1027 TransitionToState(STATE_ADD_TO_ENTRY); 1031 TransitionToState(STATE_ADD_TO_ENTRY);
1028 return OK; 1032 return OK;
1029 } 1033 }
1030 1034
1031 if (result == ERR_CACHE_RACE) { 1035 if (result == ERR_CACHE_RACE) {
1032 TransitionToState(STATE_HEADERS_PHASE_CANNOT_PROCEED); 1036 TransitionToState(STATE_INIT_ENTRY);
1033 return OK; 1037 return OK;
1034 } 1038 }
1035 1039
1036 if (request_->method == "PUT" || request_->method == "DELETE" || 1040 if (request_->method == "PUT" || request_->method == "DELETE" ||
1037 (request_->method == "HEAD" && mode_ == READ_WRITE)) { 1041 (request_->method == "HEAD" && mode_ == READ_WRITE)) {
1038 DCHECK(mode_ == READ_WRITE || mode_ == WRITE || request_->method == "HEAD"); 1042 DCHECK(mode_ == READ_WRITE || mode_ == WRITE || request_->method == "HEAD");
1039 mode_ = NONE; 1043 mode_ = NONE;
1040 TransitionToState(STATE_SEND_REQUEST); 1044 TransitionToState(STATE_SEND_REQUEST);
1041 return OK; 1045 return OK;
1042 } 1046 }
(...skipping 24 matching lines...) Expand all
1067 first_cache_access_since_ = TimeTicks::Now(); 1071 first_cache_access_since_ = TimeTicks::Now();
1068 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_DOOM_ENTRY); 1072 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_DOOM_ENTRY);
1069 return cache_->DoomEntry(cache_key_, this); 1073 return cache_->DoomEntry(cache_key_, this);
1070 } 1074 }
1071 1075
1072 int HttpCache::Transaction::DoDoomEntryComplete(int result) { 1076 int HttpCache::Transaction::DoDoomEntryComplete(int result) {
1073 TRACE_EVENT0("io", "HttpCacheTransaction::DoDoomEntryComplete"); 1077 TRACE_EVENT0("io", "HttpCacheTransaction::DoDoomEntryComplete");
1074 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_DOOM_ENTRY, 1078 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_DOOM_ENTRY,
1075 result); 1079 result);
1076 cache_pending_ = false; 1080 cache_pending_ = false;
1077 TransitionToState(result == ERR_CACHE_RACE 1081
1078 ? STATE_HEADERS_PHASE_CANNOT_PROCEED 1082 TransitionToState(result == ERR_CACHE_RACE ? STATE_INIT_ENTRY
1079 : STATE_CREATE_ENTRY); 1083 : STATE_CREATE_ENTRY);
1080 return OK; 1084 return OK;
1081 } 1085 }
1082 1086
1083 int HttpCache::Transaction::DoCreateEntry() { 1087 int HttpCache::Transaction::DoCreateEntry() {
1084 TRACE_EVENT0("io", "HttpCacheTransaction::DoCreateEntry"); 1088 TRACE_EVENT0("io", "HttpCacheTransaction::DoCreateEntry");
1085 DCHECK(!new_entry_); 1089 DCHECK(!new_entry_);
1086 TransitionToState(STATE_CREATE_ENTRY_COMPLETE); 1090 TransitionToState(STATE_CREATE_ENTRY_COMPLETE);
1087 cache_pending_ = true; 1091 cache_pending_ = true;
1088 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_CREATE_ENTRY); 1092 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_CREATE_ENTRY);
1089 return cache_->CreateEntry(cache_key_, &new_entry_, this); 1093 return cache_->CreateEntry(cache_key_, &new_entry_, this);
1090 } 1094 }
1091 1095
1092 int HttpCache::Transaction::DoCreateEntryComplete(int result) { 1096 int HttpCache::Transaction::DoCreateEntryComplete(int result) {
1093 TRACE_EVENT0("io", "HttpCacheTransaction::DoCreateEntryComplete"); 1097 TRACE_EVENT0("io", "HttpCacheTransaction::DoCreateEntryComplete");
1094 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is 1098 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is
1095 // OK, otherwise the cache will end up with an active entry without any 1099 // OK, otherwise the cache will end up with an active entry without any
1096 // transaction attached. 1100 // transaction attached.
1097 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_CREATE_ENTRY, 1101 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_CREATE_ENTRY,
1098 result); 1102 result);
1099 cache_pending_ = false; 1103 cache_pending_ = false;
1100 switch (result) { 1104 switch (result) {
1101 case OK: 1105 case OK:
1102 TransitionToState(STATE_ADD_TO_ENTRY); 1106 TransitionToState(STATE_ADD_TO_ENTRY);
1103 break; 1107 break;
1104 1108
1105 case ERR_CACHE_RACE: 1109 case ERR_CACHE_RACE:
1106 TransitionToState(STATE_HEADERS_PHASE_CANNOT_PROCEED); 1110 TransitionToState(STATE_INIT_ENTRY);
1107 break; 1111 break;
1108 1112
1109 default: 1113 default:
1110 // We have a race here: Maybe we failed to open the entry and decided to 1114 // We have a race here: Maybe we failed to open the entry and decided to
1111 // create one, but by the time we called create, another transaction 1115 // create one, but by the time we called create, another transaction
1112 // already created the entry. If we want to eliminate this issue, we 1116 // already created the entry. If we want to eliminate this issue, we
1113 // need an atomic OpenOrCreate() method exposed by the disk cache. 1117 // need an atomic OpenOrCreate() method exposed by the disk cache.
1114 DLOG(WARNING) << "Unable to create cache entry"; 1118 DLOG(WARNING) << "Unable to create cache entry";
1119 // Switching into passing through data directly from the network, avoiding
1120 // the cache entry.
1115 mode_ = NONE; 1121 mode_ = NONE;
1116 if (partial_) 1122
1117 partial_->RestoreHeaders(&custom_request_->extra_headers); 1123 if (!done_headers_create_new_entry_) {
1118 TransitionToState(STATE_SEND_REQUEST); 1124 if (partial_)
1125 partial_->RestoreHeaders(&custom_request_->extra_headers);
1126 TransitionToState(STATE_SEND_REQUEST);
1127 return OK;
1128 }
1129
1130 // The headers have already been received as a result of validation,
1131 // triggering the doom of the old entry. So no network request needs to
1132 // be sent. Note that since mode_ is set to pass-through, response will
1133 // not be written to the cache but moving to state
1134 // STATE_CACHE_WRITE_RESPONSE for consistency.
1135 done_headers_create_new_entry_ = false;
1136 TransitionToState(STATE_CACHE_WRITE_RESPONSE);
1119 } 1137 }
1120 return OK; 1138 return OK;
1121 } 1139 }
1122 1140
1123 int HttpCache::Transaction::DoAddToEntry() { 1141 int HttpCache::Transaction::DoAddToEntry() {
1124 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntry"); 1142 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntry");
1125 DCHECK(new_entry_); 1143 DCHECK(new_entry_);
1126 cache_pending_ = true; 1144 cache_pending_ = true;
1127 TransitionToState(STATE_ADD_TO_ENTRY_COMPLETE);
1128 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY); 1145 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY);
1129 DCHECK(entry_lock_waiting_since_.is_null()); 1146 DCHECK(entry_lock_waiting_since_.is_null());
1147 int rv = cache_->AddTransactionToEntry(new_entry_, this);
1148 DCHECK_EQ(rv, ERR_IO_PENDING);
1149
1150 if (done_headers_create_new_entry_) {
1151 TransitionToState(STATE_DONE_HEADERS_ADD_TO_ENTRY_COMPLETE);
Randy Smith (Not in Mondays) 2017/04/27 17:47:12 It's my belief that short-circuiting all the logic
shivanisha 2017/05/31 15:51:47 Added a comment.
1152 return rv;
1153 }
1154
1155 TransitionToState(STATE_ADD_TO_ENTRY_COMPLETE);
1156
1130 entry_lock_waiting_since_ = TimeTicks::Now(); 1157 entry_lock_waiting_since_ = TimeTicks::Now();
1131 int rv = cache_->AddTransactionToEntry(new_entry_, this); 1158
1132 if (rv == ERR_IO_PENDING) { 1159 if (bypass_lock_for_test_) {
1133 if (bypass_lock_for_test_) { 1160 base::ThreadTaskRunnerHandle::Get()->PostTask(
1134 base::ThreadTaskRunnerHandle::Get()->PostTask( 1161 FROM_HERE,
1135 FROM_HERE, 1162 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout,
1136 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout, 1163 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_));
1137 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_)); 1164 } else {
1138 } else { 1165 int timeout_milliseconds = 20 * 1000;
1139 int timeout_milliseconds = 20 * 1000; 1166 if (partial_ && new_entry_->writer &&
1140 if (partial_ && new_entry_->writer && 1167 new_entry_->writer->range_requested_) {
1141 new_entry_->writer->range_requested_) { 1168 // Quickly timeout and bypass the cache if we're a range request and
1142 // Quickly timeout and bypass the cache if we're a range request and 1169 // we're blocked by the reader/writer lock. Doing so eliminates a long
1143 // we're blocked by the reader/writer lock. Doing so eliminates a long 1170 // running issue, http://crbug.com/31014, where two of the same media
1144 // running issue, http://crbug.com/31014, where two of the same media 1171 // resources could not be played back simultaneously due to one locking
1145 // resources could not be played back simultaneously due to one locking 1172 // the cache entry until the entire video was downloaded.
1146 // the cache entry until the entire video was downloaded. 1173 //
1147 // 1174 // Bypassing the cache is not ideal, as we are now ignoring the cache
1148 // Bypassing the cache is not ideal, as we are now ignoring the cache 1175 // entirely for all range requests to a resource beyond the first. This
1149 // entirely for all range requests to a resource beyond the first. This 1176 // is however a much more succinct solution than the alternatives, which
1150 // is however a much more succinct solution than the alternatives, which 1177 // would require somewhat significant changes to the http caching logic.
1151 // would require somewhat significant changes to the http caching logic. 1178 //
1152 // 1179 // Allow some timeout slack for the entry addition to complete in case
1153 // Allow some timeout slack for the entry addition to complete in case 1180 // the writer lock is imminently released; we want to avoid skipping
1154 // the writer lock is imminently released; we want to avoid skipping 1181 // the cache if at all possible. See http://crbug.com/408765
1155 // the cache if at all possible. See http://crbug.com/408765 1182 timeout_milliseconds = 25;
1156 timeout_milliseconds = 25;
1157 }
1158 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
1159 FROM_HERE,
1160 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout,
1161 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_),
1162 TimeDelta::FromMilliseconds(timeout_milliseconds));
1163 } 1183 }
1184 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
1185 FROM_HERE,
1186 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout,
1187 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_),
1188 TimeDelta::FromMilliseconds(timeout_milliseconds));
1164 } 1189 }
1165 return rv; 1190 return rv;
1166 } 1191 }
1167 1192
1168 int HttpCache::Transaction::DoAddToEntryComplete(int result) { 1193 int HttpCache::Transaction::DoAddToEntryComplete(int result) {
1169 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntryComplete"); 1194 TRACE_EVENT0("io", "HttpCacheTransaction::DoAddToEntryComplete");
1170 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY, 1195 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY,
1171 result); 1196 result);
1172 const TimeDelta entry_lock_wait = 1197 const TimeDelta entry_lock_wait =
1173 TimeTicks::Now() - entry_lock_waiting_since_; 1198 TimeTicks::Now() - entry_lock_waiting_since_;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 partial_->RestoreHeaders(&custom_request_->extra_headers); 1246 partial_->RestoreHeaders(&custom_request_->extra_headers);
1222 TransitionToState(STATE_SEND_REQUEST); 1247 TransitionToState(STATE_SEND_REQUEST);
1223 } else { 1248 } else {
1224 // We have to read the headers from the cached entry. 1249 // We have to read the headers from the cached entry.
1225 DCHECK(mode_ & READ_META); 1250 DCHECK(mode_ & READ_META);
1226 TransitionToState(STATE_CACHE_READ_RESPONSE); 1251 TransitionToState(STATE_CACHE_READ_RESPONSE);
1227 } 1252 }
1228 return OK; 1253 return OK;
1229 } 1254 }
1230 1255
1256 int HttpCache::Transaction::DoDoneHeadersAddToEntryComplete(int result) {
1257 // This state is reached when |this| has already completed validation leading
1258 // to a no-match with original entry which was doomed and |new_entry_| was
1259 // created. |this| transaction should thus go ahead and write the response to
1260 // the newly created entry.
Randy Smith (Not in Mondays) 2017/04/27 17:47:12 Preface second sentence with something like "A res
shivanisha 2017/05/31 15:51:47 Done
1261 DCHECK_EQ(result, OK);
1262 DCHECK(mode_ & WRITE);
1263 DCHECK(new_entry_);
1264 DCHECK(response_.headers);
1265
1266 cache_pending_ = false;
1267 entry_ = new_entry_;
1268 done_headers_create_new_entry_ = false;
1269 bool is_match = response_.headers->response_code() == 304;
1270 DCHECK(cache_->CanTransactionWriteResponseHeaders(entry_, this, is_match));
1271 TransitionToState(STATE_CACHE_WRITE_RESPONSE);
1272 return OK;
1273 }
1274
1231 int HttpCache::Transaction::DoCacheReadResponse() { 1275 int HttpCache::Transaction::DoCacheReadResponse() {
1232 TRACE_EVENT0("io", "HttpCacheTransaction::DoCacheReadResponse"); 1276 TRACE_EVENT0("io", "HttpCacheTransaction::DoCacheReadResponse");
1233 DCHECK(entry_); 1277 DCHECK(entry_);
1234 TransitionToState(STATE_CACHE_READ_RESPONSE_COMPLETE); 1278 TransitionToState(STATE_CACHE_READ_RESPONSE_COMPLETE);
1235 1279
1236 io_buf_len_ = entry_->GetDataSize(kResponseInfoIndex, this); 1280 io_buf_len_ = entry_->GetDataSize(kResponseInfoIndex, this);
1237 read_buf_ = new IOBuffer(io_buf_len_); 1281 read_buf_ = new IOBuffer(io_buf_len_);
1238 1282
1239 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_INFO); 1283 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_INFO);
1240 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_.get(), 1284 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_.get(),
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1712 TransitionToState(STATE_CACHE_WRITE_RESPONSE_COMPLETE); 1756 TransitionToState(STATE_CACHE_WRITE_RESPONSE_COMPLETE);
1713 1757
1714 // Invalidate any current entry with a successful response if this transaction 1758 // Invalidate any current entry with a successful response if this transaction
1715 // cannot write to this entry. This transaction then continues to read from 1759 // cannot write to this entry. This transaction then continues to read from
1716 // the network without writing to the backend. 1760 // the network without writing to the backend.
1717 bool is_match = response_.headers->response_code() == 304; 1761 bool is_match = response_.headers->response_code() == 304;
1718 if (entry_ && response_.headers && 1762 if (entry_ && response_.headers &&
1719 !cache_->CanTransactionWriteResponseHeaders(entry_, this, is_match)) { 1763 !cache_->CanTransactionWriteResponseHeaders(entry_, this, is_match)) {
1720 cache_->DoneWritingToEntry(entry_, false, this); 1764 cache_->DoneWritingToEntry(entry_, false, this);
1721 entry_ = nullptr; 1765 entry_ = nullptr;
1722 mode_ = NONE; 1766 done_headers_create_new_entry_ = true;
1767
1768 // This transaction should not add itself to any other existing entry but
1769 // create a new entry. Going to state STATE_INIT_ENTRY will take care of
1770 // dooming if any other entry exists.
1771 mode_ = WRITE;
1772 next_state_ = STATE_INIT_ENTRY;
Randy Smith (Not in Mondays) 2017/04/27 17:47:12 nit: TransitionToState? (& move the TransitionToS
shivanisha 2017/05/31 15:51:47 done
1723 return OK; 1773 return OK;
1724 } 1774 }
1725 1775
1726 return WriteResponseInfoToEntry(truncated_); 1776 return WriteResponseInfoToEntry(truncated_);
1727 } 1777 }
1728 1778
1729 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { 1779 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) {
1730 TRACE_EVENT0("io", "HttpCacheTransaction::DoCacheWriteResponseComplete"); 1780 TRACE_EVENT0("io", "HttpCacheTransaction::DoCacheWriteResponseComplete");
1731 TransitionToState(STATE_TRUNCATE_CACHED_DATA); 1781 TransitionToState(STATE_TRUNCATE_CACHED_DATA);
1732 return OnWriteResponseInfoToEntryComplete(result); 1782 return OnWriteResponseInfoToEntryComplete(result);
(...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after
3114 } 3164 }
3115 3165
3116 void HttpCache::Transaction::TransitionToState(State state) { 3166 void HttpCache::Transaction::TransitionToState(State state) {
3117 // Ensure that the state is only set once per Do* state. 3167 // Ensure that the state is only set once per Do* state.
3118 DCHECK(in_do_loop_); 3168 DCHECK(in_do_loop_);
3119 DCHECK_EQ(STATE_UNSET, next_state_) << "Next state is " << state; 3169 DCHECK_EQ(STATE_UNSET, next_state_) << "Next state is " << state;
3120 next_state_ = state; 3170 next_state_ = state;
3121 } 3171 }
3122 3172
3123 } // namespace net 3173 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698