[ 
https://issues.apache.org/jira/browse/CASSANDRA-8319?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

DOAN DuyHai updated CASSANDRA-8319:
-----------------------------------
    Description: 
Right now, the only way to use LWT with DELETE is to rely on the IF NOT EXISTS 
keyword

There may be some scenarios where using IF column=xxx with DELETE is relevant.

 I am preparing a hands-on with a chat application using C*. A chatroom is 
defined as:

{code:sql}
CREATE TABLE chatroom (
    room_id uuid PRIMARY KEY,
    name text,
    participants list<frozen <person>> // person is an UDT representing a 
subset of the users table);
{code}

 Right now, upon removing a participant from the room, I need to:

* count remaining participants in the room (read the participants list)
* remove the room (the whole partition) is there isn't anyone inside

 This is a read-before-write pattern, but even this does not prevent race 
conditions. Indeed, the last participant may leave the room at the same time a 
new one enters

 So using LWT with "DELETE FROM chatroom IF participants = [] WHERE room_id= 
..." may help making the removal safe

 With this design, room creation/deletion as well as participants 
addition/removal should go through LWT to be consistent. It's slow but 
participant joining and leaving event frequency is low enough compared to 
people posting messages to make the trade off not too expensive in general

  was:
Right now, the only way to use LWT with DELETE is to rely on the IF NOT EXISTS 
keyword

There may be some scenarios where using IF column=xxx with DELETE is relevant.

 I am preparing a hands-on with a chat application using C*. A chatroom is 
defined as:

{code:sql}
CREATE TABLE chatroom (
    room_id uuid PRIMARY KEY,
    name text,
    participants list<frozen <person>> // person is an UDT representing a 
subset of the users table);
{code}

 Right now, upon removing a participant from the room, I need to:

* count remaining participants in the room
* remove the room (the whole partition) is there isn't anyone inside

 This is a read-before-write pattern, but even this does not prevent race 
conditions. Indeed, the last participant may leave the room at the same time a 
new one enters

 So using LWT with "DELETE FROM chatroom IF participants = [] WHERE room_id= 
..." may help making the removal safe


> Allow CAS DELETE with column comparison
> ---------------------------------------
>
>                 Key: CASSANDRA-8319
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8319
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: API, Core
>            Reporter: DOAN DuyHai
>            Priority: Minor
>             Fix For: 2.1.2
>
>
> Right now, the only way to use LWT with DELETE is to rely on the IF NOT 
> EXISTS keyword
> There may be some scenarios where using IF column=xxx with DELETE is relevant.
>  I am preparing a hands-on with a chat application using C*. A chatroom is 
> defined as:
> {code:sql}
> CREATE TABLE chatroom (
>     room_id uuid PRIMARY KEY,
>     name text,
>     participants list<frozen <person>> // person is an UDT representing a 
> subset of the users table);
> {code}
>  Right now, upon removing a participant from the room, I need to:
> * count remaining participants in the room (read the participants list)
> * remove the room (the whole partition) is there isn't anyone inside
>  This is a read-before-write pattern, but even this does not prevent race 
> conditions. Indeed, the last participant may leave the room at the same time 
> a new one enters
>  So using LWT with "DELETE FROM chatroom IF participants = [] WHERE room_id= 
> ..." may help making the removal safe
>  With this design, room creation/deletion as well as participants 
> addition/removal should go through LWT to be consistent. It's slow but 
> participant joining and leaving event frequency is low enough compared to 
> people posting messages to make the trade off not too expensive in general



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to