【发布时间】:2023-03-15 05:49:01
【问题描述】:
我们有一个表,我们使用 java max long (9223372036854775807) 作为时间戳删除了一堆行。例如,
使用时间戳 9223372036854775807 从订单簿中删除 r_id,其中 o_id='' AND p_id='' AND 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 中强制删除所有墓碑?
【问题讨论】: