This is an automated email from the ASF dual-hosted git repository. mhubail pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 08695012ea4c664787eca0b5f7c722363c2a0c82 Author: Michael Blow <[email protected]> AuthorDate: Mon Mar 31 18:22:06 2025 -0400 [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 <[email protected]> Tested-by: Ali Alsuliman <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../hyracks/cloud/io/request/ICloudRequest.java | 7 ++++ .../cloud/util/CloudRetryableRequestUtil.java | 46 ++-------------------- 2 files changed, 11 insertions(+), 42 deletions(-) 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 4f2532348d..a70ecdd5a4 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 @@ public interface ICloudRequest { * 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 9e3d5c214a..c36e4a7cba 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 @@ public class CloudRetryableRequestUtil { * @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 @@ public class CloudRetryableRequestUtil { } 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() {
