Skip to content

Commit f78644d

Browse files
core: add Metadata.discardAll()
Metadata.removeAll creates an iterator for looking through removed values even if the call doens't use it. This change adds a similar method which doesn't create garbage. This change makes it easier in the future to alter the internals of Metadata where it may be expensive to return removed values.
1 parent 5379de7 commit f78644d

File tree

8 files changed

+33
-12
lines changed

8 files changed

+33
-12
lines changed

core/src/main/java/io/grpc/Metadata.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,16 @@ public <T> Iterable<T> removeAll(Key<T> key) {
271271
return new ValueIterable<T>(key, values);
272272
}
273273

274+
/**
275+
* Remove all values for the given key without returning them. This is a minor performance
276+
* optimization if you do not need the previous values.
277+
*/
278+
@ExperimentalApi
279+
public <T> void discardAll(Key<T> key) {
280+
List<MetadataEntry> removed = store.remove(key.name());
281+
storeCount -= removed != null ? removed.size() : 0;
282+
}
283+
274284
/**
275285
* Serialize all the metadata entries.
276286
*

core/src/main/java/io/grpc/internal/AbstractServerStream.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ public final void close(Status status, Metadata trailers) {
145145
}
146146

147147
private void addStatusToTrailers(Metadata trailers, Status status) {
148-
trailers.removeAll(Status.CODE_KEY);
149-
trailers.removeAll(Status.MESSAGE_KEY);
148+
trailers.discardAll(Status.CODE_KEY);
149+
trailers.discardAll(Status.MESSAGE_KEY);
150150
trailers.put(Status.CODE_KEY, status);
151151
if (status.getDescription() != null) {
152152
trailers.put(Status.MESSAGE_KEY, status.getDescription());

core/src/main/java/io/grpc/internal/ClientCallImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ ClientCallImpl<ReqT, RespT> setCompressorRegistry(CompressorRegistry compressorR
140140
@VisibleForTesting
141141
static void prepareHeaders(Metadata headers, DecompressorRegistry decompressorRegistry,
142142
Compressor compressor) {
143-
headers.removeAll(MESSAGE_ENCODING_KEY);
143+
headers.discardAll(MESSAGE_ENCODING_KEY);
144144
if (compressor != Codec.Identity.NONE) {
145145
headers.put(MESSAGE_ENCODING_KEY, compressor.getMessageEncoding());
146146
}
147147

148-
headers.removeAll(MESSAGE_ACCEPT_ENCODING_KEY);
148+
headers.discardAll(MESSAGE_ACCEPT_ENCODING_KEY);
149149
String advertisedEncodings = decompressorRegistry.getRawAdvertisedMessageEncodings();
150150
if (!advertisedEncodings.isEmpty()) {
151151
headers.put(MESSAGE_ACCEPT_ENCODING_KEY, advertisedEncodings);
@@ -251,7 +251,7 @@ public void runInContext() {
251251
*/
252252
private static void updateTimeoutHeaders(@Nullable Deadline effectiveDeadline,
253253
@Nullable Deadline callDeadline, @Nullable Deadline outerCallDeadline, Metadata headers) {
254-
headers.removeAll(TIMEOUT_KEY);
254+
headers.discardAll(TIMEOUT_KEY);
255255

256256
if (effectiveDeadline == null) {
257257
return;

core/src/main/java/io/grpc/internal/Http2ClientStream.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ private static Charset extractCharset(Metadata headers) {
238238
* the application layer.
239239
*/
240240
private static void stripTransportDetails(Metadata metadata) {
241-
metadata.removeAll(HTTP2_STATUS);
242-
metadata.removeAll(Status.CODE_KEY);
243-
metadata.removeAll(Status.MESSAGE_KEY);
241+
metadata.discardAll(HTTP2_STATUS);
242+
metadata.discardAll(Status.CODE_KEY);
243+
metadata.discardAll(Status.MESSAGE_KEY);
244244
}
245245
}

core/src/main/java/io/grpc/internal/ServerCallImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void sendHeaders(Metadata headers) {
104104
checkState(!sendHeadersCalled, "sendHeaders has already been called");
105105
checkState(!closeCalled, "call is closed");
106106

107-
headers.removeAll(MESSAGE_ENCODING_KEY);
107+
headers.discardAll(MESSAGE_ENCODING_KEY);
108108
if (compressor == null) {
109109
compressor = Codec.Identity.NONE;
110110
} else {
@@ -125,7 +125,7 @@ public void sendHeaders(Metadata headers) {
125125

126126
stream.setCompressor(compressor);
127127

128-
headers.removeAll(MESSAGE_ACCEPT_ENCODING_KEY);
128+
headers.discardAll(MESSAGE_ACCEPT_ENCODING_KEY);
129129
String advertisedEncodings = decompressorRegistry.getRawAdvertisedMessageEncodings();
130130
if (!advertisedEncodings.isEmpty()) {
131131
headers.put(MESSAGE_ACCEPT_ENCODING_KEY, advertisedEncodings);

core/src/test/java/io/grpc/MetadataTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ public void testMutations() {
114114
assertEquals(null, metadata.get(KEY));
115115
}
116116

117+
@Test
118+
public void discardAll() {
119+
Fish lance = new Fish(LANCE);
120+
Metadata metadata = new Metadata();
121+
122+
metadata.put(KEY, lance);
123+
metadata.discardAll(KEY);
124+
assertEquals(null, metadata.getAll(KEY));
125+
assertEquals(null, metadata.get(KEY));
126+
}
127+
117128
@Test
118129
public void testGetAllNoRemove() {
119130
Fish lance = new Fish(LANCE);

netty/src/main/java/io/grpc/netty/NettyClientStream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void start(ClientStreamListener listener) {
105105
defaultPath = new AsciiString("/" + method.getFullMethodName());
106106
methodDescriptorAccessor.setRawMethodName(method, defaultPath);
107107
}
108-
headers.removeAll(GrpcUtil.USER_AGENT_KEY);
108+
headers.discardAll(GrpcUtil.USER_AGENT_KEY);
109109
Http2Headers http2Headers
110110
= Utils.convertClientHeaders(headers, scheme, defaultPath, authority, userAgent);
111111
headers = null;

okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void setAuthority(String authority) {
139139
public void start(ClientStreamListener listener) {
140140
super.start(listener);
141141
String defaultPath = "/" + method.getFullMethodName();
142-
headers.removeAll(GrpcUtil.USER_AGENT_KEY);
142+
headers.discardAll(GrpcUtil.USER_AGENT_KEY);
143143
List<Header> requestHeaders =
144144
Headers.createRequestHeaders(headers, defaultPath, authority, userAgent);
145145
headers = null;

0 commit comments

Comments
 (0)