[ https://issues.apache.org/jira/browse/CASSANDRA-1510?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jonathan Ellis resolved CASSANDRA-1510. --------------------------------------- Resolution: Won't Fix Right, you need to drop bad connections, that's just how thrift is designed (and I think it's probably the only sane approach). > Cassandra.Client/Thrift errors not cleaned up between executions > ---------------------------------------------------------------- > > Key: CASSANDRA-1510 > URL: https://issues.apache.org/jira/browse/CASSANDRA-1510 > Project: Cassandra > Issue Type: Bug > Components: API > Affects Versions: 0.7 beta 1, 0.7 beta 2 > Reporter: Jesse McConnell > Priority: Critical > > It seems that if a Cassandra.Client returns with a certain type of error it > is not being cleaned up enough to make another call using that same client > instance. In the example below you see a get slice call being made with a > poorly formatted SliceRange and the errors are being caught and printed out. > A subsequent call on that client to do something like set_keyspace now > returns with additional error information from that previous execution...and > then ends with the 'Missing version in readMessageBegin' error that makes you > think that the server/client are not in sync re: framed vs non-framed. > In pooling environments where that client might be cached and then back to be > reused this can lead to a bit of a red herring chase to track down transport > issues while its really a previous bogus call like described. > org.apache.thrift.protocol.TProtocolException: Required field 'finish' was > not present! Struct: SliceRange(start:, finish:null, reversed:false, > count:100) > at org.apache.cassandra.thrift.SliceRange.validate(SliceRange.java:623) > at org.apache.cassandra.thrift.SliceRange.write(SliceRange.java:552) > at > org.apache.cassandra.thrift.SlicePredicate.write(SlicePredicate.java:429) > at > org.apache.cassandra.thrift.Cassandra$get_slice_args.write(Cassandra.java:6603) > at > org.apache.cassandra.thrift.Cassandra$Client.send_get_slice(Cassandra.java:534) > at > org.apache.cassandra.thrift.Cassandra$Client.get_slice(Cassandra.java:522) > ... > CassandraException: org.apache.thrift.protocol.TProtocolException: Required > field 'finish' was not present! Struct: SliceRange(start:, finish:null, > reversed:false, count:100) > at > com.foo.ThriftCassandraInterface.getColumnSlice(ThriftCassandraInterface.java:471) > at > com.foo.ThriftInterfaceTest.testBadBehaviour(ThriftInterfaceTest.java:73) > ... > Caused by: org.apache.thrift.protocol.TProtocolException: Required field > 'finish' was not present! Struct: SliceRange(start:, finish:null, > reversed:false, count:100) > at org.apache.cassandra.thrift.SliceRange.validate(SliceRange.java:623) > at org.apache.cassandra.thrift.SliceRange.write(SliceRange.java:552) > at > org.apache.cassandra.thrift.SlicePredicate.write(SlicePredicate.java:429) > at > org.apache.cassandra.thrift.Cassandra$get_slice_args.write(Cassandra.java:6603) > at > org.apache.cassandra.thrift.Cassandra$Client.send_get_slice(Cassandra.java:534) > at > org.apache.cassandra.thrift.Cassandra$Client.get_slice(Cassandra.java:522) > at > com.foo.ThriftCassandraInterface.getColumnSlice(ThriftCassandraInterface.java:416) > ... 23 more > org.apache.thrift.TApplicationException: Required field 'reversed' was not > found in serialized data! Struct: SliceRange(start:null, finish:null, > reversed:false, count:100) > at > org.apache.thrift.TApplicationException.read(TApplicationException.java:108) > at > org.apache.cassandra.thrift.Cassandra$Client.recv_set_keyspace(Cassandra.java:454) > at > org.apache.cassandra.thrift.Cassandra$Client.set_keyspace(Cassandra.java:437) > at > com.foo.ThriftCassandraInterface.setKeyspace(ThriftCassandraInterface.java:975) > at > com.foo.ThriftInterfaceTest.testBadBehaviour(ThriftInterfaceTest.java:83) > ... > 53851 [pool-1-thread-3] ERROR > org.apache.cassandra.thrift.CustomTThreadPoolServer - Thrift error occurred > during processing of message. > org.apache.thrift.protocol.TProtocolException: Missing version in > readMessageBegin, old client? > at > org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:211) > at > org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2634) > at > org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:167) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > at java.lang.Thread.run(Thread.java:619) > Below is a bit of modified code from the testBadBehavior() test case being > executed in the code above. > Cassandra.Client client = foo.gimmeClient(); > > ColumnParent parent = new ColumnParent(); > parent.setColumn_family("Foo"); > > SlicePredicate predicate = new SlicePredicate(); > SliceRange range = new SliceRange(); > // NOTE: the range is not completely initialized, missing sets for finished > and reverse which imo ought to be defaulted anyway > range.setStart("".getBytes()); > range.setCount(100); > predicate.setSlice_range(range); > > try > { > Collection<ColumnOrSuperColumn> columns = > client.get_column_slice("foo", parent, predicate); > } > catch (CassandraException e) > { > e.printStackTrace(); > } > > client.set_keyspace("FooBar"); -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.