[jboss-cvs] JBossAS SVN: r100970 - in projects/kernel/trunk: dependency/src/main/java/org/jboss/dependency/spi and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Feb 15 10:14:11 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-02-15 10:14:10 -0500 (Mon, 15 Feb 2010)
New Revision: 100970

Modified:
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerStateModel.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ListControllerStateModel.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/MapControllerStateModel.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerState.java
   projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/benchmark/SimpleBenchmarkWrongOrder.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java
Log:
[JBKERNEL-99] Avoid hash lookups in MapControllerStateModel

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -122,6 +122,7 @@
    /** The context tracker */
    private final AbstractContextRegistry registry;
 
+   protected final ControllerState indexedInstalledState;
    /**
     * Create an abstract controller
     */
@@ -135,6 +136,8 @@
       addState(ControllerState.CREATE, null);
       addState(ControllerState.START, null);
       addState(ControllerState.INSTALLED, null);
+      
+      indexedInstalledState = indexState(ControllerState.INSTALLED);
 
       registry = createContextRegistry();
    }
@@ -577,7 +580,7 @@
 
    public ControllerContext getInstalledContext(Object name)
    {
-      return getContext(name, ControllerState.INSTALLED);
+      return getContext(name, indexedInstalledState);
    }
 
    public Set<ControllerContext> getNotInstalled()
@@ -588,7 +591,7 @@
          Set<ControllerContext> result = new HashSet<ControllerContext>(errorContexts.values());
          for (ControllerState state : stateModel)
          {
-            if (ControllerState.INSTALLED.equals(state))
+            if (indexedInstalledState.equals(state))
                break;
             
             Set<ControllerContext> stateContexts = getContextsByState(state);
@@ -606,6 +609,11 @@
    {
       return stateModel;
    }
+   
+   public ControllerState indexState(ControllerState state)
+   {
+      return stateModel.indexState(state);
+   }
 
    public Set<ControllerContext> getContextsByState(ControllerState state)
    {
@@ -636,7 +644,7 @@
       if (state == null)
          throw new IllegalArgumentException("Null state");
 
-      change(context, state, trace);
+      change(context, indexState(state), trace);
    }
 
    public void enableOnDemand(ControllerContext context) throws Throwable
@@ -690,7 +698,7 @@
     */
    protected Map<ControllerState, ControllerContextAction> createAliasActions()
    {
-      return Collections.<ControllerState, ControllerContextAction>singletonMap(ControllerState.INSTALLED, new AliasControllerContextAction());
+      return Collections.<ControllerState, ControllerContextAction>singletonMap(indexedInstalledState, new AliasControllerContextAction());
    }
 
    /**
@@ -832,7 +840,7 @@
 
          // set the required state
          ControllerMode mode = context.getMode();
-         context.setRequiredState(mode.getRequiredState());
+         context.setRequiredState(indexState(mode.getRequiredState()));
 
          if (trace)
             log.trace("Installing " + context.toShortString());
@@ -954,7 +962,7 @@
          controller = context.getController();
          
          // Already done
-         if (ControllerState.INSTALLED.equals(context.getRequiredState()))
+         if (indexedInstalledState.equals(context.getRequiredState()))
             return;
 
          if (controller == this)
@@ -965,7 +973,7 @@
             // Sanity check
             getRegisteredControllerContext(context.getName(), true);
    
-            context.setRequiredState(ControllerState.INSTALLED);
+            context.setRequiredState(indexedInstalledState);
    
             if (trace)
                log.trace("Enable onDemand: " + context.toShortString());

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerStateModel.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerStateModel.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerStateModel.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -41,4 +41,12 @@
     * @throws IllegalArgumentException if the before state did not exist
     */
    public abstract boolean addState(ControllerState state, ControllerState before);
+   
+   /**
+    * Do any special work needed for the state model to index the state as an optimization
+    * 
+    * @param state The state to index
+    * @return the indexed state
+    */
+   public abstract ControllerState indexState(ControllerState state);
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -23,7 +23,6 @@
 
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.dependency.spi.DependencyItem;
@@ -44,17 +43,20 @@
    protected static final Logger log = Logger.getLogger(AbstractDependencyItem.class);
    
    /** What I depend on */
-   private Object iDependOn;
+   private volatile Object iDependOn;
 
    /** My name */
-   private Object name;
+   private volatile Object name;
 
    /** When the dependency is required */
-   private ControllerState whenRequired = ControllerState.DESCRIBED;
+   private volatile ControllerState whenRequired = ControllerState.DESCRIBED;
 
    /** The state of the dependency */
-   private ControllerState dependentState;
+   private volatile ControllerState dependentState;
    
+   /** Whether we optimized the states or not */
+   private volatile boolean indexedStates; 
+   
    /** Whether we are resolved */
    private boolean resolved;
 
@@ -108,6 +110,7 @@
       
    public boolean resolve(Controller controller)
    {
+      indexStates(controller, ControllerState.DESCRIBED, ControllerState.INSTALLED);
       boolean previous = resolved;
       ControllerState state = dependentState == null ? ControllerState.INSTALLED : dependentState;
       ControllerContext context = controller.getContext(iDependOn, state, true);
@@ -228,4 +231,31 @@
    {
       builder.append("Depends on '").append(getIDependOn()).append("'");
    }
+   
+   /**
+    * Indexes the states for optimized lookups
+    * 
+    * @param controller the controller. If it is an instance of AbstractController the states will be indexed
+    */
+   protected void indexStates(Controller controller, ControllerState defaultWhenRequired, ControllerState defaultDependent)
+   {
+      if (!indexedStates)
+      {
+         if (controller instanceof AbstractController == false)
+         {
+            log.warn("controller was not an AbstractController when indexing the states");
+         }
+         else
+         {
+            ControllerState req = whenRequired;
+            if (req == null)
+               req = defaultWhenRequired;
+            ControllerState dep = dependentState;
+            if (dep == null)
+               dep = defaultDependent;
+            whenRequired = ((AbstractController)controller).indexState(req);
+            dependentState = ((AbstractController)controller).indexState(dep);
+         }
+      }
+   }
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ListControllerStateModel.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ListControllerStateModel.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ListControllerStateModel.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -147,4 +147,10 @@
          throw new IllegalStateException("No intial state");
       return states.get(0);
    }
+
+   @Override
+   public ControllerState indexState(ControllerState state)
+   {
+      return state;
+   }
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/MapControllerStateModel.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/MapControllerStateModel.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/MapControllerStateModel.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -82,7 +82,7 @@
 
       //Add the state so that calls to isValid() can return successfully
       states.put(state, newState);
-      stateList.add(index, state);
+      stateList.add(index, newState);
       if (previous == null)
          first = newState;
       if (next == null)
@@ -111,6 +111,12 @@
          previous.setAfter(newState);
       return true;
    }
