diff --git a/alts/src/main/java/io/grpc/alts/internal/ChannelCrypterNetty.java b/alts/src/main/java/io/grpc/alts/internal/ChannelCrypterNetty.java index 4164560e7a..e2e7d4046f 100644 --- a/alts/src/main/java/io/grpc/alts/internal/ChannelCrypterNetty.java +++ b/alts/src/main/java/io/grpc/alts/internal/ChannelCrypterNetty.java @@ -21,8 +21,8 @@ import java.security.GeneralSecurityException; import java.util.List; /** - * A @{code ChannelCrypterNetty} performs stateful encryption and decryption of independent input - * and output streams. Both decrypt and encrypt gather their input from a list of Netty @{link + * A {@code ChannelCrypterNetty} performs stateful encryption and decryption of independent input + * and output streams. Both decrypt and encrypt gather their input from a list of Netty {@link * ByteBuf} instances. * *

Note that we provide implementations of this interface that provide integrity only and diff --git a/alts/src/test/java/io/grpc/alts/internal/TsiTest.java b/alts/src/test/java/io/grpc/alts/internal/TsiTest.java index f677a44a75..f75fb7fcee 100644 --- a/alts/src/test/java/io/grpc/alts/internal/TsiTest.java +++ b/alts/src/test/java/io/grpc/alts/internal/TsiTest.java @@ -34,13 +34,13 @@ import java.util.Collections; import java.util.List; import javax.crypto.AEADBadTagException; -/** Utility class that provides tests for implementations of @{link TsiHandshaker}. */ +/** Utility class that provides tests for implementations of {@link TsiHandshaker}. */ public final class TsiTest { private static final String DECRYPTION_FAILURE_RE = "Tag mismatch!|BAD_DECRYPT"; private TsiTest() {} - /** A @{code TsiHandshaker} pair for running tests. */ + /** A {@code TsiHandshaker} pair for running tests. */ public static class Handshakers { private final TsiHandshaker client; private final TsiHandshaker server; diff --git a/api/build.gradle b/api/build.gradle index 1348e49ad6..3c7ff8221e 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -12,9 +12,9 @@ evaluationDependsOn(project(':grpc-context').path) dependencies { api project(':grpc-context'), - libraries.jsr305 - implementation libraries.guava, + libraries.jsr305, libraries.errorprone + implementation libraries.guava testImplementation project(':grpc-context').sourceSets.test.output, project(':grpc-testing'), diff --git a/api/src/main/java/io/grpc/Attributes.java b/api/src/main/java/io/grpc/Attributes.java index b70cc2bc8c..26c2a72f90 100644 --- a/api/src/main/java/io/grpc/Attributes.java +++ b/api/src/main/java/io/grpc/Attributes.java @@ -46,11 +46,13 @@ import javax.annotation.concurrent.Immutable; @Immutable public final class Attributes { - private final Map, Object> data; + private final IdentityHashMap, Object> data; - public static final Attributes EMPTY = new Attributes(Collections., Object>emptyMap()); + private static final IdentityHashMap, Object> EMPTY_MAP = + new IdentityHashMap, Object>(); + public static final Attributes EMPTY = new Attributes(EMPTY_MAP); - private Attributes(Map, Object> data) { + private Attributes(IdentityHashMap, Object> data) { assert data != null; this.data = data; } @@ -212,14 +214,14 @@ public final class Attributes { */ public static final class Builder { private Attributes base; - private Map, Object> newdata; + private IdentityHashMap, Object> newdata; private Builder(Attributes base) { assert base != null; this.base = base; } - private Map, Object> data(int size) { + private IdentityHashMap, Object> data(int size) { if (newdata == null) { newdata = new IdentityHashMap<>(size); } @@ -241,7 +243,7 @@ public final class Attributes { @ExperimentalApi("https://github.com/grpc/grpc-java/issues/5777") public Builder discard(Key key) { if (base.data.containsKey(key)) { - Map, Object> newBaseData = new IdentityHashMap<>(base.data); + IdentityHashMap, Object> newBaseData = new IdentityHashMap<>(base.data); newBaseData.remove(key); base = new Attributes(newBaseData); } diff --git a/api/src/main/java/io/grpc/NameResolver.java b/api/src/main/java/io/grpc/NameResolver.java index f4c05aa6a6..78b35a14e3 100644 --- a/api/src/main/java/io/grpc/NameResolver.java +++ b/api/src/main/java/io/grpc/NameResolver.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import com.google.errorprone.annotations.InlineMe; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -204,6 +205,10 @@ public abstract class NameResolver { */ @Override @Deprecated + @InlineMe( + replacement = "this.onResult(ResolutionResult.newBuilder().setAddresses(servers)" + + ".setAttributes(attributes).build())", + imports = "io.grpc.NameResolver.ResolutionResult") public final void onAddresses( List servers, @ResolutionResultAttr Attributes attributes) { // TODO(jihuncho) need to promote Listener2 if we want to use ConfigOrError diff --git a/build.gradle b/build.gradle index 149ade4ae0..9a649b2886 100644 --- a/build.gradle +++ b/build.gradle @@ -151,7 +151,7 @@ subprojects { animalsniffer_annotations: "org.codehaus.mojo:animal-sniffer-annotations:1.19", autovalue: "com.google.auto.value:auto-value:${autovalueVersion}", autovalue_annotation: "com.google.auto.value:auto-value-annotations:${autovalueVersion}", - errorprone: "com.google.errorprone:error_prone_annotations:2.9.0", + errorprone: "com.google.errorprone:error_prone_annotations:2.10.0", cronet_api: 'org.chromium.net:cronet-api:92.4515.131', cronet_embedded: 'org.chromium.net:cronet-embedded:92.4515.131', gson: "com.google.code.gson:gson:2.8.9", @@ -239,19 +239,15 @@ subprojects { } } - if (rootProject.properties.get('errorProne', true)) { + if (!project.hasProperty('errorProne') || errorProne.toBoolean()) { dependencies { - errorprone 'com.google.errorprone:error_prone_core:2.4.0' + errorprone 'com.google.errorprone:error_prone_core:2.10.0' errorproneJavac 'com.google.errorprone:javac:9+181-r4173-1' } } else { // Disable Error Prone - allprojects { - afterEvaluate { project -> - project.tasks.withType(JavaCompile) { - options.errorprone.enabled = false - } - } + tasks.withType(JavaCompile) { + options.errorprone.enabled = false } } @@ -304,7 +300,7 @@ subprojects { maxHeapSize = '1500m' } - if (rootProject.properties.get('errorProne', true)) { + if (!project.hasProperty('errorProne') || errorProne.toBoolean()) { dependencies { annotationProcessor 'com.google.guava:guava-beta-checker:1.0' } @@ -315,6 +311,7 @@ subprojects { options.errorprone.check("UnnecessaryAnonymousClass", CheckSeverity.OFF) // This project targets Java 7 (no time.Duration class) options.errorprone.check("PreferJavaTimeOverload", CheckSeverity.OFF) + options.errorprone.check("JavaUtilDate", CheckSeverity.OFF) // The warning fails to provide a source location options.errorprone.check("MissingSummary", CheckSeverity.OFF) } @@ -323,6 +320,7 @@ subprojects { options.errorprone.check("JdkObsolete", CheckSeverity.OFF) options.errorprone.check("UnnecessaryAnonymousClass", CheckSeverity.OFF) options.errorprone.check("PreferJavaTimeOverload", CheckSeverity.OFF) + options.errorprone.check("JavaUtilDate", CheckSeverity.OFF) } plugins.withId("ru.vyarus.animalsniffer") { diff --git a/context/src/main/java/io/grpc/Context.java b/context/src/main/java/io/grpc/Context.java index ad47ca9cb4..41d3a5c94a 100644 --- a/context/src/main/java/io/grpc/Context.java +++ b/context/src/main/java/io/grpc/Context.java @@ -1042,7 +1042,7 @@ public class Context { * Implements {@link io.grpc.Context#current}. * *

Caution: {@link Context} interprets a return value of {@code null} to mean the same - * thing as {@code Context{@link #ROOT}}. + * thing as {@link Context#ROOT}. * *

See also {@link #doAttach(Context)}. * diff --git a/core/src/main/java/io/grpc/internal/AbstractServerImplBuilder.java b/core/src/main/java/io/grpc/internal/AbstractServerImplBuilder.java index d20c60cd44..c1268cfdb0 100644 --- a/core/src/main/java/io/grpc/internal/AbstractServerImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/AbstractServerImplBuilder.java @@ -17,6 +17,7 @@ package io.grpc.internal; import com.google.common.base.MoreObjects; +import com.google.errorprone.annotations.DoNotCall; import io.grpc.BinaryLog; import io.grpc.BindableService; import io.grpc.CompressorRegistry; @@ -53,6 +54,7 @@ public abstract class AbstractServerImplBuilder /** * This method serves to force sub classes to "hide" this static factory. */ + @DoNotCall("Unsupported") public static ServerBuilder forPort(int port) { throw new UnsupportedOperationException("Subclass failed to hide static factory"); } diff --git a/core/src/main/java/io/grpc/internal/JndiResourceResolverFactory.java b/core/src/main/java/io/grpc/internal/JndiResourceResolverFactory.java index a13c9fe466..22e08de9cf 100644 --- a/core/src/main/java/io/grpc/internal/JndiResourceResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/JndiResourceResolverFactory.java @@ -140,7 +140,7 @@ final class JndiResourceResolverFactory implements DnsNameResolver.ResourceResol Level level = Level.WARNING; for (String rawSrv : rawSrvRecords) { try { - String[] parts = whitespace.split(rawSrv); + String[] parts = whitespace.split(rawSrv, 5); Verify.verify(parts.length == 4, "Bad SRV Record: %s", rawSrv); // SRV requires the host name to be absolute if (!parts[3].endsWith(".")) { diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/NettyFlowControlTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/NettyFlowControlTest.java index 4d7c8bdbca..c86bd8070a 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/NettyFlowControlTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/NettyFlowControlTest.java @@ -39,17 +39,13 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.netty.channel.ChannelHandler; import io.netty.handler.codec.http2.Http2Stream; import io.netty.util.AsciiString; -import io.netty.util.concurrent.DefaultThreadFactory; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -80,16 +76,6 @@ public class NettyFlowControlTest { private int proxyPort; private int serverPort; - private static final ThreadPoolExecutor executor = - new ThreadPoolExecutor(1, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue(), - new DefaultThreadFactory("flowcontrol-test-pool", true)); - - - @AfterClass - public static void shutDownTests() { - executor.shutdown(); - } - @Before public void initTest() { startServer(REGULAR_WINDOW); diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/TrafficControlProxy.java b/interop-testing/src/test/java/io/grpc/testing/integration/TrafficControlProxy.java index 19f22cb03f..a93d51628e 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/TrafficControlProxy.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/TrafficControlProxy.java @@ -51,7 +51,7 @@ public final class TrafficControlProxy { private Socket serverSock; private Socket clientSock; private final ThreadPoolExecutor executor = - new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue(), + new ThreadPoolExecutor(5, 5, 1, TimeUnit.SECONDS, new LinkedBlockingQueue(), new DefaultThreadFactory("proxy-pool", true)); /** diff --git a/netty/src/main/java/io/grpc/netty/GrpcHttp2ConnectionHandler.java b/netty/src/main/java/io/grpc/netty/GrpcHttp2ConnectionHandler.java index 459c313ede..25f4f9232c 100644 --- a/netty/src/main/java/io/grpc/netty/GrpcHttp2ConnectionHandler.java +++ b/netty/src/main/java/io/grpc/netty/GrpcHttp2ConnectionHandler.java @@ -58,6 +58,7 @@ public abstract class GrpcHttp2ConnectionHandler extends Http2ConnectionHandler * @deprecated Use the two argument method instead. */ @Deprecated + @SuppressWarnings("InlineMeSuggester") // the caller should consider providing securityInfo public void handleProtocolNegotiationCompleted(Attributes attrs) { handleProtocolNegotiationCompleted(attrs, /*securityInfo=*/ null); } diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java index 17801afa38..ca029fe7cf 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java @@ -24,6 +24,7 @@ import static io.grpc.internal.GrpcUtil.KEEPALIVE_TIME_NANOS_DISABLED; import com.google.common.annotations.VisibleForTesting; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.errorprone.annotations.InlineMe; import io.grpc.Attributes; import io.grpc.CallCredentials; import io.grpc.ChannelCredentials; @@ -393,6 +394,7 @@ public final class NettyChannelBuilder extends * @deprecated Use {@link #maxInboundMetadataSize} instead */ @Deprecated + @InlineMe(replacement = "this.maxInboundMetadataSize(maxHeaderListSize)") public NettyChannelBuilder maxHeaderListSize(int maxHeaderListSize) { return maxInboundMetadataSize(maxHeaderListSize); } diff --git a/netty/src/main/java/io/grpc/netty/NettyServerBuilder.java b/netty/src/main/java/io/grpc/netty/NettyServerBuilder.java index 9b67cd21f1..ff5553eb11 100644 --- a/netty/src/main/java/io/grpc/netty/NettyServerBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyServerBuilder.java @@ -26,6 +26,7 @@ import static io.grpc.internal.GrpcUtil.SERVER_KEEPALIVE_TIME_NANOS_DISABLED; import com.google.common.annotations.VisibleForTesting; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.errorprone.annotations.InlineMe; import io.grpc.Attributes; import io.grpc.ExperimentalApi; import io.grpc.Internal; @@ -437,6 +438,7 @@ public final class NettyServerBuilder extends AbstractServerImplBuilder()); EnvoyServerProtoData.FilterChain filterChain = new EnvoyServerProtoData.FilterChain( "filter-chain-foo", createMatch(), httpConnectionManager, createTls(), - tlsContextManager); + mock(TlsContextManager.class)); xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain), null); start.get(5000, TimeUnit.MILLISECONDS); assertThat(ldsWatched).isEqualTo("grpc/server?udpa.resource.listening_address=0.0.0.0:1"); @@ -1190,7 +1188,7 @@ public class XdsServerWrapperTest { private static FilterChain createFilterChain(String name, HttpConnectionManager hcm) { return new EnvoyServerProtoData.FilterChain(name, createMatch(), - hcm, createTls(), tlsContextManager); + hcm, createTls(), mock(TlsContextManager.class)); } private static VirtualHost createVirtualHost(String name) {