E E created LOG4J2-3517:
---------------------------
Summary: Log4j2 logging Tools TcpSocketServer socket leak - tcp
socket server does not close sockets properly and they stay in CLOSE_WAIT state
Key: LOG4J2-3517
URL: https://issues.apache.org/jira/browse/LOG4J2-3517
Project: Log4j 2
Issue Type: Bug
Components: Servers
Affects Versions: 2.17.2
Environment: Linux machine:
uname -a
Linux 4.18.0-193.13.2.el8_2.x86_64 #1 SMP Mon Jul 13 23:17:28 UTC 2020 x86_64
x86_64 x86_64 GNU/Linux
java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
Reporter: E E
We are using the tcp socket server for listening and intercepting log4j2
logging events from clients and logging them
We have close wait sockets on our server where the log4j2 tcp socket server is
running after connection is closed by the client, the client crashed and
connection terminated by the client.
Looks like a bug in TcpSocketServer --> SocketHandler --> that in case of EOF
exception like if a connection is closed by the client or connection terminated
un expectedly then the connection is not closed properly and the socket remains
in close wait state forever or until the tcp socket server is restarted.
This is a socket leak and after sometime with many close wait sockets the
machine can be unresponsive and can deny new connections if max open files is
reached.
Looking at the source code of TcpSocketServer --> SocketHandler --> in the
run() method, if EOF exception the closed turned to true and the input stream
is not properly closed:
@Override
public void run() {
final EntryMessage entry = logger.traceEntry();
boolean closed = false;
try {
try {
while (!shutdown) {
logEventInput.logEvents(inputStream,
TcpSocketServer.this);
}
{color:#FF0000} *} catch (final EOFException e) {*{color}
*{color:#FF0000}closed = true;{color}*
{color:#FF0000} *}* {color}catch (final OptionalDataException e)
{
logger.error("OptionalDataException eof=" + e.eof + "
length=" + e.length, e);
} catch (final IOException e) {
logger.error("IOException encountered while reading from
socket", e);
} catch (ParseException e) {
logger.error("ParseException encountered while reading from
socket", e);
}
{color:#FF0000} *if (!closed) {*{color}
{color:#FF0000} *Closer.closeSilently(inputStream);*{color}
{color:#FF0000} *}*{color}
} finally {
handlers.remove(Long.valueOf(getId()));
}
logger.traceExit(entry);
}
Thank you
--
This message was sent by Atlassian Jira
(v8.20.7#820007)