[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