[jboss-cvs] JBossAS SVN: r100714 - in projects/kernel/branches/resolver: dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing and 4 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Feb 8 13:28:27 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-02-08 13:28:27 -0500 (Mon, 08 Feb 2010)
New Revision: 100714
Added:
projects/kernel/branches/resolver/dependency/src/test/java/org/jboss/test/dependency/controller/test/Benchmark.java
Modified:
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java
projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanNonStandardContent.xml
projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierInjectNonStandardContent.xml
Log:
Don't use heavy recursion in indexing resolver when contexts leading to resolved dependencies are installed
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -2246,6 +2246,7 @@
{
stateChanged = true;
}
+ dependencyResolver.resolveWaitingContexts(trace);
}
}
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -143,6 +143,25 @@
}
}
+ protected Set<ControllerContext> getWaitingContextsChildControllers(Set<ControllerContext> result, boolean trace)
+ {
+ result = getWaitingContexts(result, trace);
+ // resolve child controllers
+ for (AbstractController controller : getChildControllers())
+ {
+ controller.lockWrite();
+ try
+ {
+ result = controller.getDependencyResolver().getWaitingContextsChildControllers(result, trace);
+ }
+ finally
+ {
+ controller.unlockWrite();
+ }
+ }
+ return result;
+ }
+
protected void resolveParentController(ControllerContext context, boolean trace)
{
AbstractController parent = controller.getParentController();
@@ -164,6 +183,16 @@
{
return controller.getRegisteredControllerContext(name, mustExist);
}
+
+ protected void lockWriteController(AbstractController targetController)
+ {
+ targetController.lockWrite();
+ }
+
+ protected void unlockWriteController(AbstractController targetController)
+ {
+ targetController.unlockWrite();
+ }
/**
* Called by the controller upon install to decorate the dependency info.
@@ -247,4 +276,10 @@
public abstract void enableOnDemand(ControllerContext context, boolean trace);
public abstract void registerControllerRegisteredAlias(Object alias, Object original);
+
+ public abstract void resolveWaitingContexts(boolean trace);
+
+ public abstract Set<ControllerContext> getWaitingContexts(Set<ControllerContext> result, boolean trace);
+
+ public abstract void resolveContext(ControllerContext context, boolean trace);
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -23,9 +23,12 @@
import java.util.HashSet;
import java.util.Map;
+import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import org.jboss.dependency.plugins.AbstractController;
import org.jboss.dependency.plugins.AbstractDependencyItem;
import org.jboss.dependency.plugins.AbstractDependencyResolver;
import org.jboss.dependency.spi.Controller;
@@ -37,7 +40,6 @@
import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
import org.jboss.logging.Logger;
import org.jboss.util.JBossStringBuilder;
-import org.jboss.util.collection.ConcurrentSet;
/**
* Optimized
@@ -46,12 +48,11 @@
*/
public class IndexingDependencyResolver extends AbstractDependencyResolver
{
- Logger log = Logger.getLogger(this.getClass());
- //Supply
- //Qualifiers (Need some tests doing qualifiers with the dependency last)
+ Logger log = Logger.getLogger(this.getClass());
+ private final Queue<ControllerContext> enabledOnDemandContexts = new ConcurrentLinkedQueue<ControllerContext>();
- private final ConcurrentSet<ControllerContext> enabledOnDemandContexts = new ConcurrentSet<ControllerContext>();
+ private final Queue<ControllerContext> contextsWithDependenciesResolved = new ConcurrentLinkedQueue<ControllerContext>();
private final Map<Class<? extends DependencyItem>, DependencyResolverMatcher> matchers = new ConcurrentHashMap<Class<? extends DependencyItem>, DependencyResolverMatcher>();
@@ -178,6 +179,45 @@
@Override
public void resolveContexts(ControllerContext context, boolean trace)
{
+ resolveContext(context, trace);
+
+ resolveWaitingContexts(trace);
+ }
+
+ private Set<ControllerContext> getEnabledOnDemandContexts(Set<ControllerContext> result, boolean trace)
+ {
+ return getQueuedContexts(result, enabledOnDemandContexts, trace);
+ }
+
+ public Set<ControllerContext> getWaitingContexts(Set<ControllerContext> result, boolean trace)
+ {
+ return getQueuedContexts(result, contextsWithDependenciesResolved, trace);
+ }
+
+ private Set<ControllerContext> getQueuedContexts(Set<ControllerContext> result, Queue<ControllerContext> queue, boolean trace)
+ {
+ while (true)
+ {
+ if (queue.isEmpty())
+ break;
+
+ ControllerContext context = queue.poll();
+ while (context != null)
+ {
+ //if (enabled != context)
+ //resolveContexts(context, trace);
+ if (result == null)
+ result = new HashSet<ControllerContext>();
+ if (!result.contains(context))
+ result.add(context);
+ context = queue.poll();
+ }
+ }
+ return result;
+ }
+
+ public void resolveContext(ControllerContext context, boolean trace)
+ {
ControllerState fromState = context.getState();
if (getStateModel().isValidState(fromState))
@@ -213,20 +253,8 @@
}
}
}
-
- while (true)
- {
- if (enabledOnDemandContexts.isEmpty())
- break;
- for (ControllerContext enabled : enabledOnDemandContexts)
- {
- enabledOnDemandContexts.remove(enabled);
- if (enabled != context)
- resolveContexts(enabled, trace);
- }
- }
}
-
+
@Override
public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
{
@@ -259,13 +287,13 @@
{
if (context.getDependencyInfo() != null)
{
- resolveContexts(context, trace);
+ contextsWithDependenciesResolved.add(context);
}
}
}
incrementStateChildControllers(incremented, trace);
}
-
+
@Override
public void enableOnDemand(ControllerContext context, boolean trace)
{
@@ -329,4 +357,42 @@
{
buffer.append("matchers:" + matchers.toString());
}
-}
+
+ @Override
+ public void resolveWaitingContexts(boolean trace)
+ {
+ while (true)
+ {
+ Set<ControllerContext> contexts = null;
+ contexts = getWaitingContextsChildControllers(contexts, trace);
+ contexts = getEnabledOnDemandContexts(contexts, trace);
+
+ if (contexts == null)
+ return;
+
+ if (contexts.size() == 0)
+ return;
+
+ for (ControllerContext context : contexts)
+ {
+ Controller controller = context.getController();
+ if (controller instanceof AbstractController == false)
+ throw new IllegalStateException(context + " does not have a controller of type AbstractController: " + controller);
+ AbstractController abstractController = (AbstractController)controller;
+ if (abstractController == controller)
+ {
+ lockWriteController(abstractController);
+ try
+ {
+
+ abstractController.getDependencyResolver().resolveContext(context, trace);
+ }
+ finally
+ {
+ unlockWriteController(abstractController);
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -25,6 +25,7 @@
import java.util.Iterator;
import java.util.Set;
+import org.jboss.dependency.plugins.AbstractController;
import org.jboss.dependency.plugins.AbstractDependencyResolver;
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
@@ -103,7 +104,7 @@
resolveParentController(context, trace);
}
}
-
+
protected boolean resolveContexts(ControllerState fromState, ControllerState toState, boolean trace)
{
boolean resolutions = false;
@@ -277,4 +278,21 @@
//Should not be decorated
return context.getDependencyInfo();
}
+
+ @Override
+ public void resolveWaitingContexts(boolean trace)
+ {
+ resolveContexts(null, trace);
+ }
+
+ @Override
+ public Set<ControllerContext> getWaitingContexts(Set<ControllerContext> result, boolean trace)
+ {
+ return null;
+ }
+
+ @Override
+ public void resolveContext(ControllerContext context, boolean trace)
+ {
+ }
}
Added: projects/kernel/branches/resolver/dependency/src/test/java/org/jboss/test/dependency/controller/test/Benchmark.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/test/java/org/jboss/test/dependency/controller/test/Benchmark.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/test/java/org/jboss/test/dependency/controller/test/Benchmark.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -0,0 +1,95 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.dependency.controller.test;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.test.dependency.controller.support.TestControllerContext;
+import org.jboss.test.dependency.controller.support.TestDelegate;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class Benchmark extends AbstractDependencyTest
+{
+ int iterations = 30000;
+
+ public Benchmark(String name)
+ {
+ // FIXME Benchmark constructor
+ super(name);
+ }
+
+ public void testBenchmark() throws Throwable
+ {
+// List<ControllerContext> contexts = correctDependencies();
+ List<ControllerContext> contexts = reverseDependencies();
+
+ long start = System.currentTimeMillis();
+ for (ControllerContext context : contexts)
+ {
+ install(context);
+// System.out.println(context.getName());
+ }
+ System.out.println("----------> " + (System.currentTimeMillis() - start));
+
+ for (ControllerContext context : contexts)
+ {
+ assertContext(context, ControllerState.INSTALLED);
+ }
+ }
+
+ private List<ControllerContext> correctDependencies()
+ {
+ List<ControllerContext> contexts = new ArrayList<ControllerContext>(iterations);
+ for (int i = 0 ; i < iterations ; i++)
+ {
+ TestDelegate delegate = new TestDelegate("Bean" + i);
+ if (i != 0)
+ delegate.addDependency(new AbstractDependencyItem("Bean" + i, "Bean" + (i-1), ControllerState.CONFIGURED, ControllerState.INSTALLED));
+ contexts.add(new TestControllerContext(delegate));
+ }
+ return contexts;
+ }
+
+ private List<ControllerContext> reverseDependencies()
+ {
+ List<ControllerContext> contexts = new ArrayList<ControllerContext>(iterations);
+ for (int i = 0 ; i < iterations ; i++)
+ {
+ TestDelegate delegate = new TestDelegate("Bean" + i);
+ if (i != iterations - 1)
+ delegate.addDependency(new AbstractDependencyItem("Bean" + i, "Bean" + (i+1), ControllerState.CONFIGURED, ControllerState.INSTALLED));
+ contexts.add(new TestControllerContext(delegate));
+ }
+ return contexts;
+ }
+
+
+}
Modified: projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java 2010-02-08 18:28:27 UTC (rev 100714)
@@ -336,7 +336,7 @@
return;
assertNotNull(enabled);
assertEquals(1, enabled.size());
- assertEquals("!@£123", enabled.iterator().next());
+ assertEquals("xyz123", enabled.iterator().next());
}
public void testInjectNonStandardContent() throws Exception
@@ -378,7 +378,7 @@
return;
assertNotNull(enabled);
assertEquals(1, enabled.size());
- assertEquals("abc!@£", enabled.iterator().next());
+ assertEquals("abcxyz", enabled.iterator().next());
}
protected RelatedClassMetaData getRelated(String name) throws Exception
Modified: projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanNonStandardContent.xml
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanNonStandardContent.xml 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanNonStandardContent.xml 2010-02-08 18:28:27 UTC (rev 100714)
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
- <qualifier content="Rubbish">!@£</qualifier>
+ <qualifier content="Rubbish">xyz</qualifier>
</bean>
Modified: projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierInjectNonStandardContent.xml
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierInjectNonStandardContent.xml 2010-02-08 18:22:55 UTC (rev 100713)
+++ projects/kernel/branches/resolver/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierInjectNonStandardContent.xml 2010-02-08 18:28:27 UTC (rev 100714)
@@ -4,7 +4,7 @@
<install>
<parameter>
<inject bean="Dummy">
- <qualifier content="Rubbish">!@£</qualifier>
+ <qualifier content="Rubbish">xyz</qualifier>
</inject>
</parameter>
</install>
More information about the jboss-cvs-commits
mailing list