ConfX created CASSANDRA-21096:
---------------------------------

             Summary: TableMetricTest might cause NPE
                 Key: CASSANDRA-21096
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21096
             Project: Apache Cassandra
          Issue Type: Bug
          Components: Test/dtest/java
            Reporter: ConfX


The `MapMBeanWrapper.queryNames()` method in `TableMetricTest` returns `null` 
instead of an empty `Set`, violating the `MBeanWrapper` interface contract. 
This causes a `NullPointerException` when `GCInspector` is instantiated during 
nodetool operations.
{code:java}
@Override
public Set<ObjectName> queryNames(ObjectName name, QueryExp query)
{
    return null;
} 

{code}
With this, we might meet NPE if queryNames() is called, for example, if we 
restart a node and create a new GCInspector, then the GCInspector constructor 
queries MBeans.

 
{code:java}
// GCInspector.java:144-146
ObjectName gcName = new 
ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*");
   for (ObjectName name : MBeanWrapper.instance.queryNames(gcName, null))  // 
NPE HERE {code}
 
h2. StackTrace:

 
{code:java}
java.lang.NullPointerException: Cannot invoke "java.util.Set.iterator()" 
because the return value of 
"org.apache.cassandra.utils.MBeanWrapper.queryNames(javax.management.ObjectName,
 javax.management.QueryExp)" is null
    at org.apache.cassandra.service.GCInspector.<init>(GCInspector.java:145)
    at 
org.apache.cassandra.distributed.mock.nodetool.InternalNodeProbe.connect(InternalNodeProbe.java:79)
    at 
org.apache.cassandra.distributed.mock.nodetool.InternalNodeProbe.<init>(InternalNodeProbe.java:58)
    at 
org.apache.cassandra.distributed.impl.Instance$DTestNodeTool.<init>(Instance.java:1079)
    at 
org.apache.cassandra.distributed.impl.Instance.lambda$nodetoolResult$51(Instance.java:986)
 {code}
A better way would be:
 
Change `MapMBeanWrapper.queryNames()` to return an empty set instead of null:
{code:java}
@Override
public Set<ObjectName> queryNames(ObjectName name, QueryExp query)
{
    return Collections.emptySet();  // FIX: Return empty set, not null
} {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to