Yes definitely! We would want to test that a connection without any data
sent does not block subsequent requests when SSL is enabled.

On Thu, May 12, 2016 at 12:35 AM, Neil Conway <neil.con...@gmail.com> wrote:

> Would it be possible to write a unit test that reproduces the original
> problem? It should be pretty easy to repro, right?
>
> Neil
>
> On Thu, May 12, 2016 at 1:50 AM,  <bmah...@apache.org> wrote:
> > Repository: mesos
> > Updated Branches:
> >   refs/heads/master 95e670cd4 -> 28c085fca
> >
> >
> > Fixed a head-of-line blocking bug in libevent SSL socket.
> >
> > Currently, the `accept_queue` is used to store connected sockets.
> > However, we push socket futures into this queue *before* they
> > complete the SSL handshake or are downgraded. This means that
> > a future returned from the queue may remain pending. If the user
> > writes a `Socket::accept` loop consuming accepted sockets they
> > will experience head-of-line blocking while a slow handshake or
> > downgrade is in progress.
> >
> > Review: https://reviews.apache.org/r/47192
> >
> >
> > Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
> > Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/28c085fc
> > Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/28c085fc
> > Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/28c085fc
> >
> > Branch: refs/heads/master
> > Commit: 28c085fcad70de128d147b486264395318c4d1ec
> > Parents: 95e670c
> > Author: Benjamin Mahler <bmah...@apache.org>
> > Authored: Tue May 10 15:33:13 2016 -0700
> > Committer: Benjamin Mahler <bmah...@apache.org>
> > Committed: Wed May 11 16:50:33 2016 -0700
> >
> > ----------------------------------------------------------------------
> >  3rdparty/libprocess/src/libevent_ssl_socket.cpp | 17 ++++++++++++-----
> >  3rdparty/libprocess/src/libevent_ssl_socket.hpp | 10 +++++-----
> >  2 files changed, 17 insertions(+), 10 deletions(-)
> > ----------------------------------------------------------------------
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/28c085fc/3rdparty/libprocess/src/libevent_ssl_socket.cpp
> > ----------------------------------------------------------------------
> > diff --git a/3rdparty/libprocess/src/libevent_ssl_socket.cpp
> b/3rdparty/libprocess/src/libevent_ssl_socket.cpp
> > index b829e7d..2f844c2 100644
> > --- a/3rdparty/libprocess/src/libevent_ssl_socket.cpp
> > +++ b/3rdparty/libprocess/src/libevent_ssl_socket.cpp
> > @@ -843,8 +843,9 @@ Future<Socket> LibeventSSLSocketImpl::accept()
> >    // We explicitly specify the return type to avoid a type deduction
> >    // issue in some versions of clang. See MESOS-2943.
> >    return accept_queue.get()
> > -    .then([](const Future<Socket>& future) -> Future<Socket> {
> > -      return future;
> > +    .then([](const Future<Socket>& socket) -> Future<Socket> {
> > +      CHECK(!socket.isPending());
> > +      return socket;
> >      });
> >  }
> >
> > @@ -920,9 +921,15 @@ void
> LibeventSSLSocketImpl::accept_callback(AcceptRequest* request)
> >  {
> >    CHECK(__in_event_loop__);
> >
> > -  // Enqueue a potential socket that we will set up SSL state for and
> > -  // verify.
> > -  accept_queue.put(request->promise.future());
> > +  Queue<Future<Socket>> accept_queue_ = accept_queue;
> > +
> > +  // After the socket is accepted, it must complete the SSL
> > +  // handshake (or be downgraded to a regular socket) before
> > +  // we put it in the queue of connected sockets.
> > +  request->promise.future()
> > +    .onAny([accept_queue_](Future<Socket> socket) mutable {
> > +      accept_queue_.put(socket);
> > +    });
> >
> >    // If we support downgrading the connection, first wait for this
> >    // socket to become readable. We will then MSG_PEEK it to test
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/28c085fc/3rdparty/libprocess/src/libevent_ssl_socket.hpp
> > ----------------------------------------------------------------------
> > diff --git a/3rdparty/libprocess/src/libevent_ssl_socket.hpp
> b/3rdparty/libprocess/src/libevent_ssl_socket.hpp
> > index e773fad..9b6ba64 100644
> > --- a/3rdparty/libprocess/src/libevent_ssl_socket.hpp
> > +++ b/3rdparty/libprocess/src/libevent_ssl_socket.hpp
> > @@ -170,11 +170,11 @@ private:
> >    // event loop until it is destroyed.
> >    std::weak_ptr<LibeventSSLSocketImpl>* event_loop_handle;
> >
> > -  // This queue stores buffered accepted sockets. 'Queue' is a thread
> > -  // safe queue implementation, and the event loop pushes connected
> > -  // sockets onto it, the 'accept()' call pops them off. We wrap these
> > -  // sockets with futures so that we can pass errors through and chain
> > -  // futures as well.
> > +  // This queue stores accepted sockets that are considered connected
> > +  // (either the SSL handshake has completed or the socket has been
> > +  // downgraded). The 'accept()' call returns sockets from this queue.
> > +  // We wrap the socket in a 'Future' so that we can pass failures or
> > +  // discards through.
> >    Queue<Future<Socket>> accept_queue;
> >
> >    Option<std::string> peer_hostname;
> >
>

Reply via email to