apoorvmittal10 commented on code in PR #23696:
URL: https://github.com/apache/kafka/pull/23696#discussion_r4204608594


##########
server/src/main/java/org/apache/kafka/server/metrics/ClientMatchPattern.java:
##########
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.kafka.server.metrics;
+
+/**
+ * A compiled client-metrics match pattern, backed by RE2/J. java.util.regex 
is supported only as
+ * a deprecated, temporary fallback for patterns that predate RE2/J 
validation. See
+ * {@link #ofLegacy}.
+ * <p>
+ * RE2/J's {@code Pattern} and {@code java.util.regex.Pattern} share no common 
supertype, so this
+ * interface gives both a uniform shape wherever a compiled match pattern is 
stored or evaluated.
+ */
+public interface ClientMatchPattern {
+
+    boolean matches(String input);
+
+    String pattern();
+
+    static ClientMatchPattern ofRe2(com.google.re2j.Pattern pattern) {
+        return new ClientMatchPattern() {
+            @Override
+            public boolean matches(String input) {
+                return pattern.matcher(input).matches();
+            }
+
+            @Override
+            public String pattern() {
+                return pattern.pattern();
+            }
+        };
+    }
+
+    /**
+     * Wraps a pattern compiled with the legacy java.util.regex engine, for a 
match pattern that
+     * predates RE2/J validation and would otherwise be rejected (e.g. one 
relying on backreferences
+     * or lookaround). This fallback support is temporary and will be removed 
in Apache Kafka 5.0.
+     */
+    @Deprecated(since = "4.5", forRemoval = true)
+    static ClientMatchPattern ofLegacy(java.util.regex.Pattern pattern) {

Review Comment:
   Can you please provide me example when this will be used i.e. scenario?



##########
server/src/main/java/org/apache/kafka/server/metrics/ClientMetricsConfigs.java:
##########
@@ -169,11 +185,39 @@ private static void validateConfigs(Map<?, ?> configs) {
             }
         }
 
-        // Make sure that client match patterns are valid by parsing them.
-        if (configs.containsKey(MATCH_CONFIG)) {
+        // Make sure that new or changed match patterns are valid RE2/J syntax.
+        if (configs.containsKey(MATCH_CONFIG) && matchPatternsChanged(configs, 
oldProps)) {
             List<String> patterns = (List<String>) parsed.get(MATCH_CONFIG);
-            // Parse the client matching patterns to validate if the patterns 
are valid.
-            parseMatchingPatterns(patterns);
+            patterns.forEach(pattern -> {
+                String[] nameValuePair = splitMatchPattern(pattern);
+                String param = nameValuePair[0];
+                String patternValue = nameValuePair[1];
+
+                compileStrict(param, patternValue);
+            });
+        }
+    }
+
+    private static boolean matchPatternsChanged(Map<?, ?> newProps, Map<?, ?> 
oldProps) {
+        Object newMatch = newProps.get(MATCH_CONFIG);
+        Object oldMatch = oldProps == null ? null : oldProps.get(MATCH_CONFIG);
+        return !Objects.equals(newMatch, oldMatch);
+    }
+
+    /**
+     * Compiles a single match pattern with RE2/J only.
+     *
+     * See also {@link #compileLenient(String, String, String)}.
+     *
+     * @throws InvalidConfigurationException if the pattern is not valid RE2/J 
syntax
+     */
+    private static ClientMatchPattern compileStrict(String param, String 
patternValue) {
+        try {
+            return ClientMatchPattern.ofRe2(Pattern.compile(patternValue));
+        } catch (PatternSyntaxException e) {
+            throw new InvalidConfigurationException(
+                String.format("Client match pattern `%s=%s` is not a valid 
regular expression: %s.",
+                    param, patternValue, e.getDescription()));
         }
     }

Review Comment:
   Can you also please explain why you need oldConfigs here?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to