Commit fce715c8 authored by Lily Chen's avatar Lily Chen Committed by Commit Bot

Reland "Add reprioritization to SSLConnectJobs"

This reverts commit dc8c60c3.

Reason for revert: Bug causing crashes was fixed in https://crrev.com/c/1333135

Original change's description:
> Revert "Add reprioritization to SSLConnectJobs"
> 
> This reverts commit 8a9302e2.
> 
> Reason for revert: Causing flaky crashes in external/wpt/webusb/idlharness.https.any.worker.html
> 
> Original change's description:
> > Add reprioritization to SSLConnectJobs
> >
> > This change allows the priority of an SSLConnectJob to be changed. If
> > the reprioritization occurs while the job is establishing its underlying
> > connection, the priority change is also passed down to the lower-level
> > socket pool.
> >
> > Bug: 166689
> > Change-Id: I87d1e536846443901cc628423f4615c3ffa7542a
> > Reviewed-on: https://chromium-review.googlesource.com/c/1327423
> > Commit-Queue: Lily Chen <chlily@chromium.org>
> > Reviewed-by: Matt Menke <mmenke@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#606876}
> 
> TBR=mmenke@chromium.org,chlily@chromium.org
> 
> # Not skipping CQ checks because original CL landed > 1 day ago.
> 
> Bug: 166689, 904345
> Change-Id: I6458798e11d210258f2a26330548f1ca33eb6c90
> Reviewed-on: https://chromium-review.googlesource.com/c/1331139
> Reviewed-by: Matt Menke <mmenke@chromium.org>
> Commit-Queue: Lily Chen <chlily@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#607301}

