Repository: cassandra-dtest Updated Branches: refs/heads/master 894bc92c9 -> b724df80d
Added test to verify indexes are not rebuilt at startup if not actually needed. Project: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/commit/b724df80 Tree: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/tree/b724df80 Diff: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/diff/b724df80 Branch: refs/heads/master Commit: b724df80d3bbb55b6b41845633e3a9034116f3be Parents: 894bc92 Author: Sergio Bossa <sergio.bo...@gmail.com> Authored: Mon Jul 24 14:08:32 2017 +0100 Committer: Sergio Bossa <sergio.bo...@gmail.com> Committed: Tue Jul 25 18:47:50 2017 +0100 ---------------------------------------------------------------------- secondary_indexes_test.py | 69 ++++++++++++------------------------------ tools/data.py | 18 ++++++++++- 2 files changed, 37 insertions(+), 50 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra-dtest/blob/b724df80/secondary_indexes_test.py ---------------------------------------------------------------------- diff --git a/secondary_indexes_test.py b/secondary_indexes_test.py index 1edd30e..11cd3af 100644 --- a/secondary_indexes_test.py +++ b/secondary_indexes_test.py @@ -14,11 +14,10 @@ from cassandra.query import BatchStatement, SimpleStatement from dtest import (DISABLE_VNODES, OFFHEAP_MEMTABLES, DtestTimeoutError, Tester, debug, CASSANDRA_VERSION_FROM_BUILD, create_ks, create_cf) from tools.assertions import assert_bootstrap_state, assert_invalid, assert_none, assert_one, assert_row_count -from tools.data import index_is_built, rows_to_list +from tools.data import block_until_index_is_built, index_is_built, rows_to_list from tools.decorators import since from tools.misc import new_node - class TestSecondaryIndexes(Tester): @staticmethod @@ -306,28 +305,14 @@ class TestSecondaryIndexes(Tester): lookup_value = session.execute('select "C0" from standard1 limit 1')[0].C0 session.execute('CREATE INDEX ix_c0 ON standard1("C0");') - start = time.time() - while time.time() < start + 30: - debug("waiting for index to build") - time.sleep(1) - if index_is_built(node1, session, 'keyspace1', 'standard1', 'ix_c0'): - break - else: - raise DtestTimeoutError() + block_until_index_is_built(node1, session, 'keyspace1', 'standard1', 'ix_c0') stmt = session.prepare('select * from standard1 where "C0" = ?') self.assertEqual(1, len(list(session.execute(stmt, [lookup_value])))) before_files = self._index_sstables_files(node1, 'keyspace1', 'standard1', 'ix_c0') node1.nodetool("rebuild_index keyspace1 standard1 ix_c0") - start = time.time() - while time.time() < start + 30: - debug("waiting for index to rebuild") - time.sleep(1) - if index_is_built(node1, session, 'keyspace1', 'standard1', 'ix_c0'): - break - else: - raise DtestTimeoutError() + block_until_index_is_built(node1, session, 'keyspace1', 'standard1', 'ix_c0') after_files = self._index_sstables_files(node1, 'keyspace1', 'standard1', 'ix_c0') self.assertNotEqual(before_files, after_files) @@ -447,39 +432,39 @@ class TestSecondaryIndexes(Tester): 'Cannot execute this query as it might involve data filtering') @since('4.0') - def test_index_is_not_always_rebuilt_at_start(self): + def test_index_is_not_rebuilt_at_restart(self): """ - @jira_ticket CASSANDRA-10130 + @jira_ticket CASSANDRA-13725 - Tests the management of index status during manual index rebuilding failures. + Tests the index is not rebuilt at restart if already built. """ cluster = self.cluster - cluster.populate(1, install_byteman=True).start(wait_for_binary_proto=True) + cluster.populate(1).start(wait_for_binary_proto=True) node = cluster.nodelist()[0] session = self.patient_cql_connection(node) create_ks(session, 'k', 1) session.execute("CREATE TABLE k.t (k int PRIMARY KEY, v int)") - session.execute("CREATE INDEX idx ON k.t(v)") session.execute("INSERT INTO k.t(k, v) VALUES (0, 1)") - session.execute("INSERT INTO k.t(k, v) VALUES (2, 3)") - # Verify that the index is marked as built and it can answer queries + debug("Create the index") + session.execute("CREATE INDEX idx ON k.t(v)") + block_until_index_is_built(node, session, 'k', 't', 'idx') + before_files = self._index_sstables_files(node, 'k', 't', 'idx') + + debug("Verify the index is marked as built and it can be queried") assert_one(session, """SELECT * FROM system."IndexInfo" WHERE table_name='k'""", ['k', 'idx']) assert_one(session, "SELECT * FROM k.t WHERE v = 1", [0, 1]) - # Restart the node to trigger any eventual undesired index rebuild - before_files = self._index_sstables_files(node, 'k', 't', 'idx') - node.nodetool('drain') + debug("Restart the node and verify the index build is not submitted") node.stop() - cluster.start() - session = self.patient_cql_connection(node) - session.execute("USE k") + node.start(wait_for_binary_proto=True) after_files = self._index_sstables_files(node, 'k', 't', 'idx') + self.assertEqual(before_files, after_files) - # Verify that, the index is not rebuilt, marked as built, and it can answer queries - self.assertNotEqual(before_files, after_files) + debug("Verify the index is still marked as built and it can be queried") + session = self.patient_cql_connection(node) assert_one(session, """SELECT * FROM system."IndexInfo" WHERE table_name='k'""", ['k', 'idx']) assert_one(session, "SELECT * FROM k.t WHERE v = 1", [0, 1]) @@ -610,14 +595,7 @@ class TestSecondaryIndexes(Tester): session.execute("CREATE INDEX composites_index on ks.regular_table (b)") for node in cluster.nodelist(): - start = time.time() - while time.time() < start + 10: - debug("waiting for index to build") - time.sleep(1) - if index_is_built(node, session, 'ks', 'regular_table', 'composites_index'): - break - else: - raise DtestTimeoutError() + block_until_index_is_built(node, session, 'ks', 'regular_table', 'composites_index') insert_args = [(i, i % 2) for i in xrange(100)] execute_concurrent_with_args(session, @@ -1067,14 +1045,7 @@ class TestSecondaryIndexesOnCollections(Tester): stmt = "CREATE INDEX user_uuids_values on map_index_search.users (uuids);" session.execute(stmt) - start = time.time() - while time.time() < start + 30: - debug("waiting for index to build") - time.sleep(1) - if index_is_built(node1, session, 'map_index_search', 'users', 'user_uuids_values'): - break - else: - raise DtestTimeoutError() + block_until_index_is_built(node1, session, 'map_index_search', 'users', 'user_uuids_values') # shuffle the log in-place, and double-check a slice of records by querying the secondary index random.shuffle(log) http://git-wip-us.apache.org/repos/asf/cassandra-dtest/blob/b724df80/tools/data.py ---------------------------------------------------------------------- diff --git a/tools/data.py b/tools/data.py index e1a3cfc..597a10c 100644 --- a/tools/data.py +++ b/tools/data.py @@ -6,7 +6,8 @@ from cassandra.query import SimpleStatement from nose.tools import assert_equal, assert_true import assertions -from dtest import create_cf +from dtest import debug, create_cf, DtestTimeoutError +from tools.funcutils import get_rate_limited_function def create_c1c2_table(tester, session, read_repair=None): @@ -149,3 +150,18 @@ def index_is_built(node, session, keyspace, table_name, idx_name): full_idx_name = idx_name if node.get_cassandra_version() > '3.0' else '{}.{}'.format(table_name, idx_name) index_query = """SELECT * FROM system."IndexInfo" WHERE table_name = '{}' AND index_name = '{}'""".format(keyspace, full_idx_name) return len(list(session.execute(index_query))) == 1 + +def block_until_index_is_built(node, session, keyspace, table_name, idx_name): + """ + Waits up to 30 seconds for a secondary index to be built, and raises + DtestTimeoutError if it is not. + """ + start = time.time() + rate_limited_debug = get_rate_limited_function(debug, 5) + while time.time() < start + 30: + rate_limited_debug("waiting for index to build") + time.sleep(1) + if index_is_built(node, session, keyspace, table_name, idx_name): + break + else: + raise DtestTimeoutError() \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org