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

Inconsistent handling of row expiration using TTL in collections

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Urgent
    • Resolution: Not A Problem
    • None
    • None
    • None
    • Apache Cassandra 2.0.3
      Apache Cassandra 1.2.8
      CQLSH client 3.1.6

    • Critical

    Description

      The expiration of row when all TTLed columns have expired is inconsistent

      Scenario 1)

      cqlsh:test> create table ttl_issue(id int primary key,collection set<text>);
      cqlsh:test> update ttl_issue USING TTL 2 set collection = collection + {'test_2'} where id=10;
      cqlsh:test> update ttl_issue USING TTL 3 set collection = collection + {'test_3'} where id=10;
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+----------------------
       10 | {'test_2', 'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+----------------------
       10 | {'test_2', 'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+------------
       10 | {'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      cqlsh:test> 
      

      As we can see, after a few seconds, both columns of the collection are expired. When all columns of the set have expired, the SELECT * FROM ttl_issue returns no result, meaning that the whole row has expired.

      Scenario 2)

      cqlsh:test> update ttl_issue USING TTL 3 set collection = collection + {'test_3'} where id=11;
      cqlsh:test> update ttl_issue USING TTL 1000 set collection = collection + {'test_1000'} where id=11;
      cqlsh:test> update ttl_issue set collection = collection - {'test_1000'} where id=11;
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+------------
       11 | {'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+------------
       11 | {'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+------------
       11 | {'test_3'}
      
      cqlsh:test> select * from ttl_issue;
      
       id | collection
      ----+------------
       11 |       null
      

      In this second scenario. We add elements to the collection with TTL but then remove one of them. After a while, although all TTLed columns have expired, the row is till there with only the primary key present.

      One should expect to get the same behavior as in scenario 1), e.g. the complete row should expire.

      I've also tried removing one element from collection using TTL 0 (

      update ttl_issue USING TTL 0 set collection = collection - {'test_1000'} where id=11;

      ) but the result is the same.

      Quick guest: bug on row deletion marker for specific collection element append/remove ?

      Attachments

        Activity

          People

            Unassigned Unassigned
            doanduyhai DuyHai Doan
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: