Skip to content

Commit 50f565b

Browse files
committed
SearchSlowLog uses a non thread-safe object to escape json (#48363)
This commit fixes the usage of JsonStringEncoder#quoteAsUTF8 in the SearchSlowLog. JsonStringEncoder#getInstance should always be called to get a thread local object but this assumption was broken by #44642. This means that any slow log can throw an AIOOBE since it uses the same byte array concurrently. Closes #48358
1 parent 4790ee4 commit 50f565b

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

server/src/main/java/org/elasticsearch/common/logging/ESLogMessage.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@
1919

2020
package org.elasticsearch.common.logging;
2121

22-
import com.fasterxml.jackson.core.io.JsonStringEncoder;
2322
import org.apache.logging.log4j.message.ParameterizedMessage;
2423
import org.elasticsearch.common.SuppressLoggerChecks;
2524

26-
import java.nio.charset.Charset;
2725
import java.util.Map;
2826
import java.util.stream.Collectors;
2927
import java.util.stream.Stream;
@@ -32,7 +30,6 @@
3230
* A base class for custom log4j logger messages. Carries additional fields which will populate JSON fields in logs.
3331
*/
3432
public abstract class ESLogMessage extends ParameterizedMessage {
35-
private static final JsonStringEncoder JSON_STRING_ENCODER = JsonStringEncoder.getInstance();
3633
private final Map<String, Object> fields;
3734

3835
/**
@@ -45,11 +42,6 @@ public ESLogMessage(Map<String, Object> fields, String messagePattern, Object...
4542
this.fields = fields;
4643
}
4744

48-
public static String escapeJson(String text) {
49-
byte[] sourceEscaped = JSON_STRING_ENCODER.quoteAsUTF8(text);
50-
return new String(sourceEscaped, Charset.defaultCharset());
51-
}
52-
5345
public String getValueFor(String key) {
5446
Object value = fields.get(key);
5547
return value != null ? value.toString() : null;

server/src/main/java/org/elasticsearch/index/SearchSlowLog.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.index;
2121

22+
import com.fasterxml.jackson.core.io.JsonStringEncoder;
2223
import org.apache.logging.log4j.LogManager;
2324
import org.apache.logging.log4j.Logger;
2425
import org.elasticsearch.common.Strings;
@@ -33,13 +34,16 @@
3334
import org.elasticsearch.tasks.Task;
3435

3536
import java.util.Arrays;
37+
import java.nio.charset.Charset;
3638
import java.util.Collections;
3739
import java.util.HashMap;
3840
import java.util.Map;
3941
import java.util.concurrent.TimeUnit;
4042
import java.util.stream.Stream;
4143

4244
public final class SearchSlowLog implements SearchOperationListener {
45+
private static final Charset UTF_8 = Charset.forName("UTF-8");
46+
4347
private long queryWarnThreshold;
4448
private long queryInfoThreshold;
4549
private long queryDebugThreshold;
@@ -227,6 +231,11 @@ private static String message(SearchContext context, long tookInNanos) {
227231
}
228232
return sb.toString();
229233
}
234+
235+
private static String escapeJson(String text) {
236+
byte[] sourceEscaped = JsonStringEncoder.getInstance().quoteAsUTF8(text);
237+
return new String(sourceEscaped, UTF_8);
238+
}
230239
}
231240

232241
private void setQueryWarnThreshold(TimeValue warnThreshold) {

0 commit comments

Comments
 (0)