From ac3ff4f168feadc7b3a3df54889d5573f28ef203 Mon Sep 17 00:00:00 2001 From: Santiago Pericasgeertsen Date: Thu, 1 Oct 2020 14:51:34 -0400 Subject: [PATCH] Support for a name for all those operations that implement FtHandler. These names can be used for debugging, error reporting and future config support. Fixed some warnings too. (#2404) Signed-off-by: Santiago Pericasgeertsen --- .../io/helidon/faulttolerance/Bulkhead.java | 4 ++-- .../helidon/faulttolerance/BulkheadImpl.java | 6 +++++ .../faulttolerance/CircuitBreaker.java | 22 +++++++++++++++++-- .../faulttolerance/CircuitBreakerImpl.java | 7 ++++++ .../io/helidon/faulttolerance/Fallback.java | 6 +++-- .../faulttolerance/FaultTolerance.java | 6 +++++ .../io/helidon/faulttolerance/FtHandler.java | 8 +++++++ .../java/io/helidon/faulttolerance/Retry.java | 22 +++++++++++++++++-- .../io/helidon/faulttolerance/RetryImpl.java | 7 ++++++ .../io/helidon/faulttolerance/Timeout.java | 16 ++++++++++++++ .../helidon/faulttolerance/TimeoutImpl.java | 7 ++++++ 11 files changed, 103 insertions(+), 8 deletions(-) diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Bulkhead.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Bulkhead.java index 34f3597ed..7691ea578 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Bulkhead.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Bulkhead.java @@ -98,9 +98,9 @@ public interface Bulkhead extends FtHandler { } /** - * Name is useful for debugging and in exception handling. + * A name assigned for debugging, error reporting or configuration purposes. * - * @param name name of this bulkhead + * @param name the name * @return updated builder instance */ public Builder name(String name) { diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/BulkheadImpl.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/BulkheadImpl.java index 6a46b163b..8e37439c5 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/BulkheadImpl.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/BulkheadImpl.java @@ -55,6 +55,11 @@ class BulkheadImpl implements Bulkhead { } } + @Override + public String name() { + return name; + } + @Override public Single invoke(Supplier> supplier) { return invokeTask(DelayedTask.createSingle(supplier)); @@ -91,6 +96,7 @@ class BulkheadImpl implements Bulkhead { } // this method must be called while NOT holding a permit + @SuppressWarnings("unchecked") private R invokeTask(DelayedTask task) { if (inProgress.tryAcquire()) { LOGGER.finest(() -> name + " invoke immediate: " + task); diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreaker.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreaker.java index 5549014ca..f9ea4a47e 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreaker.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreaker.java @@ -101,6 +101,7 @@ public interface CircuitBreaker extends FtHandler { // rolling window size to private int volume = 10; private LazyValue executor = FaultTolerance.scheduledExecutor(); + private String name = "CircuitBreaker-" + System.identityHashCode(this); private Builder() { } @@ -167,7 +168,8 @@ public interface CircuitBreaker extends FtHandler { * @param classes to consider failures to calculate failure ratio * @return updated builder instance */ - public Builder applyOn(Class... classes) { + @SafeVarargs + public final Builder applyOn(Class... classes) { applyOn.clear(); Arrays.stream(classes) .forEach(this::addApplyOn); @@ -195,7 +197,8 @@ public interface CircuitBreaker extends FtHandler { * @param classes to consider successful * @return updated builder instance */ - public Builder skipOn(Class... classes) { + @SafeVarargs + public final Builder skipOn(Class... classes) { skipOn.clear(); Arrays.stream(classes) .forEach(this::addSkipOn); @@ -228,6 +231,17 @@ public interface CircuitBreaker extends FtHandler { return this; } + /** + * A name assigned for debugging, error reporting or configuration purposes. + * + * @param name the name + * @return updated builder instance + */ + public Builder name(String name) { + this.name = name; + return this; + } + LazyValue executor() { return executor; } @@ -255,5 +269,9 @@ public interface CircuitBreaker extends FtHandler { int volume() { return volume; } + + String name() { + return name; + } } } diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreakerImpl.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreakerImpl.java index 2381a7b30..1f432a704 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreakerImpl.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/CircuitBreakerImpl.java @@ -54,6 +54,7 @@ class CircuitBreakerImpl implements CircuitBreaker { private final AtomicBoolean halfOpenInProgress = new AtomicBoolean(); private final AtomicReference> schedule = new AtomicReference<>(); private final ErrorChecker errorChecker; + private final String name; CircuitBreakerImpl(CircuitBreaker.Builder builder) { this.delayMillis = builder.delay().toMillis(); @@ -61,6 +62,12 @@ class CircuitBreakerImpl implements CircuitBreaker { this.results = new ResultWindow(builder.volume(), builder.errorRatio()); this.executor = builder.executor(); this.errorChecker = ErrorChecker.create(builder.skipOn(), builder.applyOn()); + this.name = builder.name(); + } + + @Override + public String name() { + return name; } @Override diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Fallback.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Fallback.java index 18fc4a1d9..730eede8e 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Fallback.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Fallback.java @@ -122,7 +122,8 @@ public interface Fallback extends FtHandlerTyped { * @param classes classes to fallback on * @return updated builder instance */ - public Builder applyOn(Class... classes) { + @SafeVarargs + public final Builder applyOn(Class... classes) { applyOn.clear(); Arrays.stream(classes) .forEach(this::addApplyOn); @@ -148,7 +149,8 @@ public interface Fallback extends FtHandlerTyped { * @param classes classes not to fallback on * @return updated builder instance */ - public Builder skipOn(Class... classes) { + @SafeVarargs + public final Builder skipOn(Class... classes) { skipOn.clear(); Arrays.stream(classes) .forEach(this::addSkipOn); diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/FaultTolerance.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/FaultTolerance.java index 38e401fc1..20b520274 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/FaultTolerance.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/FaultTolerance.java @@ -349,11 +349,17 @@ public final class FaultTolerance { private static class FtHandlerImpl implements FtHandler { private final List validFts; + private final String name = "FtHandler-" + System.identityHashCode(this); private FtHandlerImpl(List validFts) { this.validFts = new LinkedList<>(validFts); } + @Override + public String name() { + return name; + } + @Override public Multi invokeMulti(Supplier> supplier) { Supplier> next = supplier; diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/FtHandler.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/FtHandler.java index 60f1daead..a2b6c9350 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/FtHandler.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/FtHandler.java @@ -33,6 +33,14 @@ import io.helidon.common.reactive.Single; * */ public interface FtHandler { + + /** + * A name assigned to a handler for debugging, error reporting or configuration purposes. + * + * @return a non-null name for this handler + */ + String name(); + /** * Invoke this fault tolerance handler on a supplier of a {@link java.util.concurrent.CompletionStage}, such as a * {@link io.helidon.common.reactive.Single}. diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Retry.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Retry.java index a41e342de..ee7680dbc 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Retry.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Retry.java @@ -60,6 +60,7 @@ public interface Retry extends FtHandler { private Duration overallTimeout = Duration.ofSeconds(1); private LazyValue scheduledExecutor = FaultTolerance.scheduledExecutor(); + private String name = "Retry-" + System.identityHashCode(this); private Builder() { } @@ -90,7 +91,8 @@ public interface Retry extends FtHandler { * @param classes to consider failures and trigger a retry * @return updated builder instance */ - public Builder applyOn(Class... classes) { + @SafeVarargs + public final Builder applyOn(Class... classes) { applyOn.clear(); Arrays.stream(classes) .forEach(this::addApplyOn); @@ -118,7 +120,8 @@ public interface Retry extends FtHandler { * @param classes to skip retries * @return updated builder instance */ - public Builder skipOn(Class... classes) { + @SafeVarargs + public final Builder skipOn(Class... classes) { skipOn.clear(); Arrays.stream(classes) .forEach(this::addSkipOn); @@ -164,6 +167,17 @@ public interface Retry extends FtHandler { return this; } + /** + * A name assigned for debugging, error reporting or configuration purposes. + * + * @param name the name + * @return updated builder instance + */ + public Builder name(String name) { + this.name = name; + return this; + } + Set> applyOn() { return applyOn; } @@ -183,6 +197,10 @@ public interface Retry extends FtHandler { LazyValue scheduledExecutor() { return scheduledExecutor; } + + String name() { + return name; + } } /** diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/RetryImpl.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/RetryImpl.java index 2d5bb3c3f..69707be46 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/RetryImpl.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/RetryImpl.java @@ -38,12 +38,19 @@ class RetryImpl implements Retry { private final long maxTimeNanos; private final Retry.RetryPolicy retryPolicy; private final AtomicLong retryCounter = new AtomicLong(0L); + private final String name; RetryImpl(Retry.Builder builder) { this.scheduledExecutor = builder.scheduledExecutor(); this.errorChecker = ErrorChecker.create(builder.skipOn(), builder.applyOn()); this.maxTimeNanos = builder.overallTimeout().toNanos(); this.retryPolicy = builder.retryPolicy(); + this.name = builder.name(); + } + + @Override + public String name() { + return name; } @Override diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Timeout.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Timeout.java index 3d6e7076a..642495da5 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/Timeout.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/Timeout.java @@ -53,6 +53,7 @@ public interface Timeout extends FtHandler { private Duration timeout = Duration.ofSeconds(10); private LazyValue executor = FaultTolerance.scheduledExecutor(); private boolean currentThread = false; + private String name = "Timeout-" + System.identityHashCode(this); private Builder() { } @@ -96,6 +97,17 @@ public interface Timeout extends FtHandler { return this; } + /** + * A name assigned for debugging, error reporting or configuration purposes. + * + * @param name the name + * @return updated builder instance + */ + public Builder name(String name) { + this.name = name; + return this; + } + Duration timeout() { return timeout; } @@ -107,5 +119,9 @@ public interface Timeout extends FtHandler { boolean currentThread() { return currentThread; } + + String name() { + return name; + } } } diff --git a/fault-tolerance/src/main/java/io/helidon/faulttolerance/TimeoutImpl.java b/fault-tolerance/src/main/java/io/helidon/faulttolerance/TimeoutImpl.java index d4da5cd66..f79e79fc2 100644 --- a/fault-tolerance/src/main/java/io/helidon/faulttolerance/TimeoutImpl.java +++ b/fault-tolerance/src/main/java/io/helidon/faulttolerance/TimeoutImpl.java @@ -36,11 +36,18 @@ class TimeoutImpl implements Timeout { private final long timeoutMillis; private final LazyValue executor; private final boolean currentThread; + private final String name; TimeoutImpl(Timeout.Builder builder) { this.timeoutMillis = builder.timeout().toMillis(); this.executor = builder.executor(); this.currentThread = builder.currentThread(); + this.name = builder.name(); + } + + @Override + public String name() { + return name; } @Override