|
mike bayer
mike_mp at zzzcomputing.com
Wed Sep 8 21:31:27 EDT 2004
hi -
this is a slightly tricky one to demonstrate. Running apache 2.0 with the
worker MPM on linux, it appears that a page that requests a Session, and
then takes a really long time to finish, blocks certain other
session-enabled pages from completing, regardless of which session ID they
have. though not every page, just maybe ones in the same child process ?
not totally sure.
I am assuming this behavior is due to the global locking mechanism used
within Session (to which I cant readily find documentation). I have a
feeling this is "expected" behavior as opposed to a bug....though it sort
of sucks if thats the case. I suppose I am looking for a description of
why the below example does what it does.
first, run apache with the worker MPM with a pretty small process/thread
size, say 5 ThreadsPerChild and 2 StartServers.
then, mptest.py, configured just like mptest.py in the mod python
documentation:
from mod_python import apache, util, Session
from time import sleep
def handler(req):
req.content_type = 'text/html'
session = Session.Session(req)
fields = util.FieldStorage(req)
if fields.has_key('pause'):
req.write("hi, this is a very slow page\n")
sleep(5)
req.write("really, a very slow page\n")
sleep(5)
req.write("ok\n")
else:
req.write("""
hello world ! reloading in 100ms
<script>setTimeout('window.location.href="mptest.py"', 100)</script>
""")
return apache.OK
Then, set your browser to call the fast version over and over again:
http://myserver.com/mptest.py
then to watch it hang due to a totally unrelated access by someone else,
go to a shell window somewhere and type:
wget --output-document=- http://myserver.com/mptest.py?pause=1
to get the slow version. at least on my server, the fast-reloading page
will hit a certain process/thread that will just hang, and there it will
stay until your slow command-line one completes.
i am gathering this is either totally new news, or utterly obvious to
everyone but me. comments ?
|