[ 
https://issues.apache.org/jira/browse/CASSANDRA-5593?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aleksey Yeschenko resolved CASSANDRA-5593.
------------------------------------------

    Resolution: Invalid

This is not a good fix. At all.

This behavior is expected. What you should've done instead was to increase RF 
on system_auth keyspace (with a regular ALTER KEYSPACE system_auth .. query).
                
> Auth.isExistingUser is periodically throwing 
> org.apache.cassandra.exceptions.UnavailableException: Cannot achieve 
> consistency level ONE
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-5593
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-5593
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.2.4
>         Environment: Three node cluster
>            Reporter: Justin Geiser
>
> When setting up authentication on a clustered setup we're periodically 
> getting an UnavailableException: Cannot achieve consistency level ONE 
> whenever one or two of the cluster nodes is down.
> {code}
> java.lang.RuntimeException: 
> org.apache.cassandra.exceptions.UnavailableException: Cannot achieve 
> consistency level ONE
>         at org.apache.cassandra.auth.Auth.isExistingUser(Auth.java:75)
>         at 
> com.resolve.cassandra.auth.SimpleAuthenticator.setup(SimpleAuthenticator.java:273)
>         at org.apache.cassandra.auth.Auth.setup(Auth.java:139)
>         at 
> org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:781)
>         at 
> org.apache.cassandra.service.StorageService.initServer(StorageService.java:542)
>         at 
> org.apache.cassandra.service.StorageService.initServer(StorageService.java:439)
>         at 
> org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:323)
>         at 
> org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:411)
>         at 
> org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:454)
> Caused by: org.apache.cassandra.exceptions.UnavailableException: Cannot 
> achieve consistency level ONE
>         at 
> org.apache.cassandra.db.ConsistencyLevel.assureSufficientLiveNodes(ConsistencyLevel.java:250)
>         at 
> org.apache.cassandra.service.ReadCallback.assureSufficientLiveNodes(ReadCallback.java:152)
>         at 
> org.apache.cassandra.service.StorageProxy.fetchRows(StorageProxy.java:891)
>         at 
> org.apache.cassandra.service.StorageProxy.read(StorageProxy.java:829)
>         at 
> org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:126)
>         at 
> org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:1)
>         at 
> org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:132)
>         at 
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:143)
>         at 
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:151)
>         at org.apache.cassandra.auth.Auth.isExistingUser(Auth.java:71)
>         ... 8 more
> {code}
> Digging into the issue it looks like the problem is the 
> SimpleStrategy.calculateNaturalEndpoints method is only returning 1 entry, 
> because the replication factor for the system_auth column family is 1, and if 
> this node happens to be one of the down nodes it gets removed by 
> getLiveNaturalEndpoints in StorageService.  So by the time it reaches 
> StorageProxy.fetchRows(StorageProxy.java:891) the endpoints list is empty, 
> even though we have valid nodes running.
> For a quick fix I removed the "endpoints.size() < replicas" check from the 
> while loop in SimpleStrategy.calculateNaturalEndpoints:
> {code}
>     public List<InetAddress> calculateNaturalEndpoints(Token token, 
> TokenMetadata metadata)
>     {
>         int replicas = getReplicationFactor();
>         ArrayList<Token> tokens = metadata.sortedTokens();
>         List<InetAddress> endpoints = new ArrayList<InetAddress>(replicas);
>         if (tokens.isEmpty())
>             return endpoints;
>         // Add the token at the index by default
>         Iterator<Token> iter = TokenMetadata.ringIterator(tokens, token, 
> false);
>         while (iter.hasNext())
>         {
>             InetAddress ep = metadata.getEndpoint(iter.next());
>             if (!endpoints.contains(ep))
>             {
>                 endpoints.add(ep);
>             }
>         }
>         return endpoints;
>     }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to