From 9fcfcc3f0f85b6bb271955e431418ea0519cc2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 22 Dec 2025 10:06:23 +0100 Subject: [PATCH 1/2] improve: log error in NodeExecutor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/workflow/NodeExecutor.java | 8 ++++ .../dependent/workflow/NodeExecutorTest.java | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java index e7a017a291..561fac626e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java @@ -15,10 +15,15 @@ */ package io.javaoperatorsdk.operator.processing.dependent.workflow; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.HasMetadata; abstract class NodeExecutor implements Runnable { + private static final Logger log = LoggerFactory.getLogger(NodeExecutor.class); + private final DependentResourceNode dependentResourceNode; private final AbstractWorkflowExecutor

workflowExecutor; @@ -37,6 +42,9 @@ public void run() { } catch (Exception e) { // Exception is required because of Kotlin workflowExecutor.handleExceptionInExecutor(dependentResourceNode, e); + } catch (Error e) { + log.error("java.lang.Error during execution", e); + throw e; } finally { workflowExecutor.handleNodeExecutionFinish(dependentResourceNode); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java new file mode 100644 index 0000000000..870bae9c58 --- /dev/null +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java @@ -0,0 +1,44 @@ +/* + * Copyright Java Operator SDK Authors + * + * 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 io.javaoperatorsdk.operator.processing.dependent.workflow; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class NodeExecutorTest { + + private NodeExecutor errorThrowingNodeExecutor = + new NodeExecutor(null, null) { + @Override + protected void doRun(DependentResourceNode dependentResourceNode) { + throw new NoSuchFieldError(); + } + }; + + // for manual testing only to verify you can see the log message + @Disabled + @Test + void nodeExecutorLogsError() throws InterruptedException { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.submit(errorThrowingNodeExecutor); + Thread.sleep(500); + } +} From 2bc526c22725ee9d93879b366cacbca4a7abd286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 22 Dec 2025 10:08:50 +0100 Subject: [PATCH 2/2] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/processing/dependent/workflow/NodeExecutor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java index 561fac626e..98756f7eb6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java @@ -43,6 +43,7 @@ public void run() { // Exception is required because of Kotlin workflowExecutor.handleExceptionInExecutor(dependentResourceNode, e); } catch (Error e) { + // without this user would see no sign about the error log.error("java.lang.Error during execution", e); throw e; } finally {