[ https://issues.apache.org/jira/browse/CASSANDRA-6837?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sylvain Lebresne updated CASSANDRA-6837: ---------------------------------------- Attachment: 6837.txt For batches at the protocol level, unfortunately the serial CL is not shipped by the protocol so this will have to be part of CASSANDRA-6855 (the fact that the java driver silently send SERIAL is a separate problem, one that concerns the java driver). That being said, as it happens, we don't even pass the right serial CL when you use non-protocol batches, and that can be fixed trivially, so attaching a patch (this will have to do as a work-around until CASSANDRA-6855). > 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 > Assignee: Sylvain Lebresne > Fix For: 2.0.7 > > Attachments: 6837.txt > > > 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)