You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by aw...@apache.org on 2017/11/15 21:46:34 UTC
[06/50] cassandra git commit: Add a test for CASSANDRA-13346 (#1467)
Add a test for CASSANDRA-13346 (#1467)
* Add a test for CASSANDRA-13346; Optionally make reading JMX attributes verbose or not
* Compliance with Pep8
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6f4e41e0
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6f4e41e0
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6f4e41e0
Branch: refs/heads/master
Commit: 6f4e41e04c3d48f1dbbcd0fc636e39e8d114a6be
Parents: 058b952
Author: juiceblender <le...@gmail.com>
Authored: Fri Jul 7 18:39:00 2017 +1000
Committer: Philip Thompson <pt...@gmail.com>
Committed: Fri Jul 7 10:39:00 2017 +0200
----------------------------------------------------------------------
jmx_test.py | 93 +++++++++++++++++++++++++++++++++++++++++++++-----
tools/jmxutils.py | 12 +++----
2 files changed, 90 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6f4e41e0/jmx_test.py
----------------------------------------------------------------------
diff --git a/jmx_test.py b/jmx_test.py
index 7df84ac..16c1ece 100644
--- a/jmx_test.py
+++ b/jmx_test.py
@@ -13,7 +13,6 @@ from tools.misc import generate_ssl_stores
class TestJMX(Tester):
-
def netstats_test(self):
"""
Check functioning of nodetool netstats, especially with restarts.
@@ -48,7 +47,8 @@ class TestJMX(Tester):
if not isinstance(e, ToolError):
raise
else:
- self.assertRegexpMatches(str(e), "ConnectException: 'Connection refused( \(Connection refused\))?'.")
+ self.assertRegexpMatches(str(e),
+ "ConnectException: 'Connection refused( \(Connection refused\))?'.")
self.assertTrue(running, msg='node1 never started')
@@ -69,9 +69,12 @@ class TestJMX(Tester):
debug('Version {} typeName {}'.format(version, typeName))
# TODO the keyspace and table name are capitalized in 2.0
- memtable_size = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1', name='AllMemtablesHeapSize')
- disk_size = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1', name='LiveDiskSpaceUsed')
- sstable_count = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1', name='LiveSSTableCount')
+ memtable_size = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1',
+ name='AllMemtablesHeapSize')
+ disk_size = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1',
+ name='LiveDiskSpaceUsed')
+ sstable_count = make_mbean('metrics', type=typeName, keyspace='keyspace1', scope='standard1',
+ name='LiveSSTableCount')
with JolokiaAgent(node1) as jmx:
mem_size = jmx.read_attribute(memtable_size, "Value")
@@ -88,6 +91,76 @@ class TestJMX(Tester):
sstables = jmx.read_attribute(sstable_count, "Value")
self.assertGreaterEqual(int(sstables), 1)
+ @since('3.0')
+ def mv_metric_mbeans_release_test(self):
+ """
+ Test that the right mbeans are created and released when creating mvs
+ """
+ cluster = self.cluster
+ cluster.populate(1)
+ node = cluster.nodelist()[0]
+ remove_perf_disable_shared_mem(node)
+ cluster.start(wait_for_binary_proto=True)
+
+ node.run_cqlsh(cmds="""
+ CREATE KEYSPACE mvtest WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1 };
+ CREATE TABLE mvtest.testtable (
+ foo int,
+ bar text,
+ baz text,
+ PRIMARY KEY (foo, bar)
+ );
+
+ CREATE MATERIALIZED VIEW mvtest.testmv AS
+ SELECT foo, bar, baz FROM mvtest.testtable WHERE
+ foo IS NOT NULL AND bar IS NOT NULL AND baz IS NOT NULL
+ PRIMARY KEY (foo, bar, baz);""")
+
+ table_memtable_size = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testtable',
+ name='AllMemtablesHeapSize')
+ table_view_read_time = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testtable',
+ name='ViewReadTime')
+ table_view_lock_time = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testtable',
+ name='ViewLockAcquireTime')
+ mv_memtable_size = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testmv',
+ name='AllMemtablesHeapSize')
+ mv_view_read_time = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testmv',
+ name='ViewReadTime')
+ mv_view_lock_time = make_mbean('metrics', type='Table', keyspace='mvtest', scope='testmv',
+ name='ViewLockAcquireTime')
+
+ missing_metric_message = "Table metric %s should have been registered after creating table %s" \
+ "but wasn't!"
+
+ with JolokiaAgent(node) as jmx:
+ self.assertIsNotNone(jmx.read_attribute(table_memtable_size, "Value"),
+ missing_metric_message.format("AllMemtablesHeapSize", "testtable"))
+ self.assertIsNotNone(jmx.read_attribute(table_view_read_time, "Count"),
+ missing_metric_message.format("ViewReadTime", "testtable"))
+ self.assertIsNotNone(jmx.read_attribute(table_view_lock_time, "Count"),
+ missing_metric_message.format("ViewLockAcquireTime", "testtable"))
+ self.assertIsNotNone(jmx.read_attribute(mv_memtable_size, "Value"),
+ missing_metric_message.format("AllMemtablesHeapSize", "testmv"))
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=mv_view_read_time, attribute="Count", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=mv_view_lock_time, attribute="Count", verbose=False)
+
+ node.run_cqlsh(cmds="DROP KEYSPACE mvtest;")
+ with JolokiaAgent(node) as jmx:
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=table_memtable_size, attribute="Value", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=table_view_lock_time, attribute="Count", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=table_view_read_time, attribute="Count", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=mv_memtable_size, attribute="Value", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=mv_view_lock_time, attribute="Count", verbose=False)
+ self.assertRaisesRegexp(Exception, ".*InstanceNotFoundException.*", jmx.read_attribute,
+ mbean=mv_view_read_time, attribute="Count", verbose=False)
+
def test_compactionstats(self):
"""
@jira_ticket CASSANDRA-10504
@@ -147,7 +220,8 @@ class TestJMX(Tester):
start = time.time()
max_query_timeout = 600
debug("Waiting for compaction to finish:")
- while (len(jmx.read_attribute(compaction_manager, 'CompactionSummary')) > 0) and (time.time() - start < max_query_timeout):
+ while (len(jmx.read_attribute(compaction_manager, 'CompactionSummary')) > 0) and (
+ time.time() - start < max_query_timeout):
debug(jmx.read_attribute(compaction_manager, 'CompactionSummary'))
time.sleep(2)
@@ -205,7 +279,6 @@ class TestJMX(Tester):
@since('3.9')
class TestJMXSSL(Tester):
-
keystore_password = 'cassandra'
truststore_password = 'cassandra'
@@ -247,8 +320,10 @@ class TestJMXSSL(Tester):
.format(ts=self.truststore(), ts_pwd=self.truststore_password))
# when both truststore and a keystore containing the client key are supplied, connection should succeed
- node.nodetool("info --ssl -Djavax.net.ssl.trustStore={ts} -Djavax.net.ssl.trustStorePassword={ts_pwd} -Djavax.net.ssl.keyStore={ks} -Djavax.net.ssl.keyStorePassword={ks_pwd}"
- .format(ts=self.truststore(), ts_pwd=self.truststore_password, ks=self.keystore(), ks_pwd=self.keystore_password))
+ node.nodetool(
+ "info --ssl -Djavax.net.ssl.trustStore={ts} -Djavax.net.ssl.trustStorePassword={ts_pwd} -Djavax.net.ssl.keyStore={ks} -Djavax.net.ssl.keyStorePassword={ks_pwd}"
+ .format(ts=self.truststore(), ts_pwd=self.truststore_password, ks=self.keystore(),
+ ks_pwd=self.keystore_password))
def assert_insecure_connection_rejected(self, node):
"""
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6f4e41e0/tools/jmxutils.py
----------------------------------------------------------------------
diff --git a/tools/jmxutils.py b/tools/jmxutils.py
index c910dbf..1f41626 100644
--- a/tools/jmxutils.py
+++ b/tools/jmxutils.py
@@ -225,7 +225,7 @@ class JolokiaAgent(object):
print "Output was: %s" % (exc.output,)
raise
- def _query(self, body):
+ def _query(self, body, verbose=True):
request_data = json.dumps(body)
url = 'http://%s:8778/jolokia/' % (self.node.network_interfaces['binary'][0],)
response = urlopen(url, data=request_data, timeout=10.0)
@@ -236,14 +236,14 @@ class JolokiaAgent(object):
response = json.loads(raw_response)
if response['status'] != 200:
stacktrace = response.get('stacktrace')
- if stacktrace:
+ if stacktrace and verbose:
print "Stacktrace from Jolokia error follows:"
for line in stacktrace.splitlines():
print line
raise Exception("Jolokia agent returned non-200 status: %s" % (response,))
return response
- def read_attribute(self, mbean, attribute, path=None):
+ def read_attribute(self, mbean, attribute, path=None, verbose=True):
"""
Reads a single JMX attribute.
@@ -260,10 +260,10 @@ class JolokiaAgent(object):
'attribute': attribute}
if path:
body['path'] = path
- response = self._query(body)
+ response = self._query(body, verbose=verbose)
return response['value']
- def write_attribute(self, mbean, attribute, value, path=None):
+ def write_attribute(self, mbean, attribute, value, path=None, verbose=True):
"""
Writes a values to a single JMX attribute.
@@ -284,7 +284,7 @@ class JolokiaAgent(object):
'value': value}
if path:
body['path'] = path
- self._query(body)
+ self._query(body, verbose=verbose)
def execute_method(self, mbean, operation, arguments=None):
"""
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org