[ 
https://issues.apache.org/jira/browse/QPID-5282?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13827398#comment-13827398
 ] 

Keith Wall commented on QPID-5282:
----------------------------------

Changed IoSender to cause the socket to be closed after a sender timeout.  If 
this problem were to occur owing to back pressure from a client, the Java 
Broker will now close the connection and log two additional lines at ERROR:

{noformat}
2013-11-19 21:51:03,204 ERROR [pool-2-thread-5] (io.IoSender) - write timed out 
for socket /127.0.0.1:54190: head -2146434265, tail -2146958553
2013-11-19 21:51:03,205 INFO  [IoReceiver - /127.0.0.1:54190] 
(subscription.close) - [Broker] [sub:1(vh(/default)/qu(myqueue)] SUB-1002 : 
Close
2013-11-19 21:51:03,208 INFO  [IoReceiver - /127.0.0.1:54190] (channel.close) - 
[Broker] [con:1(clientid@/127.0.0.1:54190/default)/ch:0] CHN-1003 : Close
2013-11-19 21:51:03,209 INFO  [IoReceiver - /127.0.0.1:54190] 
(connection.close) - [Broker] [con:1(clientid@/127.0.0.1:54190/default)] 
CON-1002 : Close
2013-11-19 21:51:03,210 ERROR [IoSender - /127.0.0.1:54190] (io.IoSender) - 
error in write thread
java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.qpid.transport.network.io.IoSender.run(IoSender.java:308)
at java.lang.Thread.run(Thread.java:695)
{noformat}

If the problem were to occur owing to back pressure from a Broker, the client 
will close the connection and  logs would show the following (0-9/0-10):

{noformat}
2013-11-19 22:29:54,789 ERROR [main] [IoSender] write timed out for socket 
localhost/127.0.0.1:5672: head -2146565522, tail -2146696594
2013-11-19 22:29:54,790 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[AMQProtocolHandler] Session closed called with failover state FailoverState: 
NOT STARTED
2013-11-19 22:29:54,790 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[FailoverPolicy] All failover methods exhausted
2013-11-19 22:29:54,790 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[FailoverPolicy] All failover methods exhausted
2013-11-19 22:29:54,790 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[AMQProtocolHandler] Failover not allowed by policy:Failover Policy:
Failover not allowed
Failover policy methods
>Single Server:
Max Retries:0
Current Retry:0
tcp://localhost:5672

javax.jms.JMSException: Exception whilst sending:write timed out for socket 
localhost/127.0.0.1:5672: head -2146565522, tail -2146696594
at org.apache.qpid.client.AMQSession.toJMSException(AMQSession.java:3465)
at 
org.apache.qpid.client.BasicMessageProducer.sendImpl(BasicMessageProducer.java:504)
at 
org.apache.qpid.client.BasicMessageProducer.send(BasicMessageProducer.java:298)
at org.apache.qpid.example.Hello.runTest(Hello.java:65)
at org.apache.qpid.example.Hello.main(Hello.java:43)
Caused by: org.apache.qpid.transport.SenderException: write timed out for 
socket localhost/127.0.0.1:5672: head -2146565522, tail -2146696594
at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:156)
at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:1)
at 
org.apache.qpid.client.protocol.AMQProtocolHandler.writeFrame(AMQProtocolHandler.java:567)
at 
org.apache.qpid.client.protocol.AMQProtocolHandler.writeFrame(AMQProtocolHandler.java:559)
at 
org.apache.qpid.client.BasicMessageProducer_0_8.sendMessage(BasicMessageProducer_0_8.java:185)
at 
org.apache.qpid.client.BasicMessageProducer.sendImpl(BasicMessageProducer.java:500)
... 3 more
2013-11-19 22:29:54,792 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[AMQConnection] exceptionReceived done by:IoReceiver - localhost/127.0.0.1:5672
org.apache.qpid.AMQDisconnectedException: Server closed connection and 
reconnection not permitted.
{noformat}

