[NO ISSUE][HYR][STO] Refactor CloudRetryableRequestUtil to avoid duplicate logic

Update nearly duplicate retry loop handling for requests that return
results and those that don't, to use a single implementation. Ensure
that this implementation handles interrupts correctly.

Ext-ref: MB-66048
Change-Id: I1e5afdeb1ba6a4787b4ce60ed7b64121da3327d8
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19605
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/io/request/ICloudRequest.java b/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/io/request/ICloudRequest.java
index 4f25323..a70ecdd 100644
--- a/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/io/request/ICloudRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/io/request/ICloudRequest.java
@@ -29,4 +29,11 @@
      * Run the cloud request
      */
     void call() throws IOException;
+
+    static ICloudReturnableRequest<Void> asReturnableRequest(ICloudRequest request) {
+        return () -> {
+            request.call();
+            return null;
+        };
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/util/CloudRetryableRequestUtil.java b/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/util/CloudRetryableRequestUtil.java
index 9e3d5c2..c36e4a7 100644
--- a/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/util/CloudRetryableRequestUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-cloud/src/main/java/org/apache/hyracks/cloud/util/CloudRetryableRequestUtil.java
@@ -18,6 +18,8 @@
  */
 package org.apache.hyracks.cloud.util;
 
+import static org.apache.hyracks.cloud.io.request.ICloudRequest.asReturnableRequest;
+
 import java.io.IOException;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -76,30 +78,7 @@
      * @param retry   a pre-retry routine to make the operation idempotent
      */
     public static void run(ICloudRequest request, ICloudBeforeRetryRequest retry) throws HyracksDataException {
-        boolean interrupted = Thread.interrupted();
-        try {
-            while (true) {
-                try {
-                    doRun(request, retry);
-                    break;
-                } catch (Throwable e) {
-                    // First, clear the interrupted flag
-                    interrupted |= Thread.interrupted();
-                    if (ExceptionUtils.causedByInterrupt(e)) {
-                        interrupted = true;
-                    } else {
-                        // The cause isn't an interruption, rethrow
-                        throw e;
-                    }
-                    retry.beforeRetry();
-                    LOGGER.warn("Ignored interrupting ICloudReturnableRequest", e);
-                }
-            }
-        } finally {
-            if (interrupted) {
-                Thread.currentThread().interrupt();
-            }
-        }
+        run(asReturnableRequest(request), retry);
     }
 
     /**
@@ -199,24 +178,7 @@
     }
 
     private static void doRun(ICloudRequest request, ICloudBeforeRetryRequest retry) throws HyracksDataException {
-        int attempt = 1;
-        IRetryPolicy retryPolicy = null;
-        while (true) {
-            try {
-                request.call();
-                break;
-            } catch (IOException | BaseServiceException | SdkException e) {
-                if (retryPolicy == null) {
-                    retryPolicy = new ExponentialRetryPolicy(NUMBER_OF_RETRIES, MAX_DELAY_BETWEEN_RETRIES);
-                }
-                if (!retryPolicy.retry(e)) {
-                    throw HyracksDataException.create(e);
-                }
-                attempt++;
-                retry.beforeRetry();
-                LOGGER.warn("Failed to perform ICloudRequest, performing {}/{}", attempt, NUMBER_OF_RETRIES, e);
-            }
-        }
+        doRun(asReturnableRequest(request), retry);
     }
 
     private static int getNumberOfRetries() {