[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