This is an automated email from the ASF dual-hosted git repository. smiklosovic pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra-dtest.git
The following commit(s) were added to refs/heads/trunk by this push: new e1dee91 Emit a metric for number of local read and write calls e1dee91 is described below commit e1dee91f897b37debb6e044cd15644f93ddbe146 Author: Stefan Miklosovic <smikloso...@apache.org> AuthorDate: Tue Dec 7 19:35:39 2021 +0100 Emit a metric for number of local read and write calls patch by Damien Stevenson; reviewed by Stefan Miklosovic and Brandon Williams for CASSANDRA-10023 --- client_request_metrics_local_remote_test.py | 211 ++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/client_request_metrics_local_remote_test.py b/client_request_metrics_local_remote_test.py new file mode 100644 index 0000000..8b412a3 --- /dev/null +++ b/client_request_metrics_local_remote_test.py @@ -0,0 +1,211 @@ +from dtest import Tester, create_ks +from tools.jmxutils import JolokiaAgent, make_mbean +import pytest + +since = pytest.mark.since + + +@since('4.1') +class TestClientRequestMetricsLocalRemote(Tester): + + def test_write_and_read(self): + session, node = setup(self) + + read_metrics = ClientRequestMetricsContainer(node, 'Read') + write_metrics = ClientRequestMetricsContainer(node, 'Write') + + # Get initial results: + r1_r = ClientRequestMetricsSnapshot(read_metrics) + r1_w = ClientRequestMetricsSnapshot(write_metrics) + + # Run Write test: + for i in murmur3_hashes.keys(): + session.execute( + "INSERT INTO ks.test (id, ord, val) VALUES ({}, 1, 'aaaa');".format(i) + ) + + # Collect results: + r2_r = ClientRequestMetricsSnapshot(read_metrics) + r2_w = ClientRequestMetricsSnapshot(write_metrics) + + # Run Read test: + for i in murmur3_hashes.keys(): + session.execute( + "SELECT (id, ord, val) FROM ks.test WHERE id={};".format(i) + ) + + # Collect results: + r3_r = ClientRequestMetricsSnapshot(read_metrics) + r3_w = ClientRequestMetricsSnapshot(write_metrics) + + # Note: There are requests to system_auth.roles table which adds + # noise to the Read.LocalRequests mbean. + # Therefore, it is assumed that Read.LocalRequests >= the expected value + assert expected_local_requests == (r2_w.local_requests - r1_w.local_requests) + assert expected_remote_requests == (r2_w.remote_requests - r1_w.remote_requests) + assert 0 <= (r2_r.local_requests - r1_r.local_requests) + assert 0 == (r2_r.remote_requests - r1_r.remote_requests) + + assert 0 == (r3_w.local_requests - r2_w.local_requests) + assert 0 == (r3_w.remote_requests - r2_w.remote_requests) + assert expected_local_requests <= (r3_r.local_requests - r2_r.local_requests) + assert expected_remote_requests == (r3_r.remote_requests - r2_r.remote_requests) + + def test_batch_and_slice(self): + session, node = setup(self) + + read_metrics = ClientRequestMetricsContainer(node, 'Read') + write_metrics = ClientRequestMetricsContainer(node, 'Write') + + # Get initial results: + r1_r = ClientRequestMetricsSnapshot(read_metrics) + r1_w = ClientRequestMetricsSnapshot(write_metrics) + + # Run batch test: + query = 'BEGIN BATCH ' + for i in murmur3_hashes.keys(): + for y in range(0, 100): + query += "INSERT INTO ks.test (id, ord, val) VALUES ({}, {}, 'aaa')".format(i, y) + query += 'APPLY BATCH;' + session.execute(query) + + # Collect results: + r2_r = ClientRequestMetricsSnapshot(read_metrics) + r2_w = ClientRequestMetricsSnapshot(write_metrics) + + # Run read range test: + for i in murmur3_hashes.keys(): + session.execute(""" + SELECT (id, ord, val) FROM ks.test + WHERE id={} + AND ord > 0 + AND ord < 100; + """.format(i)) + # Collect results: + r3_r = ClientRequestMetricsSnapshot(read_metrics) + r3_w = ClientRequestMetricsSnapshot(write_metrics) + + # Note: There are requests to system_auth.roles table which adds + # noise to the Read.LocalRequests mbean. + # Therefore, it is assumed that Read.LocalRequests >= the expected value + assert expected_local_requests == (r2_w.local_requests - r1_w.local_requests) + assert expected_remote_requests == (r2_w.remote_requests - r1_w.remote_requests) + assert 0 <= (r2_r.local_requests - r1_r.local_requests) + assert 0 == (r2_r.remote_requests - r1_r.remote_requests) + + assert 0 == (r3_w.local_requests - r2_w.local_requests) + assert 0 == (r3_w.remote_requests - r2_w.remote_requests) + assert expected_local_requests <= (r3_r.local_requests - r2_r.local_requests) + assert expected_remote_requests == (r3_r.remote_requests - r2_r.remote_requests) + + def test_paxos(self): + session, node = setup(self) + + read_metrics = ClientRequestMetricsContainer(node, 'Read') + write_metrics = ClientRequestMetricsContainer(node, 'Write') + + # Get initial results: + r1_r = ClientRequestMetricsSnapshot(read_metrics) + r1_w = ClientRequestMetricsSnapshot(write_metrics) + + # Run write test: + for i in murmur3_hashes.keys(): + session.execute( + "UPDATE ks.test SET val='aaa' WHERE id={} AND ord=0".format(i) + ) + + # Collect results: + r2_r = ClientRequestMetricsSnapshot(read_metrics) + r2_w = ClientRequestMetricsSnapshot(write_metrics) + + # Note: There are requests to system_auth.roles table which adds + # noise to the Read.LocalRequests mbean. + # Therefore, it is assumed that Read.LocalRequests >= the expected value + assert expected_local_requests == (r2_w.local_requests - r1_w.local_requests) + assert expected_remote_requests == (r2_w.remote_requests - r1_w.remote_requests) + assert 0 <= (r2_r.local_requests - r1_r.local_requests) + assert 0 == (r2_r.remote_requests - r1_r.remote_requests) + + +murmur3_hashes = { + 5: -7509452495886106294, + 10: -6715243485458697746, + 16: -5477287129830487822, + 13: -5034495173465742853, + 11: -4156302194539278891, + 1: -4069959284402364209, + 19: -3974532302236993209, + 8: -3799847372828181882, + 2: -3248873570005575792, + 4: -2729420104000364805, + 18: -2695747960476065067, + 15: -1191135763843456182, + 20: 1388667306199997068, + 7: 1634052884888577606, + 6: 2705480034054113608, + 9: 3728482343045213994, + 14: 4279681877540623768, + 17: 5467144456125416399, + 12: 8582886034424406875, + 3: 9010454139840013625 +} + +expected_local_requests = 8 +expected_remote_requests = 12 + + +class ClientRequestMetricsContainer: + + def __init__(self, node, scope): + self.node = node + + self.local_requests_mbean = make_mbean( + 'metrics', + type='ClientRequest', + scope=scope, + name='LocalRequests' + ) + + self.remote_requests_mbean = make_mbean( + 'metrics', + type='ClientRequest', + scope=scope, + name='RemoteRequests' + ) + + def get_local_requests(self): + with JolokiaAgent(self.node) as jmx: + return jmx.read_attribute(self.local_requests_mbean, 'Count') + + def get_remote_requests(self): + with JolokiaAgent(self.node) as jmx: + return jmx.read_attribute(self.remote_requests_mbean, 'Count') + + +class ClientRequestMetricsSnapshot: + + def __init__(self, client_request_metrics): + self.local_requests = client_request_metrics.get_local_requests() + self.remote_requests = client_request_metrics.get_remote_requests() + + +def setup_schema(session): + create_ks(session, 'ks', 1) + session.execute("CREATE TABLE test (id int,ord int,val varchar,PRIMARY KEY (id, ord));""") + + +def setup(obj): + cluster = obj.cluster + cluster.populate(2) + + node = cluster.nodelist()[0] + node2 = cluster.nodelist()[1] + + cluster.start() + + session = obj.patient_exclusive_cql_connection(node) + session2 = obj.patient_exclusive_cql_connection(node2) + + setup_schema(session) + + return session, node --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org