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 '}'; } } + }
