Hi there,

In netty we support using BlockHound[1] to detect if people do blocking 
operations within the EventLoop and so notify them that this should not be 
done. While running our integration tests with TLS1.3 we noticed that unwrap(…) 
may trigger an FileInputStream.read(…) which in theory could block for a long 
time. I was assuming that such an operation should only be done after 
SSLEngine.* returns NEED_TASK and so be delegated to another ThreadPool via 
getTask().

Now the question(s):

* Is my assumption incorrect ?
* If my assumption is correct should we fix this ?

Here is the stack trace when such a blocking call is detected:

reactor.blockhound.BlockingOperationError: Blocking call! 
java.io.FileInputStream#readBytes
        at java.base/java.io.FileInputStream.readBytes(FileInputStream.java)
        at java.base/java.io.FileInputStream.read(FileInputStream.java:273)
        at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
        at 
java.base/sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
        at 
java.base/sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:526)
        at 
java.base/sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:545)
        at 
java.base/sun.security.provider.NativePRNG$NonBlocking.engineNextBytes(NativePRNG.java:318)
        at java.base/java.security.SecureRandom.nextBytes(SecureRandom.java:741)
        at java.base/sun.security.ssl.RandomCookie.<init>(RandomCookie.java:67)
        at java.base/sun.security.ssl.SessionId.<init>(SessionId.java:45)
        at 
java.base/sun.security.ssl.NewSessionTicket$NewSessionTicketKickstartProducer.produce(NewSessionTicket.java:225)
        at 
java.base/sun.security.ssl.Finished$T13FinishedConsumer.onConsumeFinished(Finished.java:1100)
        at 
java.base/sun.security.ssl.Finished$T13FinishedConsumer.consume(Finished.java:867)
        at 
java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
        at 
java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443)
        at 
java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:418)
        at 
java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:177)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
        at 
java.base/sun.security.ssl.SSLEngineImpl.decode(SSLEngineImpl.java:681)
        at 
java.base/sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:636)
        at 
java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:454)
        at 
java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:433)
        at java.base/javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:634)
        at 
io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1380)
        at 
io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1275)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1322)

[1] https://github.com/reactor/BlockHound

Reply via email to