Nicolas Favre-Felix created CASSANDRA-6837:
----------------------------------------------
Summary: Batch CAS does not support LOCAL_SERIAL
Key: CASSANDRA-6837
URL: https://issues.apache.org/jira/browse/CASSANDRA-6837
Project: Cassandra
Issue Type: Bug
Components: Core
Reporter: Nicolas Favre-Felix
The batch CAS feature introduced in Cassandra 2.0.6 does not support the
LOCAL_SERIAL consistency level, and always uses SERIAL.
Create a cluster with 4 nodes with the following topology:
{code}
Datacenter: DC2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID
Rack
UN 127.0.0.3 269 KB 256 26.3% ae92d997-6042-42d9-b447-943080569742
RAC1
UN 127.0.0.4 197.81 KB 256 25.1% 3edc92d7-9d1b-472a-8452-24dddbc4502c
RAC1
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID
Rack
UN 127.0.0.1 226.92 KB 256 24.8% dbc17bd7-1ede-47a2-9b31-6063752d6eb3
RAC1
UN 127.0.0.2 179.27 KB 256 23.7% bb0ad285-34d2-4989-a664-b068986ab6fa
RAC1
{code}
In cqlsh:
{code}
cqlsh> CREATE KEYSPACE foo WITH replication = {'class':
'NetworkTopologyStrategy', 'DC1': 2, 'DC2': 2};
cqlsh> USE foo;
cqlsh:foo> CREATE TABLE bar (x text, y bigint, z bigint, t bigint, PRIMARY
KEY(x,y));
{code}
Kill nodes 127.0.0.3 and 127.0.0.4:
{code}
Datacenter: DC2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID
Rack
DN 127.0.0.3 262.37 KB 256 26.3% ae92d997-6042-42d9-b447-943080569742
RAC1
DN 127.0.0.4 208.04 KB 256 25.1% 3edc92d7-9d1b-472a-8452-24dddbc4502c
RAC1
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID
Rack
UN 127.0.0.1 214.82 KB 256 24.8% dbc17bd7-1ede-47a2-9b31-6063752d6eb3
RAC1
UN 127.0.0.2 178.23 KB 256 23.7% bb0ad285-34d2-4989-a664-b068986ab6fa
RAC1
{code}
Connect to 127.0.0.1 in DC1 and run a CAS batch at CL.LOCAL_SERIAL+LOCAL_QUORUM:
{code}
final Cluster cluster = new Cluster.Builder()
.addContactPoint("127.0.0.1")
.withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("DC1"))
.build();
final Session session = cluster.connect("foo");
Batch batch = QueryBuilder.batch();
batch.add(new SimpleStatement("INSERT INTO bar (x,y,z) VALUES ('abc',
123, 1) IF NOT EXISTS"));
batch.add(new SimpleStatement("UPDATE bar SET t=2 WHERE x='abc' AND
y=123"));
batch.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
batch.setSerialConsistencyLevel(ConsistencyLevel.LOCAL_SERIAL);
session.execute(batch);
{code}
The batch fails with:
{code}
Caused by: com.datastax.driver.core.exceptions.UnavailableException: Not enough
replica available for query at consistency SERIAL (3 required but only 2 alive)
at com.datastax.driver.core.Responses$Error$1.decode(Responses.java:44)
at com.datastax.driver.core.Responses$Error$1.decode(Responses.java:33)
at
com.datastax.driver.core.Message$ProtocolDecoder.decode(Message.java:182)
at
org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:66)
... 21 more
{code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)