Skip to content

Commit 206f6a2

Browse files
committed
Improve efficiency of Grok circular reference check (#74814)
This change is a tweak to #74581 which removes the N^2 loop that was added in that PR.
1 parent fc90c88 commit 206f6a2

File tree

1 file changed

+10
-9
lines changed
  • libs/grok/src/main/java/org/elasticsearch/grok

1 file changed

+10
-9
lines changed

libs/grok/src/main/java/org/elasticsearch/grok/Grok.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,7 @@ private Grok(Map<String, String> patternBank, String grokPattern, boolean namedC
9595
this.namedCaptures = namedCaptures;
9696
this.threadWatchdog = threadWatchdog;
9797

98-
for (Map.Entry<String, String> entry : patternBank.entrySet()) {
99-
String name = entry.getKey();
100-
String pattern = entry.getValue();
101-
forbidCircularReferences(name, new ArrayList<>(), pattern);
102-
}
98+
forbidCircularReferences();
10399

104100
String expression = toRegex(grokPattern);
105101
byte[] expressionBytes = expression.getBytes(StandardCharsets.UTF_8);
@@ -113,7 +109,8 @@ private Grok(Map<String, String> patternBank, String grokPattern, boolean namedC
113109
* a reference to another named pattern. This method will navigate to all these named patterns and
114110
* check for a circular reference.
115111
*/
116-
private void forbidCircularReferences(String patternName, List<String> path, String pattern) {
112+
private void forbidCircularReferences() {
113+
117114
// first ensure that the pattern bank contains no simple circular references (i.e., any pattern
118115
// containing an immediate reference to itself) as those can cause the remainder of this algorithm
119116
// to recurse infinitely
@@ -123,8 +120,12 @@ private void forbidCircularReferences(String patternName, List<String> path, Str
123120
}
124121
}
125122

126-
// next recursively check any other pattern names referenced in the pattern
127-
innerForbidCircularReferences(patternName, path, pattern);
123+
// next, recursively check any other pattern names referenced in each pattern
124+
for (Map.Entry<String, String> entry : patternBank.entrySet()) {
125+
String name = entry.getKey();
126+
String pattern = entry.getValue();
127+
innerForbidCircularReferences(name, new ArrayList<>(), pattern);
128+
}
128129
}
129130

130131
private void innerForbidCircularReferences(String patternName, List<String> path, String pattern) {
@@ -160,7 +161,7 @@ private void innerForbidCircularReferences(String patternName, List<String> path
160161
}
161162
String otherPatternName = pattern.substring(begin, end);
162163
path.add(otherPatternName);
163-
forbidCircularReferences(patternName, path, patternBank.get(otherPatternName));
164+
innerForbidCircularReferences(patternName, path, patternBank.get(otherPatternName));
164165
}
165166
}
166167

0 commit comments

Comments
 (0)