Earlier I've posted the same message to a hector-users list.

Guys,

I'm a bit puzzled today. I'm using just released Hector 0.7.0-29
(thank you, Nate!) and Cassandra 0.7.4 and getting the exception
below, marked as (1) Exception. When I dig to Cassandra source code
below, marked as (2) Cassandra source, I see that there's no check for
LOCAL_QUORUM. I also see that (3) cassandra.thrift defines
LOCAL_QUORUM as enum value 3 and in debugger, I see that LOCAL_QUORUM
is a valid enum value.

My question is, how is it possible to use LOCAL_QUORUM if Cassandra
code throws exception when it sees it? Is it a bad merge or something?
I know it worked before, from looking at
https://issues.apache.org/jira/browse/CASSANDRA-2254

:-\

(1) Exception:

2011-04-19 14:57:33,550 [pool-2-thread-49] ERROR
org.apache.cassandra.thrift.Cassandra$Processor - Internal error
processing batch_mutate
java.lang.UnsupportedOperationException: invalid consistency level: LOCAL_QUORUM
       at 
org.apache.cassandra.service.WriteResponseHandler.determineBlockFor(WriteResponseHandler.java:99)
       at 
org.apache.cassandra.service.WriteResponseHandler.<init>(WriteResponseHandler.java:48)
       at 
org.apache.cassandra.service.WriteResponseHandler.create(WriteResponseHandler.java:61)
       at 
org.apache.cassandra.locator.AbstractReplicationStrategy.getWriteResponseHandler(AbstractReplicationStrategy.java:127)
       at 
org.apache.cassandra.service.StorageProxy.mutate(StorageProxy.java:115)
       at 
org.apache.cassandra.thrift.CassandraServer.doInsert(CassandraServer.java:415)
       at 
org.apache.cassandra.thrift.CassandraServer.batch_mutate(CassandraServer.java:388)
       at 
org.apache.cassandra.thrift.Cassandra$Processor$batch_mutate.process(Cassandra.java:3036)
       at 
org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2555)
       at 
org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:206)
       at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
       at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
       at java.lang.Thread.run(Thread.java:662)

(2) Cassandra source (line 99 is throw statement)

   protected int determineBlockFor(String table)
   {
       int blockFor = 0;
       switch (consistencyLevel)
       {
           case ONE:
               blockFor = 1;
               break;
           case ANY:
               blockFor = 1;
               break;
           case TWO:
               blockFor = 2;
               break;
           case THREE:
               blockFor = 3;
               break;
           case QUORUM:
               blockFor = (writeEndpoints.size() / 2) + 1;
               break;
           case ALL:
               blockFor = writeEndpoints.size();
               break;
           default:
               throw new UnsupportedOperationException("invalid
consistency level: " + consistencyLevel.toString());
       }
       // at most one node per range can bootstrap at a time, and
these will be added to the write until
       // bootstrap finishes (at which point we no longer need to
write to the old ones).
       assert 1 <= blockFor && blockFor <= 2 *
Table.open(table).getReplicationStrategy().getReplicationFactor()
           : String.format("invalid response count %d for replication
factor %d",
                           blockFor,
Table.open(table).getReplicationStrategy().getReplicationFactor());
       return blockFor;
   }

(3) cassandra.thrift:

enum ConsistencyLevel {
   ONE = 1,
   QUORUM = 2,
   LOCAL_QUORUM = 3,
   EACH_QUORUM = 4,
   ALL = 5,
   ANY = 6,
   TWO = 7,
   THREE = 8,
}

Reply via email to