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(-)
----------------------------------------------------------------------