use of net.jodah.failsafe.RetryPolicy in project open-kilda by telstra.
the class BaseResourceAllocationAction method allocateFlowResources.
@SneakyThrows
protected FlowResources allocateFlowResources(Flow flow, PathId forwardPathId, PathId reversePathId) throws ResourceAllocationException {
RetryPolicy<FlowResources> resourceAllocationRetryPolicy = transactionManager.<FlowResources>getDefaultRetryPolicy().handle(ResourceAllocationException.class).handle(ConstraintViolationException.class).onRetry(e -> log.warn("Failure in resource allocation. Retrying #{}...", e.getAttemptCount(), e.getLastFailure())).onRetriesExceeded(e -> log.warn("Failure in resource allocation. No more retries", e.getFailure())).withMaxRetries(resourceAllocationRetriesLimit);
FlowResources flowResources = transactionManager.doInTransaction(resourceAllocationRetryPolicy, () -> resourcesManager.allocateFlowResources(flow, forwardPathId, reversePathId));
log.debug("Resources have been allocated: {}", flowResources);
return flowResources;
}
use of net.jodah.failsafe.RetryPolicy in project open-kilda by telstra.
the class BaseResourceAllocationAction method allocatePathPair.
@SneakyThrows
protected GetPathsResult allocatePathPair(Flow flow, PathId newForwardPathId, PathId newReversePathId, boolean forceToIgnoreBandwidth, List<PathId> pathsToReuseBandwidth, FlowPathPair oldPaths, boolean allowOldPaths, String sharedBandwidthGroupId, Predicate<GetPathsResult> whetherCreatePathSegments) throws RecoverableException, UnroutableFlowException, ResourceAllocationException {
// Lazy initialisable map with reused bandwidth...
Supplier<Map<IslEndpoints, Long>> reuseBandwidthPerIsl = Suppliers.memoize(() -> {
Map<IslEndpoints, Long> result = new HashMap<>();
if (pathsToReuseBandwidth != null && !pathsToReuseBandwidth.isEmpty()) {
pathsToReuseBandwidth.stream().map(pathId -> flow.getPath(pathId).orElse(flowPathRepository.findById(pathId).orElse(null))).filter(Objects::nonNull).flatMap(path -> path.getSegments().stream()).forEach(segment -> {
IslEndpoints isl = new IslEndpoints(segment.getSrcSwitchId().toString(), segment.getSrcPort(), segment.getDestSwitchId().toString(), segment.getDestPort());
result.put(isl, result.getOrDefault(isl, 0L) + segment.getBandwidth());
});
}
return result;
});
RetryPolicy<GetPathsResult> pathAllocationRetryPolicy = new RetryPolicy<GetPathsResult>().handle(RecoverableException.class).handle(ResourceAllocationException.class).handle(UnroutableFlowException.class).handle(PersistenceException.class).onRetry(e -> log.warn("Failure in path allocation. Retrying #{}...", e.getAttemptCount(), e.getLastFailure())).onRetriesExceeded(e -> log.warn("Failure in path allocation. No more retries", e.getFailure())).withMaxRetries(pathAllocationRetriesLimit);
if (pathAllocationRetryDelay > 0) {
pathAllocationRetryPolicy.withDelay(Duration.ofMillis(pathAllocationRetryDelay));
}
try {
return Failsafe.with(pathAllocationRetryPolicy).get(() -> {
GetPathsResult potentialPath;
if (forceToIgnoreBandwidth) {
boolean originalIgnoreBandwidth = flow.isIgnoreBandwidth();
flow.setIgnoreBandwidth(true);
potentialPath = pathComputer.getPath(flow);
flow.setIgnoreBandwidth(originalIgnoreBandwidth);
} else {
potentialPath = pathComputer.getPath(flow, pathsToReuseBandwidth);
}
boolean newPathFound = isNotSamePath(potentialPath, oldPaths);
if (allowOldPaths || newPathFound) {
if (!newPathFound) {
log.debug("Found the same path for flow {}. Proceed with recreating it", flow.getFlowId());
}
if (whetherCreatePathSegments.test(potentialPath)) {
boolean ignoreBandwidth = forceToIgnoreBandwidth || flow.isIgnoreBandwidth();
List<PathSegment> forwardSegments = flowPathBuilder.buildPathSegments(newForwardPathId, potentialPath.getForward(), flow.getBandwidth(), ignoreBandwidth, sharedBandwidthGroupId);
List<PathSegment> reverseSegments = flowPathBuilder.buildPathSegments(newReversePathId, potentialPath.getReverse(), flow.getBandwidth(), ignoreBandwidth, sharedBandwidthGroupId);
transactionManager.doInTransaction(() -> {
createPathSegments(forwardSegments, reuseBandwidthPerIsl);
createPathSegments(reverseSegments, reuseBandwidthPerIsl);
});
}
return potentialPath;
}
return null;
});
} catch (FailsafeException ex) {
throw ex.getCause();
}
}
use of net.jodah.failsafe.RetryPolicy in project samza by apache.
the class FailsafeAdapter method valueOf.
/**
* Convert the {@link TableRetryPolicy} to failsafe {@link RetryPolicy}.
* @return this policy instance
*/
static RetryPolicy valueOf(TableRetryPolicy policy) {
// max retries default changed to 2 in v2.0. switching back to infinite retries by default for back compat.
RetryPolicy failSafePolicy = new RetryPolicy().withMaxRetries(-1);
switch(policy.getBackoffType()) {
case NONE:
break;
case FIXED:
failSafePolicy.withDelay(policy.getSleepTime());
break;
case RANDOM:
failSafePolicy.withDelay(policy.getRandomMin().toMillis(), policy.getRandomMax().toMillis(), ChronoUnit.MILLIS);
break;
case EXPONENTIAL:
failSafePolicy.withBackoff(policy.getSleepTime().toMillis(), policy.getExponentialMaxSleep().toMillis(), ChronoUnit.MILLIS, policy.getExponentialFactor());
break;
default:
throw new SamzaException("Unknown retry policy type.");
}
if (policy.getMaxDuration() != null) {
failSafePolicy.withMaxDuration(policy.getMaxDuration());
}
if (policy.getMaxAttempts() != null) {
failSafePolicy.withMaxRetries(policy.getMaxAttempts());
}
if (policy.getJitter() != null && policy.getBackoffType() != TableRetryPolicy.BackoffType.RANDOM) {
failSafePolicy.withJitter(policy.getJitter());
}
failSafePolicy.abortOn(policy.getRetryPredicate().negate());
return failSafePolicy;
}
use of net.jodah.failsafe.RetryPolicy in project samza by apache.
the class FutureUtil method executeAsyncWithRetries.
public static <T> CompletableFuture<T> executeAsyncWithRetries(String opName, Supplier<? extends CompletionStage<T>> action, Predicate<? extends Throwable> abortRetries, ExecutorService executor) {
Duration maxDuration = Duration.ofMinutes(10);
RetryPolicy<Object> retryPolicy = new RetryPolicy<>().withBackoff(100, 312500, ChronoUnit.MILLIS, // 100 ms, 500 ms, 2500 ms, 12.5 s, 1.05 min, 5.20 min, 5.20 min
5).withMaxDuration(maxDuration).abortOn(// stop retrying if predicate returns true
abortRetries).onRetry(e -> LOG.warn("Action: {} attempt: {} completed with error {} ms after start. Retrying up to {} ms.", opName, e.getAttemptCount(), e.getElapsedTime().toMillis(), maxDuration.toMillis(), e.getLastFailure()));
return Failsafe.with(retryPolicy).with(executor).getStageAsync(action::get);
}
use of net.jodah.failsafe.RetryPolicy in project samza by apache.
the class TestTableRetryPolicy method testExponentialRetry.
@Test
public void testExponentialRetry() {
TableRetryPolicy retryPolicy = new TableRetryPolicy();
retryPolicy.withExponentialBackoff(Duration.ofMillis(1000), Duration.ofMillis(2000), 1.5);
retryPolicy.withJitter(Duration.ofMillis(100));
Assert.assertEquals(TableRetryPolicy.BackoffType.EXPONENTIAL, retryPolicy.getBackoffType());
RetryPolicy fsRetry = FailsafeAdapter.valueOf(retryPolicy);
Assert.assertEquals(1000, fsRetry.getDelay().toMillis());
Assert.assertEquals(2000, fsRetry.getMaxDelay().toMillis());
Assert.assertEquals(1.5, fsRetry.getDelayFactor(), 0.001);
Assert.assertEquals(100, fsRetry.getJitter().toMillis());
Assert.assertEquals("{\"sleepTime\":{\"seconds\":1,\"nanos\":0},\"exponentialFactor\":1.5," + "\"exponentialMaxSleep\":{\"seconds\":2,\"nanos\":0},\"jitter\":{\"seconds\":0,\"nanos\":100000000}," + "\"backoffType\":\"EXPONENTIAL\",\"retryPredicate\":{}}", retryPolicy.toConfig(null, null).get("TableRetryPolicy"));
}
Aggregations