Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-13595

Implement short read protection on partition boundaries

    XMLWordPrintableJSON

Details

    • 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?

      Attachments

        Activity

          People

            aleksey Aleksey Yeschenko
            adelapena Andres de la Peña
            Aleksey Yeschenko
            Sam Tunnicliffe
            Votes:
            0 Vote for this issue
            Watchers:
            9 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: