[prev in list] [next in list] [prev in thread] [next in thread]
List: synapse-dev
Subject: [jira] Commented: (SYNAPSE-415) Leaked SharedInputBuffer and
From: "Jason Walton (JIRA)" <jira () apache ! org>
Date: 2008-07-31 19:38:33
Message-ID: 1993981538.1217533113460.JavaMail.jira () brutus
[Download RAW message or body]
[ https://issues.apache.org/jira/browse/SYNAPSE-415?page=com.atlassian.jira.plugin \
.system.issuetabpanels:comment-tabpanel&focusedCommentId=12618827#action_12618827 ]
Jason Walton commented on SYNAPSE-415:
--------------------------------------
Certainly looks similar.
What did you do to fix https://issues.apache.org/jira/browse/SYNAPSE-404?
> Leaked SharedInputBuffer and SharedOutputBuffers slowly consume HttpServerWorker \
> pool
> -------------------------------------------------------------------------------------
>
> Key: SYNAPSE-415
> URL: https://issues.apache.org/jira/browse/SYNAPSE-415
> Project: Synapse
> Issue Type: Bug
> Components: Transports
> Affects Versions: 1.2
> Environment: Synapse 1.2 on Red Hat EL3
> Reporter: Jason Walton
> Assignee: Asankha C. Perera
> Priority: Critical
>
> 1) Create a synapse configuration with a single proxy service (Sample 150).
> 2) Put a breakpoint in
> org.apache.synapse.transport.nhttp.ClientHandler.outputReady() at the beginning of \
> the method. 3) Put another breakpoint in ClientHandler.closed(), again at the \
> beginning of the method. 4) Send a message through the proxy service with SoapUI.
> 5) When you hit the breakpoint in outputReady(), wait 15 seconds and then continue.
> 6) You should hit the breakpoint in closed() immediately. closed() will remove the \
> source buffer from the HttpContext without first calling shutdown on it (you can \
> verify this by finding the SharedOutputBuffer in the NHttpClientConnection's \
> context, and you will see that the private boolean "shutdown" is false). The \
> HttpServerWorker which is currently waiting on that buffer will never get a notify, \
> and will effectively be leaked. The HttpServerWorker in question will have a stack \
> trace as follows: Thread [HttpServerWorker-2] (Suspended)
> Object.wait(long) line: not available [native method]
> Object.wait() line: 485
> SharedOutputBuffer.flushContent() line: 161
> SharedOutputBuffer.write(byte[], int, int) line: 118
> ContentOutputStream.write(byte[], int, int) line: 63
> UTF8Writer.write(char[], int, int) line: 139
> BufferingXmlWriter.writeRaw(char[], int, int) line: 259
> BufferingXmlWriter.writeCharacters(char[], int, int) line: 543
> SimpleNsStreamWriter(BaseStreamWriter).writeCharacters(String) line: 509
> MTOMXMLStreamWriter.writeCharacters(String) line: 237
> StreamingOMSerializer.serializeText(XMLStreamReader, XMLStreamWriter) line: 369
> StreamingOMSerializer.serializeNode(XMLStreamReader, XMLStreamWriter, boolean) \
> line: 109 StreamingOMSerializer.serialize(XMLStreamReader, XMLStreamWriter, \
> boolean) line: 68 StreamingOMSerializer.serialize(XMLStreamReader, \
> XMLStreamWriter) line: 57 OMSerializerUtil.serializeByPullStream(OMElement, \
> XMLStreamWriter, boolean) line: 548 \
> SOAPEnvelopeImpl.internalSerialize(XMLStreamWriter, boolean) line: 232 \
> SOAPEnvelopeImpl(OMElementImpl).internalSerializeAndConsume(XMLStreamWriter) line: \
> 947 SOAPEnvelopeImpl(OMNodeImpl).serializeAndConsume(OutputStream, \
> OMOutputFormat) line: 471 SOAPMessageFormatter.writeTo(MessageContext, \
> OMOutputFormat, OutputStream, boolean) line: 79 \
> Axis2HttpRequest.streamMessageContents() line: 221 \
> HttpCoreNIOSender.sendAsyncRequest(EndpointReference, MessageContext) line: 346 \
> HttpCoreNIOSender.invoke(MessageContext) line: 256 \
> AxisEngine.send(MessageContext) line: 448 \
> DynamicAxisOperation$DynamicOperationClient.send(MessageContext) line: 190 \
> DynamicAxisOperation$DynamicOperationClient.executeImpl(boolean) line: 174 \
> DynamicAxisOperation$DynamicOperationClient(OperationClient).execute(boolean) line: \
> 163 Axis2FlexibleMEPClient.send(EndpointDefinition, MessageContext) line: 288
> Axis2Sender.sendOn(EndpointDefinition, MessageContext) line: 57
> Axis2SynapseEnvironment.send(EndpointDefinition, MessageContext) line: 222
> AddressEndpoint.send(MessageContext) line: 195
> ProxyServiceMessageReceiver.receive(MessageContext) line: 179
> AxisEngine.receive(MessageContext) line: 176
> HTTPTransportUtils.processHTTPPostRequest(MessageContext, InputStream, \
> OutputStream, String, String, String) line: 275 ServerWorker.processPost() line: \
> 253 ServerWorker.run() line: 194
> ThreadPoolExecutor$Worker.runTask(Runnable) line: 885
> ThreadPoolExecutor$Worker.run() line: 907
> Thread.run() line: 619
> The fix is simply to call shutdown on the SharedInputerBuffer and \
> SharedOutputBuffer after removing them from the context. This same problem exists \
> in ServerHandler.closed() as well. Here's my modified versions of these methods \
> which seems to fix the problem: In ServerHander.java:
> public void closed(final NHttpServerConnection conn) {
> HttpContext context = conn.getContext();
> SharedInputBuffer sinkBuffer = \
> (SharedInputBuffer)context.getAttribute(REQUEST_SINK_BUFFER); \
> context.removeAttribute(REQUEST_SINK_BUFFER); if(sinkBuffer != null) {
> sinkBuffer.shutdown();
> }
> SharedOutputBuffer sourceBuffer = \
> (SharedOutputBuffer)context.getAttribute(RESPONSE_SOURCE_BUFFER); \
> context.removeAttribute(RESPONSE_SOURCE_BUFFER); if(sourceBuffer != null) {
> sourceBuffer.shutdown();
> }
> if (log.isTraceEnabled()) {
> log.trace("Connection closed");
> }
> }
> And, in ClientHandler.java:
> public void closed(final NHttpClientConnection conn) {
> ConnectionPool.forget(conn);
> checkAxisRequestComplete(conn, "Abnormal connection close", null);
> HttpContext context = conn.getContext();
> SharedInputBuffer sinkBuffer = \
> (SharedInputBuffer)context.getAttribute(RESPONSE_SINK_BUFFER); \
> context.removeAttribute(RESPONSE_SINK_BUFFER); if(sinkBuffer != null) {
> sinkBuffer.shutdown();
> }
> SharedOutputBuffer sourceBuffer = \
> (SharedOutputBuffer)context.getAttribute(REQUEST_SOURCE_BUFFER); \
> context.removeAttribute(REQUEST_SOURCE_BUFFER); if(sourceBuffer != null) {
> sourceBuffer.shutdown();
> }
> if (log.isTraceEnabled()) {
> log.trace("Connection closed");
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
For additional commands, e-mail: dev-help@synapse.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic