- // Final request, needs routing to the data tree, so it can persist a tombstone
- abstract void purge(Runnable callback);
+ if (previousFailure != null) {
+ LOG.debug("{}: Rejecting request {} due to previous failure", persistenceId(), request, previousFailure);
+ throw previousFailure;
+ }
+
+ try {
+ return doHandleRequest(request, envelope, now);
+ } catch (RuntimeException e) {
+ /*
+ * The request failed to process, we should not attempt to ever
+ * apply it again. Furthermore we cannot accept any further requests
+ * from this connection, simply because the transaction state is
+ * undefined.
+ */
+ LOG.debug("{}: Request {} failed to process", persistenceId(), request, e);
+ previousFailure = new RuntimeRequestException("Request " + request + " failed to process", e);
+ throw previousFailure;
+ }
+ }
+
+ @Nullable
+ abstract TransactionSuccess<?> doHandleRequest(TransactionRequest<?> request, RequestEnvelope envelope,
+ long now) throws RequestException;