From c3253dce9d3fba83af4b75c9be966afe9c8da733 Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Fri, 14 Oct 2022 07:20:35 -0400 Subject: [PATCH] fix #4491: adding a more explicit shutdown exception --- CHANGELOG.md | 1 + .../client/okhttp/OkHttpClientImpl.java | 32 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9bf84217f..178f26b2ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 6.3-SNAPSHOT #### Bugs +* Fix #4491: added a more explicit shutdown exception for okhttp * Fix #4534: Java Generator CLI default handling of skipGeneratedAnnotations * Fix #4535: The shell command string will now have single quotes sanitized * Fix #4547: preventing timing issues with leader election cancel diff --git a/httpclient-okhttp/src/main/java/io/fabric8/kubernetes/client/okhttp/OkHttpClientImpl.java b/httpclient-okhttp/src/main/java/io/fabric8/kubernetes/client/okhttp/OkHttpClientImpl.java index c988720e03..cf803cf656 100644 --- a/httpclient-okhttp/src/main/java/io/fabric8/kubernetes/client/okhttp/OkHttpClientImpl.java +++ b/httpclient-okhttp/src/main/java/io/fabric8/kubernetes/client/okhttp/OkHttpClientImpl.java @@ -17,6 +17,7 @@ package io.fabric8.kubernetes.client.okhttp; import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.http.HttpClient; import io.fabric8.kubernetes.client.http.HttpRequest; import io.fabric8.kubernetes.client.http.HttpResponse; @@ -42,6 +43,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionException; import java.util.function.Function; public class OkHttpClientImpl implements HttpClient { @@ -242,22 +244,28 @@ private CompletableFuture> sendAsync(HttpRequest request Function handler) { CompletableFuture> future = new CompletableFuture<>(); Call call = httpClient.newCall(((OkHttpRequestImpl) request).getRequest()); - call.enqueue(new Callback() { + try { + call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) throws IOException { - BufferedSource source = response.body().source(); + @Override + public void onResponse(Call call, Response response) throws IOException { + BufferedSource source = response.body().source(); - AsyncBody asyncBody = handler.apply(source); + AsyncBody asyncBody = handler.apply(source); - future.complete(new OkHttpResponseImpl<>(response, asyncBody)); - } + future.complete(new OkHttpResponseImpl<>(response, asyncBody)); + } - @Override - public void onFailure(Call call, IOException e) { - future.completeExceptionally(e); - } - }); + @Override + public void onFailure(Call call, IOException e) { + future.completeExceptionally(e); + } + }); + } catch (RejectedExecutionException e) { + throw new KubernetesClientException("The okhttp client executor has been shutdown. " + + "More than likely this is because the KubernetesClient.close method has been called " + + "- please ensure that is intentional.", e); + } future.whenComplete((r, t) -> { if (future.isCancelled()) { call.cancel();