You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by J Robert Ray <jr...@gmail.com> on 2014/02/25 08:09:39 UTC

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!

Re: Mixing CAS and TTL.

Posted by J Robert Ray <jr...@gmail.com>.
Good to hear, thanks. I didn't find that in my searches.
On Feb 25, 2014 3:13 AM, "Sylvain Lebresne" <sy...@datastax.com> wrote:

> 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 <jr...@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" <da...@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:jrobertray@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!
>>>
>>
>

Re: Mixing CAS and TTL.

Posted by Sylvain Lebresne <sy...@datastax.com>.
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 <jr...@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" <da...@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:jrobertray@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!
>>
>

RE: Mixing CAS and TTL.

Posted by J Robert Ray <jr...@gmail.com>.
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" <da...@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:jrobertray@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!
>

RE: Mixing CAS and TTL.

Posted by Daniel Shelepov <da...@timefork.com>.
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:jrobertray@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!