From
https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutDeletes.html

> Cassandra allows you to set a default_time_to_live property for an entire
table. Columns and rows marked with regular TTLs are processed as described
above; but when a record exceeds the table-level TTL, **Cassandra deletes
it immediately, without tombstoning or compaction**.

This is also answered in https://stackoverflow.com/a/50060436/3517383

>  If a table has default_time_to_live on it then rows that exceed this
time limit are **deleted immediately without tombstones being written**.

And commented in LastPickle's post About deletes and tombstones (
http://thelastpickle.com/blog/2016/07/27/about-deletes-and-tombstones.html#comment-3949581514
)

> Another clue to explore would be to use the TTL as a default value if
that's a good fit. TTLs set at the table level with 'default_time_to_live'
**should not generate any tombstone at all in C*3.0+**. Not tested on my
hand, but I read about this.

I've made the simplest test that I could imagine using
`LeveledCompactionStrategy`:

    CREATE KEYSPACE IF NOT EXISTS temp WITH replication = {'class':
'SimpleStrategy', 'replication_factor': '1'};

    CREATE TABLE IF NOT EXISTS temp.test_ttl (
        key text,
        value text,
        PRIMARY KEY (key)
    ) WITH  compaction = { 'class': 'LeveledCompactionStrategy'}
      AND default_time_to_live = 180;

 1. `INSERT INTO temp.test_ttl (key,value) VALUES ('k1','v1');`
 2. `nodetool flush temp`
 3. `sstabledump mc-1-big-Data.db`
[image: cassandra0.png]

 4. wait for 180 seconds (default_time_to_live)
 5. `sstabledump mc-1-big-Data.db`
[image: cassandra1.png]

The tombstone isn't created yet
 6. `nodetool compact temp`
 7. `sstabledump mc-2-big-Data.db`
[image: cassandra2.png]

The **tombstone is created** (and not dropped on compaction due to
gc_grace_seconds)

The test was performed using apache cassandra 3.0.13

>From the example I conclude that isn't true that `default_time_to_live` not
require tombstones, at least for version 3.0.13.
However this is a very simple test and I'm forcing a major compaction with
`nodetool compact` so I may not be recreating the scenario where
default_time_to_live magic comes into play.

But how would C* delete without tombstones? Why this should be a different
scenario to using TTL per insert?

This is also asked at stackoverflow
<https://stackoverflow.com/questions/52282517/how-default-time-to-live-would-delete-rows-without-tombstones-in-cassandra>

Reply via email to