You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Andy Klages (JIRA)" <ji...@apache.org> on 2016/09/22 00:36:20 UTC

[jira] [Created] (CASSANDRA-12683) Batch statement fails with consistency ONE when only 1 node up in DC

Andy Klages created CASSANDRA-12683:
---------------------------------------

             Summary: Batch statement fails with consistency ONE when only 1 node up in DC
                 Key: CASSANDRA-12683
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12683
             Project: Cassandra
          Issue Type: Bug
          Components: Coordination
         Environment: 3 Cassandra nodes (N1, N2, N3)
2 Data Centers (DC1, DC2)
N1 and N2 members of DC1
N3 a member of DC2
1 keyspace using SimpleReplicationStrategy with RF=3 (can also be 2):
CREATE KEYSPACE ks WITH REPLICATION={'class':'SimpleStrategy','replication_factor':3};
1 column family in the keyspace. For simplicity, a partition key of bigint and one other field of any type. No cluster key needed:
CREATE TABLE ks.test (
        id      bigint,
        flag    boolean,
        PRIMARY KEY(id)
);

            Reporter: Andy Klages
            Priority: Minor


If Cassandra node N2 is stopped, that only leaves one node (N1) in DC1 running. Output from "nodetool status" is:

Datacenter: DC1
=========================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns    Host ID                               Rack
DN  N2            ...
UN  N1            ...
Datacenter: DC2
======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns    Host ID                               Rack
UN  N3            ...


The following batch statement will fail when executed on N1 with consistency level of ONE using cqlsh (also fails with Java using Datastax driver):

CONSISTENCY ONE
BEGIN BATCH
UPDATE ks.test SET flag=true where id=1;
UPDATE ks.test SET flag=true where id=2;
APPLY BATCH;

The failure is:

  File "apache-cassandra-2.1.15/bin/../lib/cassandra-driver-internal-only-2.7.2.zip/cassandra-driver-2.7.2/cassandra/cluster.py", line 3347, in result
    raise self._final_exception
Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ONE" info={'required_replicas': 1, 'alive_replicas': 0, 'consistency': 'ONE'}

There are 2 replicas alive but for some reason, Cassandra thinks there are none.

If each statement is executed individually (i.e. no batch), each one succeeds.

This same batch query succeeds on N3, which is the other node in the cluster that is running. My analysis shows this happens when the query is executed on a node in a DC where all other nodes in that DC is down. The batch statement has 2 or more queries with different partition keys. If all of the partition keys are the same value, it succeeds. As the replication factor is set to the number of nodes in the cluster (full replication) and the consistency level is ONE, the batch statement should succeed.

2 workarounds for this are:

1. Set the consistency level to ANY.
2. Use an unlogged batch.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)