You're running into https://issues.apache.org/jira/browse/CASSANDRA-6623. It will be fixed in 2.0.6 but you can read the comments there for more details.
On Tue, Feb 25, 2014 at 9:02 AM, J Robert Ray <jrobert...@gmail.com> wrote: > Thanks Daniel. > > I am taking care to only expire the one column. There are other columns so > my row isn't completely deleted. > On Feb 24, 2014 11:37 PM, "Daniel Shelepov" <dan...@timefork.com> wrote: > >> For the case where you don't get the update, is your whole row removed >> when TTL expires? If so, you're essentially looking at a non-existing row, >> and I think it's not too surprising that a "if col=null" test will behave >> differently; I personally wouldn't call it a bug. If you're dealing with >> disappearing rows, you should look into running INSERT IF NOT EXISTS >> queries instead of UPDATE IF col=null. >> >> >> >> If the row is not completely deleted when TTL expires, then the behavior >> is definitely fishy, and should probably be filed as a bug. >> >> >> >> To your other question, once a TTL update is expired, you can't infer its >> past existence through any queries. >> >> >> >> Daniel >> >> >> >> *From:* J Robert Ray [mailto:jrobert...@gmail.com] >> *Sent:* Monday, February 24, 2014 11:10 PM >> *To:* user@cassandra.apache.org >> *Subject:* Mixing CAS and TTL. >> >> >> >> Hi, I am trying to mix CAS and TTL and am wondering if this behavior that >> I am seeing is expected. >> >> >> >> I'm on 2.0.2 and using the java datastax 2.0.0-rc3 client. >> >> >> >> In my application, a server "claims" a row by assigning a value to a row >> using CAS, expecting the column to start out null. The column has a >> shortish TTL and while the application "owns" the row, it will periodically >> refresh the TTL on the column. If the application dies, the column expires >> and can be claimed by another server. My problem is that after the TTL >> expires, no server can successfully claim a row using a CAS update. >> >> >> >> If I set a TTL on a column with a null value (for demonstration purposes; >> the real code sets to a non-null value): >> >> >> >> UPDATE foo USING TTL 120 SET col = null WHERE ...; >> >> >> >> This CAS update will succeed: >> >> >> >> UPDATE foo USING TTL 120 SET col = 'some value' IF col = null; // >> [applied] = true >> >> or >> >> UPDATE foo USING TTL 120 SET col = 'some value' IF col = 'foo'; // >> [applied] = true, col = null >> >> >> >> However, if I allow the TTL to expire, then the same update now fails. >> >> >> >> UPDATE foo USING TTL 120 SET col = 'some value' IF col = null; // >> [applied] = false >> >> >> >> Note, after it fails, the ResultSet column definitions only contains >> "[applied]" and so does not provide the value of the 'col' column which >> failed the conditional update. >> >> >> >> It seems a null value is a different flavor of null than an expired >> column. Is it possible to make an update conditional on if a column is >> expired? Is this behavior expected or a bug? >> >> >> >> Thanks! >> >