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

Unified Diff: net/socket/client_socket_pool_base.cc

Issue 1898133002: Add reprioritization to socket pools. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Test for not propagating priority in HttpStreamFactoryImpl::Job if the stream's been returned alrea… Created 3 years, 12 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
Index: net/socket/client_socket_pool_base.cc
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index 252ca294d4c76536297089003726cca5dac043d1..530fb14b4ac885c232869674897947c9c8ca0fa2 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -305,7 +305,7 @@ void ClientSocketPoolBaseHelper::RemoveHigherLayeredPool(
int ClientSocketPoolBaseHelper::RequestSocket(
const std::string& group_name,
- std::unique_ptr<const Request> request) {
+ std::unique_ptr<Request> request) {
CHECK(!request->callback().is_null());
CHECK(request->handle());
@@ -562,6 +562,20 @@ void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest(
connect_job_source.ToEventParametersCallback());
}
+void ClientSocketPoolBaseHelper::SetPriority(const std::string& group_name,
+ ClientSocketHandle* handle,
+ RequestPriority priority) {
+ GroupMap::iterator group_it = group_map_.find(group_name);
+ if (group_it == group_map_.end()) {
+ DCHECK(base::ContainsKey(pending_callback_map_, handle));
+ // The Request has already completed and been destroyed; nothing to
+ // reprioritize.
+ return;
mmenke 2017/01/03 22:51:22 Per earlier comment, the ClientSocketHandle knows
Randy Smith (Not in Mondays) 2017/01/05 03:47:18 I'm embarrassed to say that when I first read your
+ }
+
+ group_it->second->SetPriority(handle, priority);
+}
+
void ClientSocketPoolBaseHelper::CancelRequest(
const std::string& group_name, ClientSocketHandle* handle) {
PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle);
@@ -582,8 +596,7 @@ void ClientSocketPoolBaseHelper::CancelRequest(
Group* group = GetOrCreateGroup(group_name);
// Search pending_requests for matching handle.
- std::unique_ptr<const Request> request =
- group->FindAndRemovePendingRequest(handle);
+ std::unique_ptr<Request> request = group->FindAndRemovePendingRequest(handle);
if (request) {
request->net_log().AddEvent(NetLogEventType::CANCELLED);
request->net_log().EndEvent(NetLogEventType::SOCKET_POOL);
@@ -947,7 +960,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
if (result == OK) {
DCHECK(socket.get());
RemoveConnectJob(job, group);
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (request) {
LogBoundConnectJobToRequest(job_log.source(), *request);
HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED,
@@ -964,7 +977,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
// If we got a socket, it must contain error information so pass that
// up so that the caller can retrieve it.
bool handed_out_socket = false;
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (request) {
LogBoundConnectJobToRequest(job_log.source(), *request);
job->GetAdditionalErrorState(request->handle());
@@ -1033,7 +1046,7 @@ void ClientSocketPoolBaseHelper::ProcessPendingRequest(
int rv = RequestSocketInternal(group_name, *next_request);
if (rv != ERR_IO_PENDING) {
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
DCHECK(request);
if (group->IsEmpty())
RemoveGroup(group_name);
@@ -1120,7 +1133,7 @@ void ClientSocketPoolBaseHelper::CancelAllRequestsWithError(int error) {
Group* group = i->second;
while (true) {
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (!request)
break;
InvokeUserCallbackLater(request->handle(), request->callback(), error);
@@ -1363,7 +1376,7 @@ bool ClientSocketPoolBaseHelper::Group::HasConnectJobForHandle(
}
void ClientSocketPoolBaseHelper::Group::InsertPendingRequest(
- std::unique_ptr<const Request> request) {
+ std::unique_ptr<Request> request) {
// This value must be cached before we release |request|.
RequestPriority priority = request->priority();
if (request->respect_limits() == ClientSocketPool::RespectLimits::DISABLED) {
@@ -1377,33 +1390,59 @@ void ClientSocketPoolBaseHelper::Group::InsertPendingRequest(
}
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::PopNextPendingRequest() {
if (pending_requests_.empty())
- return std::unique_ptr<const ClientSocketPoolBaseHelper::Request>();
+ return std::unique_ptr<ClientSocketPoolBaseHelper::Request>();
return RemovePendingRequest(pending_requests_.FirstMax());
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::FindAndRemovePendingRequest(
ClientSocketHandle* handle) {
for (RequestQueue::Pointer pointer = pending_requests_.FirstMax();
!pointer.is_null();
pointer = pending_requests_.GetNextTowardsLastMin(pointer)) {
if (pointer.value()->handle() == handle) {
- std::unique_ptr<const Request> request = RemovePendingRequest(pointer);
+ std::unique_ptr<Request> request = RemovePendingRequest(pointer);
return request;
}
}
- return std::unique_ptr<const ClientSocketPoolBaseHelper::Request>();
+ return std::unique_ptr<ClientSocketPoolBaseHelper::Request>();
+}
+
+void ClientSocketPoolBaseHelper::Group::SetPriority(ClientSocketHandle* handle,
+ RequestPriority priority) {
+ for (RequestQueue::Pointer pointer = pending_requests_.FirstMax();
+ !pointer.is_null();
+ pointer = pending_requests_.GetNextTowardsLastMin(pointer)) {
+ if (pointer.value()->handle() == handle) {
+ if (pointer.priority() == priority)
+ return;
+
+ std::unique_ptr<Request> request = RemovePendingRequest(pointer);
+
+ // Requests that ignore limits much be created and remain at the highest
+ // priority, and should not be reprioritized.
+ DCHECK_EQ(request->respect_limits(),
+ ClientSocketPool::RespectLimits::ENABLED);
+
+ request->set_priority(priority);
+ InsertPendingRequest(std::move(request));
+ return;
+ }
+ }
mmenke 2017/01/03 22:51:22 This entire block is just: std::unique_ptr<Reques
Randy Smith (Not in Mondays) 2017/01/05 03:47:18 The entire reason for this code is indeed the case
Randy Smith (Not in Mondays) 2017/01/13 23:05:44 Ping?
mmenke 2017/01/17 18:56:31 Sorry, I was thinking the early return was a break
Randy Smith (Not in Mondays) 2017/01/17 19:50:36 So I'm quite happy to do #3; I changed it to this
Charlie Harrison 2017/01/17 20:04:39 I am OK with #3 as long as it is documented clearl
mmenke 2017/01/17 20:11:28 Could also do a DLOG(WARNING), though if DLOG's ar
+
+ // This function must be called with a valid ClientSocketHandle.
+ NOTREACHED();
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::RemovePendingRequest(
const RequestQueue::Pointer& pointer) {
// TODO(eroman): Temporary for debugging http://crbug.com/467797.
CHECK(!pointer.is_null());
- std::unique_ptr<const Request> request(pointer.value());
+ std::unique_ptr<Request> request(pointer.value());
pending_requests_.Erase(pointer);
// If there are no more requests, kill the backup timer.
if (pending_requests_.empty())

Powered by Google App Engine
This is Rietveld 408576698