[
https://issues.apache.org/jira/browse/CASSANDRA-1310?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12892802#action_12892802
]
Gary Dusbabek commented on CASSANDRA-1310:
------------------------------------------
I think we should allow the creation of keyspaces even when there aren't enough
nodes to support the specified replication factor. For example, it should be
allowable for an operator to bring up a single node in a new cluster, define
all the keyspaces and then start bringing up new nodes to populate the cluster.
Throwing IllegalStateException is a special case that should probably be
handled in NodeTool (gently output the error string and die).
> Disallow KS definition with RF > # of nodes
> -------------------------------------------
>
> Key: CASSANDRA-1310
> URL: https://issues.apache.org/jira/browse/CASSANDRA-1310
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Environment: CentOS 5.1
> Trunc July 22nd
> Reporter: Arya Goudarzi
> Assignee: Nate McCall
> Fix For: 0.7.0
>
> Attachments: trunk-1310.txt
>
>
> Cassandra 0.7 allows user to create Keyspaces with Replication Factor >
> number of endpoints causing in java.lang.IllegalStateException: replication
> factor (2) exceeds number of endpoints (1) exception in nodetool and Internal
> Errors on Thrift making the node useless.
> Steps to Reproduce:
> From a clean setup of Cassandra:
> 1. Start a single node out of cluster of 3. This means my configuration has
> the other two nodes in the seeds list, but have not restarted them yet;
> 2. Use Thrift API (I am using PHP) and create a Keyspace with replication
> factor 2;
> 3. The command executes with no exception or error;
> 4. Now try writing to it, you will get TException with Internal Error message;
> 5. Try nodetool ring and you will get Exception:
> Exception in thread "main" java.lang.IllegalStateException: replication
> factor (2) exceeds number of endpoints (1)
> at
> org.apache.cassandra.locator.RackUnawareStrategy.calculateNaturalEndpoints(RackUnawareStrategy.java:61)
> at
> org.apache.cassandra.locator.AbstractReplicationStrategy.getNaturalEndpoints(AbstractReplicationStrategy.java:87)
> at
> org.apache.cassandra.service.StorageService.constructRangeToEndpointMap(StorageService.java:536)
> at
> org.apache.cassandra.service.StorageService.getRangeToAddressMap(StorageService.java:522)
> at
> org.apache.cassandra.service.StorageService.getRangeToEndpointMap(StorageService.java:496)
> 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:616)
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:111)
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:45)
> at
> com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:226)
> at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
> at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:251)
> at
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:857)
> at
> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:795)
> at
> javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1449)
> at
> javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:90)
> at
> javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1284)
> at
> javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1382)
> at
> javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:807)
> 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:616)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
> at sun.rmi.transport.Transport$1.run(Transport.java:177)
> 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:553)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
> at java.lang.Thread.run(Thread.java:636)
> Expected:
> 1. Either step 3 should not let you create the KS with RF 2 and 1 node in
> ring, or there should be a peaceful way for Cassandra to recover from
> IllegalStateException and replicate once other nodes become available.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.