[
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)