Andrew, I wasted a little more time looking at the actual code. My impression is that everything is working as expected. If there is an error in a postauth filter or in adp processing (registered proc), trace filters are skipped. Until about 4.5, errors during preauth also skipped trace filters. Not sure why this change was made.
The only think that matters is what happens in Ns_AdpRequest. If there were no errors, the request will be logged. In order to get ns_adp_abort to work correctly, the tcl result must be set to TCL_ERROR until code returns to Ns_AdpRequest. This is why an additional structure is maintained for the adp exception, which is independent of the tcl exception. In this case, adp.exception indicates what actually happened during adp processing. So things seem to be working as intended, and they have been working the same way for a long time. It might be possible that you are misusing ns_adp_abort, or something else is messing up. Could you provide a simple test case, probably a few nested adp includes, which repeats the issue? Without a test case of what you think should work differently, it is hard to give any more advice. In general, when an error occurs during a request, the response is by definition an error response, so the original request might get transformed into an internal redirect to your error handling page. An error in this page, or a missing error page could cause further problems. Bottom line: no reason to believe that this is a bug. tom jackson p.s. this case seems to validate my belief that the hardest bug to find and fix is one that doesn't actually exist. On Thu, 2009-04-02 at 18:03 -0500, Andrew Steets wrote: > What was the original purpose of "trace" filters? At the C API level > there is a distinction between between a trace filter and a cleanup > callback, but it doesn't look like you can register a cleanup proc > from TCL. Maybe this was mistakenly omitted? > > The cleanup procs run unconditionally. It seems like that is the most > appropriate place to handle "cleanup of resources." Alternatively we > could change the trace filters to run regardless of the > Ns_ConnRunRequest() return status, but then that would make them > basically the same as the cleanups. > > I looked a little deeper into the source. The confusion seems to > arise in NsAdpFlush() which is run at the end of all ADP processing. > The code there is smart enough to recognize when an abort exception > has been signalled; it sets the TCL result to "adp flush disabled: adp > aborted", but it still returns TCL_ERROR. That is essentially where > the TCL exception gets turned into a full blown connection processing > error. We could change NsAdpFlush() to return success when it > recognizes the abort exception, or just not run NsAdpFlush() for abort > exceptions. > > There would still be cases where trace filters would not run though. > For instance if you called ns_returnxxx without calling ns_adp_abort. > I'm not sure if that is a bad thing. > > It would be nice to hear from anyone who knows about the original > motivation for the trace and cleanup filters. > > -Andrew > > On Thu, Apr 2, 2009 at 3:53 PM, Tom Jackson <[email protected]> wrote: > Gustaf, > > You may be "using" traces but not realize it, it sounds like > ns_adp_abort isn't don't what was originally intended. > > I wouldn't worry about an runtime error caused during running > traces, it > would be an error to even use ns_adp_abort in a trace filter > because the > connection is already finished. This is analogous to calling > [break] > outside of a loop. > > It seems important to consider ns_adp_abort, ns_adp_return and > ns_adp_break as a unit. They add necessary loop type controls > so that > developers can create deeply nested code and still get out of > it without > the need to use [catch]. But, like a lot of AOLserver specific > procedures, there is no hand-holding in their use. They can be > misued. > > In this particular case, it looks like somewhere along the > way, > ns_adp_abort was modified to not work as expected. > > The desired effect is exactly what you would get by returning > filter_return from a preauth or postauth filter. This effect > is to skip > to trace filters, not past them. > > Skipping trace filters even on an aborted connection would be > a disaster > for any application which relies on cleanup of resources. > > tom jackson > > > On Thu, 2009-04-02 at 11:12 +0200, Gustaf Neumann wrote: > > Andrew Steets schrieb: > > > The patch I sent earlier seems to fulfill these needs, but > I am > > > worried about corner cases where LogTrace (from the nslog > module) > > > could blow up. Nothing about the state of the Conn * > seems to be > > > guaranteed when the ConnCleanup callbacks are called. > > > > > Dear Andrew, > > > > i think most (all?) of the repondents seems to agree that > writing in the > > about case to > > the access log file. For me there are still two quesions > open: > > > > a) is it possoble to call ns_adp_abort at some time, where > the server > > might crash > > (in normal operations, everthing looks fine to me, > problems might > > occur in > > when called from some traces; other calls are likely to > have similar > > problems) > > > > b) the patch replaces the call to the regular server trace > by a > > connection cleanup call. > > this means, at least in 4.5.*, ns_adp_abort seems to > cancel all > > traces (also > > these registered with ns_register_trace). Is this > desired? > > > > From Tom's website: > http://rmadilo.com/files/nsapi/ns_adp_abort.html > > the doc of ns_adp_abort says > > > > ... Every ns_returnxxx call in an ADP should be followed > with a call > > to ns_adp_abort.... > > > > With this recommendation, cancelling traces seem wrong to > me; or at > > least, > > this should be documented. > > > > We don't use traces, all of OpenACS does not use it, so this > is no > > current issue for us. > > > > -gustaf neumann > > > > > > -- > > AOLserver - http://www.aolserver.com/ > > > > To Remove yourself from this list, simply send an email to > <[email protected]> with the > > body of "SIGNOFF AOLSERVER" in the email message. You can > leave the Subject: field of your email blank. > > > > > -- > AOLserver - http://www.aolserver.com/ > > To Remove yourself from this list, simply send an email to > <[email protected]> with the > body of "SIGNOFF AOLSERVER" in the email message. You can > leave the Subject: field of your email blank. > > > > -- > AOLserver - http://www.aolserver.com/ > > > > To Remove yourself from this list, simply send an email to > <[email protected]> with the > body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: > field of your email blank. > > -- AOLserver - http://www.aolserver.com/ To Remove yourself from this list, simply send an email to <[email protected]> with the body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: field of your email blank.
