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 @@
+
+
+
+
+