You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Jonathan Ellis (JIRA)" <ji...@apache.org> on 2010/07/29 04:04:16 UTC
[jira] Updated: (CASSANDRA-1331) Any request after a
TApplicationException hangs
[ https://issues.apache.org/jira/browse/CASSANDRA-1331?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jonathan Ellis updated CASSANDRA-1331:
--------------------------------------
Affects Version/s: (was: 0.6.3)
Priority: Minor (was: Major)
this is a thrift bug, but I don't see what is causing it.
if you look at the generated thrift code sending the error (Cassandra.get_count_args.read), validate() is not called until all the data has been read. The only thing remaining should be the thrift "footer", and if you look at Cassandra.get_count.process which is calling read(), it calls readMessageEnd before returning the ApplicationError as well.
> Any request after a TApplicationException hangs
> -----------------------------------------------
>
> Key: CASSANDRA-1331
> URL: https://issues.apache.org/jira/browse/CASSANDRA-1331
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Reporter: Apache
> Priority: Minor
>
> Observed that the design of request validation can return without consuming the complete request. The remnant is then read by the next request and produces a large read size.
> readMessageBegin size: 134218752
> Sample test case in python:
> from cassandra.ttypes import *
> from cassandra import Cassandra
> from thrift import Thrift
> from thrift.transport import TTransport
> from thrift.transport import TSocket
> from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
> socket = TSocket.TSocket("127.0.0.1", 9160)
> transport = TTransport.TBufferedTransport(socket)
> protocol = TBinaryProtocolAccelerated(transport)
> client = Cassandra.Client(protocol)
> transport.open()
> client.transport = transport
> # don't specify a column_family to force a TApplicationException
> parent = ColumnParent()
> try:
> client.get_count("ignore_keyspace", "ignore_key", parent, 1)
> print "ERROR: we didn't see the problem"
> except TApplicationException as e:
> message = "Required field 'column_family' was not present!"
> if e.message.startswith(message):
> print "OK, we got the error we were looking for."
> print "The server input buffer was only partially read,"
> print " up to the validation error, so our next request"
> print " will start reading the stale data causing a hang."
> print "hanging..."
> client.get_count("ignore_keyspace", "ignore_key", parent, 1)
> client.transport.close()
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.