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

ASF subversion and git services commented on QPID-5282:
-------------------------------------------------------

Commit 1545184 from [~k-wall] in branch 'qpid/branches/0.26'
[ https://svn.apache.org/r1545184 ]

QPID-5282: Change IoSender to cause the socket to be closed after a sender 
timeout.

Merged from trunk with the following command:

svn merge -c1543721  https://svn.apache.org/repos/asf/qpid/trunk/qpid

> 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: Alex Rudyy
>             Fix For: 0.27
>
>
> 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