{noformat}
2013-11-19 22:23:03,739 ERROR [main] [IoSender] write timed out for socket 
localhost/127.0.0.1:5672: head -2146696295, tail -2146827367
2013-11-19 22:23:03,740 DEBUG [IoReceiver - localhost/127.0.0.1:5672] 
[Connection] connection closed: conn:6c9c035a
2013-11-19 22:23:03,741 ERROR [main] [Session] error sending command
org.apache.qpid.transport.SenderException: write timed out for socket 
localhost/127.0.0.1:5672: head -2146696295, tail -2146827367
at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:156)
at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:1)
at org.apache.qpid.transport.network.Disassembler.frame(Disassembler.java:118)
at 
org.apache.qpid.transport.network.Disassembler.fragment(Disassembler.java:147)
at org.apache.qpid.transport.network.Disassembler.method(Disassembler.java:242)
at org.apache.qpid.transport.network.Disassembler.command(Disassembler.java:172)
at org.apache.qpid.transport.network.Disassembler.command(Disassembler.java:48)
at org.apache.qpid.transport.Method.delegate(Method.java:159)
at org.apache.qpid.transport.network.Disassembler.send(Disassembler.java:73)
at org.apache.qpid.transport.network.Disassembler.send(Disassembler.java:48)
at org.apache.qpid.transport.Connection.send(Connection.java:405)
at org.apache.qpid.transport.Session.send(Session.java:602)
at org.apache.qpid.transport.Session.invoke(Session.java:772)
at org.apache.qpid.transport.Session.invoke(Session.java:627)
at 
org.apache.qpid.transport.SessionInvoker.messageTransfer(SessionInvoker.java:93)
at 
org.apache.qpid.client.BasicMessageProducer_0_10.sendMessage(BasicMessageProducer_0_10.java:229)
at 
org.apache.qpid.client.BasicMessageProducer.sendImpl(BasicMessageProducer.java:500)
at 
org.apache.qpid.client.BasicMessageProducer.send(BasicMessageProducer.java:298)
at org.apache.qpid.example.Hello.runTest(Hello.java:65)
at org.apache.qpid.example.Hello.main(Hello.java:43)
{noformat}


