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