https://issues.apache.org/bugzilla/show_bug.cgi?id=52009
--- Comment #4 from Konstantin Kolinko <knst.koli...@gmail.com> 2011-10-12 
04:31:05 UTC ---
> I already sent you the application in gmail, which is so large to attache 
> here.

1) I bet that you do not need all 25 Mb of dojox components of dojotoolkit.

The NPE issue is still reproducible if I delete the dojox folder from the
webapp and that shrinks its size significantly.

2) Source code for StockServlet is there - thank you, but sources of its parent
class BayeuxServlet is not available.

3) To reproduce the issue, open http://localhost:8888/QuoteStreamerApp/

Just open the page in browser and leave it open.

The page sends a flow of POST requests to
/QuoteStreamerApp/stockServlet HTTP/1.1

4) I am running with the following line added to catalina.properties file:
org.apache.coyote.http11.InternalNioInputBuffer.level = FINE

and it shows that there are problems in BayeuxServlet that it calls setHeader()
on a response that has already been recycled.
It is an application error. This is unacceptable and can lead to updating a
response that is being delivered to a different client.

Stacktrace in localhost.2011-10-12.log:

12-окт-2011 08:04:02.078 SEVERE [http-nio-8888-exec-8]
org.apache.catalina.core.StandardWrapperValve.event Servlet.service() for
servlet [StockServlet] in context with path [/QuoteStreamerApp] threw exception
 java.lang.IllegalStateException: The response object has been recycled and is
no longer associated with this facade
    at
org.apache.catalina.connector.ResponseFacade.isCommitted(ResponseFacade.java:325)
    at
org.apache.catalina.connector.ResponseFacade.setHeader(ResponseFacade.java:518)
    at
com.ibm.ws.webmsg.servlet.adapter.ServletResponse.setHeader(ServletResponse.java:147)
    at
com.ibm.ws.webmsg.client.bayeux.protocol.vone.JSONTransport.endResponse(JSONTransport.java:191)
    at
com.ibm.ws.webmsg.client.bayeux.protocol.vone.processor.EventDeliveryProcessor.close(EventDeliveryProcessor.java:139)
    at
com.ibm.ws.webmsg.client.bayeux.protocol.vone.WASCEClientImpl.shutdown(WASCEClientImpl.java:117)
    at
com.ibm.ws.webmsg.client.bayeux.protocol.vone.processor.DisconnectProcessor.processMessage(DisconnectProcessor.java:63)
    at
com.ibm.ws.webmsg.client.bayeux.protocol.vone.ClientImpl.processRequest(ClientImpl.java:332)
    at com.ibm.webmsg.servlet.BayeuxServlet.handleRead(BayeuxServlet.java:233)
    at com.ibm.webmsg.servlet.BayeuxServlet.event(BayeuxServlet.java:210)
    at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilterEvent(ApplicationFilterChain.java:482)
    at
org.apache.catalina.core.ApplicationFilterChain.doFilterEvent(ApplicationFilterChain.java:376)
    at
org.apache.catalina.core.StandardWrapperValve.event(StandardWrapperValve.java:414)
    at
org.apache.catalina.core.StandardContextValve.event(StandardContextValve.java:192)
    at org.apache.catalina.valves.ValveBase.event(ValveBase.java:226)
    at
org.apache.catalina.core.StandardHostValve.event(StandardHostValve.java:245)
    at org.apache.catalina.valves.ValveBase.event(ValveBase.java:226)
    at org.apache.catalina.valves.ValveBase.event(ValveBase.java:226)
    at
org.apache.catalina.core.StandardEngineValve.event(StandardEngineValve.java:138)
    at
org.apache.catalina.connector.CoyoteAdapter.event(CoyoteAdapter.java:211)
    at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:411)
    at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:970)
    at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1550)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)


5) There are a lot of exceptions like
javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616.
Reason: java.net.ConnectException: Connection refused: connect

but the NullPointerException at CoyoteAdapter.java:436 is reproducible.

6) The NPE is reproducible both in 7.0.22 and in trunk.


The requests to of them fail with error 500, but response sizes in different
requests are different.

I noted the following while debugging trunk:

1. In access log all requests are POST to /QuoteStreamerApp/stockServlet.
They all fail with error 500, but response sizes are different.

2. After the call to getPipeline().getFirst().invoke(request, response) the
value of request.isComet() is true.

3. The cause for NPE at CoyoteAdapter.java:436 is that at that point the
request is already recycled and request.getMappingData().context  is null.

4. The recycling happens in the finally block in CoyoteAdapter#event(..),
lines 252-254:
            if (error || response.isClosed() || !request.isComet()) {
                request.recycle();
                request.setFilterChain(null);
                response.recycle();
            }

I do not know much about request that is being recycled. It is not the first
request that was received.

5. If I put breakpoint on the request.recycle() call above, the call stack is:

CoyoteAdapter.event(Request, Response, SocketStatus) line: 252    
CoyoteAdapter.service(Request, Response) line: 411    
Http11NioProcessor(AbstractHttp11Processor<S>).process(SocketWrapper<S>) line:
970    
Http11NioProtocol$Http11ConnectionHandler(AbstractProtocol$AbstractConnectionHandler<S,P>).process(SocketWrapper<S>,
SocketStatus) line: 515    
NioEndpoint$SocketProcessor.run() line: 1550    

After returning from event() call on CoyoteAdapter:411 (the call returns false)
the lines 431..440 are executed:
            } else if (!comet) {
                request.finishRequest();
                response.finishResponse();
                if (postParseSuccess) {
                    // Log only if processing was invoked.
                    // If postParseRequest() failed, it has already logged it.
                    ((Context) request.getMappingData().context).logAccess(
                            request, response,
                            System.currentTimeMillis() - req.getStartTime(),
                            false);
                }

The comet variable is false and postParseSuccess is true.
The request is already recycled and request.getMappingData().context is null,
leading to an NPE.

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to