我们有一个表,我们使用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中删除所有的墓碑?
答案 0 :(得分:0)
CASSANDRA-12792 - 由于昨天填充了Cassandra bug,因此无法删除使用Long.MAX_VALUE编写的带有压缩的逻辑删除。我不得不做ETL和表截断来摆脱墓碑。
在db / compaction / LazilyCompactedRow.java中 我们只检查< MaxPurgeableTimeStamp 例如: (this.maxRowTombstone.markedForDeleteAt< getMaxPurgeableTimestamp()) 这应该是< =