From d50b832b667e8091ab647119c309668eb563803c Mon Sep 17 00:00:00 2001 From: Fuat Basik Date: Wed, 23 Jul 2025 11:57:58 +0100 Subject: [PATCH 1/5] improve retries --- common/build.gradle.kts | 1 + .../util/OpenStreamInformation.java | 5 + .../util/retry/IORunnable.java | 27 ++ .../util/retry/IOSupplier.java | 35 ++ .../util/retry/RetryPolicy.java | 48 ++ .../util/retry/RetryPolicyBuilder.java | 125 ++++++ .../util/retry/RetryStrategy.java | 64 +++ .../SeekableInputStreamRetryStrategy.java | 154 +++++++ .../util}/retry/RetryPolicyBuilderTest.java | 26 +- .../SeekableInputStreamRetryStrategyTest.java | 243 ++++++++++ docs/allclasses-frame.html | 6 +- docs/allclasses-noframe.html | 6 +- docs/index-all.html | 105 +++-- docs/overview-frame.html | 2 +- docs/overview-summary.html | 4 +- docs/overview-tree.html | 10 +- docs/package-list | 2 +- .../request/package-summary.html | 4 +- .../request/package-tree.html | 4 +- .../retry/RetryPolicyBuilder.html | 411 ----------------- .../SeekableInputStreamRetryStrategy.html | 367 ---------------- .../retry/package-frame.html | 24 - ...ormation.OpenStreamInformationBuilder.html | 21 +- .../util/OpenStreamInformation.html | 17 +- .../util/package-summary.html | 8 +- .../util/package-tree.html | 10 +- .../{ => util}/retry/RetryPolicy.html | 110 ++--- .../util/retry/RetryPolicyBuilder.html | 415 ++++++++++++++++++ .../SeekableInputStreamRetryStrategy.html | 409 +++++++++++++++++ .../util/retry/package-frame.html | 24 + .../{ => util}/retry/package-summary.html | 54 +-- .../{ => util}/retry/package-tree.html | 50 +-- input-stream/build.gradle.kts | 2 +- .../io/physical/data/Block.java | 27 +- .../retry/RetryPolicy.java | 75 ---- .../retry/RetryPolicyBuilder.java | 123 ------ .../retry/RetryStrategy.java | 84 ---- .../SeekableInputStreamRetryStrategy.java | 140 ------ .../util/StreamUtils.java | 7 +- .../SeekableInputStreamRetryStrategyTest.java | 209 --------- 40 files changed, 1805 insertions(+), 1653 deletions(-) create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IORunnable.java create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IOSupplier.java create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicy.java create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilder.java create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryStrategy.java create mode 100644 common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategy.java rename {input-stream/src/test/java/software/amazon/s3/analyticsaccelerator => common/src/test/java/software/amazon/s3/analyticsaccelerator/util}/retry/RetryPolicyBuilderTest.java (67%) create mode 100644 common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategyTest.java delete mode 100644 docs/software/amazon/s3/analyticsaccelerator/retry/RetryPolicyBuilder.html delete mode 100644 docs/software/amazon/s3/analyticsaccelerator/retry/SeekableInputStreamRetryStrategy.html delete mode 100644 docs/software/amazon/s3/analyticsaccelerator/retry/package-frame.html rename docs/software/amazon/s3/analyticsaccelerator/{ => util}/retry/RetryPolicy.html (52%) create mode 100644 docs/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilder.html create mode 100644 docs/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategy.html create mode 100644 docs/software/amazon/s3/analyticsaccelerator/util/retry/package-frame.html rename docs/software/amazon/s3/analyticsaccelerator/{ => util}/retry/package-summary.html (57%) rename docs/software/amazon/s3/analyticsaccelerator/{ => util}/retry/package-tree.html (51%) delete mode 100644 input-stream/src/main/java/software/amazon/s3/analyticsaccelerator/retry/RetryPolicy.java delete mode 100644 input-stream/src/main/java/software/amazon/s3/analyticsaccelerator/retry/RetryPolicyBuilder.java delete mode 100644 input-stream/src/main/java/software/amazon/s3/analyticsaccelerator/retry/RetryStrategy.java delete mode 100644 input-stream/src/main/java/software/amazon/s3/analyticsaccelerator/retry/SeekableInputStreamRetryStrategy.java delete mode 100644 input-stream/src/test/java/software/amazon/s3/analyticsaccelerator/retry/SeekableInputStreamRetryStrategyTest.java diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 594d2844..b818afd1 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -10,6 +10,7 @@ plugins { dependencies { implementation(libs.slf4j.api) + implementation(libs.failsafe) testImplementation(libs.junit.jupiter) testImplementation(libs.mockito.core) diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/OpenStreamInformation.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/OpenStreamInformation.java index 59105529..13036ff2 100644 --- a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/OpenStreamInformation.java +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/OpenStreamInformation.java @@ -21,6 +21,8 @@ import software.amazon.s3.analyticsaccelerator.request.EncryptionSecrets; import software.amazon.s3.analyticsaccelerator.request.ObjectMetadata; import software.amazon.s3.analyticsaccelerator.request.StreamAuditContext; +import software.amazon.s3.analyticsaccelerator.util.retry.RetryStrategy; +import software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy; /** * Open stream information, useful for allowing the stream opening application to pass down known @@ -45,6 +47,9 @@ public class OpenStreamInformation { @Builder.Default private RequestCallback requestCallback = new DefaultRequestCallbackImpl(); private final EncryptionSecrets encryptionSecrets; + @Builder.Default + private final RetryStrategy retryStrategy = new SeekableInputStreamRetryStrategy(); + /** Default set of settings for {@link OpenStreamInformation} */ public static final OpenStreamInformation DEFAULT = OpenStreamInformation.builder().build(); } diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IORunnable.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IORunnable.java new file mode 100644 index 00000000..978c5d14 --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IORunnable.java @@ -0,0 +1,27 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +/** A functional interface that mimics {@link Runnable}, but allows IOException to be thrown. */ +public interface IORunnable { + /** + * Functional representation of the code that takes no parameters and returns no value. The code + * is allowed to throw any exception. + * + * @throws Exception on error condition. + */ + void apply() throws Throwable; +} diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IOSupplier.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IOSupplier.java new file mode 100644 index 00000000..65c0494f --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/IOSupplier.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +import java.io.IOException; + +/** + * A function that mimics {@link java.util.function.Supplier}, but allows IOException to be thrown + * and returns byte [] as it will only represent IO operations + */ +@FunctionalInterface +public interface IOSupplier { + + /** + * Functional representation of the code that takes no parameters and returns a value of type + * {@link byte[]}. The code is allowed to throw any exception. + * + * @return a value of type {@link byte[]}. + * @throws IOException on error condition. + */ + byte[] apply() throws IOException; +} diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicy.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicy.java new file mode 100644 index 00000000..cc3b3951 --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicy.java @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +/** + * A retry policy interface that wraps the Failsafe retry policy for byte array operations. Provides + * factory methods to create retry policies with default or custom configurations. + */ +public interface RetryPolicy { + + /** + * Creates a new retry policy builder. + * + * @return a new RetryPolicyBuilder instance + */ + static RetryPolicyBuilder builder() { + return new RetryPolicyBuilder(); + } + + /** + * Creates a retry policy with default settings. + * + * @return a RetryPolicy with default configuration + */ + static RetryPolicy ofDefaults() { + return RetryPolicy.builder().build(); + } + + /** + * Gets the underlying Failsafe retry policy delegate. + * + * @return the Failsafe RetryPolicy for byte arrays + */ + dev.failsafe.RetryPolicy getDelegate(); +} diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilder.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilder.java new file mode 100644 index 00000000..6ce72ca4 --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilder.java @@ -0,0 +1,125 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +import java.time.Duration; +import java.util.List; + +/** + * Builder for creating RetryPolicy instances with custom configurations. Wraps the Failsafe + * RetryPolicyBuilder to provide a simplified interface. + */ +public class RetryPolicyBuilder { + private final dev.failsafe.RetryPolicyBuilder delegateBuilder; + + /** Creates a new RetryPolicyBuilder instance. */ + protected RetryPolicyBuilder() { + this.delegateBuilder = dev.failsafe.RetryPolicy.builder(); + } + + /** + * Sets the maximum number of retry attempts. + * + * @param maxRetries the maximum number of retries + * @return this builder instance + */ + public RetryPolicyBuilder withMaxRetries(int maxRetries) { + delegateBuilder.withMaxRetries(maxRetries); + return this; + } + + /** + * Sets the delay between retry attempts. + * + * @param delay the delay duration between retries + * @return this builder instance + */ + public RetryPolicyBuilder withDelay(Duration delay) { + delegateBuilder.withDelay(delay); + return this; + } + + /** + * Specifies an exception type to handle for retries. + * + * @param exception the exception class to handle + * @return this builder instance + */ + public RetryPolicyBuilder handle(Class exception) { + delegateBuilder.handle(exception); + return this; + } + + /** + * Specifies multiple exception types to handle for retries. + * + * @param exceptions the exception classes to handle + * @return this builder instance + */ + @SafeVarargs + @SuppressWarnings("varargs") + public final RetryPolicyBuilder handle(Class... exceptions) { + delegateBuilder.handle(exceptions); + return this; + } + + /** + * Specifies a list of exception types to handle for retries. + * + * @param exceptions the list of exception classes to handle + * @return this builder instance + */ + @SuppressWarnings("varargs") + public final RetryPolicyBuilder handle(List> exceptions) { + delegateBuilder.handle(exceptions); + return this; + } + + /** + * Sets a callback to execute on each retry attempt. + * + * @param onRetry the callback to execute on retry + * @return this builder instance + */ + public RetryPolicyBuilder onRetry(Runnable onRetry) { + delegateBuilder.onRetry(event -> onRetry.run()); + return this; + } + + /** + * Builds the RetryPolicy with the configured settings. + * + * @return a new RetryPolicy instance + */ + public RetryPolicy build() { + dev.failsafe.RetryPolicy delegate = delegateBuilder.build(); + + return new RetryPolicyImpl(delegate); + } + + private static class RetryPolicyImpl implements RetryPolicy { + private final dev.failsafe.RetryPolicy delegate; + + RetryPolicyImpl(dev.failsafe.RetryPolicy delegate) { + this.delegate = delegate; + } + + @Override + public dev.failsafe.RetryPolicy getDelegate() { + return delegate; + } + } +} diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryStrategy.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryStrategy.java new file mode 100644 index 00000000..322b53d8 --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryStrategy.java @@ -0,0 +1,64 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +import java.io.IOException; +import java.util.List; + +/** Interface for executing operations with retry logic. */ +public interface RetryStrategy { + /** + * Executes a runnable with retry logic. + * + * @param runnable the operation to execute + * @throws IOException if the operation fails after all retry attempts + */ + void execute(IORunnable runnable) throws IOException; + + /** + * Executes a supplier with retry logic. + * + * @param supplier the operation to execute + * @return result of the supplier + * @throws IOException if the operation fails after all retry attempts + */ + byte[] get(IOSupplier supplier) throws IOException; + + /** + * Adds a retry policy to the strategy. This will be policy first to execute as it is appended to + * the policy list. + * + * @param policy + * @return a new {@link RetryStrategy} with the policy appended + */ + RetryStrategy amend(RetryPolicy policy); + + /** + * Merge two retry strategies and return a new {@link RetryStrategy}. This new strategy will + * execute policies from both strategies in order. + * + * @param strategy + * @return a new {@link RetryStrategy} + */ + RetryStrategy merge(RetryStrategy strategy); + + /** + * Get retry policies associated with a {@link RetryStrategy} + * + * @return list of {@link RetryPolicy} + */ + List getRetryPolicies(); +} diff --git a/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategy.java b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategy.java new file mode 100644 index 00000000..1820e3c2 --- /dev/null +++ b/common/src/main/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategy.java @@ -0,0 +1,154 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +import dev.failsafe.Failsafe; +import dev.failsafe.FailsafeException; +import dev.failsafe.FailsafeExecutor; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import software.amazon.s3.analyticsaccelerator.common.Preconditions; + +/** + * Retry strategy implementation for seekable input stream operations. Uses Failsafe library to + * execute operations with configurable retry policies. + */ +public class SeekableInputStreamRetryStrategy implements RetryStrategy { + private final List retryPolicies; + FailsafeExecutor failsafeExecutor; + + /** Creates a retry strategy with no retry policies (no retries). */ + public SeekableInputStreamRetryStrategy() { + this.retryPolicies = new ArrayList<>(); + this.failsafeExecutor = Failsafe.none(); + } + + /** + * Creates a retry strategy with one or more retry policies. + * + * @param outerPolicy the primary retry policy (required) + * @param policies additional retry policies (optional) + */ + @SuppressWarnings("varargs") + public SeekableInputStreamRetryStrategy(RetryPolicy outerPolicy, RetryPolicy... policies) { + Preconditions.checkNotNull(outerPolicy); + this.retryPolicies = new ArrayList<>(); + this.retryPolicies.add(outerPolicy); + if (policies != null && policies.length > 0) { + this.retryPolicies.addAll(Arrays.asList(policies)); + } + this.failsafeExecutor = Failsafe.with(getDelegates()); + } + + /** + * Creates a retry strategy with a list of retry policies. + * + * @param policies the list of retry policies to apply + */ + public SeekableInputStreamRetryStrategy(List policies) { + Preconditions.checkNotNull(policies); + this.retryPolicies = new ArrayList<>(); + this.retryPolicies.addAll(policies); + this.failsafeExecutor = Failsafe.with(getDelegates()); + } + + /** + * Executes a runnable operation with retry logic. + * + * @param runnable the operation to execute + * @throws IOException if the operation fails after all retries + */ + @Override + public void execute(IORunnable runnable) throws IOException { + try { + this.failsafeExecutor.run(runnable::apply); + } catch (Exception ex) { + throw handleExceptionAfterRetry(ex); + } + } + + /** + * Executes a supplier operation with retry logic. + * + * @param supplier the operation that returns a byte array + * @return the result of the supplier operation + * @throws IOException if the operation fails after all retries + */ + @Override + public byte[] get(IOSupplier supplier) throws IOException { + try { + return this.failsafeExecutor.get(supplier::apply); + } catch (Exception ex) { + throw handleExceptionAfterRetry(ex); + } + } + + @Override + public RetryStrategy amend(RetryPolicy policy) { + Preconditions.checkNotNull(policy); + this.failsafeExecutor = this.failsafeExecutor.compose(policy.getDelegate()); + return this; + } + + @Override + public RetryStrategy merge(RetryStrategy strategy) { + Preconditions.checkNotNull(strategy); + for (RetryPolicy policy : strategy.getRetryPolicies()) { + this.failsafeExecutor = this.failsafeExecutor.compose(policy.getDelegate()); + } + return this; + } + + @Override + public List getRetryPolicies() { + return this.retryPolicies; + } + + /** + * Converts retry policies to their Failsafe delegate policies. + * + * @return list of Failsafe policies + */ + private List> getDelegates() { + return this.retryPolicies.stream().map(RetryPolicy::getDelegate).collect(Collectors.toList()); + } + + /** + * Handles exceptions after retry attempts are exhausted. + * + * @param e the exception that occurred + * @return an IOException to throw + */ + private IOException handleExceptionAfterRetry(Exception e) { + IOException toThrow = new IOException("Failed to execute operation with retries", e); + + if (e instanceof FailsafeException) { + Optional cause = Optional.ofNullable(e.getCause()); + if (cause.isPresent()) { + if (cause.get() instanceof IOException) { + return (IOException) cause.get(); + } else { + toThrow = new IOException("Failed to execute operation with retries", cause.get()); + } + } + } + return toThrow; + } +} diff --git a/input-stream/src/test/java/software/amazon/s3/analyticsaccelerator/retry/RetryPolicyBuilderTest.java b/common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilderTest.java similarity index 67% rename from input-stream/src/test/java/software/amazon/s3/analyticsaccelerator/retry/RetryPolicyBuilderTest.java rename to common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilderTest.java index 36b18dfc..5a24e555 100644 --- a/input-stream/src/test/java/software/amazon/s3/analyticsaccelerator/retry/RetryPolicyBuilderTest.java +++ b/common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/RetryPolicyBuilderTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.amazon.s3.analyticsaccelerator.retry; +package software.amazon.s3.analyticsaccelerator.util.retry; import static org.junit.jupiter.api.Assertions.*; @@ -25,8 +25,8 @@ class RetryPolicyBuilderTest { @Test void testBuildCreatesRetryPolicy() { - RetryPolicyBuilder builder = new RetryPolicyBuilder<>(); - RetryPolicy policy = builder.build(); + RetryPolicyBuilder builder = new RetryPolicyBuilder(); + RetryPolicy policy = builder.build(); assertNotNull(policy); assertNotNull(policy.getDelegate()); @@ -34,8 +34,8 @@ void testBuildCreatesRetryPolicy() { @Test void testWithMaxRetries() { - RetryPolicyBuilder builder = new RetryPolicyBuilder<>(); - RetryPolicyBuilder result = builder.withMaxRetries(5); + RetryPolicyBuilder builder = new RetryPolicyBuilder(); + RetryPolicyBuilder result = builder.withMaxRetries(5); assertSame(builder, result); assertNotNull(builder.build()); @@ -43,9 +43,9 @@ void testWithMaxRetries() { @Test void testWithDelay() { - RetryPolicyBuilder builder = new RetryPolicyBuilder<>(); + RetryPolicyBuilder builder = new RetryPolicyBuilder(); Duration delay = Duration.ofSeconds(1); - RetryPolicyBuilder result = builder.withDelay(delay); + RetryPolicyBuilder result = builder.withDelay(delay); assertSame(builder, result); assertNotNull(builder.build()); @@ -53,8 +53,8 @@ void testWithDelay() { @Test void testHandleSingleException() { - RetryPolicyBuilder builder = new RetryPolicyBuilder<>(); - RetryPolicyBuilder result = builder.handle(IOException.class); + RetryPolicyBuilder builder = new RetryPolicyBuilder(); + RetryPolicyBuilder result = builder.handle(IOException.class); assertSame(builder, result); assertNotNull(builder.build()); @@ -62,8 +62,8 @@ void testHandleSingleException() { @Test void testHandleMultipleExceptions() { - RetryPolicyBuilder builder = new RetryPolicyBuilder<>(); - RetryPolicyBuilder result = builder.handle(IOException.class, RuntimeException.class); + RetryPolicyBuilder builder = new RetryPolicyBuilder(); + RetryPolicyBuilder result = builder.handle(IOException.class, RuntimeException.class); assertSame(builder, result); assertNotNull(builder.build()); @@ -71,8 +71,8 @@ void testHandleMultipleExceptions() { @Test void testChainedConfiguration() { - RetryPolicy policy = - new RetryPolicyBuilder() + RetryPolicy policy = + new RetryPolicyBuilder() .withMaxRetries(3) .withDelay(Duration.ofMillis(500)) .handle(IOException.class) diff --git a/common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategyTest.java b/common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategyTest.java new file mode 100644 index 00000000..5534b8d0 --- /dev/null +++ b/common/src/test/java/software/amazon/s3/analyticsaccelerator/util/retry/SeekableInputStreamRetryStrategyTest.java @@ -0,0 +1,243 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed 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. + */ +package software.amazon.s3.analyticsaccelerator.util.retry; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.jupiter.api.Test; + +class SeekableInputStreamRetryStrategyTest { + + @Test + void testNoArgsConstructor() { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + assertNotNull(executor); + } + + @Test + void testPolicyConstructor() { + RetryPolicy policy = RetryPolicy.ofDefaults(); + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(policy); + assertNotNull(executor); + + RetryPolicy policy1 = RetryPolicy.ofDefaults(); + RetryPolicy policy2 = RetryPolicy.ofDefaults(); + executor = new SeekableInputStreamRetryStrategy(policy1, policy2); + assertNotNull(executor); + + List policyList = Arrays.asList(policy1, policy2); + executor = new SeekableInputStreamRetryStrategy(policyList); + assertNotNull(executor); + + assertThrows(NullPointerException.class, () -> new SeekableInputStreamRetryStrategy(null)); + + ArrayList emptyList = new ArrayList(); + assertThrows( + IllegalArgumentException.class, () -> new SeekableInputStreamRetryStrategy(emptyList)); + } + + @Test + void testAmend() throws IOException { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + String expected = "test result"; + + AtomicInteger attempt = new AtomicInteger(0); + assertNotNull(executor); + assertThrows( + IOException.class, () -> executor.get(() -> failTwiceThenSucceed(attempt, expected))); + + assertEquals(1, attempt.get()); + + // Reset attempt + attempt.set(0); + + RetryPolicy policy = RetryPolicy.builder().handle(IOException.class).withMaxRetries(3).build(); + RetryStrategy newStrategy = executor.amend(policy); + + byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8); + + byte[] result = newStrategy.get(() -> failTwiceThenSucceed(attempt, expected)); + + assertEquals(expectedBytes.length, result.length); + assertEquals(3, attempt.get()); + } + + @Test + void testMerge() throws IOException { + final RetryStrategy executor = new SeekableInputStreamRetryStrategy(); + String expected = "test result"; + + AtomicInteger attempt = new AtomicInteger(0); + assertNotNull(executor); + assertThrows( + IOException.class, () -> executor.get(() -> failTwiceThenSucceed(attempt, expected))); + + assertEquals(1, attempt.get()); + + // Reset attempt + attempt.set(0); + + RetryPolicy policy = RetryPolicy.builder().handle(IOException.class).withMaxRetries(3).build(); + RetryStrategy retryStrategy = new SeekableInputStreamRetryStrategy(policy); + + RetryStrategy newStrategy = executor.merge(retryStrategy); + + byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8); + + byte[] result = newStrategy.get(() -> failTwiceThenSucceed(attempt, expected)); + + assertEquals(expectedBytes.length, result.length); + assertEquals(3, attempt.get()); + } + + @Test + void testPolicyConstructorWithNullOuterPolicyThrowsException() { + assertThrows(NullPointerException.class, () -> new SeekableInputStreamRetryStrategy(null)); + } + + @Test + void testExecuteSuccess() throws IOException { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + AtomicInteger counter = new AtomicInteger(0); + + executor.execute(counter::incrementAndGet); + + assertEquals(1, counter.get()); + } + + @Test + void testExecuteWrapsUncheckedException() { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + + IOException exception = + assertThrows( + IOException.class, + () -> + executor.execute( + () -> { + throw new RuntimeException("Test exception"); + })); + + assertEquals("Failed to execute operation with retries", exception.getMessage()); + assertNotNull(exception.getCause()); + } + + @Test + void testExecuteIOException() { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + + IOException exception = + assertThrows( + IOException.class, + () -> + executor.execute( + () -> { + throw new IOException("Original IO exception"); + })); + + assertEquals("Original IO exception", exception.getMessage()); + } + + @Test + void testGetSuccess() throws IOException { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + String expected = "test result"; + byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8); + + byte[] result = executor.get(() -> expected.getBytes(StandardCharsets.UTF_8)); + + assertEquals(expectedBytes.length, result.length); + } + + @Test + void testGetWrapsException() { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + + IOException exception = + assertThrows( + IOException.class, + () -> + executor.get( + () -> { + throw new RuntimeException("Test exception"); + })); + + assertEquals("Failed to execute operation with retries", exception.getMessage()); + assertNotNull(exception.getCause()); + } + + @Test + void testGetIOException() { + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(); + + IOException exception = + assertThrows( + IOException.class, + () -> + executor.get( + () -> { + throw new IOException("Original IO exception"); + })); + + assertEquals("Original IO exception", exception.getMessage()); + } + + @Test + void testNoRetryOnDifferentHandle() throws IOException { + String expected = "test result"; + RetryPolicy policy = + RetryPolicy.builder().handle(TimeoutException.class).withMaxRetries(3).build(); + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(policy); + AtomicInteger retryCount = new AtomicInteger(0); + assertThrows( + IOException.class, () -> executor.get(() -> failTwiceThenSucceed(retryCount, expected))); + + assertEquals(1, retryCount.get()); + } + + @Test + void testOnRetryCallback() throws IOException { + AtomicInteger retryCounter = new AtomicInteger(0); + String expected = "test result"; + byte[] expectedBytes = expected.getBytes(StandardCharsets.UTF_8); + RetryPolicy policy = + RetryPolicy.builder().withMaxRetries(3).onRetry(retryCounter::incrementAndGet).build(); + SeekableInputStreamRetryStrategy executor = new SeekableInputStreamRetryStrategy(policy); + AtomicInteger attemptCounter = new AtomicInteger(0); + + byte[] result = executor.get(() -> failTwiceThenSucceed(attemptCounter, expected)); + + assertEquals(expectedBytes.length, result.length); + assertEquals(3, attemptCounter.get()); + assertEquals(2, retryCounter.get()); + } + + private byte[] failTwiceThenSucceed(AtomicInteger counter, String toByteArray) + throws IOException { + int attempt = counter.incrementAndGet(); + if (attempt <= 2) { + throw new IOException("Attempt " + attempt + " failed"); + } + return toByteArray.getBytes(StandardCharsets.UTF_8); + } +} diff --git a/docs/allclasses-frame.html b/docs/allclasses-frame.html index cc87ddd8..d5d0aea7 100644 --- a/docs/allclasses-frame.html +++ b/docs/allclasses-frame.html @@ -19,14 +19,14 @@

All Classes

  • OpenStreamInformation
  • OpenStreamInformation.OpenStreamInformationBuilder
  • PrefetchMode
  • -
  • RetryPolicy
  • -
  • RetryPolicyBuilder
  • +
  • RetryPolicy
  • +
  • RetryPolicyBuilder
  • S3SdkObjectClient
  • S3SeekableInputStream
  • S3SeekableInputStreamConfiguration
  • S3SeekableInputStreamFactory
  • S3URI
  • -
  • SeekableInputStreamRetryStrategy
  • +
  • SeekableInputStreamRetryStrategy
  • diff --git a/docs/allclasses-noframe.html b/docs/allclasses-noframe.html index bb08e131..7372d93a 100644 --- a/docs/allclasses-noframe.html +++ b/docs/allclasses-noframe.html @@ -19,14 +19,14 @@

    All Classes

  • OpenStreamInformation
  • OpenStreamInformation.OpenStreamInformationBuilder
  • PrefetchMode
  • -
  • RetryPolicy
  • -
  • RetryPolicyBuilder
  • +
  • RetryPolicy
  • +
  • RetryPolicyBuilder
  • S3SdkObjectClient
  • S3SeekableInputStream
  • S3SeekableInputStreamConfiguration
  • S3SeekableInputStreamFactory
  • S3URI
  • -
  • SeekableInputStreamRetryStrategy
  • +
  • SeekableInputStreamRetryStrategy
  • diff --git a/docs/index-all.html b/docs/index-all.html index f7d1509d..3ef1ac3d 100644 --- a/docs/index-all.html +++ b/docs/index-all.html @@ -67,28 +67,35 @@ -
    B C D E F G H I M O P R S T V W  +
    A B C D E F G H I M O P R S T V W  + + +

    A

    +
    +
    amend(RetryPolicy) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    +
     
    +
    +

    B

    build() - Method in class software.amazon.s3.analyticsaccelerator.request.ObjectMetadata.ObjectMetadataBuilder
     
    -
    build() - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    build() - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
    +
     
    +
    build() - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    Builds the RetryPolicy with the configured settings.
    -
    build() - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
    -
     
    builder() - Static method in class software.amazon.s3.analyticsaccelerator.request.ObjectMetadata
     
    -
    builder() - Static method in interface software.amazon.s3.analyticsaccelerator.retry.RetryPolicy
    -
    -
    Creates a new RetryPolicyBuilder with default configuration - using @link{PhysicalIOConfiguration.DEFAULT}
    -
    builder() - Static method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation
     
    +
    builder() - Static method in interface software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicy
    +
    +
    Creates a new retry policy builder.
    +
    @@ -176,9 +183,9 @@

    E

    The entity tag of the object.
    -
    execute(RetryStrategy.IORunnable) - Method in class software.amazon.s3.analyticsaccelerator.retry.SeekableInputStreamRetryStrategy
    +
    execute(IORunnable) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    -
    Executes a runnable with retry logic using Failsafe internally.
    +
    Executes a runnable operation with retry logic.
    @@ -200,8 +207,10 @@

    F

    G

    -
    get(RetryStrategy.IOSupplier<R>) - Method in class software.amazon.s3.analyticsaccelerator.retry.SeekableInputStreamRetryStrategy
    -
     
    +
    get(IOSupplier) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    +
    +
    Executes a supplier operation with retry logic.
    +
    getBoolean(String, boolean) - Method in class software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration
    Get Boolean value for a given key.
    @@ -212,9 +221,9 @@

    G

    The length of the object content in bytes.
    -
    getDelegate() - Method in interface software.amazon.s3.analyticsaccelerator.retry.RetryPolicy
    +
    getDelegate() - Method in interface software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicy
    -
    Gets the underlying Failsafe retry policy that this wrapper delegates to.
    +
    Gets the underlying Failsafe retry policy delegate.
    getDouble(String, double) - Method in class software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration
    @@ -282,6 +291,10 @@

    G

    Get String value for a given key.
    +
    getRetryPolicies() - Method in class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    +
     
    +
    getRetryStrategy() - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation
    +
     
    getS3AsyncClient() - Method in class software.amazon.s3.analyticsaccelerator.S3SdkObjectClient
     
    getStreamAuditContext() - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation
    @@ -296,13 +309,17 @@

    G

    H

    -
    handle(Class<? extends Throwable>) - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    handle(Class<? extends Throwable>) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    -
    Specifies which exceptions should trigger a retry.
    +
    Specifies an exception type to handle for retries.
    -
    handle(Class<? extends Throwable>...) - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    handle(Class<? extends Throwable>...) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    -
    Specifies which exceptions should trigger a retry.
    +
    Specifies multiple exception types to handle for retries.
    +
    +
    handle(List<Class<? extends Throwable>>) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    +
    +
    Specifies a list of exception types to handle for retries.
    hashCode() - Method in class software.amazon.s3.analyticsaccelerator.request.ObjectMetadata
     
    @@ -339,6 +356,8 @@

    M

    Return a new ConnectorConfiguration where for common prefix for keys is updated to this.getPrefix() + "." + appendPrefix
    +
    merge(RetryStrategy) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    +
     
    @@ -359,13 +378,13 @@

    O

     
    of(String, String) - Static method in class software.amazon.s3.analyticsaccelerator.util.S3URI
     
    -
    ofDefaults() - Static method in interface software.amazon.s3.analyticsaccelerator.retry.RetryPolicy
    +
    ofDefaults() - Static method in interface software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicy
    -
    Creates a RetryPolicy with default configuration.
    +
    Creates a retry policy with default settings.
    -
    onRetry(Runnable) - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    onRetry(Runnable) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    -
    Specifies a function to call when a retry occurs.
    +
    Sets a callback to execute on each retry attempt.
    OpenStreamInformation - Class in software.amazon.s3.analyticsaccelerator.util
    @@ -411,15 +430,19 @@

    R

     
    requestCallback(RequestCallback) - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
     
    -
    RetryPolicy<R> - Interface in software.amazon.s3.analyticsaccelerator.retry
    +
    RetryPolicy - Interface in software.amazon.s3.analyticsaccelerator.util.retry
    -
    Interface for retry policies that delegate to Failsafe retry policies.
    +
    A retry policy interface that wraps the Failsafe retry policy for byte array operations.
    -
    RetryPolicyBuilder<R> - Class in software.amazon.s3.analyticsaccelerator.retry
    +
    RetryPolicyBuilder - Class in software.amazon.s3.analyticsaccelerator.util.retry
    -
    Builder for creating RetryPolicy instances that delegate to Failsafe retry policies.
    +
    Builder for creating RetryPolicy instances with custom configurations.
    -
    RetryPolicyBuilder() - Constructor for class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    RetryPolicyBuilder() - Constructor for class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    +
    +
    Creates a new RetryPolicyBuilder instance.
    +
    +
    retryStrategy(RetryStrategy) - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
     
    @@ -473,17 +496,21 @@

    S

    Sets the offset, measured from the beginning of this stream, at which the next read occurs.
    -
    SeekableInputStreamRetryStrategy<R> - Class in software.amazon.s3.analyticsaccelerator.retry
    +
    SeekableInputStreamRetryStrategy - Class in software.amazon.s3.analyticsaccelerator.util.retry
    +
    +
    Retry strategy implementation for seekable input stream operations.
    +
    +
    SeekableInputStreamRetryStrategy() - Constructor for class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    -
    Implementation of Strategy that uses Failsafe library.
    +
    Creates a retry strategy with no retry policies (no retries).
    -
    SeekableInputStreamRetryStrategy() - Constructor for class software.amazon.s3.analyticsaccelerator.retry.SeekableInputStreamRetryStrategy
    +
    SeekableInputStreamRetryStrategy(RetryPolicy, RetryPolicy...) - Constructor for class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    -
    Creates a no-op executor with no retry policies.
    +
    Creates a retry strategy with one or more retry policies.
    -
    SeekableInputStreamRetryStrategy(RetryPolicy<R>, RetryPolicy<R>...) - Constructor for class software.amazon.s3.analyticsaccelerator.retry.SeekableInputStreamRetryStrategy
    +
    SeekableInputStreamRetryStrategy(List<RetryPolicy>) - Constructor for class software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy
    -
    Creates a retry executor with multiple retry policies.
    +
    Creates a retry strategy with a list of retry policies.
    setContentLength(long) - Method in class software.amazon.s3.analyticsaccelerator.request.ObjectMetadata
    @@ -499,10 +526,10 @@

    S

     
    software.amazon.s3.analyticsaccelerator.request - package software.amazon.s3.analyticsaccelerator.request
     
    -
    software.amazon.s3.analyticsaccelerator.retry - package software.amazon.s3.analyticsaccelerator.retry
    -
     
    software.amazon.s3.analyticsaccelerator.util - package software.amazon.s3.analyticsaccelerator.util
     
    +
    software.amazon.s3.analyticsaccelerator.util.retry - package software.amazon.s3.analyticsaccelerator.util.retry
    +
     
    streamAuditContext(StreamAuditContext) - Method in class software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
     
    @@ -565,16 +592,16 @@

    V

    W

    -
    withDelay(Duration) - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    withDelay(Duration) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    Sets the delay between retry attempts.
    -
    withMaxRetries(int) - Method in class software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder
    +
    withMaxRetries(int) - Method in class software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
    Sets the maximum number of retry attempts.
    -B C D E F G H I M O P R S T V W 
    +A B C D E F G H I M O P R S T V W 

     

    diff --git a/docs/overview-summary.html b/docs/overview-summary.html index 387ad584..c21950eb 100644 --- a/docs/overview-summary.html +++ b/docs/overview-summary.html @@ -91,11 +91,11 @@

    input-stream API

      -software.amazon.s3.analyticsaccelerator.retry +software.amazon.s3.analyticsaccelerator.util   -software.amazon.s3.analyticsaccelerator.util +software.amazon.s3.analyticsaccelerator.util.retry   diff --git a/docs/overview-tree.html b/docs/overview-tree.html index a11fbfc4..3c59b9fd 100644 --- a/docs/overview-tree.html +++ b/docs/overview-tree.html @@ -74,8 +74,8 @@

    Hierarchy For All Packages

  • software.amazon.s3.analyticsaccelerator,
  • software.amazon.s3.analyticsaccelerator.common,
  • software.amazon.s3.analyticsaccelerator.request,
  • -
  • software.amazon.s3.analyticsaccelerator.retry,
  • -
  • software.amazon.s3.analyticsaccelerator.util
  • +
  • software.amazon.s3.analyticsaccelerator.util,
  • +
  • software.amazon.s3.analyticsaccelerator.util.retry
  • @@ -97,12 +97,12 @@

    Class Hierarchy

  • software.amazon.s3.analyticsaccelerator.request.ObjectMetadata.ObjectMetadataBuilder
  • software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation
  • software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation.OpenStreamInformationBuilder
  • -
  • software.amazon.s3.analyticsaccelerator.retry.RetryPolicyBuilder<R>
  • +
  • software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicyBuilder
  • software.amazon.s3.analyticsaccelerator.S3SdkObjectClient (implements software.amazon.s3.analyticsaccelerator.request.ObjectClient)
  • software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration
  • software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory (implements java.lang.AutoCloseable)
  • software.amazon.s3.analyticsaccelerator.util.S3URI
  • -
  • software.amazon.s3.analyticsaccelerator.retry.SeekableInputStreamRetryStrategy<R> (implements software.amazon.s3.analyticsaccelerator.retry.RetryStrategy<R>)
  • +
  • software.amazon.s3.analyticsaccelerator.util.retry.SeekableInputStreamRetryStrategy (implements software.amazon.s3.analyticsaccelerator.util.retry.RetryStrategy)
  • @@ -117,7 +117,7 @@

    Interface Hierarchy

    -
  • software.amazon.s3.analyticsaccelerator.retry.RetryPolicy<R>
  • +
  • software.amazon.s3.analyticsaccelerator.util.retry.RetryPolicy
  • Enum Hierarchy

      diff --git a/docs/package-list b/docs/package-list index 64525fd6..ff60d927 100644 --- a/docs/package-list +++ b/docs/package-list @@ -1,5 +1,5 @@ software.amazon.s3.analyticsaccelerator software.amazon.s3.analyticsaccelerator.common software.amazon.s3.analyticsaccelerator.request -software.amazon.s3.analyticsaccelerator.retry software.amazon.s3.analyticsaccelerator.util +software.amazon.s3.analyticsaccelerator.util.retry diff --git a/docs/software/amazon/s3/analyticsaccelerator/request/package-summary.html b/docs/software/amazon/s3/analyticsaccelerator/request/package-summary.html index 170cce09..5971a95e 100644 --- a/docs/software/amazon/s3/analyticsaccelerator/request/package-summary.html +++ b/docs/software/amazon/s3/analyticsaccelerator/request/package-summary.html @@ -42,7 +42,7 @@