Gabriel Giussi
2018-09-17 12:58:07 UTC
From
https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutDeletes.html
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
And commented in LastPickle's post About deletes and tombstones (
http://thelastpickle.com/blog/2016/07/27/about-deletes-and-tombstones.html#comment-3949581514
)
**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>
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 describedabove; 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>