diff --git a/servlet/src/main/java/io/undertow/servlet/UndertowServletLogger.java b/servlet/src/main/java/io/undertow/servlet/UndertowServletLogger.java index e2a904607a..d4b8223f7b 100644 --- a/servlet/src/main/java/io/undertow/servlet/UndertowServletLogger.java +++ b/servlet/src/main/java/io/undertow/servlet/UndertowServletLogger.java @@ -32,6 +32,7 @@ import static org.jboss.logging.Logger.Level.ERROR; import static org.jboss.logging.Logger.Level.WARN; +import static org.jboss.logging.Logger.Level.TRACE; /** * log messages start at 15000 @@ -140,4 +141,7 @@ public interface UndertowServletLogger extends BasicLogger { @Message(id = 15024, value = "Servlet %s init() method in web application %s threw exception") void failedToLoad(String servletName, String appName, @Cause Throwable t); + @LogMessage(level = TRACE) + @Message(id = 15025, value = "IO Operation de-synchronization trace: ") + void ioOperationDesynchronization( @Cause Throwable t); } diff --git a/servlet/src/main/java/io/undertow/servlet/spec/ServletInputStreamImpl.java b/servlet/src/main/java/io/undertow/servlet/spec/ServletInputStreamImpl.java index f8eaa452a6..227753cb38 100644 --- a/servlet/src/main/java/io/undertow/servlet/spec/ServletInputStreamImpl.java +++ b/servlet/src/main/java/io/undertow/servlet/spec/ServletInputStreamImpl.java @@ -35,6 +35,7 @@ import org.xnio.channels.StreamSourceChannel; import io.undertow.connector.ByteBufferPool; import io.undertow.connector.PooledByteBuffer; +import io.undertow.servlet.UndertowServletLogger; import io.undertow.servlet.UndertowServletMessages; /** @@ -196,14 +197,21 @@ public int read(final byte[] b, final int off, final int len) throws IOException private void readIntoBuffer() throws IOException { if (pooled == null && !anyAreSet(state, FLAG_FINISHED)) { - pooled = bufferPool.allocate(); + try { + pooled = bufferPool.allocate(); - int res = Channels.readBlocking(channel, pooled.getBuffer()); - pooled.getBuffer().flip(); - if (res == -1) { - setFlags(FLAG_FINISHED); - pooled.close(); - pooled = null; + int res = Channels.readBlocking(channel, pooled.getBuffer()); + pooled.getBuffer().flip(); + if (res == -1) { + setFlags(FLAG_FINISHED); + pooled.close(); + pooled = null; + } + } catch(NullPointerException npe) { + //UNDERTOW-2298 - this will happen in small window when read is happening and timeout happens + if (!(anyAreSet(state, FLAG_CLOSED) || isFinished())) { + UndertowServletLogger.ROOT_LOGGER.ioOperationDesynchronization(npe); + } } } } diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml index cce71e997e..648290b999 100644 --- a/spotbugs-exclude.xml +++ b/spotbugs-exclude.xml @@ -932,4 +932,9 @@ + + + + +