This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 5f50ca0b8f63ed1ec37d4f50c00cb67b79c0ca05
Author: Alex Heneveld <[email protected]>
AuthorDate: Fri Sep 15 12:38:05 2023 +0100

    fail poller tasks by default if they throw exceptions
---
 .../brooklyn/core/feed/AttributePollHandler.java   |  9 ++++++--
 .../core/sensor/AbstractAddSensorFeed.java         |  4 ++++
 .../core/sensor/AbstractAddTriggerableSensor.java  | 25 +++++++++++++++++-----
 .../brooklyn/core/workflow/WorkflowSensor.java     |  8 +++----
 4 files changed, 35 insertions(+), 11 deletions(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/core/feed/AttributePollHandler.java 
b/core/src/main/java/org/apache/brooklyn/core/feed/AttributePollHandler.java
index e651198876..20a5381123 100644
--- a/core/src/main/java/org/apache/brooklyn/core/feed/AttributePollHandler.java
+++ b/core/src/main/java/org/apache/brooklyn/core/feed/AttributePollHandler.java
@@ -29,6 +29,7 @@ import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle.Transition;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -133,9 +134,13 @@ public class AttributePollHandler<V> implements 
PollHandler<V> {
                 setSensor( config.getOnException().apply(exception) );
             } catch (Exception e) {
                 if (feed.isConnected()) {
-                    log.warn("unable to compute "+getBriefDescription()+"; on 
exception="+exception, e);
+                    if (!e.equals(exception)) {
+                        log.warn("Exception handler for 
"+getBriefDescription()+" returned a different error than the original 
computation; original error was "+exception, exception);
+                    }
+                    log.debug("Exception handler failed computing 
"+getBriefDescription()+" (rethrowing): "+e);
+                    throw Exceptions.propagate(e);
                 } else {
-                    if (log.isDebugEnabled()) log.debug("unable to compute 
"+getBriefDescription()+"; exception="+exception+" (when inactive)", e);
+                    if (log.isDebugEnabled()) log.debug("Unable to compute 
"+getBriefDescription()+"; exception="+exception+" (when inactive)", e);
                 }
             }
         }
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddSensorFeed.java 
b/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddSensorFeed.java
index 02dd58e0ff..bb8db68bd1 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddSensorFeed.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddSensorFeed.java
@@ -67,6 +67,10 @@ public abstract class AbstractAddSensorFeed<T> extends 
AddSensorInitializer<T> {
             "Length of time, after a successful poll, before a subsequent 
failure can be logged at WARN.",
             Duration.millis(0));
 
+    public static final ConfigKey<Boolean> FAIL_TASK_ON_ERROR = 
ConfigKeys.newBooleanConfigKey("failTaskOnError",
+            "Whether to fail the task performing the operation if there is an 
error, or simply to log and continue. " +
+                    "Default is to fail the task." /* since 1.1 */);
+
     protected AbstractAddSensorFeed() {}
     public AbstractAddSensorFeed(final ConfigBag params) {
         super(params);
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddTriggerableSensor.java
 
b/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddTriggerableSensor.java
index 2f6d48aa2f..f9adc8aae7 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddTriggerableSensor.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/sensor/AbstractAddTriggerableSensor.java
@@ -18,6 +18,13 @@
  */
 package org.apache.brooklyn.core.sensor;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Predicates;
@@ -29,20 +36,17 @@ import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import org.apache.brooklyn.core.entity.EntityInitializers;
 import org.apache.brooklyn.core.entity.EntityPredicates;
-import org.apache.brooklyn.core.feed.*;
+import org.apache.brooklyn.core.feed.PollConfig;
 import org.apache.brooklyn.core.mgmt.internal.AppGroupTraverser;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.predicates.DslPredicates;
 import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.commons.lang3.tuple.Pair;
 
-import java.util.*;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
 /**
  * Super-class for entity initializers that add feeds.
  */
@@ -186,6 +190,10 @@ public abstract class AbstractAddTriggerableSensor<T> 
extends AbstractAddSensorF
                 .period(getPeriod(entity, initParams()))
                 .otherTriggers(getTriggersMaybe(entity, configBag).orNull())
                 .condition(new ConditionSupplierFromConfigBag(configBag, 
entity));
+
+        if (!Boolean.FALSE.equals(configBag.get(FAIL_TASK_ON_ERROR))) {
+            poll.onException(new RethrowException());
+        }
     }
 
     static class ConditionSupplierFromConfigBag implements 
Supplier<DslPredicates.DslPredicate> {
@@ -203,4 +211,11 @@ public abstract class AbstractAddTriggerableSensor<T> 
extends AbstractAddSensorF
         }
     }
 
+
+    public static class RethrowException<T> implements 
com.google.common.base.Function<Throwable,T> {
+        @Override
+        public T apply(Throwable err) {
+            throw Exceptions.propagate(err);
+        }
+    }
 }
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java 
b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
index fb562546d1..2a9c08b8e8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
@@ -18,6 +18,9 @@
  */
 package org.apache.brooklyn.core.workflow;
 
+import java.util.Map;
+import java.util.concurrent.Callable;
+
 import com.google.common.annotations.Beta;
 import com.google.common.reflect.TypeToken;
 import org.apache.brooklyn.api.entity.Entity;
@@ -47,10 +50,6 @@ import org.apache.brooklyn.util.guava.Maybe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
 /** 
  * Configurable {@link EntityInitializer} which adds a sensor feed running a 
given workflow.
  */
@@ -220,4 +219,5 @@ public class WorkflowSensor<T> extends 
AbstractAddTriggerableSensor<T> implement
                     '}';
         }
     }
+
 }

Reply via email to