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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]