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

Unified Diff: net/http/http_network_transaction.cc

Issue 1901533002: Implementation of network level throttler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated latest round of comments." . 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_network_transaction.h ('k') | net/http/http_network_transaction_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_network_transaction.cc
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 6414180bfc3747ae240e275b5b500e36b61688aa..5480e60597d77d719fd6bb312d4c7984d78269ae 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -161,7 +161,7 @@ int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info,
if (request_->load_flags & LOAD_PREFETCH)
response_.unused_since_prefetch = true;
- next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
+ next_state_ = STATE_THROTTLE;
int rv = DoLoop(OK);
if (rv == ERR_IO_PENDING)
callback_ = callback;
@@ -379,6 +379,8 @@ LoadState HttpNetworkTransaction::GetLoadState() const {
// TODO(wtc): Define a new LoadState value for the
// STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request.
switch (next_state_) {
+ case STATE_THROTTLE_COMPLETE:
+ return LOAD_STATE_THROTTLED;
case STATE_CREATE_STREAM:
return LOAD_STATE_WAITING_FOR_DELEGATE;
case STATE_CREATE_STREAM_COMPLETE:
@@ -435,11 +437,18 @@ void HttpNetworkTransaction::PopulateNetErrorDetails(
}
void HttpNetworkTransaction::SetPriority(RequestPriority priority) {
+ const std::string priority_string(RequestPriorityToString(priority));
Randy Smith (Not in Mondays) 2016/05/24 21:38:50 I don't intend the above code to be what lands (wh
mmenke 2016/05/24 21:52:50 I think you mean takes a RequestPriority, not a ch
mmenke 2016/05/24 22:59:52 Actually, you can just use an int called "priority
Randy Smith (Not in Mondays) 2016/05/24 23:20:30 Ok, I'll take your word for it, but FWIW, I looked
mmenke 2016/05/25 15:32:15 Oops, looks like you're right about this! It's ne
Randy Smith (Not in Mondays) 2016/05/25 16:57:48 I'm amused by how resistant I feel removing it, bu
+ net_log_.AddEvent(NetLog::TYPE_HTTP_TRANSACTION_SET_PRIORITY,
+ NetLog::StringCallback("priority", &priority_string));
+
priority_ = priority;
if (stream_request_)
stream_request_->SetPriority(priority);
if (stream_)
stream_->SetPriority(priority);
Randy Smith (Not in Mondays) 2016/05/24 21:38:50 I find myself worried about the future, if we ever
mmenke 2016/05/24 21:52:50 Very good point. I think only one of these should
Randy Smith (Not in Mondays) 2016/05/24 23:20:30 *nod* I'll put a comment here noting potential fu
+ if (throttle_)
+ throttle_->SetPriority(priority);
+ // The above call may have resulted in deleting |*this|.
}
void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper(
@@ -595,6 +604,17 @@ void HttpNetworkTransaction::GetConnectionAttempts(
*out = connection_attempts_;
}
+void HttpNetworkTransaction::OnThrottleStateChanged() {
+ // TODO(rdsmith): This DCHECK is dependent on the throttle state
+ // initializing as throttled only transition from throttled->unthrottled.
+ // That is true right now, but may not be so in the future.
+ DCHECK_EQ(STATE_THROTTLE_COMPLETE, next_state_);
+
+ net_log_.EndEvent(NetLog::TYPE_HTTP_TRANSACTION_THROTTLED);
+
+ DoLoop(OK);
+}
+
bool HttpNetworkTransaction::IsSecureRequest() const {
return request_->url.SchemeIsCryptographic();
}
@@ -665,6 +685,14 @@ int HttpNetworkTransaction::DoLoop(int result) {
State state = next_state_;
next_state_ = STATE_NONE;
switch (state) {
+ case STATE_THROTTLE:
+ DCHECK_EQ(OK, rv);
+ rv = DoThrottle();
+ break;
+ case STATE_THROTTLE_COMPLETE:
+ DCHECK_EQ(OK, rv);
+ rv = DoThrottleComplete();
+ break;
case STATE_NOTIFY_BEFORE_CREATE_STREAM:
DCHECK_EQ(OK, rv);
rv = DoNotifyBeforeCreateStream();
@@ -776,6 +804,28 @@ int HttpNetworkTransaction::DoLoop(int result) {
return rv;
}
+int HttpNetworkTransaction::DoThrottle() {
+ throttle_ = session_->throttler()->CreateThrottle(
+ this, priority_, (request_->load_flags & LOAD_IGNORE_LIMITS) != 0);
+ next_state_ = STATE_THROTTLE_COMPLETE;
+
+ if (throttle_->IsThrottled()) {
+ net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_THROTTLED);
+ return ERR_IO_PENDING;
+ }
+
+ return OK;
+}
+
+int HttpNetworkTransaction::DoThrottleComplete() {
+ DCHECK(throttle_);
+ DCHECK(!throttle_->IsThrottled());
+
+ next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
+
+ return OK;
+}
+
int HttpNetworkTransaction::DoNotifyBeforeCreateStream() {
next_state_ = STATE_CREATE_STREAM;
bool defer = false;
« no previous file with comments | « net/http/http_network_transaction.h ('k') | net/http/http_network_transaction_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698