You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Mihai Suteu (JIRA)" <ji...@apache.org> on 2014/06/10 10:55:02 UTC

[jira] [Commented] (CASSANDRA-6458) nodetool getendpoints doesn't validate key arity

    [ https://issues.apache.org/jira/browse/CASSANDRA-6458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14026250#comment-14026250 ] 

Mihai Suteu commented on CASSANDRA-6458:
----------------------------------------

Hello!
I started working on this issue, but would like to have some feedback on how to proceed. I am quite new to Cassandra and might be making some wrong assumptions about it's internals.
In order for NodeTool to check the arity, it has to get the number of columns in the partition key of a cf. As far as I understand it, I would have to get that from CFMetaData.
The problem is that NodeTool can only connect through NodeProbe, which has the proxies for the MBeans.
The closest I got was through the StorageServerProxy and ColumnFamilyStore proxy, but none of them specify a method in their interface to access a cfMetaData.

The options I see so far are to either add a method to ColumnFamilyStoreMBean or try to validate the key arity somewhere lower.

Or is there an easier way?

Thanks!


> nodetool getendpoints doesn't validate key arity 
> -------------------------------------------------
>
>                 Key: CASSANDRA-6458
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-6458
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Tools
>            Reporter: Daneel Yaitskov
>            Priority: Trivial
>              Labels: lhf
>
> I have a complex row key.
> $ create table b (x int, s text, ((x,s)) primary key);
> In cqlsh I cannot fill row key partially:
> {noformat}
> $ insert into b (x) values(4);
> Bad Request: Missing mandatory PRIMARY KEY part s
> {noformat}
> But nodetool can find hosts by incomplete key
> {noformat}
> $ nodetool -h cas3 getendpoints anti_portal b 12
> 192.168.4.4
> 192.168.4.5
> 192.168.4.6
> {noformat}
> No error is reported.
> I found that columns are separated by ":".
> And If I pass to many elements then the error happens.
> {noformat}
> $ nodetool -h cas3 getendpoints anit_portal b 12:dd:dd
> Exception in thread "main" org.apache.cassandra.serializers.MarshalException: unable to make int from '12:dd:dd'
>     at org.apache.cassandra.db.marshal.Int32Type.fromString(Int32Type.java:69)
>     at org.apache.cassandra.service.StorageService.getNaturalEndpoints(StorageService.java:2495)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:606)
>     at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
>     at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:606)
>     at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
>     at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
>     at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
>     at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
>     at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
>     at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252)
>     at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
>     at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
>     at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1487)
>     at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:97)
>     at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328)
>     at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420)
>     at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848)
>     at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:606)
>     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
>     at sun.rmi.transport.Transport$1.run(Transport.java:177)
>     at sun.rmi.transport.Transport$1.run(Transport.java:174)
>     at java.security.AccessController.doPrivileged(Native Method)
>     at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
>     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
>     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
>     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
>     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>     at java.lang.Thread.run(Thread.java:744)
> Caused by: java.lang.NumberFormatException: For input string: "12:dd:dd"
>     at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
>     at java.lang.Integer.parseInt(Integer.java:492)
>     at java.lang.Integer.parseInt(Integer.java:527)
>     at org.apache.cassandra.db.marshal.Int32Type.fromString(Int32Type.java:65)
>     ... 36 more
> {noformat}
> I think showing huge stack trace is not proper behavior.
> Error message should be printer if arity of passed key and table key are not equal.



--
This message was sent by Atlassian JIRA
(v6.2#6252)