You need to be using NTS. When NetworkTopologySetting is used it overrides the AbstractReplicationStrategy.getWriteResponseHandler() function in your stack and returns a either a DataCentreWriteResponseHandler for LOCAL_QUORUM or DatacenterSyncWriteResponseHandler for EACH_QUORUM . They are DC aware.
Aaron On 20 Apr 2011, at 13:25, William Oberman wrote: > Good point, should have read your message (and the code) more closely! > > Sent from my iPhone > > On Apr 19, 2011, at 9:16 PM, Oleg Tsvinev <oleg.tsvi...@gmail.com> wrote: > >> I'm puzzled because code does not even check for LOCAL_QUORUM before >> throwing exception. >> Indeed I did not configure NetworkTopologyStrategy. Are you saying >> that it works after configuring it? >> >> On Tue, Apr 19, 2011 at 6:04 PM, William Oberman >> <ober...@civicscience.com> wrote: >>> I had a similar error today when I tried using LOCAL_QUORUM without having a >>> properly configured NetworkTopologyStrategy. QUORUM worked fine however. >>> will >>> >>> On Tue, Apr 19, 2011 at 8:52 PM, Oleg Tsvinev <oleg.tsvi...@gmail.com> >>> wrote: >>>> >>>> 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, >>>> } >>> >>> >>> >>> -- >>> Will Oberman >>> Civic Science, Inc. >>> 3030 Penn Avenue., First Floor >>> Pittsburgh, PA 15201 >>> (M) 412-480-7835 >>> (E) ober...@civicscience.com >>>