> Sender timeouts may allow the peer to suffer an AMQFrameDecodingException
> -------------------------------------------------------------------------
>
>                 Key: QPID-5282
>                 URL: https://issues.apache.org/jira/browse/QPID-5282
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Broker, Java Client, Java Common
>    Affects Versions: 0.25
>            Reporter: Keith Wall
>            Assignee: Keith Wall
>
> If an IoSender#send suffers a timeout (IoSender.java#159) whilst awaiting 
> space in the sender's buffer, the socket which was being written to is left 
> open and a SenderException is thrown to the caller.  The bytes that were to 
> be sent are lost. If the socket is subsequent written to again, the peer may 
> suffer an AMQFrameDecodingException as is tries to decode an incomplete 
> stream of data.
> We saw this scenario in a support call.  The working theory is that the 
> application'sJVM (using a JMS consumer) was under pressue, and this caused 
> TCP/IP back pressure to be felt by the broker.  The Broker IoSender#send 
> method timed-out, but as the socket remained open, when a later message was 
> sent to the same JMS consumer application, the consuming application failed 
> with an AMQFrameDecodingException: the lost bytes meant it tried to process 
> message payload as if it were an AMQFrame.
> The two exceptions of interest are (reproduced on trunk):
> Broker side:
> {code}
> 2013-10-31 14:41:18,471 ERROR [IoReceiver - /127.0.0.1:63867] 
> (v0_8.AMQProtocolEngine) - Error informing channel that receiving is 
> complete. Channel: 
> [/127.0.0.1:63867(guest):1]org.apache.qpid.transport.SenderException: write 
> timed out: -2147471360, -2147475456
>     at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:159)
>     at org.apache.qpid.transport.network.io.IoSender.send(IoSender.java:40)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQProtocolEngine.writeFrame(AMQProtocolEngine.java:689)
>     at 
> org.apache.qpid.server.protocol.v0_8.output.ProtocolOutputConverterImpl.writeFrame(ProtocolOutputConverterImpl.java:337)
>     at 
> org.apache.qpid.server.protocol.v0_8.output.ProtocolOutputConverterImpl.writeMessageDelivery(ProtocolOutputConverterImpl.java:127)
>     at 
> org.apache.qpid.server.protocol.v0_8.output.ProtocolOutputConverterImpl.writeMessageDelivery(ProtocolOutputConverterImpl.java:97)
>     at 
> org.apache.qpid.server.protocol.v0_8.output.ProtocolOutputConverterImpl.writeDeliver(ProtocolOutputConverterImpl.java:72)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQProtocolEngine$WriteDeliverMethod.deliverToClient(AMQProtocolEngine.java:1679)
>     at 
> org.apache.qpid.server.protocol.v0_8.SubscriptionImpl.sendToClient(SubscriptionImpl.java:693)
>     at 
> org.apache.qpid.server.protocol.v0_8.SubscriptionImpl$AckSubscription.send(SubscriptionImpl.java:303)
>     at 
> org.apache.qpid.server.queue.SimpleAMQQueue.deliverMessage(SimpleAMQQueue.java:826)
>     at 
> org.apache.qpid.server.queue.SimpleAMQQueue.deliverToSubscription(SimpleAMQQueue.java:745)
>     at 
> org.apache.qpid.server.queue.SimpleAMQQueue.enqueue(SimpleAMQQueue.java:693)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQChannel$MessageDeliveryAction.postCommit(AMQChannel.java:1245)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQChannel$AsyncCommand.complete(AMQChannel.java:1623)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQChannel.sync(AMQChannel.java:1593)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQChannel.receivedComplete(AMQChannel.java:218)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQProtocolEngine.receivedComplete(AMQProtocolEngine.java:324)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQProtocolEngine.received(AMQProtocolEngine.java:304)
>     at 
> org.apache.qpid.server.protocol.v0_8.AMQProtocolEngine.received(AMQProtocolEngine.java:104)
>     at 
> org.apache.qpid.server.protocol.MultiVersionProtocolEngine.received(MultiVersionProtocolEngine.java:131)
>     at 
> org.apache.qpid.server.protocol.MultiVersionProtocolEngine.received(MultiVersionProtocolEngine.java:47)
>     at 
> org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:161)
>     at java.lang.Thread.run(Thread.java:662)
> {code} 
> Then later client side:
> {code}
> 2013-10-31 14:47:49,099 DEBUG [Dispatcher-1-Conn-1] [Dispatcher] 
> Dispatcher-1-Conn-1 thread terminating for channel 
> 1:org.apache.qpid.client.AMQSession_0_8@560932fe
> javax.jms.JMSException: Message consumer forcibly closed due to error: 
> org.apache.qpid.framing.AMQFrameDecodingException: End of frame marker not 
> found. Read 53 length=65527 type=3
>       at 
> org.apache.qpid.client.BasicMessageConsumer.returnMessageOrThrow(BasicMessageConsumer.java:531)
>       at 
> org.apache.qpid.client.BasicMessageConsumer.receive(BasicMessageConsumer.java:419)
>       at 
> org.apache.qpid.client.BasicMessageConsumer.receive(BasicMessageConsumer.java:393)
>       at org.apache.qpid.example.Hello.runTest(Hello.java:60)
>       at org.apache.qpid.example.Hello.main(Hello.java:40)
> Caused by: org.apache.qpid.framing.AMQFrameDecodingException: End of frame 
> marker not found. Read 53 length=65527 type=3
>       at 
> org.apache.qpid.framing.AMQDataBlockDecoder.createAndPopulateFrame(AMQDataBlockDecoder.java:104)
>       at org.apache.qpid.codec.AMQDecoder.decodeBuffer(AMQDecoder.java:250)
>       at 
> org.apache.qpid.client.protocol.AMQProtocolHandler.received(AMQProtocolHandler.java:451)
>       at 
> org.apache.qpid.client.protocol.AMQProtocolHandler.received(AMQProtocolHandler.java:1)
>       at 
> org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:161)
>       at java.lang.Thread.run(Thread.java:662)
> {code}



--
This message was sent by Atlassian JIRA
(v6.1#6144)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to