如何在删除CQL语句中强制删除使用USING TIMESTAMP创建的逻辑删除?

时间:2016-10-15 09:02:24

标签: cassandra cassandra-2.1

我们有一个表,我们使用java max long(9223372036854775807)作为时间戳删除了一堆行。例如,

DELETE r_id FROM orderbook使用TIMESTAMP 9223372036854775807 WHERE o_id ='' AND p_id =''和e_id ='' AND a_id =' a1' AND ord_id = 645e7d3c-aef7-4e3c-b834-24b792cf2e55;

这些墓碑是在sstable中使用markedForDeleteAt = 9223372036854775807创建的。

sstable2json的样本输出

[ {" key":" ::: a1",  "细胞":[[" 645e7d3c-aef7-4e3c-b834-24b792cf2e51:_"," 645e7d3c-aef7-4e3c-b834-24b792cf2e51:!", 9223372036854775807," T",1476520163],            [" 645e7d3c-aef7-4e3c-b834-24b792cf2e52:""",1],            [" 645e7d3c-aef7-4e3c-b834-24b792cf2e55:""",1],            [" 645e7d3c-aef7-4e3c-b834-24b792cf2e55:R_ID",1476520867,9223372036854775807," d"]]} ]

如此高的时间创建的墓碑(范围(" t")或其他(" d"))不会通过轻微或主要压缩收集。我们甚至尝试将gc_grace_seconds设置为0并运行主要压缩但没有运气。我在想' markedForDeleteAt + gc_grace_seconds>压实时间'方程式正在播出,这就是为什么没有收集墓碑的原因。但后来我读了cassandra代码,似乎localDeletionTime被考虑在等式中而没有标记为ForDeleteAt。

 * The local server timestamp, in seconds since the unix epoch, at which this tombstone was created. This is
 * only used for purposes of purging the tombstone after gc_grace_seconds have elapsed.
 */
public final int localDeletionTime;

有了这一切,我怎么能强制从sstable中删除所有的墓碑?

1 个答案:

答案 0 :(得分:0)

CASSANDRA-12792 - 由于昨天填充了Cassandra bug,因此无法删除使用Long.MAX_VALUE编写的带有压缩的逻辑删除。我不得不做ETL和表截断来摆脱墓碑。

在db / compaction / LazilyCompactedRow.java中 我们只检查< MaxPurgeableTimeStamp 例如: (this.maxRowTombstone.markedForDeleteAt< getMaxPurgeableTimestamp()) 这应该是< =