[tcp] Ignore exceptions in reader thread if writer was terminated

If we do not ignore the exception, then users may receive an exception
via connectionClosedOnError() on connection termination. Those
exceptions are typically unwanted if they are caused e.g. because the
server does not send a closing stream tag.

We previously ignored exceptions in this case already, but that
behavior was changed with [1: 57961a8cc1]. This commit re-adds the
behavior.

1: 57961a8cc1
   Remove SynchronizationPoint
This commit is contained in:
Florian Schmaus 2021-03-09 13:10:40 +01:00
parent 4adbd21a0f
commit f9114f780d
1 changed files with 19 additions and 9 deletions

View File

@ -1141,16 +1141,26 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
} }
} }
catch (Exception e) { catch (Exception e) {
// The exception can be ignored if the the connection is 'done' // Set running to false since this thread will exit here and notifyConnectionError() will wait until
// or if the it was caused because the socket got closed. // the reader and writer thread's 'running' value is false.
if (!done) { running = false;
// Set running to false since this thread will exit here and notifyConnectionError() will wait until
// the reader and writer thread's 'running' value is false. String ignoreReasonThread = null;
running = false;
// Close the connection and notify connection listeners of the boolean writerThreadWasShutDown = packetWriter.queue.isShutdown();
// error. if (writerThreadWasShutDown) {
notifyConnectionError(e); ignoreReasonThread = "writer";
} else if (done) {
ignoreReasonThread = "reader";
} }
if (ignoreReasonThread != null) {
LOGGER.log(Level.FINER, "Ignoring " + e + " as " + ignoreReasonThread + " was already shut down");
return;
}
// Close the connection and notify connection listeners of the error.
notifyConnectionError(e);
} }
} }
} }