【发布时间】:2017-09-15 15:25:47
【问题描述】:
在我们的生产环境中,我们使用 CQLSStablWriter 创建 SSTables 以供将来批量加载 Sample Gist。在创建 sstable 的过程之后。一旦我们启动 cassandra,我们就会遇到以下异常。我们所有的 CF 都是计数器列族。
2.1.5 和 2.0.8 试用版
查代码发现ColumnFamily.java中cellInternal的类型为BufferedCounterUpdateCell,不支持diff操作。在wrong type 上也调用了协调方法。
为了确认问题,我们确实使用了sstable2json 实用程序来检查数据。正如我们猜测的那样
正确转储的 sstable 的单元格具有有效的计数器
(":1:c05:desktop/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/","00010000db5ad3b00d4711e5b52dab7bf928868d00000000000000590000000000000059",1433835586985,"c",-9223372036854775808),
(":1:c05:*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/","00010000db5ad3b00d4711e5b52dab7bf928868d00000000000000590000000000000059",1433835586985,"c",-9223372036854775808)
而有故障的有缓冲计数器,因此 sstable2json 失败
("*:0:c01:*/direct/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/","0000000000000001",1433924262793),
("*:0:c01:*/*/singapore/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/","0000000000000002",1433924262793),
基本上sstable2jsondoesn't have support 用于转储BufferedCounterUpdateCells,因此它假定这些单元格是正常类型并转储它们。
从错误日志和sstable2json 输出中可以明显看出,CQLSSTableWriter 不是转储 CounterColumns,而是转储了 Counter Update Columnscounter types with a different mask,这导致了错误,而 cassandra 尝试加载带有此类列的 SSTables。
我们看到这个问题总是在通过 CQLSSTableWriter 创建 SSTable 时发生。
在处理同一张纸条上报告的任何问题时,我们在this 上停滞不前。与切换 CF 进行写作有关的事情。我们猜测问题可能在同一条线上。欢迎任何意见。
----更新 在进一步调试中,我们发现 CQLSSTableWriter 无法将 CounterUpdateColumns 转换为 CounterColumns,因为它通常在所有其他情况下完成 row mutations。可能需要补丁
【问题讨论】: