From 630e0a35746986bad8118be5b379314b2dc8e182 Mon Sep 17 00:00:00 2001 From: hypnoce Date: Fri, 22 Mar 2024 08:36:46 +0100 Subject: [PATCH] servlet: Check log fine level before hex string conversion. Fixes #11031. --- .../servlet/AsyncServletOutputStreamWriter.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java index 5ee5c02a128..cfd29b1a2fd 100644 --- a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java +++ b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java @@ -32,6 +32,7 @@ import java.util.concurrent.locks.LockSupport; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; +import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckReturnValue; import javax.annotation.Nullable; @@ -86,6 +87,11 @@ final class AsyncServletOutputStreamWriter { InternalLogId logId) throws IOException { Logger logger = Logger.getLogger(AsyncServletOutputStreamWriter.class.getName()); this.log = new Log() { + @Override + public boolean isLoggable(Level level) { + return logger.isLoggable(level); + } + @Override public void fine(String str, Object... params) { if (logger.isLoggable(FINE)) { @@ -105,7 +111,9 @@ public void finest(String str, Object... params) { this.writeAction = (byte[] bytes, Integer numBytes) -> () -> { outputStream.write(bytes, 0, numBytes); transportState.runOnTransportThread(() -> transportState.onSentBytes(numBytes)); - log.finest("outbound data: length={0}, bytes={1}", numBytes, toHexString(bytes, numBytes)); + if (log.isLoggable(Level.FINEST)) { + log.finest("outbound data: length={0}, bytes={1}", numBytes, toHexString(bytes, numBytes)); + } }; this.flushAction = () -> { log.finest("flushBuffer"); @@ -245,6 +253,10 @@ interface ActionItem { @VisibleForTesting // Lincheck test can not run with java.util.logging dependency. interface Log { + default boolean isLoggable(Level level) { + return false; + } + default void fine(String str, Object...params) {} default void finest(String str, Object...params) {}