-
Bug
-
Resolution: Unresolved
-
Major
-
12.1.7.Final, 13.0.2.Final
-
None
The Reactive Streams spec is very strict about what exceptions can be thrown, so when our blocking executor scheduler throws a CacheBackpressureFullException, RxJava wraps it into a NullPointerException.
But NullPointerException doesn't have a constructor with a Throwable cause parameter, so RxJava uses initCause(). ThrowableExternalizer sees the cause, doesn't find an appropriate constructor, and gives up.
Then because the unmarshalling of the ExceptionResponse failed, JGroupsTransport.processResponse() doesn't invoke the ResponseCollector at all, and the request eventually times out.
Fix steps:
- Make CacheBackpressureFullException extend RejectedExecutionException so it's handled more gracefully by RxJava.
- Make ThrowableExternalizer use initCause() when a constructor with a cause parameter is not available (or possibly stop unmarshalling the exact exception, see ISPN-12866
- Make JGroupsTransport.processResponse() invoke the ResponseCollector with the unmarshalling exception in cases like this.
- is related to
-
ISPN-12866 Generic exception externalizer can throw CNFEs when unmarshalling exception response
- New
-
ISPN-11022 Remote exception stack traces are not serialized
- Closed