You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ge...@apache.org on 2016/11/24 12:40:24 UTC

[1/2] brooklyn-server git commit: Fix failing GC tasks test

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 8cb244236 -> 5897dab34


Fix failing GC tasks test

Background tasks get in the way, messing with the logic of what to evict next.


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

Branch: refs/heads/master
Commit: d488584ff44093aa5fddba82940268b4c8f40ef2
Parents: a569463
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Nov 23 23:00:10 2016 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Nov 23 23:00:10 2016 +0200

----------------------------------------------------------------------
 .../mgmt/internal/BrooklynGarbageCollector.java |  2 +
 .../internal/EntityExecutionManagerTest.java    | 91 ++++++++++++++++++--
 2 files changed, 84 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d488584f/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
index 0d10c5a..98dfd90 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
@@ -525,6 +525,8 @@ public class BrooklynGarbageCollector {
         if (taskTagsInCategoryOverCapacity.isEmpty())
             return 0;
         
+        // TODO Skip tasks that will be evicted anyway (transient, expired)
+        // https://issues.apache.org/jira/browse/BROOKLYN-401
         Collection<Task<?>> tasks = executionManager.allTasksLive();
         List<Task<?>> tasksToConsiderDeleting = MutableList.of();
         try {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d488584f/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
index 02845a2..db2522a 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
@@ -124,6 +125,20 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
             }});
     }
 
+    // Needed because of https://issues.apache.org/jira/browse/BROOKLYN-401
+    protected void assertTaskMaxCountForEntityEventually(final Entity entity, final int expectedMaxCount) {
+        // Dead task (and initialization task) should have been GC'd on completion.
+        // However, the GC'ing happens in a listener, executed in a different thread - the task.get()
+        // doesn't block for it. Therefore can't always guarantee it will be GC'ed by now.
+        Asserts.succeedsEventually(new Runnable() {
+            @Override public void run() {
+                forceGc();
+                Collection<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(((EntityInternal)entity).getManagementContext().getExecutionManager(), entity);
+                Assert.assertTrue(tasks.size() <= expectedMaxCount, 
+                        "Expected tasks count max of " + expectedMaxCount + ". Tasks were "+tasks);
+            }});
+    }
+
     @Test
     public void testGetTasksAndGcBoringTags() throws Exception {
         TestEntity e = app.createAndManageChild(EntitySpec.create(TestEntity.class));
@@ -143,26 +158,45 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(
             BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2);
 
+        AtomicBoolean stopCondition = new AtomicBoolean();
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        
         for (int count=0; count<5; count++)
             runEmptyTaskWithNameAndTags(e, "task"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag");
 
-        assertTaskCountForEntityEventually(e, 2);
+        // Makes sure there's a GC while the transient tasks are running
+        forceGc();
+
+        stopCondition.set(true);
+
+        assertTaskMaxCountForEntityEventually(e, 2);
     }
     
     @Test
     public void testGcTaskAtEntityLimit() throws Exception {
-        TestEntity e = app.createAndManageChild(EntitySpec.create(TestEntity.class));
+        final TestEntity e = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(
             BrooklynGarbageCollector.MAX_TASKS_PER_ENTITY, 2);
         
+        AtomicBoolean stopCondition = new AtomicBoolean();
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, app, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, app, "boring-tag");
+
         for (int count=0; count<5; count++)
             runEmptyTaskWithNameAndTags(e, "task-e-"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag");
         for (int count=0; count<5; count++)
             runEmptyTaskWithNameAndTags(app, "task-app-"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag");
-        
-        assertTaskCountForEntityEventually(app, 2);
-        assertTaskCountForEntityEventually(e, 2);
+
+        // Makes sure there's a GC while the transient tasks are running
+        forceGc();
+        stopCondition.set(true);
+
+        assertTaskMaxCountForEntityEventually(app, 2);
+        assertTaskMaxCountForEntityEventually(e, 2);
     }
     
     @Test
@@ -174,6 +208,12 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(
             BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2);
 
+        AtomicBoolean stopCondition = new AtomicBoolean();
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, e, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, app, "boring-tag");
+        scheduleRecursiveTemporaryTask(stopCondition, app, "boring-tag");
+
         int count=0;
         
         runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag");
@@ -196,13 +236,17 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
         runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag-app", "another-tag");
         runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag-app", "another-tag");
         
-        assertTaskCountForEntityEventually(e, 6);
-        assertTaskCountForEntityEventually(app, 3);
+        // Makes sure there's a GC while the transient tasks are running
+        forceGc();
+        stopCondition.set(true);
+
+        assertTaskMaxCountForEntityEventually(e, 6);
+        assertTaskMaxCountForEntityEventually(app, 3);
         
         // now with a lowered limit, we should remove one more e
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(
             BrooklynGarbageCollector.MAX_TASKS_PER_ENTITY, 5);
-        assertTaskCountForEntityEventually(e, 5);
+        assertTaskMaxCountForEntityEventually(e, 5);
     }
     
     @Test
@@ -212,15 +256,23 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(
             BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2);
 
+        AtomicBoolean stopCondition = new AtomicBoolean();
+        scheduleRecursiveTemporaryTask(stopCondition, e, "foo");
+        scheduleRecursiveTemporaryTask(stopCondition, e, "foo");
+
         for (int count=0; count<5; count++) {
             TaskBuilder<Object> tb = Tasks.builder().displayName("task-"+count).dynamic(true).body(new Runnable() { @Override public void run() {}})
                 .tag(ManagementContextInternal.NON_TRANSIENT_TASK_TAG).tag("foo");
             ((EntityInternal)e).getExecutionContext().submit(tb.build()).getUnchecked();
         }
 
+        // Makes sure there's a GC while the transient tasks are running
+        forceGc();
+        stopCondition.set(true);
+
         // might need an eventually here, if the internal job completion and GC is done in the background
         // (if there are no test failures for a few months, since Sept 2014, then we can remove this comment)
-        assertTaskCountForEntityEventually(e, 2);
+        assertTaskMaxCountForEntityEventually(e, 2);
     }
     
     @Test
@@ -439,4 +491,25 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
             return "BigObject["+sizeBytes+"/"+data.length+"]";
         }
     }
+
+    private Task<?> scheduleRecursiveTemporaryTask(final AtomicBoolean stopCondition, final Entity e, final Object... additionalTags) {
+        // TODO Could alternate the test with expiring tasks in addition to transient
+        TaskBuilder<Object> tb = Tasks.builder()
+                .displayName("recursive")
+                .dynamic(false)
+                .tag(ManagementContextInternal.TRANSIENT_TASK_TAG)
+                .body(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (!stopCondition.get()) {
+                            scheduleRecursiveTemporaryTask(stopCondition, e, additionalTags);
+                        }
+                    }
+                });
+        for (Object t : additionalTags) {
+            tb.tag(t);
+        }
+        return ((EntityInternal)e).getExecutionContext().submit(tb.build());
+    }
+    
 }


[2/2] brooklyn-server git commit: This closes #459

Posted by ge...@apache.org.
This closes #459


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

Branch: refs/heads/master
Commit: 5897dab34c9f914b775bea47fa714684dfcc5741
Parents: 8cb2442 d488584
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Thu Nov 24 12:35:38 2016 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Thu Nov 24 12:35:38 2016 +0000

----------------------------------------------------------------------
 .../mgmt/internal/BrooklynGarbageCollector.java |  2 +
 .../internal/EntityExecutionManagerTest.java    | 91 ++++++++++++++++++--
 2 files changed, 84 insertions(+), 9 deletions(-)
----------------------------------------------------------------------