Skip to content

Commit b290d36

Browse files
committed
Revert "Attempt to fix the flakiness of the codegen-generated-classes-test tests. (#2769)"
This caused intermittent test failures. This reverts commit dc41c0d.
1 parent a0c776c commit b290d36

File tree

3 files changed

+21
-98
lines changed

3 files changed

+21
-98
lines changed

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/MakeAsyncHttpRequestStage.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,18 @@ private CompletableFuture<Response<OutputT>> executeHttpRequest(SdkHttpFullReque
193193
TimeoutTracker timeoutTracker = setupAttemptTimer(responseFuture, context);
194194
context.apiCallAttemptTimeoutTracker(timeoutTracker);
195195

196-
// Forward potential cancellations to the upstream futures that our result future depends on.
197-
CompletableFutureUtils.forwardExceptionTo(responseFuture, httpClientFuture);
198-
CompletableFutureUtils.forwardExceptionTo(responseFuture, responseHandlerFuture);
196+
// Forward the cancellation
197+
responseFuture.whenComplete((r, t) -> {
198+
if (t != null) {
199+
httpClientFuture.completeExceptionally(t);
200+
}
201+
});
199202

200-
// When the response handler and HTTP client are done processing the request, use the future completion executor
201-
// to complete the future returned by this function.
202-
CompletableFuture.allOf(responseHandlerFuture, httpClientFuture).whenCompleteAsync((r, t) -> {
203+
// Offload the completion of the future returned from this stage onto
204+
// the future completion executor
205+
responseHandlerFuture.whenCompleteAsync((r, t) -> {
203206
if (t == null) {
204-
responseFuture.complete(responseHandlerFuture.join());
207+
responseFuture.complete(r);
205208
} else {
206209
responseFuture.completeExceptionally(t);
207210
}
@@ -215,6 +218,7 @@ private CompletableFuture<Void> doExecuteHttpRequest(RequestExecutionContext con
215218
long callStart = System.nanoTime();
216219
CompletableFuture<Void> httpClientFuture = sdkAsyncHttpClient.execute(executeRequest);
217220

221+
// Offload the metrics reporting from this stage onto the future completion executor
218222
CompletableFuture<Void> result = httpClientFuture.whenComplete((r, t) -> {
219223
long duration = System.nanoTime() - callStart;
220224
metricCollector.reportMetric(CoreMetric.SERVICE_CALL_DURATION, Duration.ofNanos(duration));

core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/MakeAsyncHttpRequestStageTest.java

Lines changed: 5 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,20 @@
4040
import org.mockito.ArgumentCaptor;
4141
import org.mockito.Mock;
4242
import org.mockito.runners.MockitoJUnitRunner;
43-
import software.amazon.awssdk.core.Response;
44-
import software.amazon.awssdk.core.async.EmptyPublisher;
4543
import software.amazon.awssdk.core.client.config.SdkAdvancedAsyncClientOption;
4644
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
4745
import software.amazon.awssdk.core.http.ExecutionContext;
4846
import software.amazon.awssdk.core.http.NoopTestRequest;
4947
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
5048
import software.amazon.awssdk.core.internal.http.HttpClientDependencies;
5149
import software.amazon.awssdk.core.internal.http.RequestExecutionContext;
52-
import software.amazon.awssdk.core.internal.http.TransformingAsyncResponseHandler;
5350
import software.amazon.awssdk.core.internal.http.timers.ClientExecutionAndRequestTimerTestUtils;
5451
import software.amazon.awssdk.core.internal.util.AsyncResponseHandlerTestUtils;
5552
import software.amazon.awssdk.http.SdkHttpFullRequest;
5653
import software.amazon.awssdk.http.SdkHttpMethod;
5754
import software.amazon.awssdk.http.async.AsyncExecuteRequest;
5855
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
5956
import software.amazon.awssdk.metrics.MetricCollector;
60-
import software.amazon.awssdk.metrics.NoOpMetricCollector;
6157
import utils.ValidSdkObjects;
6258

6359
@RunWith(MockitoJUnitRunner.class)
@@ -69,7 +65,7 @@ public class MakeAsyncHttpRequestStageTest {
6965
@Mock
7066
private ScheduledExecutorService timeoutExecutor;
7167

72-
private CompletableFuture<Void> clientExecuteFuture = new CompletableFuture<>();
68+
private CompletableFuture<Void> clientExecuteFuture = CompletableFuture.completedFuture(null);
7369

7470
@Mock
7571
private ScheduledFuture future;
@@ -111,86 +107,8 @@ public void apiCallAttemptTimeoutNotEnabled_shouldNotInvokeExecutor() throws Exc
111107
verify(timeoutExecutor, never()).schedule(any(Runnable.class), anyLong(), any(TimeUnit.class));
112108
}
113109

114-
@Test
115-
public void success_stageShouldNotCompleteBeforeHttpClientFutureIsCompleted() throws Exception {
116-
TransformingAsyncResponseHandler<Response<Object>> handler =
117-
AsyncResponseHandlerTestUtils.noOpResponseHandler();
118-
119-
stage = new MakeAsyncHttpRequestStage<>(handler, clientDependencies(null));
120-
CompletableFuture<SdkHttpFullRequest> requestFuture =
121-
CompletableFuture.completedFuture(ValidSdkObjects.sdkHttpFullRequest().build());
122-
123-
CompletableFuture<?> result = stage.execute(requestFuture, requestContext());
124-
125-
assertThat(result.isDone()).isFalse();
126-
handler.onStream(new EmptyPublisher<>());
127-
assertThat(result.isDone()).isFalse();
128-
clientExecuteFuture.complete(null);
129-
assertThat(result.isDone()).isTrue();
130-
assertThat(result.isCompletedExceptionally()).isFalse();
131-
}
132-
133-
@Test
134-
public void success_stageShouldNotCompleteBeforeResponseHandlerFutureIsCompleted() throws Exception {
135-
TransformingAsyncResponseHandler<Response<Object>> handler =
136-
AsyncResponseHandlerTestUtils.noOpResponseHandler();
137-
138-
stage = new MakeAsyncHttpRequestStage<>(handler, clientDependencies(null));
139-
CompletableFuture<SdkHttpFullRequest> requestFuture =
140-
CompletableFuture.completedFuture(ValidSdkObjects.sdkHttpFullRequest().build());
141-
142-
CompletableFuture<?> result = stage.execute(requestFuture, requestContext());
143-
144-
assertThat(result.isDone()).isFalse();
145-
clientExecuteFuture.complete(null);
146-
assertThat(result.isDone()).isFalse();
147-
handler.onStream(new EmptyPublisher<>());
148-
assertThat(result.isDone()).isTrue();
149-
assertThat(result.isCompletedExceptionally()).isFalse();
150-
}
151-
152-
@Test
153-
public void failure_stageShouldNotCompleteBeforeHttpClientFutureIsCompleted() throws Exception {
154-
TransformingAsyncResponseHandler<Response<Object>> handler =
155-
AsyncResponseHandlerTestUtils.noOpResponseHandler();
156-
157-
stage = new MakeAsyncHttpRequestStage<>(handler, clientDependencies(null));
158-
CompletableFuture<SdkHttpFullRequest> requestFuture =
159-
CompletableFuture.completedFuture(ValidSdkObjects.sdkHttpFullRequest().build());
160-
161-
CompletableFuture<?> result = stage.execute(requestFuture, requestContext());
162-
163-
assertThat(result.isDone()).isFalse();
164-
handler.onError(new Throwable());
165-
assertThat(result.isDone()).isFalse();
166-
clientExecuteFuture.complete(null);
167-
assertThat(result.isDone()).isTrue();
168-
assertThat(result.isCompletedExceptionally()).isTrue();
169-
}
170-
171-
@Test
172-
public void failure_stageShouldNotCompleteBeforeResponseHandlerFutureIsCompleted() throws Exception {
173-
TransformingAsyncResponseHandler<Response<Object>> handler =
174-
AsyncResponseHandlerTestUtils.noOpResponseHandler();
175-
176-
stage = new MakeAsyncHttpRequestStage<>(handler, clientDependencies(null));
177-
CompletableFuture<SdkHttpFullRequest> requestFuture =
178-
CompletableFuture.completedFuture(ValidSdkObjects.sdkHttpFullRequest().build());
179-
180-
CompletableFuture<?> result = stage.execute(requestFuture, requestContext());
181-
182-
assertThat(result.isDone()).isFalse();
183-
clientExecuteFuture.completeExceptionally(new Throwable());
184-
assertThat(result.isDone()).isFalse();
185-
handler.onStream(new EmptyPublisher<>());
186-
assertThat(result.isDone()).isTrue();
187-
assertThat(result.isCompletedExceptionally()).isTrue();
188-
}
189-
190110
@Test
191111
public void testExecute_contextContainsMetricCollector_addsChildToExecuteRequest() {
192-
clientExecuteFuture.complete(null);
193-
194112
stage = new MakeAsyncHttpRequestStage<>(
195113
combinedAsyncResponseHandler(AsyncResponseHandlerTestUtils.noOpResponseHandler(),
196114
AsyncResponseHandlerTestUtils.noOpResponseHandler()),
@@ -250,11 +168,9 @@ private HttpClientDependencies clientDependencies(Duration timeout) {
250168

251169
private RequestExecutionContext requestContext() {
252170
ExecutionContext executionContext = ClientExecutionAndRequestTimerTestUtils.executionContext(ValidSdkObjects.sdkHttpFullRequest().build());
253-
RequestExecutionContext requestContext = RequestExecutionContext.builder()
254-
.executionContext(executionContext)
255-
.originalRequest(NoopTestRequest.builder().build())
256-
.build();
257-
requestContext.attemptMetricCollector(NoOpMetricCollector.create());
258-
return requestContext;
171+
return RequestExecutionContext.builder()
172+
.executionContext(executionContext)
173+
.originalRequest(NoopTestRequest.builder().build())
174+
.build();
259175
}
260176
}

http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/ResponseHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import software.amazon.awssdk.annotations.SdkInternalApi;
5757
import software.amazon.awssdk.http.HttpStatusFamily;
5858
import software.amazon.awssdk.http.Protocol;
59+
import software.amazon.awssdk.http.SdkCancellationException;
5960
import software.amazon.awssdk.http.SdkHttpFullResponse;
6061
import software.amazon.awssdk.http.SdkHttpResponse;
6162
import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
@@ -238,8 +239,10 @@ private void onCancel() {
238239
return;
239240
}
240241
try {
241-
log.warn("Subscriber cancelled before all events were published.");
242-
executeFuture.complete(null);
242+
SdkCancellationException e = new SdkCancellationException(
243+
"Subscriber cancelled before all events were published");
244+
log.warn("Subscriber cancelled before all events were published");
245+
executeFuture.completeExceptionally(e);
243246
} finally {
244247
runAndLogError("Could not release channel back to the pool",
245248
() -> closeAndRelease(channelContext));

0 commit comments

Comments
 (0)