abdullah alamoudi has submitted this change and it was merged. Change subject: [NO ISSUE] Improve Span ......................................................................
[NO ISSUE] Improve Span Change-Id: I4378332af6b18720f5abc60259bb9af81f22219b Reviewed-on: https://asterix-gerrit.ics.uci.edu/2694 Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Michael Blow <[email protected]> --- M asterixdb/asterix-active/pom.xml M asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicyFactory.java M asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicyFactory.java M asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicy.java M asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicyFactory.java M asterixdb/asterix-active/src/main/java/org/apache/asterix/active/NoRetryPolicyFactory.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/InvokeUtil.java C hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ComputingAction.java R hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/CountRetryPolicy.java C hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IDelay.java R hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IRetryPolicy.java C hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/NoRetryPolicy.java M hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java 14 files changed, 122 insertions(+), 35 deletions(-) Approvals: Anon. E. Moose #1000171: Jenkins: Verified; No violations found; ; Verified Michael Blow: Looks good to me, approved diff --git a/asterixdb/asterix-active/pom.xml b/asterixdb/asterix-active/pom.xml index a6f6a38..922a0e8 100644 --- a/asterixdb/asterix-active/pom.xml +++ b/asterixdb/asterix-active/pom.xml @@ -35,6 +35,10 @@ </dependency> <dependency> <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-util</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-api</artifactId> </dependency> <dependency> diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicyFactory.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicyFactory.java index 5e26ae4..477bb5a 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicyFactory.java +++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicyFactory.java @@ -18,6 +18,9 @@ */ package org.apache.asterix.active; +import org.apache.hyracks.util.CountRetryPolicy; +import org.apache.hyracks.util.IRetryPolicy; + public class CountRetryPolicyFactory implements IRetryPolicyFactory { private final int count; diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicyFactory.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicyFactory.java index a946337..82b1d5e 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicyFactory.java +++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicyFactory.java @@ -18,6 +18,8 @@ */ package org.apache.asterix.active; +import org.apache.hyracks.util.IRetryPolicy; + @FunctionalInterface public interface IRetryPolicyFactory { /** diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicy.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicy.java index fde67e6..6f43c64 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicy.java +++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicy.java @@ -18,6 +18,8 @@ */ package org.apache.asterix.active; +import org.apache.hyracks.util.IRetryPolicy; + public class InfiniteRetryPolicy implements IRetryPolicy { private final IActiveEntityEventsListener listener; diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicyFactory.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicyFactory.java index b31d245..d33e1da 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicyFactory.java +++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/InfiniteRetryPolicyFactory.java @@ -18,6 +18,8 @@ */ package org.apache.asterix.active; +import org.apache.hyracks.util.IRetryPolicy; + public class InfiniteRetryPolicyFactory implements IRetryPolicyFactory { @Override diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/NoRetryPolicyFactory.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/NoRetryPolicyFactory.java index a48283a..b8af32b 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/NoRetryPolicyFactory.java +++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/NoRetryPolicyFactory.java @@ -18,15 +18,17 @@ */ package org.apache.asterix.active; +import org.apache.hyracks.util.IRetryPolicy; +import org.apache.hyracks.util.NoRetryPolicy; + public class NoRetryPolicyFactory implements IRetryPolicyFactory { public static final NoRetryPolicyFactory INSTANCE = new NoRetryPolicyFactory(); - private static final IRetryPolicy policy = failure -> false; private NoRetryPolicyFactory() { } @Override public IRetryPolicy create(IActiveEntityEventsListener listener) { - return policy; + return NoRetryPolicy.INSTANCE; } } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java index 1f72856..3024dc6 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java @@ -21,7 +21,6 @@ import java.util.concurrent.Callable; import org.apache.asterix.active.ActivityState; -import org.apache.asterix.active.IRetryPolicy; import org.apache.asterix.active.IRetryPolicyFactory; import org.apache.asterix.active.NoRetryPolicyFactory; import org.apache.asterix.common.api.IClusterManagementWork.ClusterState; @@ -34,6 +33,7 @@ import org.apache.asterix.metadata.utils.MetadataLockUtil; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.util.IRetryPolicy; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/InvokeUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/InvokeUtil.java index b2dd680..9413d1b 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/InvokeUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/InvokeUtil.java @@ -26,8 +26,12 @@ import java.util.function.BooleanSupplier; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.util.ComputingAction; +import org.apache.hyracks.util.IDelay; import org.apache.hyracks.util.IOInterruptibleAction; +import org.apache.hyracks.util.IRetryPolicy; import org.apache.hyracks.util.InterruptibleAction; +import org.apache.hyracks.util.Span; import org.apache.hyracks.util.ThrowingAction; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -217,7 +221,7 @@ } /** - * Runs the supplied action, after suspending any pending interruption. An error will be logged if + * Runs the supplied action, after suspending any pending interruption. An error will be logged if * the action is itself interrupted. */ public static void runUninterruptible(ThrowingAction action) throws Exception { @@ -251,4 +255,30 @@ } } } + + public static <T> T retryUntilSuccessOrExhausted(Span span, ComputingAction<T> action, IRetryPolicy policy, + IDelay delay) throws HyracksDataException { + Throwable failure; + int attempt = 0; + do { + attempt++; + try { + return action.compute(); + } catch (Throwable th) { + failure = th; + if (!policy.retry(th)) { + break; + } + try { + LOGGER.log(Level.WARN, "Failure executing action {} for the {} time", action, attempt, failure); + span.sleep(delay.calculate(attempt), TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw HyracksDataException.create(e); + } + } + } while (!span.elapsed()); + LOGGER.log(Level.WARN, "Final Failure executing action {} after {} attempts", action, attempt, failure); + throw HyracksDataException.create(failure); + } } diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ComputingAction.java similarity index 73% copy from asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java copy to hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ComputingAction.java index 1daf07e..147e871 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ComputingAction.java @@ -16,14 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.active; +package org.apache.hyracks.util; -@FunctionalInterface -public interface IRetryPolicy { - /** - * @param failure - * the cause of the active entity failure - * @return true if one more attempt should be done - */ - boolean retry(Throwable failure); +public interface ComputingAction<T> { + @SuppressWarnings("squid:S00112") + T compute() throws Throwable; } diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/CountRetryPolicy.java similarity index 96% rename from asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java rename to hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/CountRetryPolicy.java index b964430..d2023e1 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/CountRetryPolicy.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.active; +package org.apache.hyracks.util; public class CountRetryPolicy implements IRetryPolicy { diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IDelay.java similarity index 75% copy from asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java copy to hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IDelay.java index 1daf07e..b266f01 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IDelay.java @@ -16,14 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.active; +package org.apache.hyracks.util; @FunctionalInterface -public interface IRetryPolicy { - /** - * @param failure - * the cause of the active entity failure - * @return true if one more attempt should be done - */ - boolean retry(Throwable failure); +public interface IDelay { + + long calculate(long attempt); + } diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IRetryPolicy.java similarity index 91% rename from asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java rename to hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IRetryPolicy.java index 1daf07e..29469d5 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/IRetryPolicy.java @@ -16,13 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.active; +package org.apache.hyracks.util; @FunctionalInterface public interface IRetryPolicy { /** * @param failure - * the cause of the active entity failure + * the cause of the failure * @return true if one more attempt should be done */ boolean retry(Throwable failure); diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/NoRetryPolicy.java similarity index 73% copy from asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java copy to hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/NoRetryPolicy.java index 1daf07e..3040fb1 100644 --- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/IRetryPolicy.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/NoRetryPolicy.java @@ -16,14 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.active; +package org.apache.hyracks.util; -@FunctionalInterface -public interface IRetryPolicy { - /** - * @param failure - * the cause of the active entity failure - * @return true if one more attempt should be done - */ - boolean retry(Throwable failure); +public class NoRetryPolicy implements IRetryPolicy { + public static final NoRetryPolicy INSTANCE = new NoRetryPolicy(); + + private NoRetryPolicy() { + } + + @Override + public boolean retry(Throwable failure) { + return false; + } + } diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java index d8d6bb1..e75a961 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java @@ -41,12 +41,25 @@ return unit.convert(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); } + /** + * Sleep for the minimum of the duration or the remaining of this span + * + * @param sleep + * the amount to sleep + * @param unit + * the unit of the amount + * @throws InterruptedException + */ public void sleep(long sleep, TimeUnit unit) throws InterruptedException { - TimeUnit.NANOSECONDS.sleep(Math.min(elapsed(TimeUnit.NANOSECONDS), unit.toNanos(sleep))); + TimeUnit.NANOSECONDS.sleep(Math.min(remaining(TimeUnit.NANOSECONDS), unit.toNanos(sleep))); } public long remaining(TimeUnit unit) { return unit.convert(Long.max(spanNanos - elapsed(TimeUnit.NANOSECONDS), 0L), TimeUnit.NANOSECONDS); + } + + public void wait(Object monitor) throws InterruptedException { + TimeUnit.NANOSECONDS.timedWait(monitor, remaining(TimeUnit.NANOSECONDS)); } public void loopUntilExhausted(ThrowingAction action) throws Exception { @@ -59,7 +72,41 @@ if (elapsed(delayUnit) < delay) { break; } - delayUnit.sleep(delay); + sleep(delay, delayUnit); } } + + @Override + public String toString() { + long nanos = spanNanos % 1000; + long micros = TimeUnit.MICROSECONDS.convert(spanNanos, TimeUnit.NANOSECONDS) % 1000; + long millis = TimeUnit.MILLISECONDS.convert(spanNanos, TimeUnit.NANOSECONDS) % 1000; + long seconds = TimeUnit.SECONDS.convert(spanNanos, TimeUnit.NANOSECONDS) % 60; + long minutes = TimeUnit.MINUTES.convert(spanNanos, TimeUnit.NANOSECONDS) % 60; + long hours = TimeUnit.HOURS.convert(spanNanos, TimeUnit.NANOSECONDS) % 24; + long days = TimeUnit.DAYS.convert(spanNanos, TimeUnit.NANOSECONDS); + StringBuilder builder = new StringBuilder(); + if (days > 0) { + builder.append(days).append("d"); + } + if (hours > 0) { + builder.append(hours).append("hr"); + } + if (minutes > 0) { + builder.append(minutes).append("m"); + } + if (seconds > 0) { + builder.append(seconds).append("s"); + } + if (millis > 0) { + builder.append(millis).append("ms"); + } + if (micros > 0) { + builder.append(micros).append("us"); + } + if (nanos > 0 || builder.length() == 0) { + builder.append(nanos).append("ns"); + } + return builder.toString(); + } } -- To view, visit https://asterix-gerrit.ics.uci.edu/2694 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I4378332af6b18720f5abc60259bb9af81f22219b Gerrit-PatchSet: 6 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: abdullah alamoudi <[email protected]>
