Katsutoshi Nagaoka created CASSANDRA-8095:
---------------------------------------------

             Summary: create table query not working in concurrent
                 Key: CASSANDRA-8095
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8095
             Project: Cassandra
          Issue Type: Bug
         Environment: 2.1.0 on Ubuntu 14.04
            Reporter: Katsutoshi Nagaoka


After 2.1.0, I have encountered the strange behavior of create table.

When I executed create table query in concurrent, 

{code}
package cassandra.test;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class ConcurrentCreateTable {

    public static void main(String[] args) {
        ConcurrentCreateTable instance = new ConcurrentCreateTable();
        try {
            instance.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private final Cluster cluster;

    public ConcurrentCreateTable() {
        this.cluster = Cluster.builder().addContactPoint("server1").build();
    }

    private void execute() throws Exception {
        Session session = cluster.newSession();
        session.execute("DROP KEYSPACE IF EXISTS ks");
        session.execute("CREATE KEYSPACE IF NOT EXISTS ks WITH REPLICATION = 
{'class':'SimpleStrategy','replication_factor':3}");
        ExecutorService executor = Executors.newFixedThreadPool(10);
        List<Future<?>> futures = new ArrayList<>();
        futures.add(executor.submit(new CreateTableRunner("text")));
        futures.add(executor.submit(new CreateTableRunner("int")));
        futures.add(executor.submit(new CreateTableRunner("boolean")));
        futures.add(executor.submit(new CreateTableRunner("bigint")));
        executor.shutdown();
        executor.awaitTermination(1L, TimeUnit.MINUTES);
        session.execute("DROP KEYSPACE ks");
        session.close();
        cluster.close();
    }

    private class CreateTableRunner implements Runnable {

        private final Session session;
        private final String type;

        public CreateTableRunner(String type) {
            this.session = cluster.newSession();
            this.type = type;
        }

        @Override
        public void run() {
            session.execute("CREATE TABLE IF NOT EXISTS ks.tb (key " + type + 
", value " + type + ", PRIMARY KEY (key))");
            session.close();
        }
    }
}
{code}

sometimes each node has different table schema or no table.

{code}
[on server1] cqlsh> DESCRIBE TABLE ks.tb;

CREATE TABLE ks.tb (
    key int PRIMARY KEY,
    value int
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'min_threshold': '4', 'class': 
'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 
'max_threshold': '32'}
    AND compression = {'sstable_compression': 
'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

[on server2] cqlsh> DESCRIBE TABLE ks.tb;

CREATE TABLE ks.tb (
    key bigint PRIMARY KEY,
    value bigint
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'min_threshold': '4', 'class': 
'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 
'max_threshold': '32'}
    AND compression = {'sstable_compression': 
'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

[on server3] cqlsh> DESCRIBE TABLE ks.tb;

Column family 'tb' not found
{code}

I can reproduce this issue on three nodes cluster in 2.1.0. and the test works 
fine in 2.0.10.



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

Reply via email to