[jbosscache-dev] Cache bean deployment via MC failing when TRACE enabled on org.jboss.kernel

Galder Zamarreno galder.zamarreno at redhat.com
Tue Mar 3 16:25:09 EST 2009



Galder Zamarreno wrote:
> Hi,
> 
> Bear with me on this one, it's a bit long :)
> 
> I've been running some tests creating Cache instances via MC and I've 
> noticed that when TRACE logging is enabled on org.jboss.kernel, my Cache 
> beans are not deployed whereas when org.jboss.kernel is set to DEBUG or 
> higher, Cache beans deploy fine.
> 
> The error I'm getting is the following:
> 
> 2009-03-03 21:40:51,505 ERROR [AbstractKernelController] (main) Error 
> installing to Instantiated: name=CacheClusterA1 state=Described
> java.lang.UnsupportedOperationException: Not supported in UnversionedNode
>     at 
> org.jboss.cache.AbstractNode.getChildrenDirect(AbstractNode.java:277)
>     at 
> org.jboss.cache.mvcc.NodeReference.getChildrenDirect(NodeReference.java:272) 
> 
>     at 
> org.jboss.cache.invocation.NodeInvocationDelegate.getChildrenDirect(NodeInvocationDelegate.java:163) 
> 
>     at 
> org.jboss.cache.DataContainerImpl.numNodes(DataContainerImpl.java:461)
>     at 
> org.jboss.cache.DataContainerImpl.getNumberOfNodes(DataContainerImpl.java:438) 
> 
>     at 
> org.jboss.cache.DataContainerImpl.toString(DataContainerImpl.java:394)
>     at 
> org.jboss.cache.DataContainerImpl.toString(DataContainerImpl.java:372)
>     at 
> org.jboss.cache.invocation.CacheInvocationDelegate.toString(CacheInvocationDelegate.java:144) 
> 
>     at java.lang.String.valueOf(String.java:2615)
>     at 
> org.jboss.util.JBossStringBuilder.append(JBossStringBuilder.java:114)
>     at 
> org.jboss.dependency.plugins.AbstractControllerContext.toString(AbstractControllerContext.java:362) 
> 
> 
> Looks like in TRACE mode, MC is trying to print the Cache when this is 
> not fully started.
> 
> To try to understand this, let's look at what DataContainerImpl logs 
> when org.jboss.kernel is set to DEBUG:
> 
> log4j-jboss-kerneldebug.log:2894:2009-03-03 21:40:24,249 2198  TRACE 
> [org.jboss.cache.DataContainerImpl] (main:) Starting data container. 
> Using MVCC? false
> log4j-jboss-kerneldebug.log:2895:2009-03-03 21:40:24,274 2223  TRACE 
> [org.jboss.cache.DataContainerImpl] (main:) Setting root node to an 
> instance of class org.jboss.cache.mvcc.NodeReference
> ...
> log4j-jboss-kerneldebug.log:3038:2009-03-03 21:40:24,336 2285  TRACE 
> [org.jboss.cache.DataContainerImpl] (main:) Starting data container. 
> Using MVCC? true
> log4j-jboss-kerneldebug.log:3039:2009-03-03 21:40:24,338 2287  DEBUG 
> [org.jboss.cache.DataContainerImpl] (main:) Setting rootInternal to 
> NodeReference{delegate=UnversionedNode[ /]}
> 
> After MVCC has been set to true, DataContainerImpl.getNumberOfNodes() is 
> able to get the number of nodes successfully:
> 
>       if (!usingMvcc) return numNodes(root) - 1;
>       return numNodesMvcc(rootInternal) - 1;
> 
> However, if in between the two "Starting data container" messages, 
> someone (i.e. MC), tries to get the number of nodes (via toString), then 
> Cache tries to get number of nodes of a MVCC node as a non MVCC node 
> failing with the exception above. This is exactly what happens when you 
> enable TRACE on MC kernel.
> 
> numNodesMvcc() calls getChildren(). numNodes calls getChildrenDirect().
> 
> With this TRACE enabled, log only show the first two lines:
> 
> log4j-jboss-kerneltrace.log:6731:2009-03-03 21:40:51,468 2817  TRACE 
> [org.jboss.cache.DataContainerImpl] (main:) Starting data container. 
> Using MVCC? false
> log4j-jboss-kerneltrace.log:6732:2009-03-03 21:40:51,475 2824  TRACE 
> [org.jboss.cache.DataContainerImpl] (main:) Setting root node to an 
> instance of class org.jboss.cache.mvcc.NodeReference
> 
> So, how do we solve this?
> 
> I'm not sure I understand why DataContainerImpl.createRootNode() is 
> called twice. The very first call, which seems to come from 
> DataContainerImpl.injectDependencies() method (annotated with @Inject) 
> looks suspicious. Why does it look suspicious? Because calls like this 
> expect a config to be set. And when they're called initially from 
> @Inject, the config object is not still set (when the call comes as part 
> of the start operation, config is indeed set)
> 
> usingMvcc = config != null && config.getNodeLockingScheme() == 
> NodeLockingScheme.MVCC;
> 
> And this returning false, when in fact the config is set to MVCC is what 
> results of number of nodes being calculated incorrectly.
> 
> Not sure on how to fix this though.
> 
> Thoughts?

Actually, the fix might be as simple as putting:

config = configuration;

before

createRootNode();

in injectDependencies() method but I think it's worth discussing the 
necessity for the two calls to createRootNode().

> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> jbosscache-dev mailing list
> jbosscache-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jbosscache-dev

-- 
Galder Zamarreño
Sr. Software Maintenance Engineer
JBoss, a division of Red Hat



More information about the jbosscache-dev mailing list