diff --git a/core/src/main/java/io/grpc/internal/ForwardingReadableBuffer.java b/core/src/main/java/io/grpc/internal/ForwardingReadableBuffer.java index 1d7b412e19..06d04b6de2 100644 --- a/core/src/main/java/io/grpc/internal/ForwardingReadableBuffer.java +++ b/core/src/main/java/io/grpc/internal/ForwardingReadableBuffer.java @@ -97,6 +97,11 @@ public abstract class ForwardingReadableBuffer implements ReadableBuffer { return buf.arrayOffset(); } + @Override + public void touch() { + buf.touch(); + } + @Override public boolean markSupported() { return buf.markSupported(); diff --git a/core/src/main/java/io/grpc/internal/MessageDeframer.java b/core/src/main/java/io/grpc/internal/MessageDeframer.java index f43676c409..c8b250c214 100644 --- a/core/src/main/java/io/grpc/internal/MessageDeframer.java +++ b/core/src/main/java/io/grpc/internal/MessageDeframer.java @@ -409,6 +409,7 @@ public class MessageDeframer implements Closeable, Deframer { statsTraceCtx.inboundMessageRead(currentMessageSeqNo, inboundBodyWireSize, -1); inboundBodyWireSize = 0; InputStream stream = compressedFlag ? getCompressedBody() : getUncompressedBody(); + nextFrame.touch(); nextFrame = null; listener.messagesAvailable(new SingleMessageProducer(stream)); diff --git a/core/src/main/java/io/grpc/internal/ReadableBuffer.java b/core/src/main/java/io/grpc/internal/ReadableBuffer.java index b47501a994..6963c78203 100644 --- a/core/src/main/java/io/grpc/internal/ReadableBuffer.java +++ b/core/src/main/java/io/grpc/internal/ReadableBuffer.java @@ -124,6 +124,14 @@ public interface ReadableBuffer extends Closeable { */ int arrayOffset(); + /** + * Note that the current callsite has access to this buffer, or do nothing. This is only useful + * when the buffer has leak detection and intrumentation to record usages before the buffer was + * leaked. That can make it much easier to track down where the buffer was leaked. If this isn't + * such a buffer, the method does nothing. + */ + default void touch() {} + /** * Indicates whether or not {@link #mark} operation is supported for this buffer. */ diff --git a/netty/src/main/java/io/grpc/netty/NettyReadableBuffer.java b/netty/src/main/java/io/grpc/netty/NettyReadableBuffer.java index cce58f1e60..7e180544de 100644 --- a/netty/src/main/java/io/grpc/netty/NettyReadableBuffer.java +++ b/netty/src/main/java/io/grpc/netty/NettyReadableBuffer.java @@ -94,6 +94,11 @@ class NettyReadableBuffer extends AbstractReadableBuffer { return buffer.arrayOffset() + buffer.readerIndex(); } + @Override + public void touch() { + buffer.touch(); + } + @Override public boolean markSupported() { return true;