Description
We found a Deadlock in the SocketAppender (TCPSocketManager.java), when the reconnectionDelay is used.
A JUnit-Testcase (testTcpAppenderDeadlock()) has been attached, which reproduced the deadlock.
Description of the JUnit-Testcase:
• No SocketServer is startet
• We generate a SocketAppender with a reconnectionDelay= 10sec
• The SocketAppender acknowledges that no SocktServer is there, and start the timeout
• During reconnectionDelay the SocketServer started and something is logged
• Now the user-thread (here the JUNIT-Thread) and the Reconnector-Thread are blocking each other forever
An additional Issue occurs:
If no SocketServer is available at the start of the SocketAppender, each user-thread is blocked at every logging operation up to the defined reconnection-time!
Recommended solution:
TCPSocketManager.java
@Override
protected synchronized void write(final byte[] bytes, final int offset, final int length) {
// if (socket == null) {
// if (connector != null)
// if (socket == null)
{ // final String msg = "Error writing to " + getName() + " socket not available"; // throw new AppenderRuntimeException(msg); // }// }
if (socket == null) {
if (connector != null)
else
{ final String msg = "Error writing to " + getName() + " socket not available"; throw new AppenderRuntimeException(msg); }}