On 02/11/2020 12:16, Eric Robinson wrote:

<snip/>

> Gotcha, thanks for the clarification. Let's see what happens when the users 
> start hitting it at 8:00 am Eastern.

Progress. The first attempt to write to the socket triggers the
following exception:

02-Nov-2020 14:33:54.083 FINE [http-bio-3016-exec-13]
org.apache.tomcat.util.net.JIoEndpoint$DebugOutputStream.write [301361476]
 java.net.SocketException: Bad file descriptor (Write failed)
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
    at
org.apache.tomcat.util.net.JIoEndpoint$DebugOutputStream.write(JIoEndpoint.java:1409)
    at
org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:247)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
    at
org.apache.coyote.http11.InternalOutputBuffer.endRequest(InternalOutputBuffer.java:183)
    at
org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:761)
    at org.apache.coyote.Response.action(Response.java:174)
    at org.apache.coyote.Response.finish(Response.java:274)
    at
org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:322)
    at
org.apache.catalina.connector.Response.finishResponse(Response.java:537)
    at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:480)
    at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)
    at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
    at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:321)
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Because this is an instance of an IOException, Tomcat assumes it has
been caused by the client dropping the connection and silently swallows
it. I'll be changing that later today so the exception is logged as
DEBUG level for all new Tomcat versions.

Possible causes of "java.net.SocketException: Bad file descriptor" I've
been able to find are:

1. OS running out of file descriptors.

2.Trying to use a closed socket.

I want to review the source code to see if there are any others.

I don't think we are seeing 2 as there is no indication of the Socket,
InputStream or OutputStream being closed in the logs.

That leaves 1. Possible causes here are a file descriptor leak or normal
operations occasionally needing more than the current limit. I don't
think it is a leak as I'd expect to see many more errors of this type
after the first and we aren't seeing that. That leaves the possibility
of the current limit being a little too low.

My recommendation at this point is to increase the limit for file
descriptors. Meanwhile, I'll look at the JRE source to see if there are
any other possible triggers for this exception.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to