[ 
https://issues.apache.org/jira/browse/CASSANDRA-1510?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12910192#action_12910192
 ] 

Peter Schuller commented on CASSANDRA-1510:
-------------------------------------------

As far as I know this is just how thrift works. A client that suffers an error 
other then declared thrift errors and TApplicationException (or something along 
those lines) is essentially in an undefined state.

I'm not sure how other people have dealt with it; I've had client pools either 
aggressively drop connections that "might" be broken or else actively probe it 
before putting it back into rotation (when there is some indication of error).


> 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.

Reply via email to