cassandra-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Benjamin Lerer (JIRA)" <j...@apache.org>
Subject [jira] [Created] (CASSANDRA-8505) Invalid results are returned while secondary index are being build
Date Wed, 17 Dec 2014 21:10:13 GMT
Benjamin Lerer created CASSANDRA-8505:
-----------------------------------------

             Summary: Invalid results are returned while secondary index are being build
                 Key: CASSANDRA-8505
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8505
             Project: Cassandra
          Issue Type: Bug
            Reporter: Benjamin Lerer


If you request an index creation and then execute a query that use the index the results returned
might be invalid until the index is fully build. This is caused by the fact that the table
column will be marked as indexed before the index is ready.

The following unit tests can be use to reproduce the problem:
{code}
    @Test
    public void testIndexCreatedAfterInsert() throws Throwable
    {
        createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))");

        execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);");
        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);");
        execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);");
        execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);");
        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);");
        
        createIndex("CREATE INDEX ON %s(b)");
        
        assertRows(execute("SELECT * FROM %s WHERE b = ?;", 1),
                   row(0, 1, 1),
                   row(1, 1, 4));
    }
    
    @Test
    public void testIndexCreatedBeforeInsert() throws Throwable
    {
        createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))");

        createIndex("CREATE INDEX ON %s(b)");
        
        execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);");
        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);");
        execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);");
        execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);");
        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);");

        assertRows(execute("SELECT * FROM %s WHERE b = ?;", 1),
                   row(0, 1, 1),
                   row(1, 1, 4));
    }
{code}

The first test will fail while the second will work. 

In my opinion the first test should reject the request as invalid (as if the index was not
existing) until the index is fully build.



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

Mime
View raw message