[hunchentoot-devel] Confusing Hunchentoot behaviour

Marijn Haverbeke marijnh at gmail.com
Sat Nov 4 20:48:24 UTC 2006


Hello,

I am going to try to report something that looks like a bug, or maybe
multiple bugs, but right now I am so bewildered that I'm not sure it's not
something stupid I am doing...

It all started when I was playing around with a lisp image and a Hunchentoot
server, trying to get the hang of the library. When I added some things to
*dispatch-table*, the server seemed to completely ignore me. (By the way,
this is SBCL 0.9.18 on Linux behind mod_lisp). This was a bit frustrating.
After poking the source for a bit, and making dispatch-request log the table
it was getting, it turns out the server was using a value different from the
current top-level *dispatch-table*. I assumed this was because it bound the
result of calling *meta-dispatcher* to its own *dispatch-table* binding and
apparently never left process-connections. I was about to write an email to
this list about how this might not be the most desirable behaviour, but
decided to test it one more time to make sure I wouldn't make a fool out of
myself. And what do you know, after restarting my lisp process, starting a
new server, and then messing with the *dispatch-table* it suddenly DID take
my changes into account.

'What the hell', was what I thought. But it got even better. Refreshing the
test page a few times showed that sometimes the changed *request-table* was
used, but other times it would use the old one! I was about to dismiss
Hunchentoot as a bug-ridden pile of weidness at this point.

But while I was writing this incoherent complaint I finally got it --
obviously process-request is called once for every THREAD, and since the
server will keep a bunch of (4 on my setup) long-lived listening threads
when communicating with mod_lisp, strange results will occur when each of
these has a different dispatch-table -- the same client will see different
behaviour from the page. I'd say this is not a desirable feature. A good fix
would be to just call *meta-dispatcher* for every call to dispatch-request,
so that you've always got the most recent dispatch-table and the programmer
can fiddle with that variable from the REPL and immediately see the result.
Unless someone goes and writes a really complicated and expensive
meta-dispatcher this shouldn't be a problem. -- As far as I can see no other
parts of the code refer to the dynamic *dispatch-table* var, so losing that
binding shouldn't be a problem.

Let me know what you think.

Marijn Haverbeke
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/tbnl-devel/attachments/20061104/abdf80eb/attachment.html>


More information about the Tbnl-devel mailing list