Howdy,

I'm busy finalizing the port of Bricolage to mod_perl2. In the process, I've discovered a bit of weirdness with our TransHandler. For certain requests, it seems to execute twice. Under mod_perl1, here's an example:

75947 Apache=SCALAR(0x295ed70) TransHandler start for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x295ed70) TransHandler finish for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x295ed70) AccessHandler start for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x295ed70) AccessHandler finish for /workflow/ profile/desk/101/101/
75947 Apache=SCALAR(0x29d6f60) TransHandler start for /101/
75947 Apache=SCALAR(0x29d6f60) TransHandler finish for /101/
75947 Apache=SCALAR(0x29d6f60) AccessHandler start for /101/
75947 Apache=SCALAR(0x29d6f60) AccessHandler finish for /101/
75947 Apache=SCALAR(0x8b5970) ResponseHandler start for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x8b5970) ResponseHandler finish for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x299e870) CleanupHandler start for /workflow/ profile/desk/101/101/ 75947 Apache=SCALAR(0x299e870) CleanupHandler finish for /workflow/ profile/desk/101/101/

The first number is the process number. I've just added print statements to each of our handlers, one at the start and one at the end. Note how there is this strange interim request for /101/ that the TransHandler and the AccessHandler handle. I've no idea where that comes from or what it's for. But the request finishes fine under mod_perl1: the ResponseHandler creates the response, and the CleanupHandler disconnects the session.

Under mod_perl2, however, the same request looks like this:

75749 Apache2::RequestRec=SCALAR(0x29f3300) TransHandler start for / workflow/profile/desk/101/101/ 75749 Apache2::RequestRec=SCALAR(0x29f3300) TransHandler finish for / workflow/profile/desk/101/101/ 75749 Apache2::RequestRec=SCALAR(0x29f3300) AccessHandler start for / workflow/profile/desk/101/101/ 75749 Apache2::RequestRec=SCALAR(0x29f3300) AccessHandler finish for / workflow/profile/desk/101/101/
75749 Apache2::RequestRec=SCALAR(0x2a10eb0) TransHandler start for /101/
75749 Apache2::RequestRec=SCALAR(0x2a10eb0) TransHandler finish for / 101/ 75749 Apache2::RequestRec=SCALAR(0x2a10eb0) CleanupHandler start for / 101/ 75749 Apache2::RequestRec=SCALAR(0x2a10eb0) CleanupHandler finish for / 101/ 75749 Apache2::RequestRec=SCALAR(0x734df0) ResponseHandler start for / workflow/profile/desk/101/101/ 75749 Apache2::RequestRec=SCALAR(0x734df0) ResponseHandler finish for / workflow/profile/desk/101/101/

Note how the CleanupHandler runs on the /101/ request *before* the response handler handles the original request URI. This leads to errors, since the CleanupHandler syncs the cache and disconnects it -- so that here it's not available to the response handler! Without the session, Bricolage gets pretty severe heartburn. So I'm again wondering WTF that /101/ request is about, and why it's screwing with our session. Note that this is a single request, all handled by a single Apache process (using prefork).

When I disable the TransHandler, I get this instead:

75793 Apache2::RequestRec=SCALAR(0x8dcf00) AccessHandler start for / workflow/profile/desk/101/101/ 75793 Apache2::RequestRec=SCALAR(0x8dcf00) AccessHandler finish for / workflow/profile/desk/101/101/ 75793 Apache2::RequestRec=SCALAR(0x292cd00) ResponseHandler start for / workflow/profile/desk/101/101/ 75793 Apache2::RequestRec=SCALAR(0x292cd00) ResponseHandler finish for /workflow/profile/desk/101/101/ 75793 Apache2::RequestRec=SCALAR(0x28757c0) CleanupHandler start for / workflow/profile/desk/101/101/ 75793 Apache2::RequestRec=SCALAR(0x28757c0) CleanupHandler finish for / workflow/profile/desk/101/101/

The weird /101 request goes away, and all works as it should!

My config, FWIW, looks like this:

NameVirtualHost *:80
<VirtualHost *:80>
  DocumentRoot           /usr/local/bricolage/comp
  ServerName             localhost
  DefaultType            "text/html; charset=utf-8"
  AddDefaultCharset      utf-8
  SetHandler             perl-script
  PerlResponseHandler    Bric::App::Handler
  PerlAccessHandler      Bric::App::AccessHandler
  PerlCleanupHandler     Bric::App::CleanupHandler
</VirtualHost>

Has anyone seen something like this before? For this request, all the TransHandler does is return DECLINED. I get the same issues even if I modify it do make sure it does nothing more than return DECLINED. Is there some side-effect of using a TransHandler that I've just missed, that it forces this weird appearence of a subrequest that then pushes the CleanupHandler execution ahead of the ResponseHandler?

Many TIA for any insight you can provide.

Best,

David

Reply via email to