public void IsRetryableWriteException_should_return_expected_result_using_code(int code, bool expectedResult) { var exception = CoreExceptionHelper.CreateMongoCommandException(code); var result = RetryabilityHelper.IsRetryableWriteException(exception); result.Should().Be(expectedResult); }
public void IsRetryableWriteException_should_return_expected_result_using_exception_type(Type exceptionType, bool expectedResult) { var exception = CoreExceptionHelper.CreateException(exceptionType); var result = RetryabilityHelper.IsRetryableWriteException(exception); result.Should().Be(expectedResult); }
public void IsRetryableWriteException_should_return_expected_result([Values(false, true)] bool hasRetryableWriteLabel) { var exception = CoreExceptionHelper.CreateMongoCommandException(-1); if (hasRetryableWriteLabel) { exception.AddErrorLabel("RetryableWriteError"); } var result = RetryabilityHelper.IsRetryableWriteException(exception); result.Should().Be(hasRetryableWriteLabel); }
public static async Task <TResult> ExecuteAsync <TResult>(IRetryableWriteOperation <TResult> operation, RetryableWriteContext context, CancellationToken cancellationToken) { if (!AreRetriesAllowed(operation, context)) { return(await operation.ExecuteAttemptAsync(context, 1, null, cancellationToken).ConfigureAwait(false)); } var transactionNumber = context.Binding.Session.AdvanceTransactionNumber(); Exception originalException; try { return(await operation.ExecuteAttemptAsync(context, 1, transactionNumber, cancellationToken).ConfigureAwait(false)); } catch (Exception ex) when(RetryabilityHelper.IsRetryableWriteException(ex)) { originalException = ex; } try { context.ReplaceChannelSource(await context.Binding.GetWriteChannelSourceAsync(cancellationToken).ConfigureAwait(false)); context.ReplaceChannel(await context.ChannelSource.GetChannelAsync(cancellationToken).ConfigureAwait(false)); } catch { throw originalException; } if (!AreRetryableWritesSupported(context.Channel.ConnectionDescription)) { throw originalException; } try { return(await operation.ExecuteAttemptAsync(context, 2, transactionNumber, cancellationToken).ConfigureAwait(false)); } catch (Exception ex) when(ShouldThrowOriginalException(ex)) { throw originalException; } }
public static TResult Execute <TResult>(IRetryableWriteOperation <TResult> operation, RetryableWriteContext context, CancellationToken cancellationToken) { if (!context.RetryRequested || !AreRetryableWritesSupported(context.Channel.ConnectionDescription)) { return(operation.ExecuteAttempt(context, 1, null, cancellationToken)); } var transactionNumber = context.Binding.Session.AdvanceTransactionNumber(); Exception originalException; try { return(operation.ExecuteAttempt(context, 1, transactionNumber, cancellationToken)); } catch (Exception ex) when(RetryabilityHelper.IsRetryableWriteException(ex)) { originalException = ex; } try { context.ReplaceChannelSource(context.Binding.GetWriteChannelSource(cancellationToken)); context.ReplaceChannel(context.ChannelSource.GetChannel(cancellationToken)); } catch { throw originalException; } if (!AreRetryableWritesSupported(context.Channel.ConnectionDescription)) { throw originalException; } try { return(operation.ExecuteAttempt(context, 2, transactionNumber, cancellationToken)); } catch (Exception ex) when(ShouldThrowOriginalException(ex)) { throw originalException; } }