TBR=mmenke@chromium.org,chlily@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 166689, 904345
Change-Id: I54fe803331be6fe3df534c0f6042bf0fb0057cbb
Reviewed-on: https://chromium-review.googlesource.com/c/1340824Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: Lily Chen <chlily@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608950}
parent 71a35d2e
...@@ -2017,11 +2017,13 @@ MockTransportClientSocketPool::MockConnectJob::MockConnectJob( ...@@ -2017,11 +2017,13 @@ MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
std::unique_ptr<StreamSocket> socket, std::unique_ptr<StreamSocket> socket,
ClientSocketHandle* handle, ClientSocketHandle* handle,
const SocketTag& socket_tag, const SocketTag& socket_tag,
CompletionOnceCallback callback) CompletionOnceCallback callback,
RequestPriority priority)
: socket_(std::move(socket)), : socket_(std::move(socket)),
handle_(handle), handle_(handle),
socket_tag_(socket_tag), socket_tag_(socket_tag),
user_callback_(std::move(callback)) {} user_callback_(std::move(callback)),
priority_(priority) {}
MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() = default; MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() = default;
...@@ -2107,8 +2109,8 @@ int MockTransportClientSocketPool::RequestSocket( ...@@ -2107,8 +2109,8 @@ int MockTransportClientSocketPool::RequestSocket(
std::unique_ptr<StreamSocket> socket = std::unique_ptr<StreamSocket> socket =
client_socket_factory_->CreateTransportClientSocket( client_socket_factory_->CreateTransportClientSocket(
AddressList(), NULL, net_log.net_log(), NetLogSource()); AddressList(), NULL, net_log.net_log(), NetLogSource());
MockConnectJob* job = new MockConnectJob(std::move(socket), handle, MockConnectJob* job = new MockConnectJob(
socket_tag, std::move(callback)); std::move(socket), handle, socket_tag, std::move(callback), priority);
job_list_.push_back(base::WrapUnique(job)); job_list_.push_back(base::WrapUnique(job));
handle->set_pool_id(1); handle->set_pool_id(1);
return job->Connect(); return job->Connect();
...@@ -2117,7 +2119,13 @@ int MockTransportClientSocketPool::RequestSocket( ...@@ -2117,7 +2119,13 @@ int MockTransportClientSocketPool::RequestSocket(
void MockTransportClientSocketPool::SetPriority(const std::string& group_name, void MockTransportClientSocketPool::SetPriority(const std::string& group_name,
ClientSocketHandle* handle, ClientSocketHandle* handle,
RequestPriority priority) { RequestPriority priority) {
// TODO: Implement. for (auto& job : job_list_) {
if (job->handle() == handle) {
job->set_priority(priority);
return;
}
}
NOTREACHED();
} }
void MockTransportClientSocketPool::CancelRequest(const std::string& group_name, void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
......
...@@ -1177,12 +1177,18 @@ class MockTransportClientSocketPool : public TransportClientSocketPool { ...@@ -1177,12 +1177,18 @@ class MockTransportClientSocketPool : public TransportClientSocketPool {
MockConnectJob(std::unique_ptr<StreamSocket> socket, MockConnectJob(std::unique_ptr<StreamSocket> socket,
ClientSocketHandle* handle, ClientSocketHandle* handle,
const SocketTag& socket_tag, const SocketTag& socket_tag,
CompletionOnceCallback callback); CompletionOnceCallback callback,
RequestPriority priority);
~MockConnectJob(); ~MockConnectJob();
int Connect(); int Connect();
bool CancelHandle(const ClientSocketHandle* handle); bool CancelHandle(const ClientSocketHandle* handle);
ClientSocketHandle* handle() const { return handle_; }
RequestPriority priority() const { return priority_; }
void set_priority(RequestPriority priority) { priority_ = priority; }
private: private:
void OnConnect(int rv); void OnConnect(int rv);
...@@ -1190,6 +1196,7 @@ class MockTransportClientSocketPool : public TransportClientSocketPool { ...@@ -1190,6 +1196,7 @@ class MockTransportClientSocketPool : public TransportClientSocketPool {
ClientSocketHandle* handle_; ClientSocketHandle* handle_;
const SocketTag socket_tag_; const SocketTag socket_tag_;
CompletionOnceCallback user_callback_; CompletionOnceCallback user_callback_;
RequestPriority priority_;
DISALLOW_COPY_AND_ASSIGN(MockConnectJob); DISALLOW_COPY_AND_ASSIGN(MockConnectJob);
}; };
...@@ -1203,6 +1210,11 @@ class MockTransportClientSocketPool : public TransportClientSocketPool { ...@@ -1203,6 +1210,11 @@ class MockTransportClientSocketPool : public TransportClientSocketPool {
RequestPriority last_request_priority() const { RequestPriority last_request_priority() const {
return last_request_priority_; return last_request_priority_;
} }
const std::vector<std::unique_ptr<MockConnectJob>>& requests() const {
return job_list_;
}
int release_count() const { return release_count_; } int release_count() const { return release_count_; }
int cancel_count() const { return cancel_count_; } int cancel_count() const { return cancel_count_; }
......
...@@ -429,6 +429,11 @@ int SSLConnectJob::ConnectInternal() { ...@@ -429,6 +429,11 @@ int SSLConnectJob::ConnectInternal() {
return DoLoop(OK); return DoLoop(OK);
} }
void SSLConnectJob::ChangePriorityInternal(RequestPriority priority) {
if (transport_socket_handle_)
transport_socket_handle_->SetPriority(priority);
}
SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory( SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
TransportClientSocketPool* transport_pool, TransportClientSocketPool* transport_pool,
SOCKSClientSocketPool* socks_pool, SOCKSClientSocketPool* socks_pool,
......
...@@ -151,6 +151,8 @@ class SSLConnectJob : public ConnectJob { ...@@ -151,6 +151,8 @@ class SSLConnectJob : public ConnectJob {
// Otherwise, it returns a net error code. // Otherwise, it returns a net error code.
int ConnectInternal() override; int ConnectInternal() override;
void ChangePriorityInternal(RequestPriority priority) override;
scoped_refptr<SSLSocketParams> params_; scoped_refptr<SSLSocketParams> params_;
TransportClientSocketPool* const transport_pool_; TransportClientSocketPool* const transport_pool_;
SOCKSClientSocketPool* const socks_pool_; SOCKSClientSocketPool* const socks_pool_;
......
...@@ -285,6 +285,7 @@ TEST_F(SSLClientSocketPoolTest, BasicDirect) { ...@@ -285,6 +285,7 @@ TEST_F(SSLClientSocketPoolTest, BasicDirect) {
EXPECT_THAT(rv, IsOk()); EXPECT_THAT(rv, IsOk());
EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.is_initialized());
EXPECT_TRUE(handle.socket()); EXPECT_TRUE(handle.socket());
EXPECT_EQ(MEDIUM, transport_socket_pool_.requests()[0]->priority());
TestLoadTimingInfo(handle); TestLoadTimingInfo(handle);
EXPECT_EQ(0u, handle.connection_attempts().size()); EXPECT_EQ(0u, handle.connection_attempts().size());
} }
...@@ -310,10 +311,40 @@ TEST_F(SSLClientSocketPoolTest, SetSocketRequestPriorityOnInitDirect) { ...@@ -310,10 +311,40 @@ TEST_F(SSLClientSocketPoolTest, SetSocketRequestPriorityOnInitDirect) {
ClientSocketPool::RespectLimits::ENABLED, ClientSocketPool::RespectLimits::ENABLED,
callback.callback(), pool_.get(), NetLogWithSource())); callback.callback(), pool_.get(), NetLogWithSource()));
EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); EXPECT_EQ(priority, transport_socket_pool_.last_request_priority());
EXPECT_EQ(priority, transport_socket_pool_.requests()[i]->priority());
handle.socket()->Disconnect(); handle.socket()->Disconnect();
} }
} }
// Test that the SSLConnectJob passes priority changes down to the transport
// socket pool (for the DIRECT case).
TEST_F(SSLClientSocketPoolTest, SetSocketRequestPriorityDirect) {
StaticSocketDataProvider data;
socket_factory_.AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(ASYNC, OK);
socket_factory_.AddSSLSocketDataProvider(&ssl);
CreatePool(true /* tcp pool */, false, false);
scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT);
ClientSocketHandle handle;
TestCompletionCallback callback;
int rv = handle.Init(kGroupName, params, MEDIUM, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_FALSE(handle.is_initialized());
EXPECT_FALSE(handle.socket());
EXPECT_EQ(MEDIUM, transport_socket_pool_.requests()[0]->priority());
pool_->SetPriority(kGroupName, &handle, LOWEST);
EXPECT_EQ(LOWEST, transport_socket_pool_.requests()[0]->priority());
EXPECT_THAT(callback.WaitForResult(), IsOk());
EXPECT_TRUE(handle.is_initialized());
EXPECT_TRUE(handle.socket());
}
TEST_F(SSLClientSocketPoolTest, BasicDirectAsync) { TEST_F(SSLClientSocketPoolTest, BasicDirectAsync) {
StaticSocketDataProvider data; StaticSocketDataProvider data;
socket_factory_.AddSocketDataProvider(&data); socket_factory_.AddSocketDataProvider(&data);
...@@ -524,6 +555,36 @@ TEST_F(SSLClientSocketPoolTest, SetTransportPriorityOnInitSOCKS) { ...@@ -524,6 +555,36 @@ TEST_F(SSLClientSocketPoolTest, SetTransportPriorityOnInitSOCKS) {
ClientSocketPool::RespectLimits::ENABLED, ClientSocketPool::RespectLimits::ENABLED,
callback.callback(), pool_.get(), NetLogWithSource())); callback.callback(), pool_.get(), NetLogWithSource()));
EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority());
EXPECT_EQ(HIGHEST, transport_socket_pool_.requests()[0]->priority());
}
// Test that the SSLConnectJob passes priority changes down to the transport
// socket pool (for the SOCKS_PROXY case).
TEST_F(SSLClientSocketPoolTest, SetTransportPrioritySOCKS) {
StaticSocketDataProvider data;
socket_factory_.AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(ASYNC, OK);
socket_factory_.AddSSLSocketDataProvider(&ssl);
CreatePool(false, true /* http proxy pool */, true /* socks pool */);
scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5);
ClientSocketHandle handle;
TestCompletionCallback callback;
int rv = handle.Init(kGroupName, params, MEDIUM, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_FALSE(handle.is_initialized());
EXPECT_FALSE(handle.socket());
EXPECT_EQ(MEDIUM, transport_socket_pool_.requests()[0]->priority());
pool_->SetPriority(kGroupName, &handle, LOWEST);
EXPECT_EQ(LOWEST, transport_socket_pool_.requests()[0]->priority());
EXPECT_THAT(callback.WaitForResult(), IsOk());
EXPECT_TRUE(handle.is_initialized());
EXPECT_TRUE(handle.socket());
} }
TEST_F(SSLClientSocketPoolTest, SOCKSBasicAsync) { TEST_F(SSLClientSocketPoolTest, SOCKSBasicAsync) {
...@@ -656,8 +717,13 @@ TEST_F(SSLClientSocketPoolTest, SetTransportPriorityOnInitHTTP) { ...@@ -656,8 +717,13 @@ TEST_F(SSLClientSocketPoolTest, SetTransportPriorityOnInitHTTP) {
ClientSocketPool::RespectLimits::ENABLED, ClientSocketPool::RespectLimits::ENABLED,
callback.callback(), pool_.get(), NetLogWithSource())); callback.callback(), pool_.get(), NetLogWithSource()));
EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority());
EXPECT_EQ(HIGHEST, transport_socket_pool_.requests()[0]->priority());
} }
// TODO(chlily): Test that the SSLConnectJob passes priority changes down to the
// transport socket pool (for the HTTP_PROXY case), once change priority is
// implemented for HttpProxyClientSocketPool.
TEST_F(SSLClientSocketPoolTest, HttpProxyBasicAsync) { TEST_F(SSLClientSocketPoolTest, HttpProxyBasicAsync) {
MockWrite writes[] = { MockWrite writes[] = {
MockWrite( MockWrite(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment