I just joined this mailing list but I've been on the IRC for a while. Pardon if this post is a repeat but I would like to share with you some of my experiences with Cassandra Thrift Interface that comes with the nightly built and probably 0.7. I came across an issue last night that I shared on the IRC, and I've found the solutions to that too, so read on as this might be your problem too in the future.
I've noticed fundamental differences in the new Thrift Interface from the bleeding edge version. First of all, if you've coded with the Thrift interface that is shipped with 0.6 branches, your code will not work with the new interface shipped with 0.7. This is because if you look at function declarations inside CassandraClient Interface, you'll see changes for example in insert() number of parameter and the way objects are passed. This also makes the examples on the Wiki site obsolete. If you are using TBinaryProtocolAccelerated in your application, then you won't be able to figure what is the problem at first glance because it crashes web server process with a message like this:
[Wed May 19 16:15:12 2010] [notice] child pid 32414 exit signal Aborted (6)
terminate called after throwing an instance of 'PHPExceptionWrapper'
what(): PHP exception zval=0x2b1c2a0429a0
This is a Thrift bug with thrift_protocol.so extention. Luckily I found the patch here:
After applying the patch and recompiling the module, Exceptions bubbled up to my app. I got complaines about T_STRUCT being different:
TProtocolException Object ( [message:protected] => Attempt to send non-object type as a T_STRUCT [string:Exception:private] => [code:protected] .......
Well because the way I used to pass stuff to insert() was different from the way it should be in the new API. I discovered this the hard way and now am sharing the sauce with you. The example on the Wiki, will become something like this:
$column = new cassandra_Column(array('name' => 'email',
'value' => 'email@example.com',
'timestamp' => time()));
$parent = new cassandra_ColumnParent(array('column_family' => 'Standard1'));
// We want the consistency level to be ZERO which means async operations on 1 node
$consistency_level = cassandra_ConsistencyLevel::ZERO;
// Add the value to be written to the table, User Key, and path.
$client->insert('1', $parent, $column, $consistency_level);
Notice no more KeySpaces and ColumnPath passed to the insert(). Other functions are changed too.
P.S. By the way, if someone grants me access, I'd like to contribute to the documentaions on Apache Cassandra.