[
https://issues.apache.org/jira/browse/PROTON-1275?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15432871#comment-15432871
]
ASF subversion and git services commented on PROTON-1275:
---------------------------------------------------------
Commit 7f87f1bbc674e2021da7cbd97d23a1400c5dadd4 in qpid-proton's branch
refs/heads/master from Robert Gemmell
[ https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;h=7f87f1b ]
PROTON-1275: avoid IAE in reactor when connect process fails by preventing a
pop with negative pending (but do try to pop since it may still be needed)
> [proton-j] [reactor] socket connection interrupt causes unhandled
> IllegalArgumentException
> ------------------------------------------------------------------------------------------
>
> Key: PROTON-1275
> URL: https://issues.apache.org/jira/browse/PROTON-1275
> Project: Qpid Proton
> Issue Type: Bug
> Components: proton-j
> Affects Versions: 0.13.0
> Environment: Windows 10
> Reporter: James Birdsall
> Assignee: Robbie Gemmell
> Priority: Minor
>
> IOHandler.handleBound() is trying to make an outbound connection and catches
> an IOException. handleBound() then tries to clean up, but the cleanup appears
> to assume that some traffic actually occurred, whereas in our case the socket
> didn't even connect. This assumption becomes a problem on the last line of
> the cleanup:
> bq.{{transport.pop(transport.pending()); // Force generation of
> TRANSPORT_HEAD_CLOSE (not in C code)}}
> ...because transport.pending() returns -1, and that -1 eventually becomes the
> argument to a call to ByteBuffer.position() and ta da!
> IllegalArgumentException.
> I worked around the problem for the moment by protecting the call to pop():
> bq.{{if (transport.pending() >= 0) { transport.pop(transport.pending()); }}}
> ...and that seems to work fine. The rest of the cleanup may not be necessary
> in that particular circumstance but it doesn't seem to do any harm either.
> I did the investigation using a copy of qpid-proton master that I grabbed
> from github last week, so the line numbers should be pretty close to current.
> The call stack from the original IOException, for reference. Reading the docs
> on ClosedByInterruptException, it doesn't sound like something that's likely
> to happen often. It may be happening to me due to bugs elsewhere in our code.
> I'm reporting it despite that because, regardless of why this condition
> occurs, when it happens the path between the connection attempt being
> interrupted and the unhandled exception is entirely within the Proton-J
> codebase - it's up to Proton-J to defend itself against this occurrence.
> {quote}
> java.nio.channels.ClosedByInterruptException
> at java.nio.channels.spi.AbstractInterruptibleChannel.end(Unknown Source)
> at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
> at
> org.apache.qpid.proton.reactor.impl.IOHandler.handleBound(IOHandler.java:155)
> at
> org.apache.qpid.proton.reactor.impl.IOHandler.onUnhandled(IOHandler.java:375)
> at
> org.apache.qpid.proton.engine.BaseHandler.onConnectionBound(BaseHandler.java:58)
> at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:131)
> at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108)
> at
> org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:307)
> at
> org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:276)
> at
> com.microsoft.azure.servicebus.MessagingFactory$RunReactor.run(MessagingFactory.java:355)
> at java.lang.Thread.run(Unknown Source)
> {quote}
> Call stack from the IllegalArgumentException, showing the location of the
> fatal call to ByteBuffer.position(-1).
> {quote}
> java.nio.Buffer.position(Unknown Source)
> org.apache.qpid.proton.engine.impl.ssl.SimpleSslTransportWrapper.pop(SimpleSslTransportWrapper.java:413)
> org.apache.qpid.proton.engine.impl.ssl.SslImpl$UnsecureClientAwareTransportWrapper.pop(SslImpl.java:185)
> org.apache.qpid.proton.engine.impl.TransportImpl.pop(TransportImpl.java:1476)
> org.apache.qpid.proton.reactor.impl.IOHandler.handleBound(IOHandler.java:164)
> org.apache.qpid.proton.reactor.impl.IOHandler.onUnhandled(IOHandler.java:372)
> org.apache.qpid.proton.engine.BaseHandler.onConnectionBound(BaseHandler.java:58)
> org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:131)
> org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108)
> org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:307)
> org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:276)
> com.microsoft.azure.servicebus.MessagingFactory$RunReactor.run(MessagingFactory.java:355)
> {quote}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]