Class ExceptionHookImpl

  • All Implemented Interfaces:
    ExceptionHook

    public class ExceptionHookImpl
    extends Object
    implements ExceptionHook
    Class to detect and handle exceptions that are caused by temporary errors, and hence should cause a retry of the failed operation.
    • Constructor Detail

      • ExceptionHookImpl

        public ExceptionHookImpl()
    • Method Detail

      • shouldRetry

        public boolean shouldRetry​(String actionType,
                                   String actionName,
                                   Throwable throwable)
        Description copied from interface: ExceptionHook
        Whether an operation should be retried if it failed with the given throwable.

        Only affects operations that are executed with RetryHelper.

        Should return true only for exceptions that are caused by temporary issues where a retry of the operation has a chance to succeed.

        If false is returned the operation is still retried once to capture a trace, unless ExceptionHook.skipRetryWithTrace(String, String, Throwable) skips the auto-retry.

        If multiple exception hooks are registered, the operation is retried if any of them returns true from this method.

        Specified by:
        shouldRetry in interface ExceptionHook
        Parameters:
        actionType - the type of the action for which the exception occurred
        actionName - the name of the action for which the exception occurred
        throwable - throwable that was thrown while executing the operation
        Returns:
        whether the operation should be retried
      • skipRetryWithTrace

        public boolean skipRetryWithTrace​(String actionType,
                                          String actionName,
                                          Throwable throwable)
        Description copied from interface: ExceptionHook
        Whether auto-retrying of an operation with tracing should be skipped for the given throwable.

        Only affects operations that are executed with RetryHelper.

        This method is only called for exceptions for which the operation should not be retried (ExceptionHook.shouldRetry(String, String, Throwable) returned false).

        By default this method returns false, so that by default traces for unexpected exceptions are captured, which allows to investigate them.

        Implementors may use this method to skip retry with tracing for exceptions that occur due to known causes that are permanent and where a trace is not needed for the investigation. For example, if an operation fails because persisted data is corrupt, it makes no sense to retry the operation with a trace, because the trace will not help with fixing the corrupt data.

        This method is only invoked if retry with tracing is enabled on the server ( retry.retryWithTraceOnFailure in gerrit.config is set to true).

        If multiple exception hooks are registered, retrying with tracing is skipped if any of them returns true from this method.

        Specified by:
        skipRetryWithTrace in interface ExceptionHook
        Parameters:
        actionType - the type of the action for which the exception occurred
        actionName - the name of the action for which the exception occurred
        throwable - throwable that was thrown while executing the operation
        Returns:
        whether auto-retrying of an operation with tracing should be skipped for the given throwable
      • formatCause

        public Optional<String> formatCause​(Throwable throwable)
        Description copied from interface: ExceptionHook
        Formats the cause of an exception for use in metrics.

        This method allows implementors to group exceptions that have the same cause into one metric bucket.

        If multiple exception hooks return a value from this method, the value from the exception hook that is registered first is used.

        Specified by:
        formatCause in interface ExceptionHook
        Parameters:
        throwable - the exception cause
        Returns:
        formatted cause or Optional.empty() if no formatting was done
      • getUserMessages

        public com.google.common.collect.ImmutableList<String> getUserMessages​(Throwable throwable,
                                                                               String traceId)
        Description copied from interface: ExceptionHook
        Returns messages that should be returned to the user.

        These messages are included into the HTTP response that is sent to the user.

        If multiple exception hooks return a value from this method, all the values are included into the HTTP response (in the order in which the exception hooks are registered).

        Specified by:
        getUserMessages in interface ExceptionHook
        Parameters:
        throwable - throwable that was thrown while executing an operation
        traceId - ID of the trace if this request was traced, otherwise null
        Returns:
        error messages that should be returned to the user, Optional.empty() if no message should be returned to the user
      • getStatus

        public Optional<ExceptionHook.Status> getStatus​(Throwable throwable)
        Description copied from interface: ExceptionHook
        Returns the HTTP status that should be returned to the user.

        Implementors may use this method to change the status for certain exceptions (e.g. using this method it would be possible to return 503 Lock failure for LockFailureExceptions instead of 500 Internal server error).

        If no value is returned (Optional.empty()) it means that this exception hook doesn't want to change the default response code for the given exception which is 500 Internal Server Error, but is fine if other exception hook implementation do so.

        If multiple exception hooks return a value from this method, the value from exception hook that is registered first is used.

        ExceptionHook.getUserMessages(Throwable, String) allows to define which additional messages should be included into the body of the HTTP response.

        Specified by:
        getStatus in interface ExceptionHook
        Parameters:
        throwable - throwable that was thrown while executing an operation
        Returns:
        HTTP status that should be returned to the user, Optional.empty() if the exception should result in 500 Internal Server Error