You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/08/30 01:01:16 UTC
[16/26] git commit: default children/members enrichers for service_up
and service_problems ignores entities that report null as well as those that
don't report;
this can be overridden with IGNORE_{NULL,TRANSITIONING} config keys. and the
load balancing p
default children/members enrichers for service_up and service_problems ignores entities that report null as well as those that don't report; this can be overridden with IGNORE_{NULL,TRANSITIONING} config keys.
and the load balancing policy defaults not to blocking service up simply because children/members are not present. misc other tidies around policies.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/d3886a05
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/d3886a05
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/d3886a05
Branch: refs/heads/master
Commit: d3886a055353f2efa435c84d45668c1a3ab0aa23
Parents: cbc103a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Aug 25 10:48:19 2014 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Aug 27 02:17:18 2014 -0400
----------------------------------------------------------------------
.../java/brooklyn/entity/basic/Entities.java | 5 +--
.../brooklyn/entity/basic/EntityConfigMap.java | 8 ++---
.../java/brooklyn/entity/basic/QuorumCheck.java | 3 ++
.../entity/basic/ServiceStateLogic.java | 36 +++++++++++++++-----
.../loadbalancing/BalanceableContainer.java | 13 +++++--
.../loadbalancing/BalanceableWorkerPool.java | 3 ++
.../BalanceableWorkerPoolImpl.java | 6 ++--
.../loadbalancing/LoadBalancingPolicy.java | 17 +++++----
.../AbstractLoadBalancingPolicyTest.java | 2 +-
.../loadbalancing/LoadBalancingPolicyTest.java | 4 ++-
.../loadbalancing/MockContainerEntity.java | 2 +-
.../loadbalancing/MockContainerEntityImpl.java | 3 +-
12 files changed, 71 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Entities.java b/core/src/main/java/brooklyn/entity/basic/Entities.java
index ea35432..4191110 100644
--- a/core/src/main/java/brooklyn/entity/basic/Entities.java
+++ b/core/src/main/java/brooklyn/entity/basic/Entities.java
@@ -281,7 +281,7 @@ public class Entities {
dumpInfo(e, new PrintWriter(System.out), currentIndentation, tab);
}
public static void dumpInfo(Entity e, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+e.toString()+"\n");
+ out.append(currentIndentation+e.toString()+" "+e.getId()+"\n");
out.append(currentIndentation+tab+tab+"locations = "+e.getLocations()+"\n");
@@ -332,7 +332,8 @@ public class Entities {
if (e instanceof Group) {
StringBuilder members = new StringBuilder();
for (Entity it : ((Group)e).getMembers()) {
- members.append(it.getId()+", ");
+ if (members.length()>0) members.append(", ");
+ members.append(it.getId());
}
out.append(currentIndentation+tab+tab+"Members: "+members.toString()+"\n");
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java b/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
index c946fe0..3f5884b 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
@@ -102,8 +102,6 @@ public class EntityConfigMap implements ConfigMap {
// but that example doesn't have a default...
ConfigKey<T> ownKey = entity!=null ? (ConfigKey<T>)elvis(entity.getEntityType().getConfigKey(key.getName()), key) : key;
- ExecutionContext exec = entity.getExecutionContext();
-
// TODO We're notifying of config-changed because currently persistence needs to know when the
// attributeWhenReady is complete (so it can persist the result).
// Long term, we'll just persist tasks properly so the call to onConfigChanged will go!
@@ -114,11 +112,13 @@ public class EntityConfigMap implements ConfigMap {
T result = null;
boolean complete = false;
if (((ConfigKeySelfExtracting<T>)ownKey).isSet(ownConfig)) {
+ ExecutionContext exec = entity.getExecutionContext();
result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(ownConfig, exec);
complete = true;
} else if (((ConfigKeySelfExtracting<T>)ownKey).isSet(inheritedConfig)) {
- result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(inheritedConfig, exec);
- complete = true;
+ ExecutionContext exec = entity.getExecutionContext();
+ result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(inheritedConfig, exec);
+ complete = true;
} else if (localConfigBag.containsKey(ownKey)) {
// TODO configBag.get doesn't handle tasks/attributeWhenReady - it only uses TypeCoercions
result = localConfigBag.get(ownKey);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java b/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
index bac4515..17195e8 100644
--- a/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
+++ b/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
@@ -39,6 +39,9 @@ public interface QuorumCheck {
public static QuorumCheck atLeastOneUnlessEmpty() {
return new NumericQuorumCheck(1, 0.0, true);
}
+ public static QuorumCheck alwaysTrue() {
+ return new NumericQuorumCheck(0, 0.0, true);
+ }
public static QuorumCheck newInstance(int minRequiredSize, double minRequiredRatio, boolean allowEmpty) {
return new NumericQuorumCheck(minRequiredSize, minRequiredRatio, allowEmpty);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
index de4f1ad..9e66381 100644
--- a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
+++ b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
@@ -25,6 +25,9 @@ import java.util.Map;
import javax.annotation.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import brooklyn.config.ConfigKey;
import brooklyn.enricher.Enrichers;
import brooklyn.enricher.basic.AbstractEnricher;
@@ -55,6 +58,8 @@ import com.google.common.collect.ImmutableList;
/** Logic, sensors and enrichers, and conveniences, for computing service status */
public class ServiceStateLogic {
+ private static final Logger log = LoggerFactory.getLogger(ServiceStateLogic.class);
+
public static final AttributeSensor<Boolean> SERVICE_UP = Attributes.SERVICE_UP;
public static final AttributeSensor<Map<String,Object>> SERVICE_NOT_UP_INDICATORS = Attributes.SERVICE_NOT_UP_INDICATORS;
@@ -206,6 +211,7 @@ public class ServiceStateLogic {
}
protected void setActualState(@Nullable Lifecycle state) {
+ if (log.isTraceEnabled()) log.trace("{} setting actual state {}", this, state);
emit(SERVICE_STATE_ACTUAL, (state==null ? Entities.REMOVE : state));
}
}
@@ -253,6 +259,8 @@ public class ServiceStateLogic {
"Logic for checking whether this service is healthy, based on children and/or members running, defaulting to requiring none to be ON-FIRE", QuorumCheck.QuorumChecks.all());
public static final ConfigKey<Boolean> DERIVE_SERVICE_NOT_UP = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.service_up.publish", "Whether to derive a service-not-up indicator from children", true);
public static final ConfigKey<Boolean> DERIVE_SERVICE_PROBLEMS = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.service_problems.publish", "Whether to derive a service-problem indicator from children", true);
+ public static final ConfigKey<Boolean> IGNORE_NULL_VALUES = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.ignore_nulls", "Whether to ignore children reporting null values for the sensor", true);
+ public static final ConfigKey<Boolean> IGNORE_TRANSITIONING = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.ignore_transitioning", "Whether to ignore children reporting transitional states (starting, stopping, etc) for service state", true);
protected String getKeyForMapSensor() {
return Preconditions.checkNotNull(super.getUniqueTag());
@@ -304,7 +312,12 @@ public class ServiceStateLogic {
protected Object computeServiceNotUp() {
Map<Entity, Boolean> values = getValues(SERVICE_UP);
List<Entity> violators = MutableList.of();
+ boolean ignoreNull = getConfig(IGNORE_NULL_VALUES);
+ int entries=0;
for (Map.Entry<Entity, Boolean> state: values.entrySet()) {
+ if (ignoreNull && state.getValue()==null)
+ continue;
+ entries++;
if (!Boolean.TRUE.equals(state.getValue())) {
violators.add(state.getKey());
}
@@ -312,11 +325,12 @@ public class ServiceStateLogic {
QuorumCheck qc = getConfig(UP_QUORUM_CHECK);
if (qc!=null) {
- if (qc.isQuorate(values.size()-violators.size(), values.size()))
+ if (qc.isQuorate(entries-violators.size(), entries))
// quorate
return null;
if (values.isEmpty()) return "No entities present";
+ if (entries==0) return "No entities publishing service up";
if (violators.isEmpty()) return "Not enough entities";
} else {
if (violators.isEmpty())
@@ -324,35 +338,41 @@ public class ServiceStateLogic {
}
if (violators.size()==1) return violators.get(0)+" is not up";
- if (violators.size()==values.size()) return "None of the entities are up";
+ if (violators.size()==entries) return "None of the entities are up";
return violators.size()+" entities are not up, including "+violators.get(0);
}
protected Object computeServiceProblems() {
Map<Entity, Lifecycle> values = getValues(SERVICE_STATE_ACTUAL);
- int numRunning=0, numOnFire=0;
+ int numRunning=0, numNotHealthy=0;
+ boolean ignoreNull = getConfig(IGNORE_NULL_VALUES);
+ boolean ignoreTransition = getConfig(IGNORE_TRANSITIONING);
for (Lifecycle state: values.values()) {
if (state==Lifecycle.RUNNING) numRunning++;
- else if (state==Lifecycle.ON_FIRE) numOnFire++;
+ else if (state==Lifecycle.ON_FIRE) numNotHealthy++;
+ else if (state==null) { if (!ignoreNull) numNotHealthy++; }
+ else { if (!ignoreTransition) numNotHealthy++; }
}
QuorumCheck qc = getConfig(RUNNING_QUORUM_CHECK);
if (qc!=null) {
- if (qc.isQuorate(numRunning, numOnFire+numRunning))
+ if (qc.isQuorate(numRunning, numNotHealthy+numRunning))
// quorate
return null;
- if (numOnFire==0)
+ if (numNotHealthy==0)
return "Not enough entities running to be quorate";
} else {
- if (numOnFire==0)
+ if (numNotHealthy==0)
return null;
}
- return numOnFire+" entit"+Strings.ies(numOnFire)+" are on fire";
+ return numNotHealthy+" entit"+Strings.ies(numNotHealthy)+" not healthy";
}
protected void updateMapSensor(AttributeSensor<Map<String, Object>> sensor, Object value) {
+ if (log.isTraceEnabled()) log.trace("{} updating map sensor {} with {}", new Object[] { this, sensor, value });
+
if (value!=null)
updateMapSensorEntry(entity, sensor, getKeyForMapSensor(), value);
else
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
index 56969d0..9a7ecb1 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
@@ -20,7 +20,12 @@ package brooklyn.policy.loadbalancing;
import java.util.Set;
+import brooklyn.config.ConfigKey;
import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractGroup;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.entity.basic.QuorumCheck;
+import brooklyn.entity.basic.QuorumCheck.QuorumChecks;
import brooklyn.event.basic.BasicNotificationSensor;
/**
@@ -28,14 +33,18 @@ import brooklyn.event.basic.BasicNotificationSensor;
* Membership of a balanceable container does not imply a parent-child relationship in the Brooklyn
* management sense.
*/
-public interface BalanceableContainer<ItemType extends Movable> extends Entity {
+public interface BalanceableContainer<ItemType extends Movable> extends Entity, AbstractGroup {
public static BasicNotificationSensor<Entity> ITEM_ADDED = new BasicNotificationSensor<Entity>(
Entity.class, "balanceablecontainer.item.added", "Movable item added to balanceable container");
public static BasicNotificationSensor<Entity> ITEM_REMOVED = new BasicNotificationSensor<Entity>(
Entity.class, "balanceablecontainer.item.removed", "Movable item removed from balanceable container");
-
+ public static final ConfigKey<QuorumCheck> UP_QUORUM_CHECK = ConfigKeys.newConfigKeyWithDefault(AbstractGroup.UP_QUORUM_CHECK,
+ "Up check from members; default one for container overrides usual check to always return true, "
+ + "i.e. not block service up simply because the container is empty or something in the container has failed",
+ QuorumChecks.alwaysTrue());
+
public Set<ItemType> getBalanceableItems();
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
index 023edbe..ab18ce6 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
@@ -32,6 +32,9 @@ import brooklyn.event.basic.BasicNotificationSensor;
* Represents an elastic group of "container" entities, each of which is capable of hosting "item" entities that perform
* work and consume the container's available resources (e.g. CPU or bandwidth). Auto-scaling and load-balancing policies can
* be attached to this pool to provide dynamic elasticity based on workrates reported by the individual item entities.
+ * <p>
+ * The containers must be "up" in order to receive work, thus they must NOT follow the default enricher pattern
+ * for groups which says that the group must be up to receive work.
*/
@ImplementedBy(BalanceableWorkerPoolImpl.class)
public interface BalanceableWorkerPool extends Entity, Resizable {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
index 905411e..bb7b64b 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
@@ -36,9 +36,7 @@ import brooklyn.event.SensorEvent;
import brooklyn.event.SensorEventListener;
/**
- * Represents an elastic group of "container" entities, each of which is capable of hosting "item" entities that perform
- * work and consume the container's available resources (e.g. CPU or bandwidth). Auto-scaling and load-balancing policies can
- * be attached to this pool to provide dynamic elasticity based on workrates reported by the individual item entities.
+ * @see BalanceableWorkerPool
*/
public class BalanceableWorkerPoolImpl extends AbstractEntity implements BalanceableWorkerPool {
@@ -60,7 +58,7 @@ public class BalanceableWorkerPoolImpl extends AbstractEntity implements Balance
if (LOG.isTraceEnabled()) LOG.trace("{} received event {}", BalanceableWorkerPoolImpl.this, event);
Entity source = event.getSource();
Object value = event.getValue();
- Sensor sensor = event.getSensor();
+ Sensor<?> sensor = event.getSensor();
if (sensor.equals(AbstractGroup.MEMBER_ADDED)) {
if (source.equals(containerGroup)) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
index 6738d6c..7cef21d 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
@@ -87,9 +87,11 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
private volatile long executorTime = 0;
private int lastEmittedDesiredPoolSize = 0;
- private String lastEmittedPoolTemperature = null; // "cold" or "hot"
+ private static enum TemperatureStates { COLD, HOT }
+ private TemperatureStates lastEmittedPoolTemperature = null; // "cold" or "hot"
private final SensorEventListener<Object> eventHandler = new SensorEventListener<Object>() {
+ @SuppressWarnings({ "rawtypes", "unchecked" })
public void onEvent(SensorEvent<Object> event) {
if (LOG.isTraceEnabled()) LOG.trace("{} received event {}", LoadBalancingPolicy.this, event);
Entity source = event.getSource();
@@ -119,6 +121,7 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
BalanceablePoolModel<NodeType, ItemType> model) {
this(MutableMap.of(), metric, model);
}
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public LoadBalancingPolicy(Map props, AttributeSensor<? extends Number> metric,
BalanceablePoolModel<NodeType, ItemType> model) {
@@ -133,6 +136,7 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
executor = Executors.newSingleThreadScheduledExecutor(newThreadFactory());
}
+ @SuppressWarnings("unchecked")
@Override
public void setEntity(EntityLocal entity) {
Preconditions.checkArgument(entity instanceof BalanceableWorkerPool, "Provided entity must be a BalanceableWorkerPool");
@@ -185,12 +189,13 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
long delay = Math.max(0, (executorTime + minPeriodBetweenExecs) - now);
executor.schedule(new Runnable() {
+ @SuppressWarnings("rawtypes")
public void run() {
try {
executorTime = System.currentTimeMillis();
executorQueued.set(false);
strategy.rebalance();
-
+
if (LOG.isDebugEnabled()) LOG.debug("{} post-rebalance: poolSize={}; workrate={}; lowThreshold={}; " +
"highThreshold={}", new Object[] {this, model.getPoolSize(), model.getCurrentPoolWorkrate(),
model.getPoolLowThreshold(), model.getPoolHighThreshold()});
@@ -206,10 +211,10 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
if (LOG.isInfoEnabled()) {
int desiredPoolSize = (int) Math.ceil(model.getCurrentPoolWorkrate() / (model.getPoolLowThreshold()/model.getPoolSize()));
- if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != "cold") {
+ if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != TemperatureStates.COLD) {
LOG.info("{} emitted COLD (suggesting {}): {}", new Object[] {this, desiredPoolSize, eventVal});
lastEmittedDesiredPoolSize = desiredPoolSize;
- lastEmittedPoolTemperature = "cold";
+ lastEmittedPoolTemperature = TemperatureStates.COLD;
}
}
@@ -224,10 +229,10 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
if (LOG.isInfoEnabled()) {
int desiredPoolSize = (int) Math.ceil(model.getCurrentPoolWorkrate() / (model.getPoolHighThreshold()/model.getPoolSize()));
- if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != "hot") {
+ if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != TemperatureStates.HOT) {
LOG.info("{} emitted HOT (suggesting {}): {}", new Object[] {this, desiredPoolSize, eventVal});
lastEmittedDesiredPoolSize = desiredPoolSize;
- lastEmittedPoolTemperature = "hot";
+ lastEmittedPoolTemperature = TemperatureStates.HOT;
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java b/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
index 0cd05a0..244d8fa 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
@@ -91,7 +91,7 @@ public class AbstractLoadBalancingPolicyTest {
model = new DefaultBalanceablePoolModel<Entity, Entity>("pool-model");
- app = ApplicationBuilder.newManagedApp(TestApplication.class);
+ app = TestApplication.Factory.newManagedInstanceForTests();
containerGroup = app.createAndManageChild(EntitySpec.create(DynamicGroup.class)
.displayName("containerGroup")
.configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(MockContainerEntity.class)));
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java b/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
index df7d300..c0ff7b7 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
@@ -27,6 +27,8 @@ import brooklyn.entity.basic.Entities;
import brooklyn.entity.basic.EntityLocal;
import brooklyn.test.Asserts;
import brooklyn.util.collections.MutableMap;
+import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -179,7 +181,7 @@ public class LoadBalancingPolicyTest extends AbstractLoadBalancingPolicyTest {
MockContainerEntity containerC = newAsyncContainer(app, "C", 10, 30, CONTAINER_STARTUP_DELAY_MS);
// New container allows hot ones to offload work.
-
+
assertWorkratesEventually(
ImmutableList.of(containerA, containerB, containerC),
ImmutableList.of(item1, item2, item3, item4, item5, item6, item7, item8),
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
index 1de0d47..2fba8f0 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
@@ -41,7 +41,7 @@ public interface MockContainerEntity extends AbstractGroup, BalanceableContainer
public static final ConfigKey<Long> DELAY = new BasicConfigKey<Long>(
Long.class, "mock.container.delay", "", 0L);
- public static final Effector OFFLOAD_AND_STOP = new MethodEffector(MockContainerEntity.class, "offloadAndStop");
+ public static final Effector<Void> OFFLOAD_AND_STOP = new MethodEffector<Void>(MockContainerEntity.class, "offloadAndStop");
public void lock();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
index 13baec5..09906d0 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
@@ -116,6 +116,7 @@ public class MockContainerEntityImpl extends AbstractGroupImpl implements MockCo
emit(BalanceableContainer.ITEM_REMOVED, item);
}
+ @SuppressWarnings("unchecked")
@Override
public Set<Movable> getBalanceableItems() {
return (Set) Sets.newLinkedHashSet(getMembers());
@@ -137,8 +138,6 @@ public class MockContainerEntityImpl extends AbstractGroupImpl implements MockCo
if (getDelay() > 0) Time.sleep(getDelay());
running = true;
addLocations(locs);
- Location loc = Iterables.get(locs, 0);
- String locName = (loc.getDisplayName() != null) ? loc.getDisplayName() : loc.toString();
emit(Attributes.LOCATION_CHANGED, null);
setAttribute(SERVICE_UP, true);
} finally {