[ 
https://issues.apache.org/jira/browse/CASSANDRA-20829?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18013632#comment-18013632
 ] 

Branimir Lambov commented on CASSANDRA-20829:
---------------------------------------------

I don't think the cost of this approach is acceptable.

It basically means that we will perform a full compaction on the obsolete 
sstables, i.e. fully read and compact them, then turn the data into tombstones 
because it is expired, and then remove it via the purger, potentially also 
checking for overlapping sstables. In other words it would kill all benefits of 
whole-sstable-expiration.

SAI (which will be fine just dropping the files without being notified of 
expirations) for one would be badly and unnecessarily hurt by this. For the 
other cases, a simpler walk over the file, listing all data as deleted, will be 
a much better performing solution, and we should only apply this if the 
secondary index requests it (this can be an addition to the interface that 
defaults to return true, overridden for SAI and SASI).

Personally, I'm quite unhappy with the way that the expirations are bundled 
with compaction tasks, which is a problem on its own that means that we have to 
choose between:
 * deleting expired sstables waiting for the completion of the compaction, 
which can be days later;
 * being unable to abort a compaction that includes expired sstables.

In the datastax branch we switched to [extracting expirations as separate 
operations for 
UCS|https://github.com/datastax/cassandra/blob/main/src/java/org/apache/cassandra/db/compaction/UnifiedCompactionStrategy.java#L329...L371].
 Perhaps this is a good opportunity to apply a similar approach to all 
compaction strategies, which would also offer [a good 
place|https://github.com/datastax/cassandra/blob/main/src/java/org/apache/cassandra/db/compaction/ExpirationTask.java]
 to implement that simple walk?

> Secondary index implementations do not integrate with IndexGCTransaction when 
> compaction contains fully expired SSTables
> ------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-20829
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-20829
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: Feature/2i Index, Local/Compaction, Local/Compaction/TWCS
>            Reporter: Stefan Miklosovic
>            Assignee: Stefan Miklosovic
>            Priority: Normal
>             Fix For: 4.0.x, 4.1.x, 5.0.x, 5.x
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> There is a test (1) which ensures that when data are TTLed and compacted, 
> IndexGCTransaction is aware of that and it will invoke Indexer.removeRow() 
> method eventually.
> However, this is not working properly when we have fully expired SSTables, 
> e.g. as the result of a table being on TWCS and having TTL on that. 
> The reason is that in CompactionTask, we are filtering out fully expired ones 
> (2). These then do not go to the compaction process and then they are not 
> reacted on in listener() (3) which contains this logic (4). Eventually, 
> onRowMerge in IndexGCTransaction will make the diff and in its commit 
> indexer.removeRow(row); will notify 2i about its removal.
>  
> This integration is missing and it is quite a big problem because if there 
> are custom secondary index implementations the fact that SSTables were fully 
> expired is not propagated to them which means that data are never removed 
> from whatever backend they use.
> The solution is to go to the compaction with fully expired SSTables as well 
> _but only if we detected that respective column family has some indexes_
>  
> (1) 
> [https://github.com/apache/cassandra/blob/cassandra-4.1/test/unit/org/apache/cassandra/index/CustomIndexTest.java#L583-L607]
> (2) 
> [https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/db/compaction/CompactionTask.java#L174]
> (3) 
> [https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java#L130]
> (4) 
> [https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java#L235-L252]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to