[ 
https://issues.apache.org/jira/browse/ARTEMIS-1940?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

clebert suconic updated ARTEMIS-1940:
-------------------------------------
    Fix Version/s: 2.7.0

> premature release of pooled buffers during send can cause AMQP connection 
> failures
> ----------------------------------------------------------------------------------
>
>                 Key: ARTEMIS-1940
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-1940
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: AMQP
>    Affects Versions: 2.6.0, 2.6.1
>            Reporter: Robbie Gemmell
>            Assignee: Robbie Gemmell
>            Priority: Critical
>             Fix For: 2.7.0, 2.6.2
>
>
> When sending messages over AMQP connections to consumers, in certain cases 
> the broker can prematurely release a pooled buffer before the message send 
> process has completed using it. When attempt is made to send more data for 
> the message later on the process fails since the buffer is no longer valid, 
> per stacktrace below.
> The issue is that the broker assumes the send is entirely complete after 
> pumping the proton transport, but there are cases where that may not yet be 
> the case, perhaps leading to this issue. Most sends are not affected by the 
> issue at all, but some such as for redelivered messages can be due to their 
> use of pooled buffers.
> To address the issue for now, cases where the pooled buffers are being used 
> should revert to the older copying send methods of proton, while the 
> remainder continue to use the newer send methods that directly use the 
> provided buffer (which is often just going to be the one created when the 
> message arrived at the broker).
> {noformat}
> Thread-1 (activemq-netty-threads)] 18:49:34,857 WARN  
> [org.apache.activemq.artemis.core.server] AMQ222218: Server disconnecting: 
> Error decoding buffer: io.netty.util.IllegalReferenceCountException: refCnt: 0
>     at 
> io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1417) 
> [netty-buffer-4.1.24.Final.jar:4.1.24.Final]
>     at io.netty.buffer.PooledHeapByteBuf.array(PooledHeapByteBuf.java:318) 
> [netty-buffer-4.1.24.Final.jar:4.1.24.Final]
>     at 
> org.apache.activemq.artemis.protocol.amqp.util.NettyReadable.get(NettyReadable.java:211)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.qpid.proton.codec.WritableBuffer$ByteBufferWrapper.put(WritableBuffer.java:140)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.FrameWriter.writeFrame(FrameWriter.java:180)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportImpl.writeFrame(TransportImpl.java:1075)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportImpl.processTransportWorkSender(TransportImpl.java:599)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportImpl.processTransportWork(TransportImpl.java:518)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportImpl.writeInto(TransportImpl.java:347)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportOutputAdaptor.pending(TransportOutputAdaptor.java:59)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportOutputAdaptor.head(TransportOutputAdaptor.java:80)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.SaslImpl$SwitchingSaslTransportWrapper.head(SaslImpl.java:820)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.HandshakeSniffingTransportWrapper.head(HandshakeSniffingTransportWrapper.java:151)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.qpid.proton.engine.impl.TransportImpl.head(TransportImpl.java:1533)
>  [proton-j-0.27.1.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.proton.handler.ProtonHandler.flushBytes(ProtonHandler.java:212)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.proton.handler.ProtonHandler.dispatch(ProtonHandler.java:516)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.proton.handler.ProtonHandler.flush(ProtonHandler.java:307)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.proton.handler.ProtonHandler.inputBuffer(ProtonHandler.java:272)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.proton.AMQPConnectionContext.inputBuffer(AMQPConnectionContext.java:158)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.protocol.amqp.broker.ActiveMQProtonRemotingConnection.bufferReceived(ActiveMQProtonRemotingConnection.java:147)
>  [artemis-amqp-protocol-2.7.0-SNAPSHOT.jar:]
>     at 
> org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl$DelegatingBufferHandler.bufferReceived(RemotingServiceImpl.java:643)
>  [artemis-server-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT]
>     at 
> org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQChannelHandler.channelRead(ActiveMQChannelHandler.java:73)
>  [artemis-core-client-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
>  [netty-transport-4.1.24.Final.jar:4.1.24.Final]
>     at 
> io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:808)
>  [netty-transport-native-epoll-4.1.24.Final-linux-x86_64.jar:4.1.24.Final]
>     at 
> io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:404) 
> [netty-transport-native-epoll-4.1.24.Final-linux-x86_64.jar:4.1.24.Final]
>     at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:304) 
> [netty-transport-native-epoll-4.1.24.Final-linux-x86_64.jar:4.1.24.Final]
>     at 
> io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
>  [netty-common-4.1.24.Final.jar:4.1.24.Final]
>     at 
> org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118)
>  [artemis-commons-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT]
> [Thread-1 (activemq-netty-threads)] 18:49:34,863 WARN  
> [org.apache.activemq.artemis.core.client] AMQ212037: Connection failure has 
> been detected: refCnt: 0 [code=GENERIC_EXCEPTION]
> [Thread-1 (activemq-netty-threads)] 18:49:34,865 WARN  
> [org.apache.activemq.artemis.core.server] AMQ222061: Client connection 
> failed, clearing up resources for session f5f36741-731f-11e8-8513-000c29e9f622
> [Thread-1 (activemq-netty-threads)] 18:49:34,871 WARN  
> [org.apache.activemq.artemis.core.server] AMQ222107: Cleared up resources for 
> session f5f36741-731f-11e8-8513-000c29e9f622
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to