You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Jonathan Valliere (JIRA)" <ji...@apache.org> on 2019/05/24 14:46:00 UTC

[jira] [Resolved] (DIRMINA-901) connect() a nonblocking unregistered channel fails with UDT

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

Jonathan Valliere resolved DIRMINA-901.
---------------------------------------
    Resolution: Abandoned

Unsupported functionality.  UDT is not supported or maintained by MINA

> connect() a nonblocking unregistered channel fails with UDT
> -----------------------------------------------------------
>
>                 Key: DIRMINA-901
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-901
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.4
>         Environment: Linux 2.6.18-164.11.1.el5xen #1 SMP Wed Jan 20 08:06:04 EST 2010 x86_64 x86_64 x86_64 GNU/Linux
> java version "1.6.0_31"
> Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
> Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
>            Reporter: Florin Sultan
>            Priority: Major
>             Fix For: 2.0.14
>
>         Attachments: ChannelSocketUDT.java, ChannelSocketUDT.java, NioUDTSocketConnector.java, NioUDTSocketConnector.java
>
>
> Context:
> -------
> I am using BarchartUDT as transport, which I have integrated with MINA 2.0.4.
> BarchartUDT is a java wrapper to a native UDT library (C++). UDT is a reliable,
> connection-oriented, streaming protocol.
> The example below is the MINA sample sumup client iprogram that breaks
> with an exception during the connect() call into the UDT wrapper.
> Description:
> -----------
> Trigger :
> 1. MINA creates a (non-blocking, by default) UDT channel.
> 2. Calls connect() on it BEFORE registering it with a selector.
> 3. My UDT library does not accept a connect with a nonblocking channel and throws an exception.
> Just for reference, here's the exception in UDT - the message is quite clear :
> Jul 3, 2012 11:22:30 AM com.barchart.udt.nio.ChannelSocketUDT connect
> SEVERE: UDT channel is in non blocking mode;must register with a selector before trying to connect()
> Of course, the above sequence of actions does work with the native TCP channels.
> The problem is that UDT does not accept a connect on a nonblocking AND unregistered channel.
> I am perfectly aware that this is most likely an issue with UDT, and not a bug in MINA.
> However, I would greatly appreciate it if you can provide any suggestions or help.
> Questions :
> 1. What would it take to have MINA perform these actions in reverse (first register, then connect) ?
> Is there an easy change to AbstractPollingIoConnector.connect0 that would do the register before connect,
> for example?
> 2. If this is not possible, is there a way to make the channel blocking, for example?
> 3. Is there other way around it?
> I'd be happy to try any suggestion (or piece of code, if you provide it).
> It would help me get over this hurdle until UDT people give a reply to this issue.
> Details:
> -------
> -- Call stack:
> Jul 13, 2012 1:10:03 PM com.barchart.udt.nio.ChannelSocketUDT connect
> SEVERE: UDT channel is in non blocking mode;must register with a selector before trying to connect()
> Exception in thread "main" java.nio.channels.IllegalBlockingModeException
>       at com.barchart.udt.nio.ChannelSocketUDT.connect(ChannelSocketUDT.java:176)
>       at org.apache.mina.transport.socket.nio.NioUDTSocketConnector.connect(NioUDTSocketConnector.java:215)
>       at org.apache.mina.transport.socket.nio.NioUDTSocketConnector.connect(NioUDTSocketConnector.java:66)
>       at org.apache.mina.core.polling.AbstractPollingIoConnector.connect0(AbstractPollingIoConnector.java:320)
>       at org.apache.mina.core.service.AbstractIoConnector.connect(AbstractIoConnector.java:262)
>       at org.apache.mina.core.service.AbstractIoConnector.connect(AbstractIoConnector.java:172)
> -- Code in question :
> {code}
> AbstractPollingIoConnector.connect0 :
>   creates Connector thread AFTER connect call on the non-blocking channel
> AbstractPollingIoConnector.Connector.run() :
>  calls registerNew() :
>     private class Connector implements Runnable {
>         public Connector() {
> System.out.println("Connector::CTOR " + selectable);
>         }
>         public void run() {
>             assert (connectorRef.get() == this);
>             int nHandles = 0;
>             while (selectable) {
>                 try {
>                     // the timeout for select shall be smaller of the connect
>                     // timeout or 1 second...
>                     int timeout = (int)Math.min(getConnectTimeoutMillis(), 1000L);
>                     int selected = select(timeout);
>                     nHandles += registerNew();
> {code}
> Thanks !
> Florin



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