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 2017/10/06 08:06:35 UTC

[11/23] brooklyn-server git commit: task visibility: ensure all tasks have a name, updating exec.submit() methods to take name

task visibility: ensure all tasks have a name, updating exec.submit() methods to take name


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/79cc9bcc
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/79cc9bcc
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/79cc9bcc

Branch: refs/heads/master
Commit: 79cc9bccf0ca80816ecd09846ec385d5cad3fbf8
Parents: aeecd3e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Sep 20 10:09:05 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Sep 20 10:10:25 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/api/mgmt/ExecutionContext.java     | 17 +++-
 .../brooklyn/api/mgmt/ExecutionManager.java     | 14 ++-
 .../camp/brooklyn/ConfigParametersYamlTest.java | 13 ++-
 .../brooklyn/camp/brooklyn/spi/dsl/DslTest.java |  4 +-
 .../core/mgmt/rebind/RebindManagerImpl.java     | 10 +--
 .../core/task/AbstractExecutionContext.java     | 10 ++-
 .../util/core/task/BasicExecutionContext.java   |  5 ++
 .../util/core/task/BasicExecutionManager.java   |  8 +-
 .../core/config/DeferredConfigTest.java         |  8 +-
 .../entity/ApplicationLifecycleStateTest.java   | 18 ++--
 .../brooklyn/core/entity/EntityAssertsTest.java | 92 ++++---------------
 .../mgmt/persist/XmlMementoSerializerTest.java  |  2 +-
 .../qa/performance/TaskPerformanceTest.java     |  6 +-
 .../ssh/SshMachineLocationIntegrationTest.java  |  6 +-
 .../location/ssh/SshMachineLocationTest.java    | 12 +--
 .../util/core/task/TaskPredicatesTest.java      |  5 +-
 .../util/core/task/ValueResolverTest.java       | 93 +++++++++++++++++---
 .../brooklyn/policy/ha/ServiceReplacer.java     |  6 +-
 .../brooklyn/policy/ha/ServiceRestarter.java    |  4 +-
 .../rest/resources/SensorResourceTest.java      |  2 +-
 .../entity/brooklynnode/BrooklynNodeImpl.java   | 12 +--
 21 files changed, 178 insertions(+), 169 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionContext.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionContext.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionContext.java
