This is what I suggested a few emails ago :-)

> 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.

I'm fine with this patch.

-Andrew

On Fri, Apr 3, 2009 at 2:37 PM, Tom Jackson <t...@rmadilo.com> wrote:

> Hey,
>
> Hopefully this is my last post on this subject, I think I actually found
> the bug.
>
> The bug is in NsAdpFlush from nsd/adprequest.c:
>
> 214-     */
> 215-
> 216-    Tcl_ResetResult(interp);
> 217:    if (itPtr->adp.exception == ADP_ABORT) {
> 218-    Tcl_SetResult(interp, "adp flush disabled: adp aborted",
> TCL_STATIC);
> 219-    result = TCL_OK;
> 220-    } else if (len == 0 && stream) {
>
>
> The bug was a missing line setting result to TCL_OK. (line 219).
>
>
> Also, ns_adp_return cannot be used after and ns_returnxxx command as adp
> processing continues after calling it.
>
> Here are two test files:
>
> test-adp-abort.adp:
>
> <%
>
> ns_return 200 text/plain hi
>
> ns_adp_abort
>
> %>
>
> test-adp-return.adp:
>
> <%
>
> ns_adp_puts hi
>
> ns_adp_return
>
> %>
>
> Both of these result in an access.log entry.
>
> Before the change, ns_adp_abort would lead to an error message:
>
> adp flush failed: connection closed
>    abort exception raised
>     while processing connection #2:
>        GET /test.adp HTTP/1.1
>        Host: 127.0.0.1:8000
>        User-Agent: ...
>        Accept: ....
>        Accept-Language: en-us,en;q=0.5
>        Accept-Encoding: gzip,deflate
>        Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
>        Keep-Alive: 300
>        Connection: keep-alive
>        Cache-Control: max-age=0
>
>
> This error message is valid if ns_adp_return is used after and
> ns_returnxxx.
>
> tom jackson
>
>
>
> On Fri, 2009-04-03 at 08:33 -0700, Tom Jackson wrote:
> > 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 <t...@rmadilo.com> 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
> > >         <lists...@listserv.aol.com> 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
> > >         <lists...@listserv.aol.com> 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 <
> lists...@listserv.aol.com> 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 <
> lists...@listserv.aol.com> 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 <
> lists...@listserv.aol.com> 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 
<lists...@listserv.aol.com> with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: 
field of your email blank.

Reply via email to