From 4f71c87c073e4799e09abc5efee02fb5a74fcd1d Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Tue, 22 Nov 2022 10:50:23 -0500 Subject: [PATCH] fix #4516: switching list delete to a (mostly) parallel operation --- .../kubernetes/client/dsl/Timeoutable.java | 4 ++-- .../client/dsl/internal/BaseOperation.java | 15 ++++++++++----- ...WatchDeleteRecreateWaitApplicableListImpl.java | 4 +++- .../client/dsl/internal/OperationContext.java | 3 +-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Timeoutable.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Timeoutable.java index ff8c2ea8d92..d84be3aa48e 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Timeoutable.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Timeoutable.java @@ -21,7 +21,7 @@ public interface Timeoutable { /** - * Wait for the given operation timeout. For list contexts it applies to each delete operation. + * Wait for the given operation timeout. * * @param timeout 0 indicates no wait * @param unit @@ -29,7 +29,7 @@ public interface Timeoutable { Object withTimeout(long timeout, TimeUnit unit); /** - * Wait for the given operation timeout in milliseconds. For list contexts it applies to each delete operation. + * Wait for the given operation timeout in milliseconds. * * @param timeoutInMillis 0 indicates no wait */ diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/BaseOperation.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/BaseOperation.java index cf19f11baa1..3ac99664972 100755 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/BaseOperation.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/BaseOperation.java @@ -43,6 +43,7 @@ import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.dsl.Waitable; import io.fabric8.kubernetes.client.dsl.base.PatchContext; import io.fabric8.kubernetes.client.dsl.base.PatchType; import io.fabric8.kubernetes.client.extension.ExtensibleResource; @@ -452,13 +453,17 @@ static void toStatusDetails(KubernetesResource obj, List details) @Override public List delete() { List deleted = deleteAll(); - if (this.context.getTimeout() > 0) { + waitForDelete(deleted, this.context, this); + return deleted; + } + + static void waitForDelete(List deleted, OperationContext context, + Waitable waitable) { + if (context.getTimeout() > 0) { Set uids = deleted.stream().map(StatusDetails::getUid).collect(Collectors.toSet()); - CompletableFuture> delete = this - .informOnCondition(l -> l.stream().map(i -> i.getMetadata().getUid()).noneMatch(uid -> uids.contains(uid))); - Utils.waitUntilReadyOrFail(delete, this.context.getTimeout(), this.context.getTimeoutUnit()); + waitable.waitUntilCondition(h -> h == null || !uids.contains(h.getMetadata().getUid()), context.getTimeout(), + context.getTimeoutUnit()); } - return deleted; } protected List deleteAll() { diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java index bb3d2c5c387..b743b341568 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java @@ -203,7 +203,9 @@ public List createOrReplace() { @Override public List delete() { - return resources().flatMap(r -> r.delete().stream()).collect(Collectors.toList()); + List deleted = resources().flatMap(r -> r.delete().stream()).collect(Collectors.toList()); + BaseOperation.waitForDelete(deleted, this.context, this); + return deleted; } @Override diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/OperationContext.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/OperationContext.java index d1ba99608eb..1d76c326c06 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/OperationContext.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/OperationContext.java @@ -499,8 +499,7 @@ public C clientInWriteContext(Class clazz) { // operationcontext OperationContext newContext = HasMetadataOperationsImpl.defaultContext(client).withDryRun(getDryRun()) .withGracePeriodSeconds(getGracePeriodSeconds()).withPropagationPolicy(getPropagationPolicy()) - .withReloadingFromServer(isReloadingFromServer()).withFieldValidation(this.fieldValidation) - .withTimeout(this.timeout, this.timeoutUnit); + .withReloadingFromServer(isReloadingFromServer()).withFieldValidation(this.fieldValidation); // check before setting to prevent flipping the default flag if (!Objects.equals(getNamespace(), newContext.getNamespace())