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

Reply via email to