On Thu, 17 Oct 2002, Johannes Erdfelt wrote:

> Ryan, I've CC'd you on this just to let you see the patch. If you don't
> want me to involve you in this, please accept my apologies and let me
> know and I won't CC you in any further patches.

I have no problem being CC'ed on patches, although for the most part, I am
unlikely to respond.  In this case however, I will.  I want to say that
this is great.  I have reviewed the patch and the logic, and it all looks
fantastic.  I'm really glad that the MPM is making progress.  I will also
provide a possible solution to the one problem that you were unable to
solve.  :-)

> Problem 4:
> Occasionally, when a request needs to be passed to another process, it will
> hang until another connection is accepted. perchild uses the same process
> accept mutex that the other MPM's seem to need. This results in
> serialization of all accept() calls as is the intent of the mutex. The
> problem is that another process might have acquired the mutex from the
> process that actually needs the mutex to hit accept() and see the passed
> request. This isn't normally a problem because all processes accept
> connections on all listening ports. The problem in this case is the fact
> not all processes accept connections on the per process unix domain socket
> to pass connections around, for obvious reasons.
> 
> Solution:
> I don't have one :) I'm not sure what the best way of solving this is. I
> don't fully understand the semantics of the process accept mutex yet. Any
> suggestions?

There is only one solution that I can see for this, unfortunately, it is a
rather big change.  :-(  The first step, is to migrate the perchild MPM to
the same model as the worker MPM, where one thread accepts requests and
puts them in a queue, and the rest of the threads remove the requests from
the queue, and actually serve them.  I've been meaning to do this for a
long time, but I never got around to it.

Once that is done, the solution to this problem is easy.  Every child
process needs to have two acceptor threads.  The first accepts on the TCP
socket, and the second accepts on the Unix Domain Socket.  For the TCP
socket, the thread should just use the same accept_mutex that it is using
now.  However for the Unix Domain Socket, each thread that is accepting on
the socket should just use apr_file_lock to lock the socket before
accepting.  This should remove the starvation that you are seeing, because
each socket will have it's own lock.

This is really great work, I hope that it gets applied ASAP.

Ryan

Reply via email to