Koji Kawamura created NIFI-5952:
-----------------------------------

             Summary: RAW Site-to-Site fails with 
java.nio.channels.IllegalBlockingModeException
                 Key: NIFI-5952
                 URL: https://issues.apache.org/jira/browse/NIFI-5952
             Project: Apache NiFi
          Issue Type: Sub-task
          Components: Core Framework
         Environment: jdk-11.0.1
            Reporter: Koji Kawamura
            Assignee: Koji Kawamura


During the review cycle of NIFI-5820, I found that while HTTP S2S works without 
issue, RAW S2S is failing with following Exception:
{code:java}
 2018-12-19 16:19:26,811 ERROR [Site-to-Site Listener] org.apache.nifi.NiFi
 java.nio.channels.IllegalBlockingModeException: null
 at 
java.base/sun.nio.ch.ServerSocketAdaptor.accept(ServerSocketAdaptor.java:121)
 at 
org.apache.nifi.remote.SocketRemoteSiteListener$1.run(SocketRemoteSiteListener.java:125)
 at java.base/java.lang.Thread.run(Thread.java:834)
{code}
Despite of the fact that the RAW has been worked with older Java versions, it 
seems current nio usage at RAW S2S is not correct. And JDK 11 starts 
complaining about it.

Here are few things I've discovered with current NiFi and nio SocketChannel:
 - NiFi accepts RAW S2S client connection with SocketRemoteSiteListener, which 
uses ServerSocketChannel as non-blocking manner [1]
 - But SocketRemoteSiteListener doesn't use Selector API to accept incoming 
connection and transfer data with the channel. This is the cause of above 
exception.
 - SocketRemoteSiteListener spawns new thread when it accepts connection. This 
is how connections are handled with a non-nio, standard Socket programming. If 
we want to use non-blocking NIO, we need to use channels with Selector
 - But using non-blocking IO with current NiFi S2S protocol can only add few or 
none benefit by doing so. [2]

To make RAW S2S work with Java 11, we need either:
 A. Stop using nio packages.
 B. Implement correct nio usage, meaning use Selector IO and probably we need 
another thread pool.

I'm going to take the approach A above, because B would take much more 
refactoring.

[1] 
[https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/SocketRemoteSiteListener.java#L120]
 [2] 
[https://stackoverflow.com/questions/12338204/in-java-nio-is-a-selector-useful-for-a-client-socketchannel]



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

Reply via email to