[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() {