This is an automated email from the ASF dual-hosted git repository.

hulee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git


The following commit(s) were added to refs/heads/master by this push:
     new 08e35dedc Improve ZkClientMonitor and ZkClientPathMonitor performance 
(#2021)
08e35dedc is described below

commit 08e35dedc2ebf9c8863b0cb136c9e7c9a150e1a0
Author: Henri Hagberg <[email protected]>
AuthorDate: Thu Apr 7 17:09:49 2022 +0300

    Improve ZkClientMonitor and ZkClientPathMonitor performance (#2021)
    
    Previously, regex matches were used, which was inefficient. This commit 
does this following:
    Replace String#matches with more efficient String#contains in 
ZkClientPathMonitor
    Refactor record* methods in ZkClientMonitor to avoid repetition and 
simplify matching logic
---
 .../zookeeper/zkclient/metric/ZkClientMonitor.java | 59 ++++++++--------------
 .../zkclient/metric/ZkClientPathMonitor.java       | 46 ++++++++---------
 2 files changed, 43 insertions(+), 62 deletions(-)

diff --git 
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientMonitor.java
 
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientMonitor.java
index 1f71e4208..d0a37bb6e 100644
--- 
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientMonitor.java
+++ 
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientMonitor.java
@@ -20,12 +20,12 @@ package org.apache.helix.zookeeper.zkclient.metric;
  */
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
 import javax.management.JMException;
 import javax.management.MBeanAttributeInfo;
 import javax.management.MalformedObjectNameException;
@@ -81,11 +81,11 @@ public class ZkClientMonitor extends DynamicMBeanProvider {
     _monitorInstanceName = monitorInstanceName;
     _monitorRootOnly = monitorRootOnly;
 
-    _stateChangeEventCounter = new 
SimpleDynamicMetric("StateChangeEventCounter", 0l);
-    _expiredSessionCounter = new SimpleDynamicMetric("ExpiredSessionCounter", 
0l);
-    _dataChangeEventCounter = new 
SimpleDynamicMetric("DataChangeEventCounter", 0l);
-    _outstandingRequestGauge = new 
SimpleDynamicMetric("OutstandingRequestGauge", 0l);
-    _znodeCompressCounter = new 
SimpleDynamicMetric("CompressedZnodeWriteCounter", 0l);
+    _stateChangeEventCounter = new 
SimpleDynamicMetric<>("StateChangeEventCounter", 0L);
+    _expiredSessionCounter = new 
SimpleDynamicMetric<>("ExpiredSessionCounter", 0L);
+    _dataChangeEventCounter = new 
SimpleDynamicMetric<>("DataChangeEventCounter", 0L);
+    _outstandingRequestGauge = new 
SimpleDynamicMetric<>("OutstandingRequestGauge", 0L);
+    _znodeCompressCounter = new 
SimpleDynamicMetric<>("CompressedZnodeWriteCounter", 0L);
 
     if (zkEventThread != null) {
       boolean result = setAndInitZkEventThreadMonitor(zkEventThread);
@@ -198,32 +198,12 @@ public class ZkClientMonitor extends DynamicMBeanProvider 
{
   }
 
   public void recordDataPropagationLatency(String path, long latencyMilliSec) {
-    if (null == path) {
-      return;
-    }
-    Arrays.stream(ZkClientPathMonitor.PredefinedPath.values())
-        .filter(predefinedPath -> predefinedPath.match(path))
-        .forEach(predefinedPath -> {
-      ZkClientPathMonitor zkClientPathMonitor = 
_zkClientPathMonitorMap.get(predefinedPath);
-      if (zkClientPathMonitor != null) {
-        zkClientPathMonitor.recordDataPropagationLatency(latencyMilliSec);
-      }
-    });
+    findZkClientPathMonitor(path, (m) -> 
m.recordDataPropagationLatency(latencyMilliSec));
   }
 
   private void record(String path, int bytes, long latencyMilliSec, boolean 
isFailure,
       boolean isRead) {
-    if (null == path) {
-      return;
-    }
-    Arrays.stream(ZkClientPathMonitor.PredefinedPath.values())
-        .filter(predefinedPath -> predefinedPath.match(path))
-        .forEach(predefinedPath -> {
-      ZkClientPathMonitor zkClientPathMonitor = 
_zkClientPathMonitorMap.get(predefinedPath);
-      if (zkClientPathMonitor != null) {
-        zkClientPathMonitor.record(bytes, latencyMilliSec, isFailure, isRead);
-      }
-    });
+    findZkClientPathMonitor(path, (m) -> m.record(bytes, latencyMilliSec, 
isFailure, isRead));
   }
 
   public void record(String path, int dataSize, long startTimeMilliSec, 
AccessType accessType) {
@@ -257,17 +237,7 @@ public class ZkClientMonitor extends DynamicMBeanProvider {
    */
   private void recordAsync(String path, int bytes, long latencyMilliSec, 
boolean isFailure,
       AccessType accessType) {
-    if (null == path) {
-      return;
-    }
-    Arrays.stream(ZkClientPathMonitor.PredefinedPath.values())
-        .filter(predefinedPath -> predefinedPath.match(path))
-        .forEach(predefinedPath -> {
-          ZkClientPathMonitor zkClientPathMonitor = 
_zkClientPathMonitorMap.get(predefinedPath);
-          if (zkClientPathMonitor != null) {
-            zkClientPathMonitor.recordAsync(bytes, latencyMilliSec, isFailure, 
accessType);
-          }
-        });
+    findZkClientPathMonitor(path, (m) -> m.recordAsync(bytes, latencyMilliSec, 
isFailure, accessType));
   }
 
   public void recordAsync(String path, int dataSize, long startTimeMilliSec, 
AccessType accessType) {
@@ -278,6 +248,17 @@ public class ZkClientMonitor extends DynamicMBeanProvider {
     recordAsync(path, 0, 0, true, accessType);
   }
 
+  private void findZkClientPathMonitor(String path, 
Consumer<ZkClientPathMonitor> onMatch) {
+    if (path == null) {
+      return;
+    }
+    _zkClientPathMonitorMap.forEach((predefinedPath, zkClientPathMonitor) -> {
+      if (predefinedPath.match(path)) {
+        onMatch.accept(zkClientPathMonitor);
+      }
+    });
+  }
+
   class ZkThreadMetric extends DynamicMetric<ZkEventThread, ZkEventThread> {
     public ZkThreadMetric(ZkEventThread eventThread) {
       super("ZkEventThead", eventThread);
diff --git 
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientPathMonitor.java
 
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientPathMonitor.java
index 59643f19b..18ae26f89 100644
--- 
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientPathMonitor.java
+++ 
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/metric/ZkClientPathMonitor.java
@@ -42,16 +42,16 @@ public class ZkClientPathMonitor extends 
DynamicMBeanProvider {
   private final PredefinedPath _path;
 
   public enum PredefinedPath {
-    IdealStates(".*/IDEALSTATES/.*"),
-    Instances(".*/INSTANCES/.*"),
-    Configs(".*/CONFIGS/.*"),
-    Controller(".*/CONTROLLER/.*"),
-    ExternalView(".*/EXTERNALVIEW/.*"),
-    LiveInstances(".*/LIVEINSTANCES/.*"),
-    PropertyStore(".*/PROPERTYSTORE/.*"),
-    CurrentStates(".*/CURRENTSTATES/.*"),
-    Messages(".*/MESSAGES/.*"),
-    Root(".*");
+    IdealStates("/IDEALSTATES/"),
+    Instances("/INSTANCES/"),
+    Configs("/CONFIGS/"),
+    Controller("/CONTROLLER/"),
+    ExternalView("/EXTERNALVIEW/"),
+    LiveInstances("/LIVEINSTANCES/"),
+    PropertyStore("/PROPERTYSTORE/"),
+    CurrentStates("/CURRENTSTATES/"),
+    Messages("/MESSAGES/"),
+    Root("");
 
     private final String _matchString;
 
@@ -60,7 +60,7 @@ public class ZkClientPathMonitor extends DynamicMBeanProvider 
{
     }
 
     public boolean match(String path) {
-      return path.matches(this._matchString);
+      return path.contains(this._matchString);
     }
   }
 
@@ -135,27 +135,27 @@ public class ZkClientPathMonitor extends 
DynamicMBeanProvider {
             path.name());
 
     _writeTotalLatencyCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteTotalLatencyCounter.name(), 
0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteTotalLatencyCounter.name(), 
0L);
     _readTotalLatencyCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadTotalLatencyCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadTotalLatencyCounter.name(), 
0L);
     _writeFailureCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteFailureCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteFailureCounter.name(), 0L);
     _readFailureCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadFailureCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadFailureCounter.name(), 0L);
     _writeAsyncFailureCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteAsyncFailureCounter.name(), 
0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteAsyncFailureCounter.name(), 
0L);
     _readAsyncFailureCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadAsyncFailureCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadAsyncFailureCounter.name(), 
0L);
     _writeBytesCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteBytesCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteBytesCounter.name(), 0L);
     _readBytesCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadBytesCounter.name(), 0l);
-    _writeCounter = new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteCounter.name(), 0l);
-    _readCounter = new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadBytesCounter.name(), 0L);
+    _writeCounter = new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteCounter.name(), 0L);
+    _readCounter = new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadCounter.name(), 0L);
     _writeAsyncCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.WriteAsyncCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.WriteAsyncCounter.name(), 0L);
     _readAsyncCounter =
-        new 
SimpleDynamicMetric(PredefinedMetricDomains.ReadAsyncCounter.name(), 0l);
+        new 
SimpleDynamicMetric<>(PredefinedMetricDomains.ReadAsyncCounter.name(), 0L);
 
     _readLatencyGauge = new 
HistogramDynamicMetric(PredefinedMetricDomains.ReadLatencyGauge.name(),
         new Histogram(

Reply via email to