abdullah alamoudi has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2694

Change subject: [NO ISSUE] Improve Span
......................................................................

[NO ISSUE] Improve Span

Change-Id: I4378332af6b18720f5abc60259bb9af81f22219b
---
M asterixdb/asterix-active/pom.xml
M 
asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java
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
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
M 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Span.java
13 files changed, 121 insertions(+), 42 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/94/2694/1

diff --git a/asterixdb/asterix-active/pom.xml b/asterixdb/asterix-active/pom.xml
index a6f6a38..efffe0a 100644
--- a/asterixdb/asterix-active/pom.xml
+++ b/asterixdb/asterix-active/pom.xml
@@ -1,22 +1,16 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements. See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership. The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License. You may obtain a copy of the License at
- !
- ! http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.    See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+<!-- ! Licensed to the Apache Software Foundation (ASF) under one ! or more 
+  contributor license agreements. See the NOTICE file ! distributed with this 
+  work for additional information ! regarding copyright ownership. The ASF 
+  licenses this file ! to you under the Apache License, Version 2.0 (the ! 
+  "License"); you may not use this file except in compliance ! with the 
License. 
+  You may obtain a copy of the License at ! ! 
http://www.apache.org/licenses/LICENSE-2.0 
+  ! ! Unless required by applicable law or agreed to in writing, ! software 
+  distributed under the License is distributed on an ! "AS IS" BASIS, WITHOUT 
+  WARRANTIES OR CONDITIONS OF ANY ! KIND, either express or implied. See the 
+  License for the ! specific language governing permissions and limitations 
+  ! under the License. ! -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.asterix</groupId>
@@ -35,6 +29,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/CountRetryPolicy.java
 
b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java
index b964430..b1fc977 100644
--- 
a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java
+++ 
b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/CountRetryPolicy.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.active;
 
+import org.apache.hyracks.util.IRetryPolicy;
+
 public class CountRetryPolicy implements IRetryPolicy {
 
     private final int count;
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..2913fd6 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,8 @@
  */
 package org.apache.asterix.active;
 
+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..d2c5196 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,6 +18,8 @@
  */
 package org.apache.asterix.active;
 
+import org.apache.hyracks.util.IRetryPolicy;
+
 public class NoRetryPolicyFactory implements IRetryPolicyFactory {
     public static final NoRetryPolicyFactory INSTANCE = new 
NoRetryPolicyFactory();
     private static final IRetryPolicy policy = failure -> false;
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/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/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: newchange
Gerrit-Change-Id: I4378332af6b18720f5abc60259bb9af81f22219b
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <[email protected]>

Reply via email to