[ https://issues.apache.org/jira/browse/CASSANDRA-14304?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16412654#comment-16412654 ]
DOAN DuyHai commented on CASSANDRA-14304: ----------------------------------------- Hints: 1) LWT operations are using the ballot based on an agreement of timestamp value between QUORUM of replicas. It can happens that the timestamp is slightly incremented (some microsecs) in case of conflict/contention on the cluster. The consequence is that the timestamp used for LWT can be slightly (again in microsecs) in the future. Read the source code to check the part of the code responsible for ballot agreement with Paxos 2) For the DELETE request: a) it can use the <current> timestamp, which can belong to the "past" with respect to the one used by LWT, thus SELECT does return a value b) it can hit a 3rd replica not involved in the previous LWT (remember LWT only uses QUORUM) and the clock of this 3rd replica is slighly in the past. Solution a. use INSERT INTO ... IF NOT EXISTS b. use DELETE using QUORUM > DELETE after INSERT IF NOT EXISTS does not work > ----------------------------------------------- > > Key: CASSANDRA-14304 > URL: https://issues.apache.org/jira/browse/CASSANDRA-14304 > Project: Cassandra > Issue Type: Bug > Components: Core > Reporter: Julien > Assignee: Vinay Chella > Priority: Major > Attachments: debug.log, system.log > > > DELETE a row immediately after INSERT IF NOT EXISTS does not work. > Can be reproduced with this CQL script: > {code:java} > CREATE KEYSPACE ks WITH REPLICATION = { 'class' : 'SimpleStrategy', > 'replication_factor' : 1 }; > CREATE TABLE ks.ta ( id text PRIMARY KEY, col text ); > INSERT INTO ks.ta (id, col) VALUES ('myId', 'myCol') IF NOT EXISTS; > DELETE FROM ks.ta WHERE id = 'myId'; > SELECT * FROM ks.ta WHERE id='myId'; > {code} > {code:java} > [cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4] > Use HELP for help. > WARNING: pyreadline dependency missing. Install to enable tab completion. > cqlsh> CREATE KEYSPACE ks WITH REPLICATION = { 'class' : 'SimpleStrategy', > 'replication_factor' : 1 }; > cqlsh> CREATE TABLE ks.ta ( id text PRIMARY KEY, col text ); > cqlsh> INSERT INTO ks.ta (id, col) VALUES ('myId', 'myCol') IF NOT EXISTS; > [applied] > ----------- > True > cqlsh> DELETE FROM ks.ta WHERE id = 'myId'; > cqlsh> SELECT * FROM ks.ta WHERE id='myId'; > id | col > ------+------- > myId | myCol > {code} > * Only happens if the client is on a different host (works as expected on > the same host) > * Works as expected without IF NOT EXISTS > * A ~500 ms delay between INSERT and DELETE fixes the issue. > Logs attached. -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org