@Override public RetryResult beforeEval(Exception exception) { if (exception instanceof BaseServiceException) { boolean retriable = ((BaseServiceException) exception).isRetryable(); return retriable ? Interceptor.RetryResult.RETRY : Interceptor.RetryResult.CONTINUE_EVALUATION; } return Interceptor.RetryResult.CONTINUE_EVALUATION; } };
@InternalApi public boolean isRetryable(boolean idempotent, Set<Error> retryableErrors) { return BaseServiceException.isRetryable(code, reason, idempotent, retryableErrors); }
public CustomServiceException(int code, String message, String reason, boolean idempotent) { super( ExceptionData.from( code, message, reason, BaseServiceException.isRetryable(code, reason, idempotent, RETRYABLE_ERRORS))); }
private static ExceptionData makeExceptionData(IOException exception, boolean idempotent) { int code = UNKNOWN_CODE; Boolean retryable = null; if (exception instanceof HttpResponseException) { // In cases where an exception is an instance of HttpResponseException, // check the status code to determine whether it's retryable code = ((HttpResponseException) exception).getStatusCode(); retryable = BaseServiceException.isRetryable(code, null, idempotent, Collections.<Error>emptySet()); } return ExceptionData.newBuilder() .setMessage(exception.getMessage()) .setCause(exception) .setRetryable( MoreObjects.firstNonNull( retryable, BaseServiceException.isRetryable(idempotent, exception))) .setCode(code) .setReason(null) .setLocation(null) .setDebugInfo(null) .build(); }
@Test public void testTranslateAndThrow() throws Exception { IOException exception = new SocketTimeoutException(); BaseGrpcServiceException cause = new BaseGrpcServiceException(exception, IDEMPOTENT); RetryHelper.RetryHelperException exceptionMock = createMock(RetryHelper.RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); try { BaseServiceException.translate(exceptionMock); } catch (BaseServiceException ex) { assertEquals(0, ex.getCode()); assertNull(ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); } } }
retryable = BaseServiceException.isRetryable(code, null, idempotent, retryableErrors); retryable = BaseServiceException.isRetryable(code, null, idempotent, retryableErrors); .setRetryable( MoreObjects.firstNonNull( retryable, BaseServiceException.isRetryable(idempotent, exception))) .setCode(code) .setReason(reason)
@Test public void testTranslateAndThrow() throws Exception { BaseServiceException cause = new BaseHttpServiceException(CODE, MESSAGE, REASON, IDEMPOTENT, EMPTY_RETRYABLE_ERRORS); RetryHelper.RetryHelperException exceptionMock = createMock(RetryHelper.RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); try { BaseServiceException.translate(exceptionMock); } catch (BaseServiceException ex) { assertEquals(CODE, ex.getCode()); assertEquals(MESSAGE, ex.getMessage()); assertFalse(ex.isRetryable()); } finally { verify(exceptionMock); } } }
@Test public void testTranslateAndThrow() throws Exception { BaseServiceException cause = new BaseServiceException(ExceptionData.from(CODE, MESSAGE, REASON, NOT_RETRYABLE)); RetryHelper.RetryHelperException exceptionMock = createMock(RetryHelper.RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); try { BaseServiceException.translate(exceptionMock); } catch (BaseServiceException ex) { assertEquals(CODE, ex.getCode()); assertEquals(MESSAGE, ex.getMessage()); assertFalse(ex.isRetryable()); } finally { verify(exceptionMock); } }
assertEquals(500, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(ComputeException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals(503, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(StorageException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals(503, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(ResourceManagerException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals(503, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(BigQueryException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals(500, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(TranslateException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals(14, ex.getCode()); assertEquals("message", ex.getMessage()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(DatastoreException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
assertEquals("message", ex.getMessage()); assertEquals(timeoutException, ex.getCause()); assertTrue(ex.isRetryable()); } finally { verify(exceptionMock); assertEquals(DnsException.UNKNOWN_CODE, ex.getCode()); assertEquals("message", ex.getMessage()); assertFalse(ex.isRetryable()); assertSame(cause, ex.getCause()); } finally {
@InternalApi("This class should only be extended within google-cloud-java") protected BaseHttpServiceException( int code, String message, String reason, boolean idempotent, Set<BaseServiceException.Error> retryableErrors, Throwable cause) { super( ExceptionData.newBuilder() .setMessage(message) .setCause(cause) .setRetryable( BaseServiceException.isRetryable(code, reason, idempotent, retryableErrors)) .setCode(code) .setReason(reason) .setLocation(null) .setDebugInfo(null) .build()); }
private static ExceptionData makeExceptionData( GoogleJsonError googleJsonError, boolean idempotent, Set<BaseServiceException.Error> retryableErrors) { int code = googleJsonError.getCode(); String reason = reason(googleJsonError); ExceptionData.Builder exceptionData = ExceptionData.newBuilder(); exceptionData .setMessage(googleJsonError.getMessage()) .setCause(null) .setRetryable(BaseServiceException.isRetryable(code, reason, idempotent, retryableErrors)) .setCode(code) .setReason(reason); if (reason != null) { GoogleJsonError.ErrorInfo errorInfo = googleJsonError.getErrors().get(0); exceptionData.setLocation(errorInfo.getLocation()); exceptionData.setDebugInfo((String) errorInfo.get("debugInfo")); } else { exceptionData.setLocation(null); exceptionData.setDebugInfo(null); } return exceptionData.build(); }
assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertNull(serviceException.getCause()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertNull(serviceException.getCause()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertEquals(cause, serviceException.getCause()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertEquals(cause, serviceException.getCause()); assertTrue(serviceException.isRetryable()); assertNull(serviceException.getMessage()); assertEquals(exception, serviceException.getCause()); assertTrue(serviceException.isRetryable()); assertNull(serviceException.getMessage()); assertEquals(exception, serviceException.getCause()); assertTrue(serviceException.isRetryable());
assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertNull(serviceException.getCause()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertFalse(serviceException.isRetryable()); assertEquals(cause, serviceException.getCause()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertTrue(serviceException.isRetryable()); assertEquals(cause, serviceException.getCause()); assertEquals(DEBUG_INFO, serviceException.getDebugInfo()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertTrue(serviceException.isRetryable()); assertEquals(MESSAGE, serviceException.getMessage()); assertNull(serviceException.getReason()); assertTrue(serviceException.isRetryable()); assertEquals(MESSAGE, serviceException.getMessage()); assertEquals(REASON, serviceException.getReason()); assertTrue(serviceException.isRetryable());
@Override public RetryResult beforeEval(Exception exception) { if (exception instanceof BaseServiceException) { boolean retriable = ((BaseServiceException) exception).isRetryable(); return retriable ? Interceptor.RetryResult.RETRY : Interceptor.RetryResult.CONTINUE_EVALUATION; } return Interceptor.RetryResult.CONTINUE_EVALUATION; } };