DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=9334>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=9334

Intermittent parsing error in Ajp13Request

           Summary: Intermittent parsing error in Ajp13Request
           Product: Tomcat 4
           Version: 4.0.3 Final
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Connector:JK/AJP (deprecated)
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Hi,

We use Tomcat 4.0.3, with Apache 1.3.24 and mod_jk, all in a loadbalanced 
setup. We experience an intermittent bug in Tomcat that I fixed by changing the 
server code. I would like to describe the problem in the following by hoping 
someone can tell me what this is about.

The problem is in the Ajp13Processor class. Once a processor is taken from the 
pool the AJP details are read with 

                status = ajp13.receiveNextRequest(ajpRequest);

Then later it is assigned to the supposedly recycled Ajp13Request from the 
previous use

                // set up request
                request.setAjpRequest(ajpRequest);

So far so good. What happens for us is that at least 5 times every minute (up 
to 20-30 times) the flag "parsed" in Ajp13Request (the "request" instance 
variable of the Ajp13Processor class) is suddenly set to "true"!

This causes the following problem. The incoming query string is not parsed 
anymore because the request thinks it had done this already. Therefore in our 
code when we use getParamXXXX() methods they all return "null" or an empty map. 
This of course means ours servlets assume that no parameters have been provided 
and they do whatever they should do in this case - which of course fails what 
the customer expects.

What I did to quickly fix this problem is to add the following lines into 
Ajp13Request.java

    void setAjpRequest(BaseRequest ajp) throws UnsupportedEncodingException {
        // XXX make this guy wrap AjpRequest so
        // we're more efficient (that's the whole point of
        // all of the MessageBytes in AjpRequest)

        /** @todo DEBUG */
        if (parsed == true) {
          parsed = false;
          System.err.println("!!! parsed was true in recycled request !!!");
        }
        /** @todo DEBUG */

        setMethod(ajp.method().toString());
        setProtocol(ajp.protocol().toString());
        ....

Note the DEBUG lines above, when I detect that, although the request should 
have been recycled, that the "parsed" flag is already set before even anything 
is assigned to it I reset the flag to "false" and everything is working fine. 
The error message I print out above is the one that shows up in our 
catalina.out the specified number of times (see above).

I then went on and added this to the HttpRequestBase.java

    public void setQueryString(String query) {

        /** @todo DEBUG */
        if (parsed) {
          System.err.println("### reassigned query string ###\nqueryString: " +
          queryString + "\nnew value: " + query);
        }
        /** @todo DEBUG */

        this.queryString = query;

    }

Although this should never happen - or am I wrong here - this is what I see in 
the catalina.out

### reassigned query string ###
queryString: null
new value: wl_srclang=ES&wl_trglang=FR&wl_gloss=7&wl_text=Provinc%
EDa+de+la+direcci%F3n+destino+de+la+mercanc%EDa
!!! parsed was true in recycled request !!!


Clearly, the request gets some values assigned twice somehow. But what puzzles 
me is that "parsed" is only set to "true" when someone calls any of the 
getParameterXXXX() methods. But because userland code hasn't been executed so 
far this is impossible. This all happens within a single thread and within two 
classes of Tomcat source code. What is going on?

I also had some debug code in the "recycle" method to check - assuming that 
recycle is called fine - if everything gets cleared, including the "parsed" 
flag. This shows the correct behaviour during all my testing, ie. everything is 
cleared fine. Also I wrapped the call to "recycle" in Ajp13Request with a 
try/catch to see if maybe an error is thrown that would prevent a "recycle" 
being called - again, I never had any errors showing up at this point. Also 
when dumping the values from the request instance it looks like it is always 
cleared correctly; I have never seen some sort of "left overs" from a previous 
request, so recycling the request does not seem to be the issue.

The only explanation I have so far is that somehow 
HttpRequestBase.parseParameters is called before the BaseRequest values (from 
the Ajp13 connection) are assigned to it. But having one single thread running 
through the Ajp13Processor and no trace of someone calling getParamXXXX(), how 
whould that happen?

Just to explain, we use three servers that all show the same problem. Two are 
running Sun JDK 1.3.0_02 and one the newest Sun JDK 1.3.1_03, again to note, 
all show this behaviour. Tomcat was built with the Sun JDK 1.3.1_03 version for 
all of them.

I recompiled Tomcat heaps of times with different debug output to find the 
problem and this has not changed anything, so it does not look like the 
infamous Heisenberg uncertainty, ie. recompiling or monitoring the code does 
not make the problem go away. Always the same problem, same spot. 

It does not seem to be load related as the number of errors just increases 
proportionally with the load; and even minor load causes the problem to show up.

I am at the end of my wisdom here as to what this is related to or caused by. I 
appreciate any comments, ideas, suggestions etc. to clarify this issue. 

Yours faithfully,

Lars

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to