index 142e664..c940ca0 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionContext.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionContext.java
@@ -52,12 +52,22 @@ public interface ExecutionContext extends Executor {
      */
     <T> Task<T> submit(Map<?,?> properties, Callable<T> callable);
 
-    /** {@link ExecutionManager#submit(Runnable) */
+    /** {@link ExecutionManager#submit(Runnable) 
+     * @deprecated since 0.12.0 pass a display name or a more detailed map */
+    @Deprecated
     Task<?> submit(Runnable runnable);
  
-    /** {@link ExecutionManager#submit(Callable) */
+    /** {@link ExecutionManager#submit(Callable)
+     * @deprecated since 0.12.0 pass a display name or a more detailed map */
+    @Deprecated
     <T> Task<T> submit(Callable<T> callable);
 
+    /** {@link ExecutionManager#submit(String Runnable) */
+    Task<?> submit(String displayName, Runnable runnable);
+ 
+    /** {@link ExecutionManager#submit(String, Callable) */
+    <T> Task<T> submit(String displayName, Callable<T> callable);
+
     /** See {@link ExecutionManager#submit(Map, TaskAdaptable)}. */
     <T> Task<T> submit(TaskAdaptable<T> task);
     
@@ -80,6 +90,9 @@ public interface ExecutionContext extends Executor {
     // TODO reference ImmediateSupplier when that class is moved to utils project
     @Beta
     <T> Maybe<T> getImmediately(Object callableOrSupplierOrTask);
+    /** As {@link #getImmediately(Object)} but strongly typed for a task. */
+    @Beta
+    <T> Maybe<T> getImmediately(Task<T> callableOrSupplierOrTask);
 
     /**
      * Efficient shortcut for {@link #submit(TaskAdaptable)} followed by an immediate {@link Task#get()}.

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionManager.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionManager.java
index 97108ab..d4d1db4 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionManager.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/ExecutionManager.java
@@ -79,11 +79,21 @@ public interface ExecutionManager {
 //    /** returns all tasks known to this manager (immutable) */
 //    public Set<Task<?>> getAllTasks();
 
-    /** see {@link #submit(Map, TaskAdaptable)} */
+    /** see {@link #submit(Map, TaskAdaptable)} 
+     * @deprecated since 0.12.0 pass displayName or map */
+    @Deprecated
     public Task<?> submit(Runnable r);
 
+    /** see {@link #submit(Map, TaskAdaptable)} 
+     * @deprecated since 0.12.0 pass displayName or map */
+    @Deprecated
+    public <T> Task<T> submit(Callable<T> r);
+
+    /** see {@link #submit(Map, TaskAdaptable)} */
+    public Task<?> submit(String displayName, Runnable c);
+
     /** see {@link #submit(Map, TaskAdaptable)} */
-    public <T> Task<T> submit(Callable<T> c);
+    public <T> Task<T> submit(String displayName, Callable<T> c);
 
     /** see {@link #submit(Map, TaskAdaptable)} */
     public <T> Task<T> submit(TaskAdaptable<T> task);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
index 98ccb0b..3840e2d 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
@@ -934,13 +934,12 @@ public class ConfigParametersYamlTest extends AbstractYamlRebindTest {
         Entity app = createStartWaitAndLogApplication(yaml);
         final TestEntity entity1 = (TestEntity) Iterables.getOnlyElement(app.getChildren());
 
-        TestEntity entity2 = entity1.getExecutionContext().submit(new Callable<TestEntity>() {
-            public TestEntity call() {
-                TestEntity entity2 = entity1.addChild(EntitySpec.create(TestEntity.class));
-                entity2.start(Collections.<Location>emptyList());
-                return entity2;
-            } 
-        }).get();
+        TestEntity entity2 = entity1.getExecutionContext().submit("create and start", () -> {
+                TestEntity entity2i = entity1.addChild(EntitySpec.create(TestEntity.class));
+                entity2i.start(Collections.<Location>emptyList());
+                return entity2i;
+            })
+            .get();
         
         Entities.dumpInfo(app);
         

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
index 63aba8e..04b6bf1 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
@@ -327,7 +327,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
     protected void runConcurrentWorker(Supplier<Runnable> taskSupplier) {
         Collection<Task<?>> results = new ArrayList<>();
         for (int i = 0; i < MAX_PARALLEL_RESOLVERS; i++) {
-            Task<?> result = app.getExecutionContext().submit(taskSupplier.get());
+            Task<?> result = app.getExecutionContext().submit("parallel "+i, taskSupplier.get());
             results.add(result);
         }
         for (Task<?> result : results) {
@@ -550,7 +550,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
             }
         };
         if (execInTask) {
-            Task<Maybe<?>> task = ((EntityInternal)context).getExecutionContext().submit(job);
+            Task<Maybe<?>> task = ((EntityInternal)context).getExecutionContext().submit("Resolving DSL for test: "+dsl, job);
             task.get(Asserts.DEFAULT_LONG_TIMEOUT);
             assertTrue(task.isDone());
             return task.get();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
index d896376..381fee8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
@@ -520,15 +520,7 @@ public class RebindManagerImpl implements RebindManager {
         ExecutionContext ec = BasicExecutionContext.getCurrentExecutionContext();
         if (ec == null) {
             ec = managementContext.getServerExecutionContext();
-            Task<List<Application>> task = ec.submit(new Callable<List<Application>>() {
-                @Override public List<Application> call() throws Exception {
-                    return rebindImpl(classLoader, exceptionHandler, mode);
-                }});
-            try {
-                return task.get();
-            } catch (Exception e) {
-                throw Exceptions.propagate(e);
-            }
+            return ec.get(Tasks.<List<Application>>builder().displayName("rebind").dynamic(false).body(() -> rebindImpl(classLoader, exceptionHandler, mode)).build());
         } else {
             return rebindImpl(classLoader, exceptionHandler, mode);
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/main/java/org/apache/brooklyn/util/core/task/AbstractExecutionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/AbstractExecutionContext.java b/core/src/main/java/org/apache/brooklyn/util/core/task/AbstractExecutionContext.java
index e7debb9..424bbfc 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/AbstractExecutionContext.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/AbstractExecutionContext.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.mgmt.ExecutionManager;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
+import org.apache.brooklyn.util.collections.MutableMap;
 
 import com.google.common.collect.Maps;
 
@@ -41,11 +42,16 @@ public abstract class AbstractExecutionContext implements ExecutionContext {
     public Task<?> submit(Map<?,?> properties, Runnable runnable) { return submitInternal(properties, runnable); }
     
     /** @see #submit(Map, Runnable) */
-    @Override
+    @Override 
+    public Task<?> submit(String displayName, Runnable runnable) { return submitInternal(MutableMap.of("displayName", displayName), runnable); }
+    @Override @Deprecated
     public Task<?> submit(Runnable runnable) { return submitInternal(Maps.newLinkedHashMap(), runnable); }
+    
  
     /** @see #submit(Map, Runnable) */
-    @Override
+    @Override 
+    public <T> Task<T> submit(String displayName, Callable<T> callable) { return submitInternal(MutableMap.of("displayName", displayName), callable); }
+    @Override @Deprecated
     public <T> Task<T> submit(Callable<T> callable) { return submitInternal(Maps.newLinkedHashMap(), callable); }
     
     /** @see #submit(Map, Runnable) */

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
index 1b85663..1236219 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
@@ -239,6 +239,11 @@ public class BasicExecutionContext extends AbstractExecutionContext {
         }
     }
     
+    @Override
+    public <T> Maybe<T> getImmediately(Task<T> callableOrSupplier) {
+        return getImmediately((Object) callableOrSupplier);
+    }
+    
     /** performs execution without spawning a new task thread, though it does temporarily set a fake task for the purpose of getting context;
      * currently supports {@link Supplier}, {@link Callable}, {@link Runnable}, or {@link Task} instances; 
      * with tasks if it is submitted or in progress,

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
index 46e501e8..e85bf2f 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
@@ -57,7 +57,7 @@ import org.apache.brooklyn.core.config.Sanitizer;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableSet;
+import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.task.TaskInternal.TaskCancellationMode;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.RuntimeInterruptedException;
@@ -388,10 +388,12 @@ public class BasicExecutionManager implements ExecutionManager {
         }
     }
 
-    @Override public Task<?> submit(Runnable r) { return submit(new LinkedHashMap<Object,Object>(1), r); }
+    @Override @Deprecated public Task<?> submit(Runnable r) { return submit(new LinkedHashMap<Object,Object>(1), r); }
+    @Override public Task<?> submit(String displayName, Runnable r) { return submit(MutableMap.of("displayName", displayName), r); }
     @Override public Task<?> submit(Map<?,?> flags, Runnable r) { return submit(flags, new BasicTask<Void>(flags, r)); }
 
-    @Override public <T> Task<T> submit(Callable<T> c) { return submit(new LinkedHashMap<Object,Object>(1), c); }
+    @Override @Deprecated public <T> Task<T> submit(Callable<T> c) { return submit(new LinkedHashMap<Object,Object>(1), c); }
+    @Override public <T> Task<T> submit(String displayName, Callable<T> c) { return submit(MutableMap.of("displayName", displayName), c); }
     @Override public <T> Task<T> submit(Map<?,?> flags, Callable<T> c) { return submit(flags, new BasicTask<T>(flags, c)); }
 
     @Override public <T> Task<T> submit(TaskAdaptable<T> t) { return submit(new LinkedHashMap<Object,Object>(1), t); }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/core/config/DeferredConfigTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/config/DeferredConfigTest.java b/core/src/test/java/org/apache/brooklyn/core/config/DeferredConfigTest.java
index 9decca8..c2cf908 100644
--- a/core/src/test/java/org/apache/brooklyn/core/config/DeferredConfigTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/config/DeferredConfigTest.java
@@ -21,7 +21,6 @@ package org.apache.brooklyn.core.config;
 import static org.testng.Assert.assertEquals;
 
 import java.util.List;
-import java.util.concurrent.Callable;
 
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.sensor.Sensor;
@@ -55,13 +54,10 @@ public class DeferredConfigTest extends BrooklynAppUnitTestSupport {
     
     void doTestDeferredConfigInList(final boolean delay) throws Exception {
         // Simulate a deferred value
-        Task<Sensor<?>> sensorFuture = app.getExecutionContext().submit(new Callable<Sensor<?>>() {
-            @Override
-            public Sensor<?> call() throws Exception {
+        Task<Sensor<?>> sensorFuture = app.getExecutionContext().submit("deferred return sensor", () -> {
                 if (delay) Time.sleep(Duration.FIVE_SECONDS);
                 return TestApplication.MY_ATTRIBUTE;
-            }
-        });
+            });
         app.config().set(SENSORS_UNTYPED, (Object)ImmutableList.of(sensorFuture));
 
         if (!delay) sensorFuture.get(Duration.ONE_SECOND);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/core/entity/ApplicationLifecycleStateTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/ApplicationLifecycleStateTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/ApplicationLifecycleStateTest.java
index e8a3eee..f301b3c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/ApplicationLifecycleStateTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/ApplicationLifecycleStateTest.java
@@ -267,20 +267,14 @@ public class ApplicationLifecycleStateTest extends BrooklynMgmtUnitTestSupport {
             }
         });
 
-        Task<?> first = mgmt.getExecutionManager().submit(new Runnable() {
-            @Override
-            public void run() {
+        Task<?> first = mgmt.getExecutionManager().submit("setting test sensor", () -> {
                 app.sensors().set(TEST_SENSOR, "first");
                 log.debug("set first");
-            }
-        });
-        Task<?> second = mgmt.getExecutionManager().submit(new Runnable() {
-            @Override
-            public void run() {
+            });
+        Task<?> second = mgmt.getExecutionManager().submit("setting test sensor", () -> {
                 app.sensors().set(TEST_SENSOR, "second");
                 log.debug("set second");
-            }
-        });
+            });
         first.blockUntilEnded();
         second.blockUntilEnded();
 
@@ -394,8 +388,8 @@ public class ApplicationLifecycleStateTest extends BrooklynMgmtUnitTestSupport {
         };
 
         // Simulates firing the emit method from event handlers in different threads
-        mgmt.getExecutionManager().submit(overrideJob);
-        mgmt.getExecutionManager().submit(overrideJob);
+        mgmt.getExecutionManager().submit("emitting test sensor", overrideJob);
+        mgmt.getExecutionManager().submit("emitting test sensor", overrideJob);
 
         Asserts.eventually(Suppliers.ofInstance(seenValues), CollectionFunctionals.sizeEquals(2));
         Asserts.succeedsContinually(new Runnable() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/core/entity/EntityAssertsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntityAssertsTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntityAssertsTest.java
index bfdac3c..3160518 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityAssertsTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityAssertsTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.core.entity;
 
-import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 
@@ -33,7 +32,6 @@ import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -85,12 +83,7 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
         entity.sensors().set(TestEntity.NAME, "before");
         final String after = "after";
 
-        Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertAttributeEqualsEventually(entity, TestEntity.NAME, after);
-            }
-        });
+        Task<?> assertValue = entity.getExecutionContext().submit("assert attr equals", () -> EntityAsserts.assertAttributeEqualsEventually(entity, TestEntity.NAME, after));
         entity.sensors().set(TestEntity.NAME, after);
         assertValue.get();
     }
@@ -105,12 +98,7 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
     @Test
     public void shouldAssertAttributeEventuallyNonNull() throws Exception {
         EntityAsserts.assertAttributeEquals(entity, TestEntity.NAME, null);
-        Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertAttributeEventuallyNonNull(entity, TestEntity.NAME);
-            }
-        });
+        Task<?> assertValue = entity.getExecutionContext().submit("assert attr non-null", () -> EntityAsserts.assertAttributeEventuallyNonNull(entity, TestEntity.NAME));
         entity.sensors().set(TestEntity.NAME, "something");
         assertValue.get();
     }
@@ -118,18 +106,11 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
     @Test
     public void shouldAssertAttributeEventually() throws Exception {
         final CountDownLatch eventuallyEntered = new CountDownLatch(2);
-        Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertAttributeEventually(entity, TestEntity.NAME, new Predicate<String>() {
-                    @Override
-                    public boolean apply(String input) {
-                        eventuallyEntered.countDown();
-                        return input.matches(".*\\d+");
-                    }
-                });
-            }
-        });
+        Task<?> assertValue = entity.getExecutionContext().submit("assert attribute", () -> EntityAsserts.assertAttributeEventually(entity, TestEntity.NAME, 
+            (input) -> {
+                eventuallyEntered.countDown();
+                return input.matches(".*\\d+");
+            }) );
         eventuallyEntered.await();
         entity.sensors().set(TestEntity.NAME, "testing testing 123");
         assertValue.get();
@@ -146,18 +127,11 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
     public void shouldAssertPredicateEventuallyTrue() throws Exception {
         final int testVal = 987654321;
         final CountDownLatch eventuallyEntered = new CountDownLatch(2);
-        Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertPredicateEventuallyTrue(entity, new Predicate<TestEntity>() {
-                    @Override
-                    public boolean apply(TestEntity input) {
-                        eventuallyEntered.countDown();
-                        return testVal == input.getSequenceValue();
-                    }
-                });
-            }
-        });
+        Task<?> assertValue = entity.getExecutionContext().submit("assert predicate", () -> EntityAsserts.assertPredicateEventuallyTrue(entity, 
+            (input) -> {
+                eventuallyEntered.countDown();
+                return testVal == input.getSequenceValue();
+            }));
         eventuallyEntered.await();
         entity.setSequenceValue(testVal);
         assertValue.get();
@@ -175,12 +149,7 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
     public void shouldFailAssertAttributeEqualsContinually() throws Throwable {
         final String myName = "myname";
         entity.sensors().set(TestEntity.NAME, myName);
-        Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertAttributeEqualsContinually(entity, TestEntity.NAME, myName);
-            }
-        });
+        Task<?> assertValue = entity.getExecutionContext().submit("check attr equals", () -> EntityAsserts.assertAttributeEqualsContinually(entity, TestEntity.NAME, myName));
         entity.sensors().set(TestEntity.NAME, "something");
         try {
             assertValue.get();
@@ -199,20 +168,10 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
         app.createAndManageChild(stooge);
         app.createAndManageChild(stooge);
 
-        Task<?> assertValue1 = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertGroupSizeEqualsEventually(ImmutableMap.of("timeout", "2s"), stooges, 3);
-            }
-        });
+        Task<?> assertValue1 = entity.getExecutionContext().submit("assert size", () -> EntityAsserts.assertGroupSizeEqualsEventually(ImmutableMap.of("timeout", "2s"), stooges, 3));
         stooges.setEntityFilter(EntityPredicates.configEqualTo(TestEntity.CONF_NAME, STOOGE));
         assertValue1.get();
-        Task<?> assertValue2 = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertGroupSizeEqualsEventually(stooges, 0);
-            }
-        });
+        Task<?> assertValue2 = entity.getExecutionContext().submit("assert size 0", () -> EntityAsserts.assertGroupSizeEqualsEventually(stooges, 0));
         stooges.setEntityFilter(EntityPredicates.configEqualTo(TestEntity.CONF_NAME, "Marx Brother"));
         assertValue2.get();
     }
@@ -220,24 +179,11 @@ public class EntityAssertsTest extends BrooklynAppUnitTestSupport {
     @Test
     public void shouldAssertAttributeChangesEventually () throws Exception{
         entity.sensors().set(TestEntity.NAME, "before");
-        final Task<?> assertValue = entity.getExecutionContext().submit(new Runnable() {
-            @Override
-            public void run() {
-                EntityAsserts.assertAttributeChangesEventually(entity, TestEntity.NAME);
-            }
-        });
+        final Task<?> assertValue = entity.getExecutionContext().submit("check attr change", () -> EntityAsserts.assertAttributeChangesEventually(entity, TestEntity.NAME));
         Repeater.create()
-            .repeat(new Runnable() {
-                @Override
-                public void run() {
-                    entity.sensors().set(TestEntity.NAME, "after" + System.currentTimeMillis());
-                }
-            }).until(new Callable<Boolean>() {
-                @Override
-                public Boolean call() throws Exception {
-                    return assertValue.isDone();
-                }
-            }).every(Duration.millis(10))
+            .repeat(() -> entity.sensors().set(TestEntity.NAME, "after" + System.currentTimeMillis()))
+            .until(() -> assertValue.isDone())
+            .every(Duration.millis(10))
             .run();
         assertValue.get();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
index 59ea8f2..88082ff 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
@@ -611,7 +611,7 @@ public class XmlMementoSerializerTest {
     public void testTask() throws Exception {
         final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         mgmt = app.getManagementContext();
-        Task<String> completedTask = app.getExecutionContext().submit(Callables.returning("myval"));
+        Task<String> completedTask = app.getExecutionContext().submit("return myval", Callables.returning("myval"));
         completedTask.get();
         
         String loggerName = UnwantedStateLoggingMapper.class.getName();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/TaskPerformanceTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/TaskPerformanceTest.java b/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/TaskPerformanceTest.java
index a7a531b..949f139 100644
--- a/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/TaskPerformanceTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/TaskPerformanceTest.java
@@ -74,11 +74,7 @@ public class TaskPerformanceTest extends AbstractPerformanceTest {
                 .summary("TaskPerformanceTest.testExecuteSimplestRunnable")
                 .iterations(numIterations)
                 .minAcceptablePerSecond(minRatePerSec)
-                .job(new Runnable() {
-                    @Override
-                    public void run() {
-                        executionManager.submit(work);
-                    }})
+                .job(() -> executionManager.submit("inner", work))
                 .completionLatch(completionLatch));
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationIntegrationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationIntegrationTest.java b/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationIntegrationTest.java
index 9ff39c1..e648c32 100644
--- a/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationIntegrationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationIntegrationTest.java
@@ -123,11 +123,7 @@ public class SshMachineLocationIntegrationTest extends SshMachineLocationTest {
         BasicExecutionManager execManager = new BasicExecutionManager("mycontextid");
         BasicExecutionContext execContext = new BasicExecutionContext(execManager);
         try {
-            MachineDetails details = execContext.submit(new Callable<MachineDetails>() {
-                @Override
-                public MachineDetails call() {
-                    return host.getMachineDetails();
-                }}).get();
+            MachineDetails details = execContext.submit("get details", () -> host.getMachineDetails()).get();
             LOG.info("machineDetails="+details);
             assertNotNull(details);
         } finally {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationTest.java b/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationTest.java
index 5c6e918..d25991c 100644
--- a/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/location/ssh/SshMachineLocationTest.java
@@ -131,11 +131,7 @@ public class SshMachineLocationTest extends BrooklynAppUnitTestSupport {
         BasicExecutionManager execManager = new BasicExecutionManager("mycontextid");
         BasicExecutionContext execContext = new BasicExecutionContext(execManager);
         try {
-            MachineDetails details = execContext.submit(new Callable<MachineDetails>() {
-                @Override
-                public MachineDetails call() {
-                    return host.getMachineDetails();
-                }}).get();
+            MachineDetails details = execContext.submit("get details", () -> host.getMachineDetails()).get();
             LOG.info("machineDetails="+details);
             assertNotNull(details);
             
@@ -166,11 +162,7 @@ public class SshMachineLocationTest extends BrooklynAppUnitTestSupport {
         BasicExecutionManager execManager = new BasicExecutionManager("mycontextid");
         BasicExecutionContext execContext = new BasicExecutionContext(execManager);
         try {
-            MachineDetails details = execContext.submit(new Callable<MachineDetails>() {
-                @Override
-                public MachineDetails call() {
-                    return host.getMachineDetails();
-                }}).get();
+            MachineDetails details = execContext.submit("get details", () -> host.getMachineDetails()).get();
             LOG.info("machineDetails="+details);
             assertNotNull(details);
             

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/util/core/task/TaskPredicatesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/task/TaskPredicatesTest.java b/core/src/test/java/org/apache/brooklyn/util/core/task/TaskPredicatesTest.java
index 90d6b06..2656c80 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/task/TaskPredicatesTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/task/TaskPredicatesTest.java
@@ -82,14 +82,13 @@ public class TaskPredicatesTest extends BrooklynAppUnitTestSupport {
     @Test
     public void testIsDone() throws Exception {
         CountDownLatch latch = new CountDownLatch(1);
-        Task<?> task = app.getExecutionContext().submit(new Runnable() {
-            public void run() {
+        Task<?> task = app.getExecutionContext().submit("await latch", () -> {
                 try {
                     latch.await();
                 } catch (InterruptedException e) {
                     throw Exceptions.propagate(e);
                 }
-            }});
+            });
         
         assertFalse(TaskPredicates.isDone().apply(task));
         

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java b/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
index 1f5c754..455f8ad 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/task/ValueResolverTest.java
@@ -24,6 +24,7 @@ import static org.testng.Assert.fail;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -87,19 +88,17 @@ public class ValueResolverTest extends BrooklynAppUnitTestSupport {
         
         Assert.assertTrue(result.isAbsent(), "result="+result);
         Exception exception = Maybe.getException(result);
-        Assert.assertTrue(exception.toString().contains("no execution context available"), "exception="+exception);
+        Asserts.assertStringContains(exception.toString(), "no execution context available");
+        
+        Asserts.assertThat(t, (tt) -> !tt.isBegun());
     }
 
     public void testUnsubmittedTaskWithExecutionContextExecutesAndReturns() {
         final Task<String> t = newSleepTask(Duration.ZERO, "foo");
         
         // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task.
-        Maybe<String>  result = app.getExecutionContext()
-                .submit(new Callable<Maybe<String> >() {
-                    @Override
-                    public Maybe<String>  call() throws Exception {
-                        return Tasks.resolving(t).as(String.class).timeout(Asserts.DEFAULT_LONG_TIMEOUT).getMaybe();
-                    }})
+        Maybe<String> result = app.getExecutionContext()
+                .submit("resolving sleep task", () -> Tasks.resolving(t).as(String.class).timeout(Asserts.DEFAULT_LONG_TIMEOUT).getMaybe())
                 .getUnchecked();
         
         Assert.assertEquals(result.get(), "foo");
@@ -110,17 +109,83 @@ public class ValueResolverTest extends BrooklynAppUnitTestSupport {
         
         // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task.
         // However, it will quickly timeout as the task will not have completed.
-        Maybe<String>  result = app.getExecutionContext()
-                .submit(new Callable<Maybe<String> >() {
-                    @Override
-                    public Maybe<String>  call() throws Exception {
-                        return Tasks.resolving(t).as(String.class).timeout(Duration.ZERO).getMaybe();
-                    }})
+        Maybe<String> result = app.getExecutionContext()
+                .submit("resolving sleep task", () -> Tasks.resolving(t).as(String.class).timeout(Duration.ZERO).getMaybe())
                 .getUnchecked();
         
         Assert.assertTrue(result.isAbsent(), "result="+result);
         Exception exception = Maybe.getException(result);
         Assert.assertTrue(exception.toString().contains("not completed when immediate completion requested"), "exception="+exception);
+        
+        Asserts.eventually(() -> t, (tt) -> tt.isBegun(), Duration.TEN_SECONDS);
+        Asserts.assertThat(t, (tt) -> !tt.isDone());
+    }
+    
+    public void testUnsubmittedTaskWithExecutionContextExecutesAndReturnsForeground() {
+        final Task<String> t = newSleepTask(Duration.ZERO, "foo");
+        
+        // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task.
+        Maybe<String> result = app.getExecutionContext()
+                .get(new BasicTask<>( () -> Tasks.resolving(t).as(String.class).timeout(Asserts.DEFAULT_LONG_TIMEOUT).getMaybe() ));
+        
+        Assert.assertEquals(result.get(), "foo");
+    }
+
+    public void testUnsubmittedTaskWithExecutionContextExecutesAndTimesOutForeground() {
+        final Task<String> t = newSleepTask(Duration.ONE_MINUTE, "foo");
+        
+        // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task.
+        // However, it will quickly timeout as the task will not have completed.
+        Maybe<String> result = app.getExecutionContext()
+            .get(new BasicTask<>( () -> Tasks.resolving(t).as(String.class).timeout(Duration.ZERO).getMaybe() ));
+        
+        Assert.assertTrue(result.isAbsent(), "result="+result);
+        Exception exception = Maybe.getException(result);
+        Assert.assertTrue(exception.toString().contains("not completed when immediate completion requested"), "exception="+exception);
+        
+        Asserts.eventually(() -> t, (tt) -> tt.isBegun(), Duration.TEN_SECONDS);
+        Asserts.assertThat(t, (tt) -> !tt.isDone());
+    }
+
+    public void testUnsubmittedTaskWithExecutionContextTimesOutWhenImmediate() {
+        final Task<String> t = newSleepTask(Duration.ZERO, "foo");
+        
+        // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task
+        Maybe<Maybe<String>> result = app.getExecutionContext()
+                .getImmediately(new BasicTask<>( () -> Tasks.resolving(t).as(String.class).timeout(Asserts.DEFAULT_LONG_TIMEOUT).getMaybe() ));
+        
+        // However, the resubmission will not be waited upon
+        Assert.assertTrue(result.isPresent(), "result="+result);
+        Assert.assertTrue(result.get().isAbsent(), "result="+result);
+        Exception exception = Maybe.getException(result.get());
+        
+        Asserts.assertStringContainsIgnoreCase(exception.toString(), "immediate", "not", "available");
+
+        // But the underlying task is running
+        Asserts.eventually(() -> t, (tt) -> tt.isBegun(), Duration.TEN_SECONDS);
+        Asserts.eventually(() -> t, (tt) -> tt.isDone(), Duration.TEN_SECONDS);
+        Asserts.assertThat(t, (tt) -> Objects.equals(tt.getUnchecked(), "foo"));
+        
+        // And subsequent get _is_ immediate
+        result = app.getExecutionContext()
+            .getImmediately(new BasicTask<>( () -> Tasks.resolving(t).as(String.class).timeout(Asserts.DEFAULT_LONG_TIMEOUT).getMaybe() ));
+        Assert.assertEquals(result.get().get(), "foo");
+    }
+
+    public void testUnsubmittedTaskWithExecutionContextExecutesAndTimesOutImmediate() {
+        final Task<String> t = newSleepTask(Duration.ONE_MINUTE, "foo");
+        
+        // Below, we call ValueResolver.getMaybe() in app's execution context. Therefore it will execute the task.
+        // However, it will quickly timeout as the task will not have completed.
+        Maybe<Maybe<String>> result = app.getExecutionContext()
+            .getImmediately(new BasicTask<>( () -> Tasks.resolving(t).as(String.class).timeout(Duration.ZERO).getMaybe() ));
+        
+        Assert.assertTrue(result.isPresent(), "result="+result);
+        Assert.assertTrue(result.get().isAbsent(), "result="+result);
+        Exception exception = Maybe.getException(result.get());
+        Asserts.assertStringContainsIgnoreCase(exception.toString(), "immediate", "not", "available");
+        Asserts.eventually(() -> t, (tt) -> tt.isBegun(), Duration.TEN_SECONDS);
+        Asserts.assertThat(t, (tt) -> !tt.isDone());
     }
 
     public void testSwallowError() {
@@ -161,7 +226,7 @@ public class ValueResolverTest extends BrooklynAppUnitTestSupport {
     
     public void testGetImmediatelyInTask() throws Exception {
         final MyImmediateAndDeferredSupplier supplier = new MyImmediateAndDeferredSupplier();
-        Task<CallInfo> task = app.getExecutionContext().submit(new Callable<CallInfo>() {
+        Task<CallInfo> task = app.getExecutionContext().submit("test task for call stack", new Callable<CallInfo>() {
             @Override
             public CallInfo call() {
                 return myUniquelyNamedMethod();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceReplacer.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceReplacer.java b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceReplacer.java
index e14433d..c799336 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceReplacer.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceReplacer.java
@@ -129,7 +129,7 @@ public class ServiceReplacer extends AbstractPolicy {
                     if (isRunning()) {
                         highlightViolation("Failure detected");
                         LOG.warn("ServiceReplacer notified; dispatching job for "+entity+" ("+event.getValue()+")");
-                        getExecutionContext().submit(() -> onDetectedFailure(event));
+                        getExecutionContext().submit("Analyzing detected failure", () -> onDetectedFailure(event));
                     } else {
                         LOG.warn("ServiceReplacer not running, so not acting on failure detected at "+entity+" ("+event.getValue()+", child of "+entity+")");
                     }
@@ -171,9 +171,9 @@ public class ServiceReplacer extends AbstractPolicy {
             return;
         }
         
-        highlightViolation(violationText+", triggering restart");
+        highlightViolation(violationText+", triggering replacement");
         LOG.warn("ServiceReplacer acting on failure detected at "+failedEntity+" ("+reason+", child of "+entity+")");
-        Task<?> t = getExecutionContext().submit(() -> {
+        Task<?> t = getExecutionContext().submit("Replace member on failure", () -> {
                 try {
                     Entities.invokeEffectorWithArgs(entity, entity, MemberReplaceable.REPLACE_MEMBER, failedEntity.getId()).get();
                     consecutiveReplacementFailureTimes.clear();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceRestarter.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceRestarter.java b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceRestarter.java
index a31e3c0..3c0341e 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceRestarter.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceRestarter.java
@@ -29,14 +29,12 @@ import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
 import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
-import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.time.Duration;
@@ -112,7 +110,7 @@ public class ServiceRestarter extends AbstractPolicy {
                     
                     if (isRunning()) {
                         LOG.info("ServiceRestarter notified; dispatching job for "+entity+" ("+event.getValue()+")");
-                        getExecutionContext().submit(() -> onDetectedFailure(event));
+                        getExecutionContext().submit("Analyzing detected failure", () -> onDetectedFailure(event));
                     } else {
                         LOG.warn("ServiceRestarter not running, so not acting on failure detected at "+entity+" ("+event.getValue()+")");
                     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
index 391f2bb..e5fc5b2 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
@@ -325,7 +325,7 @@ public class SensorResourceTest extends BrooklynRestResourceTest {
     
     @Test
     public void testGetSensorValueOfTypeCompletedTask() throws Exception {
-        Task<String> task = entity.getExecutionContext().submit(Callables.returning("myval"));
+        Task<String> task = entity.getExecutionContext().submit("returning myval", Callables.returning("myval"));
         task.get();
         entity.sensors().set(Sensors.newSensor(Task.class, "myTask"), task);
         doGetSensorTest("myTask", String.class, "\"myval\"");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79cc9bcc/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
index 54c81d1..d6e3fce 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
@@ -50,32 +50,32 @@ import org.apache.brooklyn.entity.brooklynnode.EntityHttpClient.ResponseCodePred
 import org.apache.brooklyn.entity.brooklynnode.effector.BrooklynNodeUpgradeEffectorBody;
 import org.apache.brooklyn.entity.brooklynnode.effector.SetHighAvailabilityModeEffectorBody;
 import org.apache.brooklyn.entity.brooklynnode.effector.SetHighAvailabilityPriorityEffectorBody;
-import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess.StopSoftwareParameters.StopMode;
+import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl;
 import org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks;
 import org.apache.brooklyn.feed.http.HttpFeed;
 import org.apache.brooklyn.feed.http.HttpPollConfig;
 import org.apache.brooklyn.feed.http.HttpValueFunctions;
 import org.apache.brooklyn.feed.http.JsonFunctions;
-import org.apache.http.HttpStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.util.collections.Jsonya;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.http.HttpToolResponse;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
 import org.apache.brooklyn.util.core.task.TaskTags;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException;
 import org.apache.brooklyn.util.guava.Functionals;
+import org.apache.brooklyn.util.http.HttpToolResponse;
 import org.apache.brooklyn.util.javalang.Enums;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Functions;
@@ -222,7 +222,7 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
             // we could wait for BrooklynTaskTags.getTasksInEntityContext(ExecutionManager, this).isEmpty();
             Task<?> stopEffectorTask = BrooklynTaskTags.getClosestEffectorTask(Tasks.current(), Startable.STOP);
             Task<?> topEntityTask = getTopEntityTask(stopEffectorTask);
-            getManagementContext().getExecutionManager().submit(new UnmanageTask(topEntityTask, this));
+            getManagementContext().getExecutionManager().submit("Unmanage Brooklyn entity after stop", new UnmanageTask(topEntityTask, this));
         }
     }