Allow EventLoops to rethrow Error (#10694)

Motivation:

Thread.stop() works by producing a ThreadDeath error in the target thread. EventLoops swallow all Throwables, which makes them effectively unkillable. This is effectively a memory leak, for our application. Beside this we should also just regrow all `Error` as there is almost no way to recover.

Modification:

Edit the EventLoops that swallow Throwables to instead rethrow Error.

Result:

`EventLoop` can crash if `Error` is thrown
This commit is contained in:
greenjustin 2020-10-24 08:56:33 -04:00 committed by GitHub
parent d58d1add34
commit 090e9a7271
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 27 deletions

View File

@ -390,9 +390,11 @@ class EpollEventLoop extends SingleThreadEventLoop {
//increase the size of the array as we needed the whole space for the events //increase the size of the array as we needed the whole space for the events
events.increase(); events.increase();
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} } finally {
// Always handle shutdown even if the loop processing threw an exception. // Always handle shutdown even if the loop processing threw an exception.
try { try {
if (isShuttingDown()) { if (isShuttingDown()) {
@ -401,11 +403,14 @@ class EpollEventLoop extends SingleThreadEventLoop {
break; break;
} }
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} }
} }
} }
}
/** /**
* Visible only for testing! * Visible only for testing!

View File

@ -297,9 +297,11 @@ final class KQueueEventLoop extends SingleThreadEventLoop {
//increase the size of the array as we needed the whole space for the events //increase the size of the array as we needed the whole space for the events
eventList.realloc(false); eventList.realloc(false);
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} } finally {
// Always handle shutdown even if the loop processing threw an exception. // Always handle shutdown even if the loop processing threw an exception.
try { try {
if (isShuttingDown()) { if (isShuttingDown()) {
@ -308,11 +310,14 @@ final class KQueueEventLoop extends SingleThreadEventLoop {
break; break;
} }
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} }
} }
} }
}
@Override @Override
protected Queue<Runnable> newTaskQueue(int maxPendingTasks) { protected Queue<Runnable> newTaskQueue(int maxPendingTasks) {

View File

@ -515,9 +515,11 @@ public final class NioEventLoop extends SingleThreadEventLoop {
logger.debug(CancelledKeyException.class.getSimpleName() + " raised by a Selector {} - JDK bug?", logger.debug(CancelledKeyException.class.getSimpleName() + " raised by a Selector {} - JDK bug?",
selector, e); selector, e);
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} } finally {
// Always handle shutdown even if the loop processing threw an exception. // Always handle shutdown even if the loop processing threw an exception.
try { try {
if (isShuttingDown()) { if (isShuttingDown()) {
@ -526,11 +528,14 @@ public final class NioEventLoop extends SingleThreadEventLoop {
return; return;
} }
} }
} catch (Error e) {
throw (Error) e;
} catch (Throwable t) { } catch (Throwable t) {
handleLoopException(t); handleLoopException(t);
} }
} }
} }
}
// returns true if selectCnt should be reset // returns true if selectCnt should be reset
private boolean unexpectedSelectorWakeup(int selectCnt) { private boolean unexpectedSelectorWakeup(int selectCnt) {