在 Cassandra node.js 驱动程序中使用中型 fetchSize 时出现帧流错误
Frame stream error when using medium-sized fetchSize in Cassandra node.js driver
我在使用 Cassandra node.js 驱动程序时遇到了一个奇怪的问题。当我尝试 select 来自某些分区的数据时,出现此错误。
Error: There was an problem while parsing streaming frame, opcode 8
at DriverInternalError.DriverError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:14:19)
at new DriverInternalError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:68:30)
at Parser._transform (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\streams.js:149:16)
at Parser.Transform._read (_stream_transform.js:167:10)
at Parser.Transform._write (_stream_transform.js:155:12)
at doWrite (_stream_writable.js:307:12)
at writeOrBuffer (_stream_writable.js:293:5)
at Parser.Writable.write (_stream_writable.js:220:11)
at Protocol.ondata (_stream_readable.js:556:20)
at emitOne (events.js:96:13)
name: 'DriverInternalError',
stack: 'Error: There was an problem while parsing streaming frame, opcode 8\n at DriverInternalError.DriverError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:14:19)\n at new DriverInternalError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:68:30)\n at Parser._transform (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\streams.js:149:16)\n at Parser.Transform._read (_stream_transform.js:167:10)\n at Parser.Transform._write (_stream_transform.js:155:12)\n at doWrite (_stream_writable.js:307:12)\n at writeOrBuffer (_stream_writable.js:293:5)\n at Parser.Writable.write (_stream_writable.js:220:11)\n at Protocol.ondata (_stream_readable.js:556:20)\n at emitOne (events.js:96:13)',
message: 'There was an problem while parsing streaming frame, opcode 8',
info: 'Represents a bug inside the driver or in a Cassandra host.',
这里有一些非常奇怪的行为。
- 较小的
fetchSize
s 不会发生这种情况。例如,我始终可以使用 312 或更高的获取大小使其出错,但每次使用 311 的获取大小都有效。
- 它只发生在一些分区键上。到目前为止,它似乎正在影响最近添加的密钥。
- 在单个table内,
fetchSize
的断点是一致的。例如,我可以 运行 SELECT * FROM TableX WHERE myKey = value1
或 SELECT * FROM TableX WHERE myKey = value2
并且两者都会在 fetchSize
为 240 时开始出错。但是对于 TableY
,限制可能是 284。
我真的有点不知所措。我怀疑这与从单个分区返回太多行有关,但我能够从其他分区获取大量数据(例如,20000 的 fetchSize
在大多数分区上工作正常)。
重现问题的一段简单代码是
var cassandra = require('cassandra-driver')
var client = new cassandra.Client({ contactPoints: ['node1', 'node2', 'node3'], keyspace: 'ks' });
var query = 'SELECT * FROM TableX WHERE myKey = :value';
client.eachRow(query, { value: 'someValue' }, { prepare: true, fetchSize: 500 }, function(n, row) {
console.log(row);
}, function(err) {
console.log(err)
});
正如与 OP 讨论的那样,它看起来像是驱动程序版本 3.1.3 中的错误:
更多信息:https://datastax-oss.atlassian.net/browse/NODEJS-310
现在已在 v3.1.4 of the driver 中修复。
我在使用 Cassandra node.js 驱动程序时遇到了一个奇怪的问题。当我尝试 select 来自某些分区的数据时,出现此错误。
Error: There was an problem while parsing streaming frame, opcode 8
at DriverInternalError.DriverError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:14:19)
at new DriverInternalError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:68:30)
at Parser._transform (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\streams.js:149:16)
at Parser.Transform._read (_stream_transform.js:167:10)
at Parser.Transform._write (_stream_transform.js:155:12)
at doWrite (_stream_writable.js:307:12)
at writeOrBuffer (_stream_writable.js:293:5)
at Parser.Writable.write (_stream_writable.js:220:11)
at Protocol.ondata (_stream_readable.js:556:20)
at emitOne (events.js:96:13)
name: 'DriverInternalError',
stack: 'Error: There was an problem while parsing streaming frame, opcode 8\n at DriverInternalError.DriverError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:14:19)\n at new DriverInternalError (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\errors.js:68:30)\n at Parser._transform (C:\Temp\cassandra_test\node_modules\cassandra-driver\lib\streams.js:149:16)\n at Parser.Transform._read (_stream_transform.js:167:10)\n at Parser.Transform._write (_stream_transform.js:155:12)\n at doWrite (_stream_writable.js:307:12)\n at writeOrBuffer (_stream_writable.js:293:5)\n at Parser.Writable.write (_stream_writable.js:220:11)\n at Protocol.ondata (_stream_readable.js:556:20)\n at emitOne (events.js:96:13)',
message: 'There was an problem while parsing streaming frame, opcode 8',
info: 'Represents a bug inside the driver or in a Cassandra host.',
这里有一些非常奇怪的行为。
- 较小的
fetchSize
s 不会发生这种情况。例如,我始终可以使用 312 或更高的获取大小使其出错,但每次使用 311 的获取大小都有效。 - 它只发生在一些分区键上。到目前为止,它似乎正在影响最近添加的密钥。
- 在单个table内,
fetchSize
的断点是一致的。例如,我可以 运行SELECT * FROM TableX WHERE myKey = value1
或SELECT * FROM TableX WHERE myKey = value2
并且两者都会在fetchSize
为 240 时开始出错。但是对于TableY
,限制可能是 284。
我真的有点不知所措。我怀疑这与从单个分区返回太多行有关,但我能够从其他分区获取大量数据(例如,20000 的 fetchSize
在大多数分区上工作正常)。
重现问题的一段简单代码是
var cassandra = require('cassandra-driver')
var client = new cassandra.Client({ contactPoints: ['node1', 'node2', 'node3'], keyspace: 'ks' });
var query = 'SELECT * FROM TableX WHERE myKey = :value';
client.eachRow(query, { value: 'someValue' }, { prepare: true, fetchSize: 500 }, function(n, row) {
console.log(row);
}, function(err) {
console.log(err)
});
正如与 OP 讨论的那样,它看起来像是驱动程序版本 3.1.3 中的错误:
更多信息:https://datastax-oss.atlassian.net/browse/NODEJS-310
现在已在 v3.1.4 of the driver 中修复。