Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-8505

Invalid results are returned while secondary index are being build

    XMLWordPrintableJSON

    Details

    • Severity:
      Normal

      Description

      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:

          @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));
          }
      

      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.

        Attachments

          Activity

            People

            • Assignee:
              blerer Benjamin Lerer
              Reporter:
              blerer Benjamin Lerer
              Authors:
              Benjamin Lerer
              Reviewers:
              Sam Tunnicliffe
            • Votes:
              3 Vote for this issue
              Watchers:
              11 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: