blob: 42c27e37c2b368c256634b95c2b5d2f809556039 [file] [log] [blame]
import time
import logging
from dtest import Tester, create_ks, create_cf
from tools.data import rows_to_list
from tools.jmxutils import (JolokiaAgent, make_mbean)
logger = logging.getLogger(__name__)
class TestDeletion(Tester):
def test_gc(self):
"""
Test that tombstone purging doesn't bring back deleted data by writing
2 rows to a table with gc_grace=0, deleting one of those rows, then
asserting that it isn't present in the results of SELECT *, before and
after a flush and compaction.
"""
cluster = self.cluster
cluster.populate(1).start()
[node1] = cluster.nodelist()
time.sleep(.5)
session = self.patient_cql_connection(node1)
create_ks(session, 'ks', 1)
create_cf(session, 'cf', gc_grace=0, key_type='int', columns={'c1': 'int'})
session.execute('insert into cf (key, c1) values (1,1)')
session.execute('insert into cf (key, c1) values (2,1)')
node1.flush()
assert rows_to_list(session.execute('select * from cf;')) == [[1, 1], [2, 1]]
session.execute('delete from cf where key=1')
assert rows_to_list(session.execute('select * from cf;')) == [[2, 1]]
node1.flush()
time.sleep(.5)
node1.compact()
time.sleep(.5)
assert rows_to_list(session.execute('select * from cf;')) == [[2, 1]]
def test_tombstone_size(self):
self.cluster.populate(1)
self.cluster.start()
[node1] = self.cluster.nodelist()
session = self.patient_cql_connection(node1)
create_ks(session, 'ks', 1)
session.execute('CREATE TABLE test (i int PRIMARY KEY)')
stmt = session.prepare('DELETE FROM test where i = ?')
for i in range(100):
session.execute(stmt, [i])
assert memtable_count(node1, 'ks', 'test') == 100
assert memtable_size(node1, 'ks', 'test') > 0
def memtable_size(node, keyspace, table):
return table_metric(node, keyspace, table, 'MemtableOnHeapSize')
def memtable_count(node, keyspace, table):
return table_metric(node, keyspace, table, 'MemtableColumnsCount')
def table_metric(node, keyspace, table, name):
version = node.get_cassandra_version()
typeName = "ColumnFamily" if version < '3.0' else 'Table'
with JolokiaAgent(node) as jmx:
mbean = make_mbean('metrics', type=typeName,
name=name, keyspace=keyspace, scope=table)
value = jmx.read_attribute(mbean, 'Value')
return value