+   
+   @Override
+   public ControllerState indexState(ControllerState state)
+   {
+      return getState(state);
+   }
 
    protected ControllerStateWrapper getState(ControllerState state)
    {
@@ -121,6 +127,8 @@
    {
       if (state == null)
          throw new IllegalArgumentException("Null state");
+      if (state instanceof ControllerStateWrapper)
+         return (ControllerStateWrapper)state;
 
       ControllerStateWrapper found = states.get(state);
       if (found == null && !allowNotFound)
@@ -143,13 +151,13 @@
    public ControllerState getPreviousState(ControllerState state)
    {
       ControllerStateWrapper previous = getState(state).getBefore();
-      return previous == null ? null : previous.getState();
+      return previous;
    }
 
    public ControllerState getNextState(ControllerState state)
    {
       ControllerStateWrapper next = getState(state).getAfter();
-      return next == null ? null : next.getState();
+      return next;
    }
 
    public boolean isBeforeState(ControllerState state, ControllerState reference)
@@ -186,11 +194,13 @@
       ControllerStateWrapper result = first;
       if (result == null)
          throw new IllegalStateException("No initial state");
-      return result.getState();
+      return result;
    }
    
-   private static class ControllerStateWrapper
+   private static class ControllerStateWrapper extends ControllerState
    {
+      private static final long serialVersionUID = 1L;
+      
       final ControllerState state;
       volatile int index;
       volatile ControllerStateWrapper before;
@@ -198,6 +208,7 @@
       
       ControllerStateWrapper(ControllerState state)
       {
+         super(state.getStateString(), false);
          this.state = state;
       }
       
@@ -244,24 +255,6 @@
       {
          this.after = after;
       }
-
-      ControllerState getState()
-      {
-         return state;
-      }
-
-      @Override
-      public String toString()
-      {
-         return "ControllerStateWrapper:state=" + state + "; index=" + index + "; before=" + itemAsString(before) + "; after=" + itemAsString(after);
-      }
-      
-      String itemAsString(ControllerStateWrapper item)
-      {
-         if (item == null)
-            return "null";
-         return item.getState().toString();
-      }
    }
 }
 

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerState.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerState.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerState.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -106,7 +106,7 @@
     * @param stateString the string representation
     * @param warning do we log a warning
     */
-   private ControllerState(String stateString, boolean warning)
+   protected ControllerState(String stateString, boolean warning)
    {
       if (stateString == null)
          throw new IllegalArgumentException("Null state string");

Modified: projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/benchmark/SimpleBenchmarkWrongOrder.java
===================================================================
--- projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/benchmark/SimpleBenchmarkWrongOrder.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/dependency/src/test/java/org/jboss/test/dependency/controller/benchmark/SimpleBenchmarkWrongOrder.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -40,7 +40,7 @@
    public SimpleBenchmarkWrongOrder(String name)
    {
       super(name);
-      iterations = 2000;
+      iterations = 500;
    }
 
    protected List<ControllerContext> setupContexts()

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -253,6 +253,7 @@
 
       public boolean resolve(Controller controller)
       {
+         indexStates(controller, ControllerState.DESCRIBED, ControllerState.INSTALLED);
          Object name = getDemandObject();
 
          ControllerContext context;

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -160,7 +160,7 @@
          return qm.search(this);
       }
 
-      if (state == null || ControllerState.INSTALLED.equals(state) || getStates().isAfterState(state, ControllerState.INSTALLED))
+      if (state == null || indexedInstalledState.equals(state) || getStates().isAfterState(state, indexedInstalledState))
       {
          org.jboss.kernel.spi.registry.KernelRegistry registry = kernel.getRegistry();
          try

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java	2010-02-15 14:54:11 UTC (rev 100969)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java	2010-02-15 15:14:10 UTC (rev 100970)
@@ -64,6 +64,7 @@
 
    public boolean resolve(Controller controller)
    {
+      indexStates(controller, null, null);
       Set<ControllerContext> contexts = getContexts(controller);
       int size = contexts != null ? contexts.size() : 0;
       if (cardinality.isInRange(size))




More information about the jboss-cvs-commits mailing list