Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
Normal
Description
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:
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")
However, the dtest passes if we remove the LIMIT 1.
Short read protection uses a SinglePartitionReadCommand, maybe it should use a PartitionRangeReadCommand instead?