[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16180588#comment-16180588 ] Aleksey Yeschenko commented on CASSANDRA-13595: --- [3.0 branch|https://github.com/iamaleksey/cassandra/commits/13595-3.0], [a new dtest|https://github.com/iamaleksey/cassandra-dtest/commits/13595], [CircleCI run|https://circleci.com/gh/iamaleksey/cassandra/41], [dtest run|https://builds.apache.org/view/A-D/view/Cassandra/job/Cassandra-devbranch-dtest/335/testReport/]. utests have he usual circle issues with {{RemoveTest}} and {{ViewComplexTest}}, dtests have mostly the git clone issue again with some of the tests. Everything relevant seems to be passing. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: Aleksey Yeschenko > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16177633#comment-16177633 ] ZhaoYang commented on CASSANDRA-13595: -- Thanks for the feedback. Feel free to take over. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16176664#comment-16176664 ] Aleksey Yeschenko commented on CASSANDRA-13595: --- Ok first cut, but there are some major issues with it. 1. You can't rely on the class of the command to determine if it's a single partition or a range read command. We do use range read commands for indexed queries even when the partition key is set. See CASSANDRA-11617 and CASSANDRA-11872 for some more context. 2. You cannot use {{command.limits().forShortReadRetry()}} method for the new limits here. It wasn't written with ranged reads in mind, and does among other things throw away the per partition limit - not what you want to happen. 3. The command created doesn't get passed original {{command.isForThrift()}} and hardcodes it as {{false}}. This was an issue with row-level SRP as well, but I fixed it yesterday. Should be using {{PartitionRangeReadCommand.withUpdatedLimitsAndDataRange()}} instead. As a bonus, it preserves the correct {{indexMetadata}} so you don't have to do an extra lookup. 4. I don't think that new range calculation is correct, and accounts for collisions of multiple partitions keys mapping to tokens. 5. {{shouldDoPartitionShortReadProtection()}} can be written a lot simpler, and some is redundant. {{if (mergedResultCounter.counted() >= command.limits().count())}} can't ever be true (but also is equivalent to {{if (mergedResultCounter.isDone())}}). The only meaningful thing you can do here is {code} // if the returned partition doesn't have enough partitions/rows to satisfy even the original limit, don't ask for more if (!singleResultCounter.isDone()) return null; {code} , to be honest. 6. I'm not a huge fan of the way {{expectedRows}} is shared between two protections, and am not sure it's correct. 7. The metric for SRP requests isn't being incremented. I have a version of this that fixes most of these. Needs some more work and manual testing, and eventually approval. It's a bit urgent for me, so do you mind if I take it over from this point? Thanks. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029)
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16173532#comment-16173532 ] Aleksey Yeschenko commented on CASSANDRA-13595: --- [~jasonstack] My current thinking is that as bad as this is, fixing in 3.0+ is fine. You need to upgrade to get the fix though. Can you rebase based on the latest 3.0, though - with CASSANDRA-13794 committed? Then we can take it from there. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16165589#comment-16165589 ] ZhaoYang commented on CASSANDRA-13595: -- [~jjirsa] thanks, I will move to new repo. [~iamaleksey] I haven't looked at 2.2 yet, just started off with 3.0, will do that after you finalized 13794, 12872. bq. Does it count as critical? As a user, yes.. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16164912#comment-16164912 ] Aleksey Yeschenko commented on CASSANDRA-13595: --- [~jasonstack] Yours is not a duplicate, I'd just recommend holding it off a bit until the fixes for CASSANDRA-13794 and CASSANDRA-12872 get in. The code you've submitted doesn't seem very far off of what it should be, either. I will probably review/collaborate after I'm done with the other two tickets. But this is 3.0. Have you looked into 2.1? I'm not sure how I feel about committing it to 2.1. On one hand, it's a huge correctness issues. Does it count as critical? > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16164885#comment-16164885 ] Jeff Jirsa commented on CASSANDRA-13595: Quick note that the dtest repo has moved to [apache/cassandra-dtest|https://github.com/apache/cassandra-dtest] - so we should move [e706952e|https://github.com/riptano/cassandra-dtest/commit/e706952e8d3bb18af1f96cb0cfc283e53260513e] over to the new repo > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16164833#comment-16164833 ] ZhaoYang commented on CASSANDRA-13595: -- [~iamaleksey] Thanks for the heads up. | Source | | [3.0|https://github.com/jasonstack/cassandra/commits/13595-3.0] | | [dtest|https://github.com/riptano/cassandra-dtest/commits/13595] | Here is draft of making {{ShortReadProtection}} extend {{MorePartitions}}. If you have better solution or integration, feel free to mark it as duplicated. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16164502#comment-16164502 ] Aleksey Yeschenko commented on CASSANDRA-13595: --- bq. The idea is to extend current ShortReadProtection function with across-partition support. Correct. Short read protection hasn't been implemented properly for range reads, which causes correctness issues in particular with paging. I'm currently addressing the few outstanding issues with single partition short reads on 3.0 and above (CASSANDRA-13794, CASSANDRA-12872). This would be an extension of that work, I guess - or at least there is strong overlap. Feel free to give it a go though - however it may or may not have to be altered afterwards to harmonise both implementations. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16164449#comment-16164449 ] ZhaoYang commented on CASSANDRA-13595: -- It seems that current ShortReadProtection only supports the same partition. The idea is to extend current ShortReadProtection function with across-partition support. If {{current response (UnfilteredPartitionIterator)}} reached the end and its last key is "behind" (token smaller than) other responses' current key, we will do a {{PartitionRange retry}} from the last key to make sure no response is falling short of unfetched partitions. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > Labels: Correctness > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13595) Short read protection doesn't work at the end of a partition
[ https://issues.apache.org/jira/browse/CASSANDRA-13595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16162720#comment-16162720 ] ZhaoYang commented on CASSANDRA-13595: -- The cause is no short-read-protection generated for node2 with key=2, because no UnfilteredRowIterator with key=2 for node2... {code} For initial read: Node1 returns: PartitionIterator { UnfilteredIterator( k=1@tombstone, back by short-read-protection) UnfilteredIterator( k=2, back by short-read-protection) } Node2 returns: PartitionIterator { UnfilteredIterator( k=1, back by short-read-protection) } {code} I think in this case, we should expect paging to fetch next partition instead of short-read-protection which seems work only within partition, not across partition. > Short read protection doesn't work at the end of a partition > > > Key: CASSANDRA-13595 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13595 > Project: Cassandra > Issue Type: Bug > Components: Coordination >Reporter: Andrés de la Peña >Assignee: ZhaoYang > > It seems that short read protection doesn't work when the short read is done > at the end of a partition in a range query. The final assertion of this dtest > fails: > {code} > def short_read_partitions_delete_test(self): > cluster = self.cluster > cluster.set_configuration_options(values={'hinted_handoff_enabled': > False}) > cluster.set_batch_commitlog(enabled=True) > cluster.populate(2).start(wait_other_notice=True) > node1, node2 = self.cluster.nodelist() > session = self.patient_cql_connection(node1) > create_ks(session, 'ks', 2) > session.execute("CREATE TABLE t (k int, c int, PRIMARY KEY(k, c)) > WITH read_repair_chance = 0.0") > # we write 1 and 2 in a partition: all nodes get it. > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (1, 1)", > consistency_level=ConsistencyLevel.ALL)) > session.execute(SimpleStatement("INSERT INTO t (k, c) VALUES (2, 1)", > consistency_level=ConsistencyLevel.ALL)) > # we delete partition 1: only node 1 gets it. > node2.flush() > node2.stop(wait_other_notice=True) > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 1")) > node2.start(wait_other_notice=True) > # we delete partition 2: only node 2 gets it. > node1.flush() > node1.stop(wait_other_notice=True) > session = self.patient_cql_connection(node2, 'ks', > consistency_level=ConsistencyLevel.ONE) > session.execute(SimpleStatement("DELETE FROM t WHERE k = 2")) > node1.start(wait_other_notice=True) > # read from both nodes > session = self.patient_cql_connection(node1, 'ks', > consistency_level=ConsistencyLevel.ALL) > assert_none(session, "SELECT * FROM t LIMIT 1") > {code} > However, the dtest passes if we remove the {{LIMIT 1}}. > Short read protection [uses a > {{SinglePartitionReadCommand}}|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/service/DataResolver.java#L484], > maybe it should use a {{PartitionRangeReadCommand}} instead? -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org