CASSANDRA-13294
Project: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/commit/eb3b5749 Tree: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/tree/eb3b5749 Diff: http://git-wip-us.apache.org/repos/asf/cassandra-dtest/diff/eb3b5749 Branch: refs/heads/master Commit: eb3b5749ef4f22460365ad8369ff668d68c5d85b Parents: 6bb074f Author: Marcus Eriksson <marc...@apache.org> Authored: Mon Mar 6 14:38:14 2017 +0100 Committer: Philip Thompson <ptnapol...@gmail.com> Committed: Mon Mar 6 09:56:46 2017 -0500 ---------------------------------------------------------------------- upgrade_tests/regression_test.py | 70 +++++++++++++++++++++++++++++++++++ upgrade_tests/upgrade_base.py | 10 +++++ 2 files changed, 80 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra-dtest/blob/eb3b5749/upgrade_tests/regression_test.py ---------------------------------------------------------------------- diff --git a/upgrade_tests/regression_test.py b/upgrade_tests/regression_test.py index 14a17f7..cff3c50 100644 --- a/upgrade_tests/regression_test.py +++ b/upgrade_tests/regression_test.py @@ -7,9 +7,15 @@ from cassandra import ConsistencyLevel as CL from nose.tools import assert_not_in from dtest import RUN_STATIC_UPGRADE_MATRIX +from tools.jmxutils import (JolokiaAgent, make_mbean) from upgrade_base import UpgradeTester from upgrade_manifest import build_upgrade_pairs +import glob +import os +import re +import time + class TestForRegressions(UpgradeTester): """ @@ -60,6 +66,70 @@ class TestForRegressions(UpgradeTester): count = s[1].execute("select count(*) from financial.symbol_history where symbol='{}' and year={};".format(symbol, year))[0][0] self.assertEqual(count, expected_rows, "actual {} did not match expected {}".format(count, expected_rows)) + def test13294(self): + """ + Tests upgrades with files having a bunch of files with the same prefix as another file + + this file is then compacted and we verify that no other sstables are removed + + @jira_ticket CASSANDRA-13294 + """ + cluster = self.cluster + cluster.set_datadir_count(1) # we want the same prefix for all sstables + session = self.prepare(jolokia=True) + session.execute("CREATE KEYSPACE test13294 WITH replication={'class':'SimpleStrategy', 'replication_factor': 2};") + session.execute("CREATE TABLE test13294.t (id int PRIMARY KEY, d int) WITH compaction = {'class': 'SizeTieredCompactionStrategy','enabled':'false'}") + for x in xrange(0, 5): + session.execute("INSERT INTO test13294.t (id, d) VALUES (%d, %d)" % (x, x)) + cluster.flush() + + node1 = cluster.nodelist()[0] + + sstables = node1.get_sstables('test13294', 't') + node1.stop(wait_other_notice=True) + generation_re = re.compile(r'(.*-)(\d+)(-.*)') + mul = 1 + first_sstable = '' + for sstable in sstables: + res = generation_re.search(sstable) + if res: + glob_for = "%s%s-*" % (res.group(1), res.group(2)) + for f in glob.glob(glob_for): + res2 = generation_re.search(f) + new_filename = "%s%s%s" % (res2.group(1), mul, res2.group(3)) + os.rename(f, new_filename) + if first_sstable == '' and '-Data' in new_filename: + first_sstable = new_filename # we should compact this + mul = mul * 10 + node1.start(wait_other_notice=True) + sessions = self.do_upgrade(session) + checked = False + for is_upgraded, cursor in sessions: + if is_upgraded: + sstables_before = self.get_all_sstables(node1) + self.compact_sstable(node1, first_sstable) + time.sleep(2) # wait for sstables to get physically removed + sstables_after = self.get_all_sstables(node1) + # since autocompaction is disabled and we compact a single sstable above + # the number of sstables after should be the same as before. + self.assertEquals(len(sstables_before), len(sstables_after)) + checked = True + self.assertTrue(checked) + + def compact_sstable(self, node, sstable): + mbean = make_mbean('db', type='CompactionManager') + with JolokiaAgent(node) as jmx: + jmx.execute_method(mbean, 'forceUserDefinedCompaction', [sstable]) + + def get_all_sstables(self, node): + # note that node.get_sstables(...) only returns current version sstables + keyspace_dirs = [os.path.join(node.get_path(), "data{0}".format(x), "test13294") for x in xrange(0, node.cluster.data_dir_count)] + files = [] + for d in keyspace_dirs: + for f in glob.glob(d + "/*/*Data*"): + files.append(f) + return files + for path in build_upgrade_pairs(): gen_class_name = TestForRegressions.__name__ + path.name http://git-wip-us.apache.org/repos/asf/cassandra-dtest/blob/eb3b5749/upgrade_tests/upgrade_base.py ---------------------------------------------------------------------- diff --git a/upgrade_tests/upgrade_base.py b/upgrade_tests/upgrade_base.py index 3d44cef..6d37468 100644 --- a/upgrade_tests/upgrade_base.py +++ b/upgrade_tests/upgrade_base.py @@ -5,6 +5,7 @@ from abc import ABCMeta from unittest import skipIf from ccmlib.common import get_version_from_build, is_win +from tools.jmxutils import remove_perf_disable_shared_mem from dtest import CASSANDRA_VERSION_FROM_BUILD, DEBUG, Tester, debug, create_ks @@ -60,6 +61,7 @@ class UpgradeTester(Tester): self.ignore_log_patterns = self.ignore_log_patterns[:] + [ r'RejectedExecutionException.*ThreadPoolExecutor has shut down', # see CASSANDRA-12364 ] + self.enable_for_jolokia = False super(UpgradeTester, self).__init__(*args, **kwargs) def setUp(self): @@ -99,6 +101,10 @@ class UpgradeTester(Tester): cluster.populate(nodes) node1 = cluster.nodelist()[0] cluster.set_install_dir(version=self.UPGRADE_PATH.starting_version) + self.enable_for_jolokia = kwargs.pop('jolokia', False) + if self.enable_for_jolokia: + remove_perf_disable_shared_mem(node1) + cluster.start(wait_for_binary_proto=True) node1 = cluster.nodelist()[0] @@ -157,6 +163,10 @@ class UpgradeTester(Tester): 'with Cassandra version {}'.format(self.protocol_version, new_version_from_build)) node1.set_log_level("DEBUG" if DEBUG else "INFO") node1.set_configuration_options(values={'internode_compression': 'none'}) + + if self.enable_for_jolokia: + remove_perf_disable_shared_mem(node1) + node1.start(wait_for_binary_proto=True, wait_other_notice=True) sessions_and_meta = [] --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org