aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHadrien Zalek <hzalek@google.com>2020-07-25 18:04:27 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-07-25 18:04:27 +0000
commitc8e4906d4bd70117ba477e490795e0b14b81e6d6 (patch)
tree900389d86d6c0d165b93722f60de46164ecc6255
parent6a0c363961b17e588de0a548cd1f478ab45d3ac9 (diff)
parent1d9b3ded762dc915cc45122ed932a6eb2b059f8a (diff)
downloadgrpc-grpc-java-c8e4906d4bd70117ba477e490795e0b14b81e6d6.tar.gz
Merge tag 'upstream/v1.16.1' into HEAD am: 9b4675b8ab am: f28fd1b7cb am: d68fec8751 am: 8562a75e2f am: 1d9b3ded76
Original change: https://android-review.googlesource.com/c/platform/external/grpc-grpc-java/+/1371342 Change-Id: I02607f1bbb7b077615f2d338b981fce72b05799e
-rw-r--r--.github/lock.yml2
-rw-r--r--.travis.yml1
-rw-r--r--README.md28
-rw-r--r--RELEASING.md5
-rw-r--r--SECURITY.md3
-rw-r--r--alts/build.gradle2
-rw-r--r--alts/src/main/java/io/grpc/alts/AltsChannelBuilder.java122
-rw-r--r--alts/src/main/java/io/grpc/alts/AltsServerBuilder.java4
-rw-r--r--alts/src/main/java/io/grpc/alts/GoogleDefaultChannelBuilder.java108
-rw-r--r--alts/src/main/java/io/grpc/alts/internal/AltsClientOptions.java22
-rw-r--r--alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java46
-rw-r--r--alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java8
-rw-r--r--alts/src/main/java/io/grpc/alts/internal/TsiHandshakerFactory.java4
-rw-r--r--alts/src/test/java/io/grpc/alts/AltsChannelBuilderTest.java31
-rw-r--r--alts/src/test/java/io/grpc/alts/GoogleDefaultChannelBuilderTest.java10
-rw-r--r--alts/src/test/java/io/grpc/alts/internal/AltsClientOptionsTest.java5
-rw-r--r--alts/src/test/java/io/grpc/alts/internal/AltsHandshakerClientTest.java5
-rw-r--r--alts/src/test/java/io/grpc/alts/internal/AltsProtocolNegotiatorTest.java20
-rw-r--r--alts/src/test/java/io/grpc/alts/internal/FakeTsiHandshaker.java8
-rw-r--r--android-interop-testing/app/build.gradle12
-rw-r--r--android-interop-testing/app/src/androidTest/java/io/grpc/android/integrationtest/InteropInstrumentationTest.java2
-rw-r--r--android-interop-testing/build.gradle4
-rw-r--r--android/build.gradle6
-rw-r--r--auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java21
-rw-r--r--auth/src/test/java/io/grpc/auth/GoogleAuthLibraryCallCredentialsTest.java124
-rw-r--r--build.gradle12
-rw-r--r--buildscripts/make_dependencies.bat2
-rwxr-xr-xbuildscripts/make_dependencies.sh2
-rw-r--r--compiler/src/test/golden/TestDeprecatedService.java.txt2
-rw-r--r--compiler/src/test/golden/TestService.java.txt2
-rw-r--r--compiler/src/testLite/golden/TestDeprecatedService.java.txt2
-rw-r--r--compiler/src/testLite/golden/TestService.java.txt2
-rw-r--r--compiler/src/testNano/golden/TestDeprecatedService.java.txt2
-rw-r--r--compiler/src/testNano/golden/TestService.java.txt2
-rw-r--r--core/build.gradle13
-rw-r--r--core/src/main/java/io/grpc/Attributes.java12
-rw-r--r--core/src/main/java/io/grpc/BinaryLog.java17
-rw-r--r--core/src/main/java/io/grpc/CallCredentials.java40
-rw-r--r--core/src/main/java/io/grpc/CallCredentials2.java99
-rw-r--r--core/src/main/java/io/grpc/ClientCall.java3
-rw-r--r--core/src/main/java/io/grpc/EquivalentAddressGroup.java17
-rw-r--r--core/src/main/java/io/grpc/Grpc.java26
-rw-r--r--core/src/main/java/io/grpc/LoadBalancer.java10
-rw-r--r--core/src/main/java/io/grpc/NameResolver.java18
-rw-r--r--core/src/main/java/io/grpc/ServerCall.java2
-rw-r--r--core/src/main/java/io/grpc/inprocess/InProcessTransport.java5
-rw-r--r--core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java37
-rw-r--r--core/src/main/java/io/grpc/internal/CallCredentialsApplyingTransportFactory.java1
-rw-r--r--core/src/main/java/io/grpc/internal/DnsNameResolver.java87
-rw-r--r--core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java4
-rw-r--r--core/src/main/java/io/grpc/internal/GrpcAttributes.java16
-rw-r--r--core/src/main/java/io/grpc/internal/GrpcUtil.java2
-rw-r--r--core/src/main/java/io/grpc/internal/ManagedChannelImpl.java618
-rw-r--r--core/src/main/java/io/grpc/internal/MetadataApplierImpl.java4
-rw-r--r--core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java95
-rw-r--r--core/src/test/java/io/grpc/ForwardingTestUtil.java54
-rw-r--r--core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java80
-rw-r--r--core/src/test/java/io/grpc/internal/CallCredentials2ApplyingTest.java291
-rw-r--r--core/src/test/java/io/grpc/internal/CallCredentialsApplyingTest.java25
-rw-r--r--core/src/test/java/io/grpc/internal/DnsNameResolverTest.java279
-rw-r--r--core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java21
-rw-r--r--core/src/test/java/io/grpc/util/ForwardingLoadBalancerHelperTest.java65
-rw-r--r--cronet/build.gradle4
-rw-r--r--cronet/src/main/java/io/grpc/cronet/CronetClientTransport.java5
-rw-r--r--cronet/src/test/java/io/grpc/cronet/CronetClientTransportTest.java4
-rw-r--r--documentation/android-channel-builder.md4
-rw-r--r--examples/android/clientcache/app/build.gradle10
-rw-r--r--examples/android/helloworld/app/build.gradle8
-rw-r--r--examples/android/routeguide/app/build.gradle8
-rw-r--r--examples/build.gradle2
-rw-r--r--examples/example-kotlin/android/helloworld/app/build.gradle8
-rw-r--r--examples/example-kotlin/build.gradle2
-rw-r--r--examples/pom.xml4
-rw-r--r--grpclb/src/main/java/io/grpc/grpclb/GrpclbState.java6
-rw-r--r--grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java81
-rw-r--r--interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java12
-rw-r--r--interop-testing/src/test/java/io/grpc/testing/integration/Http2NettyTest.java7
-rw-r--r--netty/src/main/java/io/grpc/netty/InternalNettyChannelBuilder.java29
-rw-r--r--netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java184
-rw-r--r--netty/src/main/java/io/grpc/netty/NettyClientTransport.java20
-rw-r--r--netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java7
-rw-r--r--netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java35
-rw-r--r--netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java32
-rw-r--r--okhttp/src/main/java/io/grpc/okhttp/AsyncFrameWriter.java25
-rw-r--r--okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java5
-rw-r--r--okhttp/src/main/java/io/grpc/okhttp/OkHttpProtocolNegotiator.java4
-rw-r--r--okhttp/src/main/java/io/grpc/okhttp/OkHttpTlsUpgrader.java2
-rw-r--r--okhttp/src/test/java/io/grpc/okhttp/AsyncFrameWriterTest.java27
-rw-r--r--okhttp/src/test/java/io/grpc/okhttp/OkHttpProtocolNegotiatorTest.java2
-rw-r--r--okhttp/third_party/okhttp/main/java/io/grpc/okhttp/internal/Platform.java6
-rw-r--r--protobuf-lite/build.gradle11
-rw-r--r--protobuf-nano/build.gradle11
-rw-r--r--protobuf/build.gradle11
-rw-r--r--protobuf/src/main/java/io/grpc/protobuf/ProtoUtils.java21
-rw-r--r--repositories.bzl78
-rw-r--r--services/src/generated/main/grpc/io/grpc/health/v1/HealthGrpc.java129
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/Address.java823
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/AddressOrBuilder.java37
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/BinaryLogProto.java177
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeader.java1199
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeaderOrBuilder.java107
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntry.java2629
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntryOrBuilder.java197
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/Message.java552
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/MessageOrBuilder.java28
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/Metadata.java778
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntry.java585
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntryOrBuilder.java24
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/MetadataOrBuilder.java33
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeader.java618
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeaderOrBuilder.java34
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/Trailer.java935
-rw-r--r--services/src/generated/main/java/io/grpc/binarylog/v1/TrailerOrBuilder.java73
-rw-r--r--services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java17
-rw-r--r--services/src/generated/main/java/io/grpc/health/v1/HealthProto.java18
-rw-r--r--services/src/main/java/io/grpc/services/BinaryLogProviderImpl.java22
-rw-r--r--services/src/main/java/io/grpc/services/BinaryLogs.java13
-rw-r--r--services/src/main/java/io/grpc/services/BinlogHelper.java650
-rw-r--r--services/src/main/java/io/grpc/services/ChannelzService.java4
-rw-r--r--services/src/main/proto/grpc/binlog/v1/binarylog.proto209
-rw-r--r--services/src/main/proto/grpc/health/v1/health.proto24
-rw-r--r--services/src/test/java/io/grpc/services/BinlogHelperTest.java1249
-rw-r--r--testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java5
123 files changed, 12462 insertions, 1954 deletions
diff --git a/.github/lock.yml b/.github/lock.yml
new file mode 100644
index 000000000..119e4840b
--- /dev/null
+++ b/.github/lock.yml
@@ -0,0 +1,2 @@
+daysUntilLock: 90
+lockComment: false
diff --git a/.travis.yml b/.travis.yml
index e3b59ff02..952f2ab27 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -49,7 +49,6 @@ jdk:
# processor based plugin.
- oraclejdk8 # if both jdk 8 and 9 are removed, migrate to net.ltgt.errorprone-javacplugin (see above comment)
- oraclejdk9 # if both jdk 8 and 9 are removed, migrate to net.ltgt.errorprone-javacplugin (see above comment)
- - oraclejdk10
notifications:
email: false
diff --git a/README.md b/README.md
index bbede99f2..b9788be62 100644
--- a/README.md
+++ b/README.md
@@ -30,8 +30,8 @@ For a guided tour, take a look at the [quick start
guide](https://grpc.io/docs/quickstart/java.html) or the more explanatory [gRPC
basics](https://grpc.io/docs/tutorials/basic/java.html).
-The [examples](https://github.com/grpc/grpc-java/tree/v1.15.0/examples) and the
-[Android example](https://github.com/grpc/grpc-java/tree/v1.15.0/examples/android)
+The [examples](https://github.com/grpc/grpc-java/tree/v1.16.1/examples) and the
+[Android example](https://github.com/grpc/grpc-java/tree/v1.16.1/examples/android)
are standalone projects that showcase the usage of gRPC.
Download
@@ -42,37 +42,37 @@ Download [the JARs][]. Or for Maven with non-Android, add to your `pom.xml`:
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
- <version>1.15.0</version>
+ <version>1.16.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
- <version>1.15.0</version>
+ <version>1.16.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
- <version>1.15.0</version>
+ <version>1.16.1</version>
</dependency>
```
Or for Gradle with non-Android, add to your dependencies:
```gradle
-compile 'io.grpc:grpc-netty-shaded:1.15.0'
-compile 'io.grpc:grpc-protobuf:1.15.0'
-compile 'io.grpc:grpc-stub:1.15.0'
+compile 'io.grpc:grpc-netty-shaded:1.16.1'
+compile 'io.grpc:grpc-protobuf:1.16.1'
+compile 'io.grpc:grpc-stub:1.16.1'
```
For Android client, use `grpc-okhttp` instead of `grpc-netty-shaded` and
`grpc-protobuf-lite` instead of `grpc-protobuf`:
```gradle
-compile 'io.grpc:grpc-okhttp:1.15.0'
-compile 'io.grpc:grpc-protobuf-lite:1.15.0'
-compile 'io.grpc:grpc-stub:1.15.0'
+compile 'io.grpc:grpc-okhttp:1.16.1'
+compile 'io.grpc:grpc-protobuf-lite:1.16.1'
+compile 'io.grpc:grpc-stub:1.16.1'
```
[the JARs]:
-https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.15.0
+https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.16.1
Development snapshots are available in [Sonatypes's snapshot
repository](https://oss.sonatype.org/content/repositories/snapshots/).
@@ -104,7 +104,7 @@ For protobuf-based codegen integrated with the Maven build system, you can use
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
- <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0:exe:${os.detected.classifier}</pluginArtifact>
+ <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.16.1:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
@@ -141,7 +141,7 @@ protobuf {
}
plugins {
grpc {
- artifact = 'io.grpc:protoc-gen-grpc-java:1.15.0'
+ artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1'
}
}
generateProtoTasks {
diff --git a/RELEASING.md b/RELEASING.md
index 9fee632b5..1306ee504 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -113,7 +113,7 @@ Tagging the Release
```bash
# Change version to remove -SNAPSHOT
$ sed -i 's/-SNAPSHOT\(.*CURRENT_GRPC_VERSION\)/\1/' "${VERSION_FILES[@]}"
- $ sed -i s/-SNAPSHOT// compiler/src/test{,Lite,Nano}/golden/TestService.java.txt
+ $ sed -i s/-SNAPSHOT// compiler/src/test{,Lite,Nano}/golden/Test{,Deprecated}Service.java.txt
$ ./gradlew build
$ git commit -a -m "Bump version to $MAJOR.$MINOR.$PATCH"
$ git tag -a v$MAJOR.$MINOR.$PATCH -m "Version $MAJOR.$MINOR.$PATCH"
@@ -125,7 +125,8 @@ Tagging the Release
# Change version to next patch and add -SNAPSHOT
$ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_GRPC_VERSION\)/'$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT'\1/' \
"${VERSION_FILES[@]}"
- $ sed -i s/$MAJOR.$MINOR.$PATCH/$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT/ compiler/src/test{,Lite,Nano}/golden/TestService.java.txt
+ $ sed -i s/$MAJOR.$MINOR.$PATCH/$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT/ \
+ compiler/src/test{,Lite,Nano}/golden/Test{,Deprecated}Service.java.txt
$ ./gradlew build
$ git commit -a -m "Bump version to $MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT"
```
diff --git a/SECURITY.md b/SECURITY.md
index 296aad2f5..891e00ca9 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -373,7 +373,8 @@ grpc-netty version | netty-handler version | netty-tcnative-boringssl-static ver
1.9.x-1.10.x | 4.1.17.Final | 2.0.7.Final
1.11.x-1.12.x | 4.1.22.Final | 2.0.7.Final
1.13.x | 4.1.25.Final | 2.0.8.Final
-1.14.x- | 4.1.27.Final | 2.0.12.Final
+1.14.x-1.15.x | 4.1.27.Final | 2.0.12.Final
+1.16.x- | 4.1.30.Final | 2.0.17.Final
_(grpc-netty-shaded avoids issues with keeping these versions in sync.)_
diff --git a/alts/build.gradle b/alts/build.gradle
index 5a8c9e376..e22e0555d 100644
--- a/alts/build.gradle
+++ b/alts/build.gradle
@@ -27,7 +27,7 @@ dependencies {
libraries.lang,
libraries.protobuf
compile (libraries.google_auth_oauth2_http) {
- // prefer 3.0.0 from libraries instead of 1.3.9
+ // prefer 3.0.2 from libraries instead of 1.3.9
exclude group: 'com.google.code.findbugs', module: 'jsr305'
// prefer 20.0 from libraries instead of 19.0
exclude group: 'com.google.guava', module: 'guava'
diff --git a/alts/src/main/java/io/grpc/alts/AltsChannelBuilder.java b/alts/src/main/java/io/grpc/alts/AltsChannelBuilder.java
index ce24861b8..af8132518 100644
--- a/alts/src/main/java/io/grpc/alts/AltsChannelBuilder.java
+++ b/alts/src/main/java/io/grpc/alts/AltsChannelBuilder.java
@@ -16,9 +16,8 @@
package io.grpc.alts;
-import static com.google.common.base.Preconditions.checkArgument;
-
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
@@ -38,14 +37,9 @@ import io.grpc.alts.internal.TsiHandshaker;
import io.grpc.alts.internal.TsiHandshakerFactory;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.ObjectPool;
-import io.grpc.internal.ProxyParameters;
import io.grpc.internal.SharedResourcePool;
import io.grpc.netty.InternalNettyChannelBuilder;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilter;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilterFactory;
import io.grpc.netty.NettyChannelBuilder;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -60,13 +54,14 @@ public final class AltsChannelBuilder extends ForwardingChannelBuilder<AltsChann
private static final Logger logger = Logger.getLogger(AltsChannelBuilder.class.getName());
private final NettyChannelBuilder delegate;
- private final AltsClientOptions.Builder handshakerOptionsBuilder =
- new AltsClientOptions.Builder();
+ private final ImmutableList.Builder<String> targetServiceAccountsBuilder =
+ ImmutableList.builder();
private ObjectPool<ManagedChannel> handshakerChannelPool =
SharedResourcePool.forResource(HandshakerServiceChannel.SHARED_HANDSHAKER_CHANNEL);
- private TcpfFactory tcpfFactoryForTest;
private boolean enableUntrustedAlts;
+ private AltsProtocolNegotiator negotiatorForTest;
+
/** "Overrides" the static method in {@link ManagedChannelBuilder}. */
public static final AltsChannelBuilder forTarget(String target) {
return new AltsChannelBuilder(target);
@@ -83,14 +78,8 @@ public final class AltsChannelBuilder extends ForwardingChannelBuilder<AltsChann
.keepAliveTime(20, TimeUnit.SECONDS)
.keepAliveTimeout(10, TimeUnit.SECONDS)
.keepAliveWithoutCalls(true);
- handshakerOptionsBuilder.setRpcProtocolVersions(
- RpcProtocolVersionsUtil.getRpcProtocolVersions());
- }
-
- /** The server service account name for secure name checking. */
- public AltsChannelBuilder withSecureNamingTarget(String targetName) {
- handshakerOptionsBuilder.setTargetName(targetName);
- return this;
+ InternalNettyChannelBuilder.setProtocolNegotiatorFactory(
+ delegate(), new ProtocolNegotiatorFactory());
}
/**
@@ -98,7 +87,7 @@ public final class AltsChannelBuilder extends ForwardingChannelBuilder<AltsChann
* service account in the handshaker result. Otherwise, the handshake fails.
*/
public AltsChannelBuilder addTargetServiceAccount(String targetServiceAccount) {
- handshakerOptionsBuilder.addTargetServiceAccount(targetServiceAccount);
+ targetServiceAccountsBuilder.add(targetServiceAccount);
return this;
}
@@ -140,84 +129,41 @@ public final class AltsChannelBuilder extends ForwardingChannelBuilder<AltsChann
}
}
- final AltsClientOptions handshakerOptions = handshakerOptionsBuilder.build();
- TsiHandshakerFactory altsHandshakerFactory =
- new TsiHandshakerFactory() {
- @Override
- public TsiHandshaker newHandshaker() {
- // Used the shared grpc channel to connecting to the ALTS handshaker service.
- // TODO: Release the channel if it is not used.
- // https://github.com/grpc/grpc-java/issues/4755.
- return AltsTsiHandshaker.newClient(
- HandshakerServiceGrpc.newStub(handshakerChannelPool.getObject()),
- handshakerOptions);
- }
- };
- AltsProtocolNegotiator negotiator = AltsProtocolNegotiator.create(altsHandshakerFactory);
-
- TcpfFactory tcpfFactory = new TcpfFactory(handshakerOptions, negotiator);
- InternalNettyChannelBuilder.setDynamicTransportParamsFactory(delegate(), tcpfFactory);
- tcpfFactoryForTest = tcpfFactory;
-
return delegate().build();
}
@VisibleForTesting
@Nullable
- TransportCreationParamsFilterFactory getTcpfFactoryForTest() {
- return tcpfFactoryForTest;
- }
-
- @VisibleForTesting
- @Nullable
- AltsClientOptions getAltsClientOptionsForTest() {
- if (tcpfFactoryForTest == null) {
- return null;
- }
- return tcpfFactoryForTest.handshakerOptions;
+ AltsProtocolNegotiator getProtocolNegotiatorForTest() {
+ return negotiatorForTest;
}
- private static final class TcpfFactory implements TransportCreationParamsFilterFactory {
-
- final AltsClientOptions handshakerOptions;
- private final AltsProtocolNegotiator negotiator;
-
- public TcpfFactory(AltsClientOptions handshakerOptions, AltsProtocolNegotiator negotiator) {
- this.handshakerOptions = handshakerOptions;
- this.negotiator = negotiator;
- }
+ private final class ProtocolNegotiatorFactory
+ implements InternalNettyChannelBuilder.ProtocolNegotiatorFactory {
@Override
- public TransportCreationParamsFilter create(
- final SocketAddress serverAddress,
- final String authority,
- final String userAgent,
- final ProxyParameters proxy) {
- checkArgument(
- serverAddress instanceof InetSocketAddress,
- "%s must be a InetSocketAddress",
- serverAddress);
- return new TransportCreationParamsFilter() {
- @Override
- public SocketAddress getTargetServerAddress() {
- return serverAddress;
- }
-
- @Override
- public String getAuthority() {
- return authority;
- }
-
- @Override
- public String getUserAgent() {
- return userAgent;
- }
-
- @Override
- public AltsProtocolNegotiator getProtocolNegotiator() {
- return negotiator;
- }
- };
+ public AltsProtocolNegotiator buildProtocolNegotiator() {
+ final ImmutableList<String> targetServiceAccounts = targetServiceAccountsBuilder.build();
+ TsiHandshakerFactory altsHandshakerFactory =
+ new TsiHandshakerFactory() {
+ @Override
+ public TsiHandshaker newHandshaker(String authority) {
+ // Used the shared grpc channel to connecting to the ALTS handshaker service.
+ // TODO: Release the channel if it is not used.
+ // https://github.com/grpc/grpc-java/issues/4755.
+ AltsClientOptions handshakerOptions =
+ new AltsClientOptions.Builder()
+ .setRpcProtocolVersions(RpcProtocolVersionsUtil.getRpcProtocolVersions())
+ .setTargetServiceAccounts(targetServiceAccounts)
+ .setTargetName(authority)
+ .build();
+ return AltsTsiHandshaker.newClient(
+ HandshakerServiceGrpc.newStub(handshakerChannelPool.getObject()),
+ handshakerOptions);
+ }
+ };
+ return negotiatorForTest =
+ AltsProtocolNegotiator.createClientNegotiator(altsHandshakerFactory);
}
}
diff --git a/alts/src/main/java/io/grpc/alts/AltsServerBuilder.java b/alts/src/main/java/io/grpc/alts/AltsServerBuilder.java
index a26443178..ae564df6f 100644
--- a/alts/src/main/java/io/grpc/alts/AltsServerBuilder.java
+++ b/alts/src/main/java/io/grpc/alts/AltsServerBuilder.java
@@ -197,10 +197,10 @@ public final class AltsServerBuilder extends ServerBuilder<AltsServerBuilder> {
}
delegate.protocolNegotiator(
- AltsProtocolNegotiator.create(
+ AltsProtocolNegotiator.createServerNegotiator(
new TsiHandshakerFactory() {
@Override
- public TsiHandshaker newHandshaker() {
+ public TsiHandshaker newHandshaker(String authority) {
// Used the shared grpc channel to connecting to the ALTS handshaker service.
// TODO: Release the channel if it is not used.
// https://github.com/grpc/grpc-java/issues/4755.
diff --git a/alts/src/main/java/io/grpc/alts/GoogleDefaultChannelBuilder.java b/alts/src/main/java/io/grpc/alts/GoogleDefaultChannelBuilder.java
index 619ce04c7..8a5ece69a 100644
--- a/alts/src/main/java/io/grpc/alts/GoogleDefaultChannelBuilder.java
+++ b/alts/src/main/java/io/grpc/alts/GoogleDefaultChannelBuilder.java
@@ -16,8 +16,6 @@
package io.grpc.alts;
-import static com.google.common.base.Preconditions.checkArgument;
-
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.annotations.VisibleForTesting;
import io.grpc.CallCredentials;
@@ -39,17 +37,12 @@ import io.grpc.alts.internal.TsiHandshaker;
import io.grpc.alts.internal.TsiHandshakerFactory;
import io.grpc.auth.MoreCallCredentials;
import io.grpc.internal.GrpcUtil;
-import io.grpc.internal.ProxyParameters;
import io.grpc.internal.SharedResourceHolder;
import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.InternalNettyChannelBuilder;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilter;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilterFactory;
import io.grpc.netty.NettyChannelBuilder;
import io.netty.handler.ssl.SslContext;
import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
import javax.annotation.Nullable;
import javax.net.ssl.SSLException;
@@ -61,37 +54,12 @@ public final class GoogleDefaultChannelBuilder
extends ForwardingChannelBuilder<GoogleDefaultChannelBuilder> {
private final NettyChannelBuilder delegate;
- private final TcpfFactory tcpfFactory;
+ private GoogleDefaultProtocolNegotiator negotiatorForTest;
private GoogleDefaultChannelBuilder(String target) {
delegate = NettyChannelBuilder.forTarget(target);
-
- final AltsClientOptions handshakerOptions =
- new AltsClientOptions.Builder()
- .setRpcProtocolVersions(RpcProtocolVersionsUtil.getRpcProtocolVersions())
- .build();
- TsiHandshakerFactory altsHandshakerFactory =
- new TsiHandshakerFactory() {
- @Override
- public TsiHandshaker newHandshaker() {
- // Used the shared grpc channel to connecting to the ALTS handshaker service.
- // TODO: Release the channel if it is not used.
- // https://github.com/grpc/grpc-java/issues/4755.
- ManagedChannel channel =
- SharedResourceHolder.get(HandshakerServiceChannel.SHARED_HANDSHAKER_CHANNEL);
- return AltsTsiHandshaker.newClient(
- HandshakerServiceGrpc.newStub(channel), handshakerOptions);
- }
- };
- SslContext sslContext;
- try {
- sslContext = GrpcSslContexts.forClient().build();
- } catch (SSLException ex) {
- throw new RuntimeException(ex);
- }
- tcpfFactory = new TcpfFactory(
- new GoogleDefaultProtocolNegotiator(altsHandshakerFactory, sslContext));
- InternalNettyChannelBuilder.setDynamicTransportParamsFactory(delegate(), tcpfFactory);
+ InternalNettyChannelBuilder.setProtocolNegotiatorFactory(
+ delegate(), new ProtocolNegotiatorFactory());
}
/** "Overrides" the static method in {@link ManagedChannelBuilder}. */
@@ -125,48 +93,40 @@ public final class GoogleDefaultChannelBuilder
}
@VisibleForTesting
- TransportCreationParamsFilterFactory getTcpfFactoryForTest() {
- return tcpfFactory;
+ GoogleDefaultProtocolNegotiator getProtocolNegotiatorForTest() {
+ return negotiatorForTest;
}
- private static final class TcpfFactory implements TransportCreationParamsFilterFactory {
- private final GoogleDefaultProtocolNegotiator negotiator;
-
- private TcpfFactory(GoogleDefaultProtocolNegotiator negotiator) {
- this.negotiator = negotiator;
- }
-
+ private final class ProtocolNegotiatorFactory
+ implements InternalNettyChannelBuilder.ProtocolNegotiatorFactory {
@Override
- public TransportCreationParamsFilter create(
- final SocketAddress serverAddress,
- final String authority,
- final String userAgent,
- final ProxyParameters proxy) {
- checkArgument(
- serverAddress instanceof InetSocketAddress,
- "%s must be a InetSocketAddress",
- serverAddress);
- return new TransportCreationParamsFilter() {
- @Override
- public SocketAddress getTargetServerAddress() {
- return serverAddress;
- }
-
- @Override
- public String getAuthority() {
- return authority;
- }
-
- @Override
- public String getUserAgent() {
- return userAgent;
- }
-
- @Override
- public GoogleDefaultProtocolNegotiator getProtocolNegotiator() {
- return negotiator;
- }
- };
+ public GoogleDefaultProtocolNegotiator buildProtocolNegotiator() {
+ TsiHandshakerFactory altsHandshakerFactory =
+ new TsiHandshakerFactory() {
+ @Override
+ public TsiHandshaker newHandshaker(String authority) {
+ // Used the shared grpc channel to connecting to the ALTS handshaker service.
+ // TODO: Release the channel if it is not used.
+ // https://github.com/grpc/grpc-java/issues/4755.
+ ManagedChannel channel =
+ SharedResourceHolder.get(HandshakerServiceChannel.SHARED_HANDSHAKER_CHANNEL);
+ AltsClientOptions handshakerOptions =
+ new AltsClientOptions.Builder()
+ .setRpcProtocolVersions(RpcProtocolVersionsUtil.getRpcProtocolVersions())
+ .setTargetName(authority)
+ .build();
+ return AltsTsiHandshaker.newClient(
+ HandshakerServiceGrpc.newStub(channel), handshakerOptions);
+ }
+ };
+ SslContext sslContext;
+ try {
+ sslContext = GrpcSslContexts.forClient().build();
+ } catch (SSLException ex) {
+ throw new RuntimeException(ex);
+ }
+ return negotiatorForTest =
+ new GoogleDefaultProtocolNegotiator(altsHandshakerFactory, sslContext);
}
}
diff --git a/alts/src/main/java/io/grpc/alts/internal/AltsClientOptions.java b/alts/src/main/java/io/grpc/alts/internal/AltsClientOptions.java
index e0e506a08..e70e7d9dd 100644
--- a/alts/src/main/java/io/grpc/alts/internal/AltsClientOptions.java
+++ b/alts/src/main/java/io/grpc/alts/internal/AltsClientOptions.java
@@ -16,42 +16,40 @@
package io.grpc.alts.internal;
+import com.google.common.collect.ImmutableList;
import io.grpc.alts.internal.TransportSecurityCommon.RpcProtocolVersions;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
import javax.annotation.Nullable;
/** Handshaker options for creating ALTS client channel. */
public final class AltsClientOptions extends AltsHandshakerOptions {
- // targetName is the server service account name for secure name checking. This field is not yet
- // supported.
+
+ // targetName is the server service account name for secure name checking.
@Nullable private final String targetName;
// targetServiceAccounts contains a list of expected target service accounts. One of these service
// accounts should match peer service account in the handshaker result. Otherwise, the handshake
// fails.
- private final List<String> targetServiceAccounts;
+ private final ImmutableList<String> targetServiceAccounts;
private AltsClientOptions(Builder builder) {
super(builder.rpcProtocolVersions);
targetName = builder.targetName;
- targetServiceAccounts =
- Collections.unmodifiableList(new ArrayList<>(builder.targetServiceAccounts));
+ targetServiceAccounts = builder.targetServiceAccounts;
}
public String getTargetName() {
return targetName;
}
- public List<String> getTargetServiceAccounts() {
+ public ImmutableList<String> getTargetServiceAccounts() {
return targetServiceAccounts;
}
/** Builder for AltsClientOptions. */
public static final class Builder {
+
@Nullable private String targetName;
@Nullable private RpcProtocolVersions rpcProtocolVersions;
- private ArrayList<String> targetServiceAccounts = new ArrayList<>();
+ private ImmutableList<String> targetServiceAccounts = ImmutableList.of();
public Builder setTargetName(String targetName) {
this.targetName = targetName;
@@ -63,8 +61,8 @@ public final class AltsClientOptions extends AltsHandshakerOptions {
return this;
}
- public Builder addTargetServiceAccount(String targetServiceAccount) {
- targetServiceAccounts.add(targetServiceAccount);
+ public Builder setTargetServiceAccounts(ImmutableList<String> targetServiceAccounts) {
+ this.targetServiceAccounts = targetServiceAccounts;
return this;
}
diff --git a/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java b/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java
index f146dbc4c..300fd7889 100644
--- a/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java
+++ b/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java
@@ -36,34 +36,55 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AsciiString;
/**
- * A client-side GRPC {@link ProtocolNegotiator} for ALTS. This class creates a Netty handler that
- * provides ALTS security on the wire, similar to Netty's {@code SslHandler}.
+ * A GRPC {@link ProtocolNegotiator} for ALTS. This class creates a Netty handler that provides ALTS
+ * security on the wire, similar to Netty's {@code SslHandler}.
*/
public abstract class AltsProtocolNegotiator implements ProtocolNegotiator {
- private static final Attributes.Key<TsiPeer> TSI_PEER_KEY = Attributes.Key.create("TSI_PEER");
- private static final Attributes.Key<AltsAuthContext> ALTS_CONTEXT_KEY =
+ @Grpc.TransportAttr
+ public static final Attributes.Key<TsiPeer> TSI_PEER_KEY = Attributes.Key.create("TSI_PEER");
+ @Grpc.TransportAttr
+ public static final Attributes.Key<AltsAuthContext> ALTS_CONTEXT_KEY =
Attributes.Key.create("ALTS_CONTEXT_KEY");
private static final AsciiString scheme = AsciiString.of("https");
- public static Attributes.Key<TsiPeer> getTsiPeerAttributeKey() {
- return TSI_PEER_KEY;
- }
+ /** Creates a negotiator used for ALTS client. */
+ public static AltsProtocolNegotiator createClientNegotiator(
+ final TsiHandshakerFactory handshakerFactory) {
+ return new AltsProtocolNegotiator() {
+ @Override
+ public Handler newHandler(GrpcHttp2ConnectionHandler grpcHandler) {
+ return new BufferUntilAltsNegotiatedHandler(
+ grpcHandler,
+ new TsiHandshakeHandler(
+ new NettyTsiHandshaker(
+ handshakerFactory.newHandshaker(grpcHandler.getAuthority()))),
+ new TsiFrameHandler());
+ }
- public static Attributes.Key<AltsAuthContext> getAltsAuthContextAttributeKey() {
- return ALTS_CONTEXT_KEY;
+ @Override
+ public void close() {
+ // TODO(jiangtaoli2016): release resources
+ }
+ };
}
- /** Creates a negotiator used for ALTS. */
- public static AltsProtocolNegotiator create(final TsiHandshakerFactory handshakerFactory) {
+ /** Creates a negotiator used for ALTS server. */
+ public static AltsProtocolNegotiator createServerNegotiator(
+ final TsiHandshakerFactory handshakerFactory) {
return new AltsProtocolNegotiator() {
@Override
public Handler newHandler(GrpcHttp2ConnectionHandler grpcHandler) {
return new BufferUntilAltsNegotiatedHandler(
grpcHandler,
- new TsiHandshakeHandler(new NettyTsiHandshaker(handshakerFactory.newHandshaker())),
+ new TsiHandshakeHandler(new NettyTsiHandshaker(handshakerFactory.newHandshaker(null))),
new TsiFrameHandler());
}
+
+ @Override
+ public void close() {
+ // TODO(jiangtaoli2016): release resources
+ }
};
}
@@ -124,6 +145,7 @@ public abstract class AltsProtocolNegotiator implements ProtocolNegotiator {
.set(TSI_PEER_KEY, altsEvt.peer())
.set(ALTS_CONTEXT_KEY, altsContext)
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
.set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
.build(),
new Security(new OtherSecurity("alts", Any.pack(altsContext.context))));
diff --git a/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java b/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java
index 84288945f..b08453452 100644
--- a/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java
+++ b/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java
@@ -29,7 +29,7 @@ public final class GoogleDefaultProtocolNegotiator implements ProtocolNegotiator
private final ProtocolNegotiator tlsProtocolNegotiator;
public GoogleDefaultProtocolNegotiator(TsiHandshakerFactory altsFactory, SslContext sslContext) {
- altsProtocolNegotiator = AltsProtocolNegotiator.create(altsFactory);
+ altsProtocolNegotiator = AltsProtocolNegotiator.createClientNegotiator(altsFactory);
tlsProtocolNegotiator = ProtocolNegotiators.tls(sslContext);
}
@@ -49,4 +49,10 @@ public final class GoogleDefaultProtocolNegotiator implements ProtocolNegotiator
return tlsProtocolNegotiator.newHandler(grpcHandler);
}
}
+
+ @Override
+ public void close() {
+ altsProtocolNegotiator.close();
+ tlsProtocolNegotiator.close();
+ }
}
diff --git a/alts/src/main/java/io/grpc/alts/internal/TsiHandshakerFactory.java b/alts/src/main/java/io/grpc/alts/internal/TsiHandshakerFactory.java
index 58e3726cb..996bd0036 100644
--- a/alts/src/main/java/io/grpc/alts/internal/TsiHandshakerFactory.java
+++ b/alts/src/main/java/io/grpc/alts/internal/TsiHandshakerFactory.java
@@ -16,9 +16,11 @@
package io.grpc.alts.internal;
+import javax.annotation.Nullable;
+
/** Factory that manufactures instances of {@link TsiHandshaker}. */
public interface TsiHandshakerFactory {
/** Creates a new handshaker. */
- TsiHandshaker newHandshaker();
+ TsiHandshaker newHandshaker(@Nullable String authority);
}
diff --git a/alts/src/test/java/io/grpc/alts/AltsChannelBuilderTest.java b/alts/src/test/java/io/grpc/alts/AltsChannelBuilderTest.java
index 747992ab6..e8cc538b4 100644
--- a/alts/src/test/java/io/grpc/alts/AltsChannelBuilderTest.java
+++ b/alts/src/test/java/io/grpc/alts/AltsChannelBuilderTest.java
@@ -18,12 +18,8 @@ package io.grpc.alts;
import static com.google.common.truth.Truth.assertThat;
-import io.grpc.alts.internal.AltsClientOptions;
import io.grpc.alts.internal.AltsProtocolNegotiator;
-import io.grpc.alts.internal.TransportSecurityCommon.RpcProtocolVersions;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilterFactory;
import io.grpc.netty.ProtocolNegotiator;
-import java.net.InetSocketAddress;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -36,32 +32,13 @@ public final class AltsChannelBuilderTest {
AltsChannelBuilder builder =
AltsChannelBuilder.forTarget("localhost:8080").enableUntrustedAltsForTesting();
- TransportCreationParamsFilterFactory tcpfFactory = builder.getTcpfFactoryForTest();
- AltsClientOptions altsClientOptions = builder.getAltsClientOptionsForTest();
-
- assertThat(tcpfFactory).isNull();
- assertThat(altsClientOptions).isNull();
+ ProtocolNegotiator protocolNegotiator = builder.getProtocolNegotiatorForTest();
+ assertThat(protocolNegotiator).isNull();
builder.build();
- tcpfFactory = builder.getTcpfFactoryForTest();
- altsClientOptions = builder.getAltsClientOptionsForTest();
-
- assertThat(tcpfFactory).isNotNull();
- ProtocolNegotiator protocolNegotiator =
- tcpfFactory
- .create(new InetSocketAddress(8080), "fakeAuthority", "fakeUserAgent", null)
- .getProtocolNegotiator();
+ protocolNegotiator = builder.getProtocolNegotiatorForTest();
+ assertThat(protocolNegotiator).isNotNull();
assertThat(protocolNegotiator).isInstanceOf(AltsProtocolNegotiator.class);
-
- assertThat(altsClientOptions).isNotNull();
- RpcProtocolVersions expectedVersions =
- RpcProtocolVersions.newBuilder()
- .setMaxRpcVersion(
- RpcProtocolVersions.Version.newBuilder().setMajor(2).setMinor(1).build())
- .setMinRpcVersion(
- RpcProtocolVersions.Version.newBuilder().setMajor(2).setMinor(1).build())
- .build();
- assertThat(altsClientOptions.getRpcProtocolVersions()).isEqualTo(expectedVersions);
}
}
diff --git a/alts/src/test/java/io/grpc/alts/GoogleDefaultChannelBuilderTest.java b/alts/src/test/java/io/grpc/alts/GoogleDefaultChannelBuilderTest.java
index b681c733b..d9bba544a 100644
--- a/alts/src/test/java/io/grpc/alts/GoogleDefaultChannelBuilderTest.java
+++ b/alts/src/test/java/io/grpc/alts/GoogleDefaultChannelBuilderTest.java
@@ -19,9 +19,7 @@ package io.grpc.alts;
import static com.google.common.truth.Truth.assertThat;
import io.grpc.alts.internal.GoogleDefaultProtocolNegotiator;
-import io.grpc.netty.InternalNettyChannelBuilder.TransportCreationParamsFilterFactory;
import io.grpc.netty.ProtocolNegotiator;
-import java.net.InetSocketAddress;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -32,13 +30,9 @@ public final class GoogleDefaultChannelBuilderTest {
@Test
public void buildsNettyChannel() throws Exception {
GoogleDefaultChannelBuilder builder = GoogleDefaultChannelBuilder.forTarget("localhost:8080");
+ builder.build();
- TransportCreationParamsFilterFactory tcpfFactory = builder.getTcpfFactoryForTest();
- assertThat(tcpfFactory).isNotNull();
- ProtocolNegotiator protocolNegotiator =
- tcpfFactory
- .create(new InetSocketAddress(8080), "fakeAuthority", "fakeUserAgent", null)
- .getProtocolNegotiator();
+ ProtocolNegotiator protocolNegotiator = builder.getProtocolNegotiatorForTest();
assertThat(protocolNegotiator).isInstanceOf(GoogleDefaultProtocolNegotiator.class);
}
}
diff --git a/alts/src/test/java/io/grpc/alts/internal/AltsClientOptionsTest.java b/alts/src/test/java/io/grpc/alts/internal/AltsClientOptionsTest.java
index cdb44c9af..5a7cf8491 100644
--- a/alts/src/test/java/io/grpc/alts/internal/AltsClientOptionsTest.java
+++ b/alts/src/test/java/io/grpc/alts/internal/AltsClientOptionsTest.java
@@ -18,6 +18,7 @@ package io.grpc.alts.internal;
import static com.google.common.truth.Truth.assertThat;
+import com.google.common.collect.ImmutableList;
import io.grpc.alts.internal.TransportSecurityCommon.RpcProtocolVersions;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -39,12 +40,12 @@ public final class AltsClientOptionsTest {
.setMinRpcVersion(
RpcProtocolVersions.Version.newBuilder().setMajor(2).setMinor(1).build())
.build();
+ ImmutableList<String> serviceAccounts = ImmutableList.of(serviceAccount1, serviceAccount2);
AltsClientOptions options =
new AltsClientOptions.Builder()
.setTargetName(targetName)
- .addTargetServiceAccount(serviceAccount1)
- .addTargetServiceAccount(serviceAccount2)
+ .setTargetServiceAccounts(serviceAccounts)
.setRpcProtocolVersions(rpcVersions)
.build();
diff --git a/alts/src/test/java/io/grpc/alts/internal/AltsHandshakerClientTest.java b/alts/src/test/java/io/grpc/alts/internal/AltsHandshakerClientTest.java
index d5cbecfca..41923b546 100644
--- a/alts/src/test/java/io/grpc/alts/internal/AltsHandshakerClientTest.java
+++ b/alts/src/test/java/io/grpc/alts/internal/AltsHandshakerClientTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.google.common.collect.ImmutableList;
import com.google.protobuf.ByteString;
import io.grpc.alts.internal.Handshaker.HandshakeProtocol;
import io.grpc.alts.internal.Handshaker.HandshakerReq;
@@ -61,7 +62,7 @@ public class AltsHandshakerClientTest {
clientOptions =
new AltsClientOptions.Builder()
.setTargetName(TEST_TARGET_NAME)
- .addTargetServiceAccount(TEST_TARGET_SERVICE_ACCOUNT)
+ .setTargetServiceAccounts(ImmutableList.of(TEST_TARGET_SERVICE_ACCOUNT))
.build();
handshaker = new AltsHandshakerClient(mockStub, clientOptions);
}
@@ -249,7 +250,7 @@ public class AltsHandshakerClientTest {
clientOptions =
new AltsClientOptions.Builder()
.setTargetName(TEST_TARGET_NAME)
- .addTargetServiceAccount(TEST_TARGET_SERVICE_ACCOUNT)
+ .setTargetServiceAccounts(ImmutableList.of(TEST_TARGET_SERVICE_ACCOUNT))
.setRpcProtocolVersions(rpcVersions)
.build();
handshaker = new AltsHandshakerClient(mockStub, clientOptions);
diff --git a/alts/src/test/java/io/grpc/alts/internal/AltsProtocolNegotiatorTest.java b/alts/src/test/java/io/grpc/alts/internal/AltsProtocolNegotiatorTest.java
index 936c298a3..1670a4c50 100644
--- a/alts/src/test/java/io/grpc/alts/internal/AltsProtocolNegotiatorTest.java
+++ b/alts/src/test/java/io/grpc/alts/internal/AltsProtocolNegotiatorTest.java
@@ -76,6 +76,7 @@ import org.junit.runners.JUnit4;
/** Tests for {@link AltsProtocolNegotiator}. */
@RunWith(JUnit4.class)
public class AltsProtocolNegotiatorTest {
+
private final CapturingGrpcHttp2ConnectionHandler grpcHandler = capturingGrpcHandler();
private final List<ReferenceCounted> references = new ArrayList<>();
@@ -133,8 +134,8 @@ public class AltsProtocolNegotiatorTest {
TsiHandshakerFactory handshakerFactory =
new DelegatingTsiHandshakerFactory(FakeTsiHandshaker.clientHandshakerFactory()) {
@Override
- public TsiHandshaker newHandshaker() {
- return new DelegatingTsiHandshaker(super.newHandshaker()) {
+ public TsiHandshaker newHandshaker(String authority) {
+ return new DelegatingTsiHandshaker(super.newHandshaker(authority)) {
@Override
public TsiPeer extractPeer() throws GeneralSecurityException {
return mockedTsiPeer;
@@ -147,7 +148,8 @@ public class AltsProtocolNegotiatorTest {
};
}
};
- handler = AltsProtocolNegotiator.create(handshakerFactory).newHandler(grpcHandler);
+ handler =
+ AltsProtocolNegotiator.createServerNegotiator(handshakerFactory).newHandler(grpcHandler);
channel = new EmbeddedChannel(uncaughtExceptionHandler, handler, userEventHandler);
}
@@ -339,12 +341,14 @@ public class AltsProtocolNegotiatorTest {
public void peerPropagated() throws Exception {
doHandshake();
- assertThat(grpcHandler.attrs.get(AltsProtocolNegotiator.getTsiPeerAttributeKey()))
+ assertThat(grpcHandler.attrs.get(AltsProtocolNegotiator.TSI_PEER_KEY))
.isEqualTo(mockedTsiPeer);
- assertThat(grpcHandler.attrs.get(AltsProtocolNegotiator.getAltsAuthContextAttributeKey()))
+ assertThat(grpcHandler.attrs.get(AltsProtocolNegotiator.ALTS_CONTEXT_KEY))
.isEqualTo(mockedAltsContext);
assertThat(grpcHandler.attrs.get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR).toString())
.isEqualTo("embedded");
+ assertThat(grpcHandler.attrs.get(Grpc.TRANSPORT_ATTR_LOCAL_ADDR).toString())
+ .isEqualTo("embedded");
assertThat(grpcHandler.attrs.get(CallCredentials.ATTR_SECURITY_LEVEL))
.isEqualTo(SecurityLevel.PRIVACY_AND_INTEGRITY);
}
@@ -394,6 +398,7 @@ public class AltsProtocolNegotiatorTest {
}
private final class CapturingGrpcHttp2ConnectionHandler extends GrpcHttp2ConnectionHandler {
+
private Attributes attrs;
private CapturingGrpcHttp2ConnectionHandler(
@@ -421,8 +426,8 @@ public class AltsProtocolNegotiatorTest {
}
@Override
- public TsiHandshaker newHandshaker() {
- return delegate.newHandshaker();
+ public TsiHandshaker newHandshaker(String authority) {
+ return delegate.newHandshaker(authority);
}
}
@@ -477,6 +482,7 @@ public class AltsProtocolNegotiatorTest {
}
private static class InterceptingProtector implements TsiFrameProtector {
+
private final TsiFrameProtector delegate;
final AtomicInteger flushes = new AtomicInteger();
diff --git a/alts/src/test/java/io/grpc/alts/internal/FakeTsiHandshaker.java b/alts/src/test/java/io/grpc/alts/internal/FakeTsiHandshaker.java
index ea728e3bb..ebec896af 100644
--- a/alts/src/test/java/io/grpc/alts/internal/FakeTsiHandshaker.java
+++ b/alts/src/test/java/io/grpc/alts/internal/FakeTsiHandshaker.java
@@ -37,7 +37,7 @@ public class FakeTsiHandshaker implements TsiHandshaker {
private static final TsiHandshakerFactory clientHandshakerFactory =
new TsiHandshakerFactory() {
@Override
- public TsiHandshaker newHandshaker() {
+ public TsiHandshaker newHandshaker(String authority) {
return new FakeTsiHandshaker(true);
}
};
@@ -45,7 +45,7 @@ public class FakeTsiHandshaker implements TsiHandshaker {
private static final TsiHandshakerFactory serverHandshakerFactory =
new TsiHandshakerFactory() {
@Override
- public TsiHandshaker newHandshaker() {
+ public TsiHandshaker newHandshaker(String authority) {
return new FakeTsiHandshaker(false);
}
};
@@ -83,11 +83,11 @@ public class FakeTsiHandshaker implements TsiHandshaker {
}
public static TsiHandshaker newFakeHandshakerClient() {
- return clientHandshakerFactory.newHandshaker();
+ return clientHandshakerFactory.newHandshaker(null);
}
public static TsiHandshaker newFakeHandshakerServer() {
- return serverHandshakerFactory.newHandshaker();
+ return serverHandshakerFactory.newHandshaker(null);
}
protected FakeTsiHandshaker(boolean isClient) {
diff --git a/android-interop-testing/app/build.gradle b/android-interop-testing/app/build.gradle
index 37238baed..e704dfe07 100644
--- a/android-interop-testing/app/build.gradle
+++ b/android-interop-testing/app/build.gradle
@@ -42,7 +42,7 @@ protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' }
plugins {
javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -71,11 +71,11 @@ dependencies {
implementation 'junit:junit:4.12'
// You need to build grpc-java to obtain the grpc libraries below.
- implementation 'io.grpc:grpc-auth:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-protobuf-lite:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-stub:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-testing:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-auth:1.16.1' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-protobuf-lite:1.16.1' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-stub:1.16.1' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-testing:1.16.1' // CURRENT_GRPC_VERSION
// workaround for https://github.com/google/protobuf/issues/1889
protobuf 'com.google.protobuf:protobuf-java:3.0.2'
diff --git a/android-interop-testing/app/src/androidTest/java/io/grpc/android/integrationtest/InteropInstrumentationTest.java b/android-interop-testing/app/src/androidTest/java/io/grpc/android/integrationtest/InteropInstrumentationTest.java
index 0d88341b2..47f6fc72d 100644
--- a/android-interop-testing/app/src/androidTest/java/io/grpc/android/integrationtest/InteropInstrumentationTest.java
+++ b/android-interop-testing/app/src/androidTest/java/io/grpc/android/integrationtest/InteropInstrumentationTest.java
@@ -127,7 +127,7 @@ public class InteropInstrumentationTest {
new InteropTask(
listener,
TesterOkHttpChannelBuilder.build(host, port, serverHostOverride, useTls, testCa),
- new ArrayList<>(),
+ new ArrayList<ClientInterceptor>(),
testCase)
.execute();
String result = resultFuture.get(TIMEOUT_SECONDS, TimeUnit.SECONDS);
diff --git a/android-interop-testing/build.gradle b/android-interop-testing/build.gradle
index 929c7a6a3..d4fce1431 100644
--- a/android-interop-testing/build.gradle
+++ b/android-interop-testing/build.gradle
@@ -2,8 +2,8 @@
buildscript {
repositories {
- jcenter()
google()
+ jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
@@ -16,9 +16,9 @@ buildscript {
allprojects {
repositories {
+ google()
mavenLocal()
jcenter()
- google()
}
}
diff --git a/android/build.gradle b/android/build.gradle
index d3303c494..7aad5977e 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'
group = "io.grpc"
-version = "1.16.0-SNAPSHOT" // CURRENT_GRPC_VERSION
+version = "1.16.1" // CURRENT_GRPC_VERSION
description = 'gRPC: Android'
buildscript {
@@ -41,9 +41,9 @@ repositories {
}
dependencies {
- implementation 'io.grpc:grpc-core:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-core:1.16.1' // CURRENT_GRPC_VERSION
- testImplementation 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ testImplementation 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:3.7.1'
testImplementation 'com.google.truth:truth:0.39'
diff --git a/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java b/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java
index c258db1bc..32855e3bd 100644
--- a/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java
+++ b/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java
@@ -22,8 +22,7 @@ import com.google.auth.Credentials;
import com.google.auth.RequestMetadataCallback;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.io.BaseEncoding;
-import io.grpc.Attributes;
-import io.grpc.CallCredentials;
+import io.grpc.CallCredentials2;
import io.grpc.Metadata;
import io.grpc.MethodDescriptor;
import io.grpc.SecurityLevel;
@@ -47,7 +46,7 @@ import javax.annotation.Nullable;
/**
* Wraps {@link Credentials} as a {@link CallCredentials}.
*/
-final class GoogleAuthLibraryCallCredentials implements CallCredentials {
+final class GoogleAuthLibraryCallCredentials extends CallCredentials2 {
private static final Logger log
= Logger.getLogger(GoogleAuthLibraryCallCredentials.class.getName());
private static final JwtHelper jwtHelper
@@ -88,15 +87,9 @@ final class GoogleAuthLibraryCallCredentials implements CallCredentials {
public void thisUsesUnstableApi() {}
@Override
- public void applyRequestMetadata(MethodDescriptor<?, ?> method, Attributes attrs,
- Executor appExecutor, final MetadataApplier applier) {
- SecurityLevel security = attrs.get(ATTR_SECURITY_LEVEL);
- if (security == null) {
- // Although the API says ATTR_SECURITY_LEVEL is required, no one was really looking at it thus
- // there may be transports that got away without setting it. Now we start to check it, it'd
- // be less disruptive to tolerate nulls.
- security = SecurityLevel.NONE;
- }
+ public void applyRequestMetadata(
+ RequestInfo info, Executor appExecutor, final MetadataApplier applier) {
+ SecurityLevel security = info.getSecurityLevel();
if (requirePrivacy && security != SecurityLevel.PRIVACY_AND_INTEGRITY) {
applier.fail(Status.UNAUTHENTICATED
.withDescription("Credentials require channel with PRIVACY_AND_INTEGRITY security level. "
@@ -104,10 +97,10 @@ final class GoogleAuthLibraryCallCredentials implements CallCredentials {
return;
}
- String authority = checkNotNull(attrs.get(ATTR_AUTHORITY), "authority");
+ String authority = checkNotNull(info.getAuthority(), "authority");
final URI uri;
try {
- uri = serviceUri(authority, method);
+ uri = serviceUri(authority, info.getMethodDescriptor());
} catch (StatusException e) {
applier.fail(e.getStatus());
return;
diff --git a/auth/src/test/java/io/grpc/auth/GoogleAuthLibraryCallCredentialsTest.java b/auth/src/test/java/io/grpc/auth/GoogleAuthLibraryCallCredentialsTest.java
index 438dab0ff..d29668313 100644
--- a/auth/src/test/java/io/grpc/auth/GoogleAuthLibraryCallCredentialsTest.java
+++ b/auth/src/test/java/io/grpc/auth/GoogleAuthLibraryCallCredentialsTest.java
@@ -39,8 +39,8 @@ import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
-import io.grpc.CallCredentials.MetadataApplier;
+import io.grpc.CallCredentials2;
+import io.grpc.CallCredentials2.MetadataApplier;
import io.grpc.Metadata;
import io.grpc.MethodDescriptor;
import io.grpc.SecurityLevel;
@@ -105,11 +105,8 @@ public class GoogleAuthLibraryCallCredentialsTest {
.build();
private URI expectedUri = URI.create("https://testauthority/a.service");
- private final String authority = "testauthority";
- private final Attributes attrs = Attributes.newBuilder()
- .set(CallCredentials.ATTR_AUTHORITY, authority)
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
- .build();
+ private static final String AUTHORITY = "testauthority";
+ private static final SecurityLevel SECURITY_LEVEL = SecurityLevel.PRIVACY_AND_INTEGRITY;
private ArrayList<Runnable> pendingRunnables = new ArrayList<>();
@@ -155,7 +152,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
verify(credentials).getRequestMetadata(eq(expectedUri));
verify(applier).apply(headersCaptor.capture());
@@ -177,7 +174,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
verify(credentials).getRequestMetadata(eq(expectedUri));
verify(applier).fail(statusCaptor.capture());
@@ -193,7 +190,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
verify(credentials).getRequestMetadata(eq(expectedUri));
verify(applier).fail(statusCaptor.capture());
@@ -209,7 +206,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
verify(credentials).getRequestMetadata(eq(expectedUri));
verify(applier).fail(statusCaptor.capture());
@@ -229,7 +226,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
for (int i = 0; i < 3; i++) {
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
}
verify(credentials, times(3)).getRequestMetadata(eq(expectedUri));
@@ -255,14 +252,11 @@ public class GoogleAuthLibraryCallCredentialsTest {
return token;
}
};
- // Security level should not impact non-GoogleCredentials
- Attributes securityNone = attrs.toBuilder()
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.NONE)
- .build();
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, securityNone, executor, applier);
+ callCredentials.applyRequestMetadata(
+ new RequestInfoImpl(SecurityLevel.NONE), executor, applier);
assertEquals(1, runPendingRunnables());
verify(applier).apply(headersCaptor.capture());
@@ -276,13 +270,11 @@ public class GoogleAuthLibraryCallCredentialsTest {
public void googleCredential_privacyAndIntegrityAllowed() {
final AccessToken token = new AccessToken("allyourbase", new Date(Long.MAX_VALUE));
final Credentials credentials = GoogleCredentials.create(token);
- Attributes privacy = attrs.toBuilder()
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
- .build();
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, privacy, executor, applier);
+ callCredentials.applyRequestMetadata(
+ new RequestInfoImpl(SecurityLevel.PRIVACY_AND_INTEGRITY), executor, applier);
runPendingRunnables();
verify(applier).apply(headersCaptor.capture());
@@ -297,33 +289,11 @@ public class GoogleAuthLibraryCallCredentialsTest {
final AccessToken token = new AccessToken("allyourbase", new Date(Long.MAX_VALUE));
final Credentials credentials = GoogleCredentials.create(token);
// Anything less than PRIVACY_AND_INTEGRITY should fail
- Attributes integrity = attrs.toBuilder()
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.INTEGRITY)
- .build();
-
- GoogleAuthLibraryCallCredentials callCredentials =
- new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, integrity, executor, applier);
- runPendingRunnables();
-
- verify(applier).fail(statusCaptor.capture());
- Status status = statusCaptor.getValue();
- assertEquals(Status.Code.UNAUTHENTICATED, status.getCode());
- }
-
- @Test
- public void googleCredential_nullSecurityDenied() {
- final AccessToken token = new AccessToken("allyourbase", new Date(Long.MAX_VALUE));
- final Credentials credentials = GoogleCredentials.create(token);
- // Null should not (for the moment) crash in horrible ways. In the future this could be changed,
- // since it technically isn't allowed per the API.
- Attributes integrity = attrs.toBuilder()
- .set(CallCredentials.ATTR_SECURITY_LEVEL, null)
- .build();
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, integrity, executor, applier);
+ callCredentials.applyRequestMetadata(
+ new RequestInfoImpl(SecurityLevel.INTEGRITY), executor, applier);
runPendingRunnables();
verify(applier).fail(statusCaptor.capture());
@@ -335,20 +305,12 @@ public class GoogleAuthLibraryCallCredentialsTest {
public void serviceUri() throws Exception {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method,
- Attributes.newBuilder()
- .setAll(attrs)
- .set(CallCredentials.ATTR_AUTHORITY, "example.com:443")
- .build(),
- executor, applier);
+ callCredentials.applyRequestMetadata(
+ new RequestInfoImpl("example.com:443"), executor, applier);
verify(credentials).getRequestMetadata(eq(new URI("https://example.com/a.service")));
- callCredentials.applyRequestMetadata(method,
- Attributes.newBuilder()
- .setAll(attrs)
- .set(CallCredentials.ATTR_AUTHORITY, "example.com:123")
- .build(),
- executor, applier);
+ callCredentials.applyRequestMetadata(
+ new RequestInfoImpl("example.com:123"), executor, applier);
verify(credentials).getRequestMetadata(eq(new URI("https://example.com:123/a.service")));
}
@@ -366,7 +328,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
assertEquals(0, runPendingRunnables());
verify(applier).apply(headersCaptor.capture());
@@ -393,7 +355,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
assertEquals(1, runPendingRunnables());
verify(applier).apply(headersCaptor.capture());
@@ -412,7 +374,7 @@ public class GoogleAuthLibraryCallCredentialsTest {
assertNull(GoogleAuthLibraryCallCredentials.createJwtHelperOrNull(null));
GoogleAuthLibraryCallCredentials callCredentials =
new GoogleAuthLibraryCallCredentials(credentials, null);
- callCredentials.applyRequestMetadata(method, attrs, executor, applier);
+ callCredentials.applyRequestMetadata(new RequestInfoImpl(), executor, applier);
verify(credentials).getRequestMetadata(eq(expectedUri));
verify(applier).apply(headersCaptor.capture());
@@ -430,4 +392,46 @@ public class GoogleAuthLibraryCallCredentialsTest {
}
return savedPendingRunnables.size();
}
+
+ private final class RequestInfoImpl extends CallCredentials2.RequestInfo {
+ final String authority;
+ final SecurityLevel securityLevel;
+
+ RequestInfoImpl() {
+ this(AUTHORITY, SECURITY_LEVEL);
+ }
+
+ RequestInfoImpl(SecurityLevel securityLevel) {
+ this(AUTHORITY, securityLevel);
+ }
+
+ RequestInfoImpl(String authority) {
+ this(authority, SECURITY_LEVEL);
+ }
+
+ RequestInfoImpl(String authority, SecurityLevel securityLevel) {
+ this.authority = authority;
+ this.securityLevel = securityLevel;
+ }
+
+ @Override
+ public MethodDescriptor<?, ?> getMethodDescriptor() {
+ return method;
+ }
+
+ @Override
+ public SecurityLevel getSecurityLevel() {
+ return securityLevel;
+ }
+
+ @Override
+ public String getAuthority() {
+ return authority;
+ }
+
+ @Override
+ public Attributes getTransportAttrs() {
+ return Attributes.EMPTY;
+ }
+ }
}
diff --git a/build.gradle b/build.gradle
index 2297beda0..a2c20bbcb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -53,7 +53,7 @@ subprojects {
idea.module.inheritOutputDirs = true
group = "io.grpc"
- version = "1.16.0-SNAPSHOT" // CURRENT_GRPC_VERSION
+ version = "1.16.1" // CURRENT_GRPC_VERSION
sourceCompatibility = 1.7
targetCompatibility = 1.7
@@ -110,8 +110,8 @@ subprojects {
protocPluginBaseName = 'protoc-gen-grpc-java'
javaPluginPath = "$rootDir/compiler/build/exe/java_plugin/$protocPluginBaseName$exeSuffix"
- nettyVersion = '4.1.27.Final'
- guavaVersion = '20.0'
+ nettyVersion = '4.1.30.Final'
+ guavaVersion = '26.0-android'
protobufVersion = '3.5.1'
protocVersion = '3.5.1-1'
protobufNanoVersion = '3.0.0-alpha-5'
@@ -201,7 +201,7 @@ subprojects {
guava: "com.google.guava:guava:${guavaVersion}",
hpack: 'com.twitter:hpack:0.10.1',
javax_annotation: 'javax.annotation:javax.annotation-api:1.2',
- jsr305: 'com.google.code.findbugs:jsr305:3.0.0',
+ jsr305: 'com.google.code.findbugs:jsr305:3.0.2',
oauth_client: 'com.google.auth:google-auth-library-oauth2-http:0.9.0',
google_api_protos: 'com.google.api.grpc:proto-google-common-protos:1.0.0',
google_auth_credentials: 'com.google.auth:google-auth-library-credentials:0.9.0',
@@ -224,7 +224,7 @@ subprojects {
netty: "io.netty:netty-codec-http2:[${nettyVersion}]",
netty_epoll: "io.netty:netty-transport-native-epoll:${nettyVersion}" + epoll_suffix,
netty_proxy_handler: "io.netty:netty-handler-proxy:${nettyVersion}",
- netty_tcnative: 'io.netty:netty-tcnative-boringssl-static:2.0.12.Final',
+ netty_tcnative: 'io.netty:netty-tcnative-boringssl-static:2.0.17.Final',
conscrypt: 'org.conscrypt:conscrypt-openjdk-uber:1.0.1',
re2j: 'com.google.re2j:re2j:1.2',
@@ -233,7 +233,7 @@ subprojects {
junit: 'junit:junit:4.12',
mockito: 'org.mockito:mockito-core:1.9.5',
truth: 'com.google.truth:truth:0.42',
- guava_testlib: 'com.google.guava:guava-testlib:20.0',
+ guava_testlib: "com.google.guava:guava-testlib:${guavaVersion}",
// Benchmark dependencies
hdrhistogram: 'org.hdrhistogram:HdrHistogram:2.1.10',
diff --git a/buildscripts/make_dependencies.bat b/buildscripts/make_dependencies.bat
index 691520eae..6b5f0acb3 100644
--- a/buildscripts/make_dependencies.bat
+++ b/buildscripts/make_dependencies.bat
@@ -36,7 +36,7 @@ if "%PLATFORM%" == "X64" (
SET CMAKE_VSARCH=
)
cmake -Dprotobuf_BUILD_TESTS=OFF -G "Visual Studio %VisualStudioVersion:~0,2%%CMAKE_VSARCH%" .. || exit /b 1
-msbuild /maxcpucount /p:Configuration=Release libprotoc.vcxproj || exit /b 1
+msbuild /maxcpucount /p:Configuration=Release /verbosity:minimal libprotoc.vcxproj || exit /b 1
call extract_includes.bat || exit /b 1
popd
goto :eof
diff --git a/buildscripts/make_dependencies.sh b/buildscripts/make_dependencies.sh
index e4aa541a5..fe9c61151 100755
--- a/buildscripts/make_dependencies.sh
+++ b/buildscripts/make_dependencies.sh
@@ -35,7 +35,7 @@ else
--prefix="$INSTALL_DIR"
# the same source dir is used for 32 and 64 bit builds, so we need to clean stale data first
make clean
- make -j$NUM_CPU
+ make V=0 -j$NUM_CPU
make install
popd
fi
diff --git a/compiler/src/test/golden/TestDeprecatedService.java.txt b/compiler/src/test/golden/TestDeprecatedService.java.txt
index 8cc441b22..769854382 100644
--- a/compiler/src/test/golden/TestDeprecatedService.java.txt
+++ b/compiler/src/test/golden/TestDeprecatedService.java.txt
@@ -21,7 +21,7 @@ import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
@java.lang.Deprecated
public final class TestDeprecatedServiceGrpc {
diff --git a/compiler/src/test/golden/TestService.java.txt b/compiler/src/test/golden/TestService.java.txt
index c9e10cf99..aebd0b14a 100644
--- a/compiler/src/test/golden/TestService.java.txt
+++ b/compiler/src/test/golden/TestService.java.txt
@@ -21,7 +21,7 @@ import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
public final class TestServiceGrpc {
diff --git a/compiler/src/testLite/golden/TestDeprecatedService.java.txt b/compiler/src/testLite/golden/TestDeprecatedService.java.txt
index 960148306..0d0490de8 100644
--- a/compiler/src/testLite/golden/TestDeprecatedService.java.txt
+++ b/compiler/src/testLite/golden/TestDeprecatedService.java.txt
@@ -21,7 +21,7 @@ import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
@java.lang.Deprecated
public final class TestDeprecatedServiceGrpc {
diff --git a/compiler/src/testLite/golden/TestService.java.txt b/compiler/src/testLite/golden/TestService.java.txt
index 2adcbdd4b..c741d6e64 100644
--- a/compiler/src/testLite/golden/TestService.java.txt
+++ b/compiler/src/testLite/golden/TestService.java.txt
@@ -21,7 +21,7 @@ import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
public final class TestServiceGrpc {
diff --git a/compiler/src/testNano/golden/TestDeprecatedService.java.txt b/compiler/src/testNano/golden/TestDeprecatedService.java.txt
index 6e5bba96e..c96a01d20 100644
--- a/compiler/src/testNano/golden/TestDeprecatedService.java.txt
+++ b/compiler/src/testNano/golden/TestDeprecatedService.java.txt
@@ -23,7 +23,7 @@ import java.io.IOException;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
@java.lang.Deprecated
public final class TestDeprecatedServiceGrpc {
diff --git a/compiler/src/testNano/golden/TestService.java.txt b/compiler/src/testNano/golden/TestService.java.txt
index 35c3332ca..ee0bd14d0 100644
--- a/compiler/src/testNano/golden/TestService.java.txt
+++ b/compiler/src/testNano/golden/TestService.java.txt
@@ -23,7 +23,7 @@ import java.io.IOException;
* </pre>
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.16.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.16.1)",
comments = "Source: grpc/testing/compiler/test.proto")
public final class TestServiceGrpc {
diff --git a/core/build.gradle b/core/build.gradle
index 700592f86..4a2429098 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -3,12 +3,19 @@ description = 'gRPC: Core'
dependencies {
compile project(':grpc-context'),
libraries.gson,
- libraries.guava,
libraries.errorprone,
libraries.jsr305,
libraries.animalsniffer_annotations
+ compile (libraries.guava) {
+ // prefer 2.2.0 from libraries instead of 2.1.3
+ exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+ // prefer 3.0.2 from libraries instead of 3.0.1
+ exclude group: 'com.google.code.findbugs', module: 'jsr305'
+ // prefer 1.17 from libraries instead of 1.14
+ exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+ }
compile (libraries.opencensus_api) {
- // prefer 3.0.0 from libraries instead of 3.0.1
+ // prefer 3.0.2 from libraries instead of 3.0.1
exclude group: 'com.google.code.findbugs', module: 'jsr305'
// prefer 20.0 from libraries instead of 19.0
exclude group: 'com.google.guava', module: 'guava'
@@ -16,7 +23,7 @@ dependencies {
exclude group: 'io.grpc', module: 'grpc-context'
}
compile (libraries.opencensus_contrib_grpc_metrics) {
- // prefer 3.0.0 from libraries instead of 3.0.1
+ // prefer 3.0.2 from libraries instead of 3.0.1
exclude group: 'com.google.code.findbugs', module: 'jsr305'
// we'll always be more up-to-date
exclude group: 'io.grpc', module: 'grpc-context'
diff --git a/core/src/main/java/io/grpc/Attributes.java b/core/src/main/java/io/grpc/Attributes.java
index 9a13f5160..411d11c33 100644
--- a/core/src/main/java/io/grpc/Attributes.java
+++ b/core/src/main/java/io/grpc/Attributes.java
@@ -29,6 +29,18 @@ import javax.annotation.concurrent.Immutable;
/**
* An immutable type-safe container of attributes.
+ *
+ * <h3>Annotation semantics</h3>
+ *
+ * <p>As a convention, annotations such as {@link Grpc.TransportAttr} is defined to associate
+ * attribute {@link Key}s and their propagation paths. The annotation may be applied to a {@code
+ * Key} definition field, a method that returns {@link Attributes}, or a variable of type {@link
+ * Attributes}, to indicate that the annotated {@link Attributes} objects may contain the annotated
+ * {@code Key}.
+ *
+ * <p>Javadoc users may click "USE" on the navigation bars of the annotation's javadoc page to view
+ * references of such annotation.
+ *
* @since 1.13.0
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1764")
diff --git a/core/src/main/java/io/grpc/BinaryLog.java b/core/src/main/java/io/grpc/BinaryLog.java
index 5c2d4ab2f..9d11b63cf 100644
--- a/core/src/main/java/io/grpc/BinaryLog.java
+++ b/core/src/main/java/io/grpc/BinaryLog.java
@@ -29,21 +29,4 @@ public abstract class BinaryLog implements Closeable {
ServerMethodDefinition<ReqT, RespT> oMethodDef);
public abstract Channel wrapChannel(Channel channel);
-
- /**
- * A CallId is two byte[] arrays both of size 8 that uniquely identifies the RPC. Users are
- * free to use the byte arrays however they see fit.
- */
- public static final class CallId {
- public final long hi;
- public final long lo;
-
- /**
- * Creates an instance.
- */
- public CallId(long hi, long lo) {
- this.hi = hi;
- this.lo = lo;
- }
- }
}
diff --git a/core/src/main/java/io/grpc/CallCredentials.java b/core/src/main/java/io/grpc/CallCredentials.java
index 7ce621993..03be65310 100644
--- a/core/src/main/java/io/grpc/CallCredentials.java
+++ b/core/src/main/java/io/grpc/CallCredentials.java
@@ -40,10 +40,15 @@ public interface CallCredentials {
* The security level of the transport. It is guaranteed to be present in the {@code attrs} passed
* to {@link #applyRequestMetadata}. It is by default {@link SecurityLevel#NONE} but can be
* overridden by the transport.
+ *
+ * @deprecated transport implementations should use {@code
+ * io.grpc.internal.GrpcAttributes.ATTR_SECURITY_LEVEL} instead.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ @Grpc.TransportAttr
+ @Deprecated
public static final Key<SecurityLevel> ATTR_SECURITY_LEVEL =
- Key.create("io.grpc.CallCredentials.securityLevel");
+ Key.create("io.grpc.internal.GrpcAttributes.securityLevel");
/**
* The authority string used to authenticate the server. Usually it's the server's host name. It
@@ -52,6 +57,8 @@ public interface CallCredentials {
* io.grpc.CallOptions} with increasing precedence.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ @Grpc.TransportAttr
+ @Deprecated
public static final Key<String> ATTR_AUTHORITY = Key.create("io.grpc.CallCredentials.authority");
/**
@@ -71,8 +78,11 @@ public interface CallCredentials {
* needs to perform blocking operations.
* @param applier The outlet of the produced headers. It can be called either before or after this
* method returns.
+ *
+ * @deprecated implement {@link CallCredentials2} instead.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ @Deprecated
void applyRequestMetadata(
MethodDescriptor<?, ?> method, Attributes attrs,
Executor appExecutor, MetadataApplier applier);
@@ -89,6 +99,7 @@ public interface CallCredentials {
*
* <p>Exactly one of its methods must be called to make the RPC proceed.
*/
+ @Deprecated
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
public interface MetadataApplier {
/**
@@ -102,4 +113,31 @@ public interface CallCredentials {
*/
void fail(Status status);
}
+
+ /**
+ * The request-related information passed to {@code CallCredentials2.applyRequestMetadata()}.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ public abstract static class RequestInfo {
+ /**
+ * The method descriptor of this RPC.
+ */
+ public abstract MethodDescriptor<?, ?> getMethodDescriptor();
+
+ /**
+ * The security level on the transport.
+ */
+ public abstract SecurityLevel getSecurityLevel();
+
+ /**
+ * Returns the authority string used to authenticate the server for this call.
+ */
+ public abstract String getAuthority();
+
+ /**
+ * Returns the transport attributes.
+ */
+ @Grpc.TransportAttr
+ public abstract Attributes getTransportAttrs();
+ }
}
diff --git a/core/src/main/java/io/grpc/CallCredentials2.java b/core/src/main/java/io/grpc/CallCredentials2.java
new file mode 100644
index 000000000..998df42db
--- /dev/null
+++ b/core/src/main/java/io/grpc/CallCredentials2.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2016 The gRPC Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.grpc;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.concurrent.Executor;
+
+/**
+ * The new interface for {@link CallCredentials}.
+ *
+ * <p>THIS CLASS NAME IS TEMPORARY and is part of a migration. This class will BE DELETED as it
+ * replaces {@link CallCredentials} in short-term. THIS CLASS SHOULD ONLY BE REFERENCED BY
+ * IMPLEMENTIONS. All consumers should still reference {@link CallCredentials}.
+ */
+@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4901")
+public abstract class CallCredentials2 implements CallCredentials {
+ /**
+ * Pass the credential data to the given {@link CallCredentials.MetadataApplier}, which will
+ * propagate it to the request metadata.
+ *
+ * <p>It is called for each individual RPC, within the {@link Context} of the call, before the
+ * stream is about to be created on a transport. Implementations should not block in this
+ * method. If metadata is not immediately available, e.g., needs to be fetched from network, the
+ * implementation may give the {@code applier} to an asynchronous task which will eventually call
+ * the {@code applier}. The RPC proceeds only after the {@code applier} is called.
+ *
+ * @param requestInfo request-related information
+ * @param appExecutor The application thread-pool. It is provided to the implementation in case it
+ * needs to perform blocking operations.
+ * @param applier The outlet of the produced headers. It can be called either before or after this
+ * method returns.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ public abstract void applyRequestMetadata(
+ RequestInfo requestInfo, Executor appExecutor, MetadataApplier applier);
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public final void applyRequestMetadata(
+ final MethodDescriptor<?, ?> method, final Attributes attrs,
+ Executor appExecutor, final CallCredentials.MetadataApplier applier) {
+ final String authority = checkNotNull(attrs.get(ATTR_AUTHORITY), "authority");
+ final SecurityLevel securityLevel =
+ firstNonNull(attrs.get(ATTR_SECURITY_LEVEL), SecurityLevel.NONE);
+ RequestInfo requestInfo = new RequestInfo() {
+ @Override
+ public MethodDescriptor<?, ?> getMethodDescriptor() {
+ return method;
+ }
+
+ @Override
+ public SecurityLevel getSecurityLevel() {
+ return securityLevel;
+ }
+
+ @Override
+ public String getAuthority() {
+ return authority;
+ }
+
+ @Override
+ public Attributes getTransportAttrs() {
+ return attrs;
+ }
+ };
+ MetadataApplier applierAdapter = new MetadataApplier() {
+ @Override
+ public void apply(Metadata headers) {
+ applier.apply(headers);
+ }
+
+ @Override
+ public void fail(Status status) {
+ applier.fail(status);
+ }
+ };
+ applyRequestMetadata(requestInfo, appExecutor, applierAdapter);
+ }
+
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1914")
+ @SuppressWarnings("deprecation")
+ public abstract static class MetadataApplier implements CallCredentials.MetadataApplier {}
+}
diff --git a/core/src/main/java/io/grpc/ClientCall.java b/core/src/main/java/io/grpc/ClientCall.java
index 936cb322b..2aa5034b7 100644
--- a/core/src/main/java/io/grpc/ClientCall.java
+++ b/core/src/main/java/io/grpc/ClientCall.java
@@ -262,12 +262,11 @@ public abstract class ClientCall<ReqT, RespT> {
* or {@link Listener#onClose}. If called prematurely, the implementation may throw {@code
* IllegalStateException} or return arbitrary {@code Attributes}.
*
- * <p>{@link Grpc} defines commonly used attributes, but they are not guaranteed to be present.
- *
* @return non-{@code null} attributes
* @throws IllegalStateException (optional) if called before permitted
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/2607")
+ @Grpc.TransportAttr
public Attributes getAttributes() {
return Attributes.EMPTY;
}
diff --git a/core/src/main/java/io/grpc/EquivalentAddressGroup.java b/core/src/main/java/io/grpc/EquivalentAddressGroup.java
index 2218a7fae..eabd2eafb 100644
--- a/core/src/main/java/io/grpc/EquivalentAddressGroup.java
+++ b/core/src/main/java/io/grpc/EquivalentAddressGroup.java
@@ -17,6 +17,9 @@
package io.grpc;
import com.google.common.base.Preconditions;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collections;
@@ -50,7 +53,7 @@ public final class EquivalentAddressGroup {
/**
* List constructor with {@link Attributes}.
*/
- public EquivalentAddressGroup(List<SocketAddress> addrs, Attributes attrs) {
+ public EquivalentAddressGroup(List<SocketAddress> addrs, @Attr Attributes attrs) {
Preconditions.checkArgument(!addrs.isEmpty(), "addrs is empty");
this.addrs = Collections.unmodifiableList(new ArrayList<>(addrs));
this.attrs = Preconditions.checkNotNull(attrs, "attrs");
@@ -69,7 +72,7 @@ public final class EquivalentAddressGroup {
/**
* Singleton constructor with Attributes.
*/
- public EquivalentAddressGroup(SocketAddress addr, Attributes attrs) {
+ public EquivalentAddressGroup(SocketAddress addr, @Attr Attributes attrs) {
this(Collections.singletonList(addr), attrs);
}
@@ -83,6 +86,7 @@ public final class EquivalentAddressGroup {
/**
* Returns the attributes.
*/
+ @Attr
public Attributes getAttributes() {
return attrs;
}
@@ -127,4 +131,13 @@ public final class EquivalentAddressGroup {
}
return true;
}
+
+ /**
+ * Annotation for {@link EquivalentAddressGroup}'s attributes. It follows the annotation semantics
+ * defined by {@link Attributes}.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4972")
+ @Retention(RetentionPolicy.SOURCE)
+ @Documented
+ public @interface Attr {}
}
diff --git a/core/src/main/java/io/grpc/Grpc.java b/core/src/main/java/io/grpc/Grpc.java
index aef072606..53ff28be3 100644
--- a/core/src/main/java/io/grpc/Grpc.java
+++ b/core/src/main/java/io/grpc/Grpc.java
@@ -16,6 +16,9 @@
package io.grpc;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.SocketAddress;
import javax.net.ssl.SSLSession;
@@ -31,13 +34,32 @@ public final class Grpc {
* Attribute key for the remote address of a transport.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1710")
+ @TransportAttr
public static final Attributes.Key<SocketAddress> TRANSPORT_ATTR_REMOTE_ADDR =
- Attributes.Key.create("remote-addr");
+ Attributes.Key.create("remote-addr");
+
+ /**
+ * Attribute key for the local address of a transport.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1710")
+ @TransportAttr
+ public static final Attributes.Key<SocketAddress> TRANSPORT_ATTR_LOCAL_ADDR =
+ Attributes.Key.create("local-addr");
/**
* Attribute key for SSL session of a transport.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1710")
+ @TransportAttr
public static final Attributes.Key<SSLSession> TRANSPORT_ATTR_SSL_SESSION =
- Attributes.Key.create("ssl-session");
+ Attributes.Key.create("ssl-session");
+
+ /**
+ * Annotation for transport attributes. It follows the annotation semantics defined
+ * by {@link Attributes}.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4972")
+ @Retention(RetentionPolicy.SOURCE)
+ @Documented
+ public @interface TransportAttr {}
}
diff --git a/core/src/main/java/io/grpc/LoadBalancer.java b/core/src/main/java/io/grpc/LoadBalancer.java
index 633bf5263..f1cef63fb 100644
--- a/core/src/main/java/io/grpc/LoadBalancer.java
+++ b/core/src/main/java/io/grpc/LoadBalancer.java
@@ -107,11 +107,12 @@ public abstract class LoadBalancer {
* <p>Implementations should not modify the given {@code servers}.
*
* @param servers the resolved server addresses, never empty.
- * @param attributes extra metadata from naming system.
+ * @param attributes extra information from naming system.
* @since 1.2.0
*/
public abstract void handleResolvedAddressGroups(
- List<EquivalentAddressGroup> servers, Attributes attributes);
+ List<EquivalentAddressGroup> servers,
+ @NameResolver.ResolutionResultAttr Attributes attributes);
/**
* Handles an error from the name resolution system.
@@ -154,6 +155,11 @@ public abstract class LoadBalancer {
*/
public abstract void shutdown();
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+
/**
* The main balancing logic. It <strong>must be thread-safe</strong>. Typically it should only
* synchronize on its own state, and avoid synchronizing with the LoadBalancer's state.
diff --git a/core/src/main/java/io/grpc/NameResolver.java b/core/src/main/java/io/grpc/NameResolver.java
index 60f819e4d..845dcb02f 100644
--- a/core/src/main/java/io/grpc/NameResolver.java
+++ b/core/src/main/java/io/grpc/NameResolver.java
@@ -16,6 +16,9 @@
package io.grpc;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.URI;
import java.util.List;
import javax.annotation.Nullable;
@@ -126,6 +129,7 @@ public abstract class NameResolver {
*
* @since 1.0.0
*/
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1770")
@ThreadSafe
public interface Listener {
/**
@@ -134,10 +138,11 @@ public abstract class NameResolver {
* <p>Implementations will not modify the given {@code servers}.
*
* @param servers the resolved server addresses. An empty list will trigger {@link #onError}
- * @param attributes extra metadata from naming system
+ * @param attributes extra information from naming system.
* @since 1.3.0
*/
- void onAddresses(List<EquivalentAddressGroup> servers, Attributes attributes);
+ void onAddresses(
+ List<EquivalentAddressGroup> servers, @ResolutionResultAttr Attributes attributes);
/**
* Handles an error from the resolver. The listener is responsible for eventually invoking
@@ -148,4 +153,13 @@ public abstract class NameResolver {
*/
void onError(Status error);
}
+
+ /**
+ * Annotation for name resolution result attributes. It follows the annotation semantics defined
+ * by {@link Attributes}.
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4972")
+ @Retention(RetentionPolicy.SOURCE)
+ @Documented
+ public @interface ResolutionResultAttr {}
}
diff --git a/core/src/main/java/io/grpc/ServerCall.java b/core/src/main/java/io/grpc/ServerCall.java
index 106676fa7..07711e381 100644
--- a/core/src/main/java/io/grpc/ServerCall.java
+++ b/core/src/main/java/io/grpc/ServerCall.java
@@ -192,11 +192,11 @@ public abstract class ServerCall<ReqT, RespT> {
* Returns properties of a single call.
*
* <p>Attributes originate from the transport and can be altered by {@link ServerTransportFilter}.
- * {@link Grpc} defines commonly used attributes, but they are not guaranteed to be present.
*
* @return non-{@code null} Attributes container
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1779")
+ @Grpc.TransportAttr
public Attributes getAttributes() {
return Attributes.EMPTY;
}
diff --git a/core/src/main/java/io/grpc/inprocess/InProcessTransport.java b/core/src/main/java/io/grpc/inprocess/InProcessTransport.java
index 7cf1a89ba..03e2e1a19 100644
--- a/core/src/main/java/io/grpc/inprocess/InProcessTransport.java
+++ b/core/src/main/java/io/grpc/inprocess/InProcessTransport.java
@@ -24,7 +24,6 @@ import com.google.common.base.MoreObjects;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
import io.grpc.CallOptions;
import io.grpc.Compressor;
import io.grpc.Deadline;
@@ -41,6 +40,7 @@ import io.grpc.Status;
import io.grpc.internal.ClientStream;
import io.grpc.internal.ClientStreamListener;
import io.grpc.internal.ConnectionClientTransport;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.ManagedClientTransport;
import io.grpc.internal.NoopClientStream;
@@ -91,7 +91,7 @@ final class InProcessTransport implements ServerTransport, ConnectionClientTrans
@GuardedBy("this")
private List<ServerStreamTracer.Factory> serverStreamTracerFactories;
private final Attributes attributes = Attributes.newBuilder()
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
.build();
public InProcessTransport(String name, String authority, String userAgent) {
@@ -132,6 +132,7 @@ final class InProcessTransport implements ServerTransport, ConnectionClientTrans
synchronized (InProcessTransport.this) {
Attributes serverTransportAttrs = Attributes.newBuilder()
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InProcessSocketAddress(name))
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, new InProcessSocketAddress(name))
.build();
serverStreamAttributes = serverTransportListener.transportReady(serverTransportAttrs);
clientTransportListener.transportReady();
diff --git a/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java b/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
index 80505bce3..a8f778a46 100644
--- a/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
+++ b/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
@@ -16,11 +16,14 @@
package io.grpc.internal;
+import static com.google.common.base.Preconditions.checkNotNull;
+
import com.google.common.annotations.VisibleForTesting;
import io.grpc.Attributes;
import io.grpc.ConnectivityState;
import io.grpc.ConnectivityStateInfo;
import io.grpc.EquivalentAddressGroup;
+import io.grpc.InternalChannelz.ChannelTrace;
import io.grpc.LoadBalancer;
import io.grpc.LoadBalancer.Helper;
import io.grpc.LoadBalancer.PickResult;
@@ -32,6 +35,7 @@ import java.lang.reflect.Method;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
final class AutoConfiguredLoadBalancerFactory extends LoadBalancer.Factory {
@@ -43,11 +47,20 @@ final class AutoConfiguredLoadBalancerFactory extends LoadBalancer.Factory {
static final String GRPCLB_LOAD_BALANCER_FACTORY_NAME =
"io.grpc.grpclb.GrpclbLoadBalancerFactory";
- AutoConfiguredLoadBalancerFactory() {}
+ @Nullable
+ private final ChannelTracer channelTracer;
+ @Nullable
+ private final TimeProvider timeProvider;
+
+ AutoConfiguredLoadBalancerFactory(
+ @Nullable ChannelTracer channelTracer, @Nullable TimeProvider timeProvider) {
+ this.channelTracer = channelTracer;
+ this.timeProvider = timeProvider;
+ }
@Override
public LoadBalancer newLoadBalancer(Helper helper) {
- return new AutoConfiguredLoadBalancer(helper);
+ return new AutoConfiguredLoadBalancer(helper, channelTracer, timeProvider);
}
private static final class NoopLoadBalancer extends LoadBalancer {
@@ -71,11 +84,21 @@ final class AutoConfiguredLoadBalancerFactory extends LoadBalancer.Factory {
private final Helper helper;
private LoadBalancer delegate;
private LoadBalancer.Factory delegateFactory;
+ @CheckForNull
+ private ChannelTracer channelTracer;
+ @Nullable
+ private final TimeProvider timeProvider;
- AutoConfiguredLoadBalancer(Helper helper) {
+ AutoConfiguredLoadBalancer(
+ Helper helper, @Nullable ChannelTracer channelTracer, @Nullable TimeProvider timeProvider) {
this.helper = helper;
delegateFactory = PickFirstBalancerFactory.getInstance();
delegate = delegateFactory.newLoadBalancer(helper);
+ this.channelTracer = channelTracer;
+ this.timeProvider = timeProvider;
+ if (channelTracer != null) {
+ checkNotNull(timeProvider, "timeProvider");
+ }
}
// Must be run inside ChannelExecutor.
@@ -101,7 +124,15 @@ final class AutoConfiguredLoadBalancerFactory extends LoadBalancer.Factory {
helper.updateBalancingState(ConnectivityState.CONNECTING, new EmptyPicker());
delegate.shutdown();
delegateFactory = newlbf;
+ LoadBalancer old = delegate;
delegate = delegateFactory.newLoadBalancer(helper);
+ if (channelTracer != null) {
+ channelTracer.reportEvent(new ChannelTrace.Event.Builder()
+ .setDescription("Load balancer changed from " + old + " to " + delegate)
+ .setSeverity(ChannelTrace.Event.Severity.CT_INFO)
+ .setTimestampNanos(timeProvider.currentTimeNanos())
+ .build());
+ }
}
getDelegate().handleResolvedAddressGroups(servers, attributes);
}
diff --git a/core/src/main/java/io/grpc/internal/CallCredentialsApplyingTransportFactory.java b/core/src/main/java/io/grpc/internal/CallCredentialsApplyingTransportFactory.java
index df2e0a0bd..e5141cf1e 100644
--- a/core/src/main/java/io/grpc/internal/CallCredentialsApplyingTransportFactory.java
+++ b/core/src/main/java/io/grpc/internal/CallCredentialsApplyingTransportFactory.java
@@ -72,6 +72,7 @@ final class CallCredentialsApplyingTransportFactory implements ClientTransportFa
}
@Override
+ @SuppressWarnings("deprecation")
public ClientStream newStream(
MethodDescriptor<?, ?> method, Metadata headers, CallOptions callOptions) {
CallCredentials creds = callOptions.getCredentials();
diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java
index 490bd8255..dc1b783fd 100644
--- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java
+++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java
@@ -20,7 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-import com.google.common.base.Stopwatch;
+import com.google.common.base.Throwables;
import com.google.common.base.Verify;
import io.grpc.Attributes;
import io.grpc.EquivalentAddressGroup;
@@ -43,7 +43,6 @@ import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -85,27 +84,18 @@ final class DnsNameResolver extends NameResolver {
private static final String JNDI_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "true");
+ private static final String JNDI_LOCALHOST_PROPERTY =
+ System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi_localhost", "false");
private static final String JNDI_SRV_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_grpclb", "false");
private static final String JNDI_TXT_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_service_config", "false");
- /**
- * Java networking system properties name for caching DNS result.
- *
- * <p>Default value is -1 (cache forever) if security manager is installed. If security manager is
- * not installed, the ttl value is {@code null} which falls back to {@link
- * #DEFAULT_NETWORK_CACHE_TTL_SECONDS gRPC default value}.
- */
- @VisibleForTesting
- static final String NETWORKADDRESS_CACHE_TTL_PROPERTY = "networkaddress.cache.ttl";
- /** Default DNS cache duration if network cache ttl value is not specified ({@code null}). */
- @VisibleForTesting
- static final long DEFAULT_NETWORK_CACHE_TTL_SECONDS = 30;
-
@VisibleForTesting
static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY);
@VisibleForTesting
+ static boolean enableJndiLocalhost = Boolean.parseBoolean(JNDI_LOCALHOST_PROPERTY);
+ @VisibleForTesting
static boolean enableSrv = Boolean.parseBoolean(JNDI_SRV_PROPERTY);
@VisibleForTesting
static boolean enableTxt = Boolean.parseBoolean(JNDI_TXT_PROPERTY);
@@ -130,8 +120,6 @@ final class DnsNameResolver extends NameResolver {
private final String host;
private final int port;
private final Resource<ExecutorService> executorResource;
- private final long networkAddressCacheTtlNanos;
- private final Stopwatch stopwatch;
@GuardedBy("this")
private boolean shutdown;
@GuardedBy("this")
@@ -140,11 +128,10 @@ final class DnsNameResolver extends NameResolver {
private boolean resolving;
@GuardedBy("this")
private Listener listener;
- private ResolutionResults cachedResolutionResults;
DnsNameResolver(@Nullable String nsAuthority, String name, Attributes params,
- Resource<ExecutorService> executorResource, ProxyDetector proxyDetector,
- Stopwatch stopwatch) {
+ Resource<ExecutorService> executorResource,
+ ProxyDetector proxyDetector) {
// TODO: if a DNS server is provided as nsAuthority, use it.
// https://www.captechconsulting.com/blogs/accessing-the-dusty-corners-of-dns-with-java
this.executorResource = executorResource;
@@ -167,8 +154,6 @@ final class DnsNameResolver extends NameResolver {
port = nameUri.getPort();
}
this.proxyDetector = proxyDetector;
- this.stopwatch = Preconditions.checkNotNull(stopwatch, "stopwatch");
- this.networkAddressCacheTtlNanos = getNetworkAddressCacheTtlNanos();
}
@Override
@@ -198,13 +183,6 @@ final class DnsNameResolver extends NameResolver {
if (shutdown) {
return;
}
- boolean resourceRefreshRequired = cachedResolutionResults == null
- || networkAddressCacheTtlNanos == 0
- || (networkAddressCacheTtlNanos > 0
- && stopwatch.elapsed(TimeUnit.NANOSECONDS) > networkAddressCacheTtlNanos);
- if (!resourceRefreshRequired) {
- return;
- }
savedListener = listener;
resolving = true;
}
@@ -229,15 +207,11 @@ final class DnsNameResolver extends NameResolver {
ResolutionResults resolutionResults;
try {
ResourceResolver resourceResolver = null;
- if (enableJndi) {
+ if (shouldUseJndi(enableJndi, enableJndiLocalhost, host)) {
resourceResolver = getResourceResolver();
}
resolutionResults =
resolveAll(addressResolver, resourceResolver, enableSrv, enableTxt, host);
- cachedResolutionResults = resolutionResults;
- if (networkAddressCacheTtlNanos > 0) {
- stopwatch.reset().start();
- }
} catch (Exception e) {
savedListener.onError(
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e));
@@ -284,23 +258,6 @@ final class DnsNameResolver extends NameResolver {
}
};
- /** Returns value of network address cache ttl property. */
- private static long getNetworkAddressCacheTtlNanos() {
- String cacheTtlPropertyValue = System.getProperty(NETWORKADDRESS_CACHE_TTL_PROPERTY);
- long cacheTtl = DEFAULT_NETWORK_CACHE_TTL_SECONDS;
- if (cacheTtlPropertyValue != null) {
- try {
- cacheTtl = Long.parseLong(cacheTtlPropertyValue);
- } catch (NumberFormatException e) {
- logger.log(
- Level.WARNING,
- "Property({0}) valid is not valid number format({1}), fall back to default({2})",
- new Object[] {NETWORKADDRESS_CACHE_TTL_PROPERTY, cacheTtlPropertyValue, cacheTtl});
- }
- }
- return cacheTtl > 0 ? TimeUnit.SECONDS.toNanos(cacheTtl) : cacheTtl;
- }
-
@GuardedBy("this")
private void resolve() {
if (resolving || shutdown) {
@@ -368,7 +325,9 @@ final class DnsNameResolver extends NameResolver {
}
}
try {
- if (addressesException != null && balancerAddressesException != null) {
+ if (addressesException != null
+ && (balancerAddressesException != null || balancerAddresses.isEmpty())) {
+ Throwables.throwIfUnchecked(addressesException);
throw new RuntimeException(addressesException);
}
} finally {
@@ -626,4 +585,28 @@ final class DnsNameResolver extends NameResolver {
}
return localHostname;
}
+
+ @VisibleForTesting
+ static boolean shouldUseJndi(boolean jndiEnabled, boolean jndiLocalhostEnabled, String target) {
+ if (!jndiEnabled) {
+ return false;
+ }
+ if ("localhost".equalsIgnoreCase(target)) {
+ return jndiLocalhostEnabled;
+ }
+ // Check if this name looks like IPv6
+ if (target.contains(":")) {
+ return false;
+ }
+ // Check if this might be IPv4. Such addresses have no alphabetic characters. This also
+ // checks the target is empty.
+ boolean alldigits = true;
+ for (int i = 0; i < target.length(); i++) {
+ char c = target.charAt(i);
+ if (c != '.') {
+ alldigits &= (c >= '0' && c <= '9');
+ }
+ }
+ return !alldigits;
+ }
}
diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java b/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java
index d0db539d4..cddbe3f3b 100644
--- a/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java
+++ b/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java
@@ -17,7 +17,6 @@
package io.grpc.internal;
import com.google.common.base.Preconditions;
-import com.google.common.base.Stopwatch;
import io.grpc.Attributes;
import io.grpc.NameResolverProvider;
import java.net.URI;
@@ -53,8 +52,7 @@ public final class DnsNameResolverProvider extends NameResolverProvider {
name,
params,
GrpcUtil.SHARED_CHANNEL_EXECUTOR,
- GrpcUtil.getDefaultProxyDetector(),
- Stopwatch.createUnstarted());
+ GrpcUtil.getDefaultProxyDetector());
} else {
return null;
}
diff --git a/core/src/main/java/io/grpc/internal/GrpcAttributes.java b/core/src/main/java/io/grpc/internal/GrpcAttributes.java
index 67da06fa7..6a63864f6 100644
--- a/core/src/main/java/io/grpc/internal/GrpcAttributes.java
+++ b/core/src/main/java/io/grpc/internal/GrpcAttributes.java
@@ -17,6 +17,10 @@
package io.grpc.internal;
import io.grpc.Attributes;
+import io.grpc.EquivalentAddressGroup;
+import io.grpc.Grpc;
+import io.grpc.NameResolver;
+import io.grpc.SecurityLevel;
import java.util.Map;
/**
@@ -26,6 +30,7 @@ public final class GrpcAttributes {
/**
* Attribute key for service config.
*/
+ @NameResolver.ResolutionResultAttr
public static final Attributes.Key<Map<String, Object>> NAME_RESOLVER_SERVICE_CONFIG =
Attributes.Key.create("service-config");
@@ -33,6 +38,7 @@ public final class GrpcAttributes {
* The naming authority of a gRPC LB server address. It is an address-group-level attribute,
* present when the address group is a LoadBalancer.
*/
+ @EquivalentAddressGroup.Attr
public static final Attributes.Key<String> ATTR_LB_ADDR_AUTHORITY =
Attributes.Key.create("io.grpc.grpclb.lbAddrAuthority");
@@ -40,8 +46,18 @@ public final class GrpcAttributes {
* Whether this EquivalentAddressGroup was provided by a GRPCLB server. It would be rare for this
* value to be {@code false}; generally it would be better to not have the key present at all.
*/
+ @EquivalentAddressGroup.Attr
public static final Attributes.Key<Boolean> ATTR_LB_PROVIDED_BACKEND =
Attributes.Key.create("io.grpc.grpclb.lbProvidedBackend");
+ /**
+ * The security level of the transport. If it's not present, {@link SecurityLevel#NONE} should be
+ * assumed.
+ */
+ @SuppressWarnings("deprecation")
+ @Grpc.TransportAttr
+ public static final Attributes.Key<SecurityLevel> ATTR_SECURITY_LEVEL =
+ io.grpc.CallCredentials.ATTR_SECURITY_LEVEL;
+
private GrpcAttributes() {}
}
diff --git a/core/src/main/java/io/grpc/internal/GrpcUtil.java b/core/src/main/java/io/grpc/internal/GrpcUtil.java
index 539829941..80fd2f52c 100644
--- a/core/src/main/java/io/grpc/internal/GrpcUtil.java
+++ b/core/src/main/java/io/grpc/internal/GrpcUtil.java
@@ -200,7 +200,7 @@ public final class GrpcUtil {
public static final Splitter ACCEPT_ENCODING_SPLITTER = Splitter.on(',').trimResults();
- private static final String IMPLEMENTATION_VERSION = "1.16.0-SNAPSHOT"; // CURRENT_GRPC_VERSION
+ private static final String IMPLEMENTATION_VERSION = "1.16.1"; // CURRENT_GRPC_VERSION
/**
* The default delay in nanos before we send a keepalive.
diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java
index dc203b016..e1f840ee3 100644
--- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java
+++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java
@@ -125,13 +125,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
private final TimeProvider timeProvider;
private final int maxTraceEvents;
- private final ChannelExecutor channelExecutor = new ChannelExecutor() {
- @Override
- void handleUncaughtThrowable(Throwable t) {
- super.handleUncaughtThrowable(t);
- panic(t);
- }
- };
+ private final ChannelExecutor channelExecutor = new PanicChannelExecutor();
private boolean fullStreamDecompression;
@@ -236,34 +230,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
// Called from channelExecutor
private final ManagedClientTransport.Listener delayedTransportListener =
- new ManagedClientTransport.Listener() {
- @Override
- public void transportShutdown(Status s) {
- checkState(shutdown.get(), "Channel must have been shut down");
- }
-
- @Override
- public void transportReady() {
- // Don't care
- }
-
- @Override
- public void transportInUse(final boolean inUse) {
- inUseStateAggregator.updateObjectInUse(delayedTransport, inUse);
- }
-
- @Override
- public void transportTerminated() {
- checkState(shutdown.get(), "Channel must have been shut down");
- terminating = true;
- shutdownNameResolverAndLoadBalancer(false);
- // No need to call channelStateManager since we are already in SHUTDOWN state.
- // Until LoadBalancer is shutdown, it may still create new subchannels. We catch them
- // here.
- maybeShutdownNowSubchannels();
- maybeTerminateChannel();
- }
- };
+ new DelayedTransportListener();
// Must be called from channelExecutor
private void maybeShutdownNowSubchannels() {
@@ -279,27 +246,12 @@ final class ManagedChannelImpl extends ManagedChannel implements
// Must be accessed from channelExecutor
@VisibleForTesting
- final InUseStateAggregator<Object> inUseStateAggregator =
- new InUseStateAggregator<Object>() {
- @Override
- void handleInUse() {
- exitIdleMode();
- }
-
- @Override
- void handleNotInUse() {
- if (shutdown.get()) {
- return;
- }
- rescheduleIdleTimer();
- }
- };
+ final InUseStateAggregator<Object> inUseStateAggregator = new IdleModeStateAggregator();
@Override
public ListenableFuture<ChannelStats> getStats() {
final SettableFuture<ChannelStats> ret = SettableFuture.create();
- // subchannels and oobchannels can only be accessed from channelExecutor
- channelExecutor.executeLater(new Runnable() {
+ final class StatsFetcher implements Runnable {
@Override
public void run() {
ChannelStats.Builder builder = new InternalChannelz.ChannelStats.Builder();
@@ -314,7 +266,10 @@ final class ManagedChannelImpl extends ManagedChannel implements
builder.setSubchannels(children);
ret.set(builder.build());
}
- }).drain();
+ }
+
+ // subchannels and oobchannels can only be accessed from channelExecutor
+ channelExecutor.executeLater(new StatsFetcher()).drain();
return ret;
}
@@ -463,7 +418,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
}
}
- private final ClientTransportProvider transportProvider = new ClientTransportProvider() {
+ private final class ChannelTransportProvider implements ClientTransportProvider {
@Override
public ClientTransport get(PickSubchannelArgs args) {
SubchannelPicker pickerCopy = subchannelPicker;
@@ -473,12 +428,14 @@ final class ManagedChannelImpl extends ManagedChannel implements
return delayedTransport;
}
if (pickerCopy == null) {
- channelExecutor.executeLater(new Runnable() {
- @Override
- public void run() {
- exitIdleMode();
- }
- }).drain();
+ final class ExitIdleModeForTransport implements Runnable {
+ @Override
+ public void run() {
+ exitIdleMode();
+ }
+ }
+
+ channelExecutor.executeLater(new ExitIdleModeForTransport()).drain();
return delayedTransport;
}
// There is no need to reschedule the idle timer here.
@@ -507,11 +464,21 @@ final class ManagedChannelImpl extends ManagedChannel implements
final Metadata headers,
final Context context) {
checkState(retryEnabled, "retry should be enabled");
- return new RetriableStream<ReqT>(
- method, headers, channelBufferUsed, perRpcBufferLimit, channelBufferLimit,
- getCallExecutor(callOptions), transportFactory.getScheduledExecutorService(),
- callOptions.getOption(RETRY_POLICY_KEY), callOptions.getOption(HEDGING_POLICY_KEY),
- throttle) {
+ final class RetryStream extends RetriableStream<ReqT> {
+ RetryStream() {
+ super(
+ method,
+ headers,
+ channelBufferUsed,
+ perRpcBufferLimit,
+ channelBufferLimit,
+ getCallExecutor(callOptions),
+ transportFactory.getScheduledExecutorService(),
+ callOptions.getOption(RETRY_POLICY_KEY),
+ callOptions.getOption(HEDGING_POLICY_KEY),
+ throttle);
+ }
+
@Override
Status prestart() {
return uncommittedRetriableStreamsRegistry.add(this);
@@ -534,9 +501,13 @@ final class ManagedChannelImpl extends ManagedChannel implements
context.detach(origContext);
}
}
- };
+ }
+
+ return new RetryStream();
}
- };
+ }
+
+ private final ClientTransportProvider transportProvider = new ChannelTransportProvider();
private final Rescheduler idleTimer;
@@ -552,8 +523,16 @@ final class ManagedChannelImpl extends ManagedChannel implements
this.nameResolverFactory = builder.getNameResolverFactory();
this.nameResolverParams = checkNotNull(builder.getNameResolverParams(), "nameResolverParams");
this.nameResolver = getNameResolver(target, nameResolverFactory, nameResolverParams);
+ this.timeProvider = checkNotNull(timeProvider, "timeProvider");
+ maxTraceEvents = builder.maxTraceEvents;
+ if (maxTraceEvents > 0) {
+ long currentTimeNanos = timeProvider.currentTimeNanos();
+ channelTracer = new ChannelTracer(builder.maxTraceEvents, currentTimeNanos, "Channel");
+ } else {
+ channelTracer = null;
+ }
if (builder.loadBalancerFactory == null) {
- this.loadBalancerFactory = new AutoConfiguredLoadBalancerFactory();
+ this.loadBalancerFactory = new AutoConfiguredLoadBalancerFactory(channelTracer, timeProvider);
} else {
this.loadBalancerFactory = builder.loadBalancerFactory;
}
@@ -568,7 +547,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
this.retryEnabled = builder.retryEnabled && !builder.temporarilyDisableRetry;
serviceConfigInterceptor = new ServiceConfigInterceptor(
retryEnabled, builder.maxRetryAttempts, builder.maxHedgedAttempts);
- Channel channel = new RealChannel();
+ Channel channel = new RealChannel(nameResolver.getServiceAuthority());
channel = ClientInterceptors.intercept(channel, serviceConfigInterceptor);
if (builder.binlog != null) {
channel = builder.binlog.wrapChannel(channel);
@@ -606,24 +585,18 @@ final class ManagedChannelImpl extends ManagedChannel implements
this.channelBufferLimit = builder.retryBufferSize;
this.perRpcBufferLimit = builder.perRpcBufferLimit;
- this.timeProvider = checkNotNull(timeProvider, "timeProvider");
- this.callTracerFactory = new CallTracer.Factory() {
+ final class ChannelCallTracerFactory implements CallTracer.Factory {
@Override
public CallTracer create() {
return new CallTracer(timeProvider);
}
- };
+ }
+
+ this.callTracerFactory = new ChannelCallTracerFactory();
channelCallTracer = callTracerFactory.create();
this.channelz = checkNotNull(builder.channelz);
channelz.addRootChannel(this);
- maxTraceEvents = builder.maxTraceEvents;
- if (maxTraceEvents > 0) {
- long currentTimeNanos = timeProvider.currentTimeNanos();
- channelTracer = new ChannelTracer(builder.maxTraceEvents, currentTimeNanos, "Channel");
- } else {
- channelTracer = null;
- }
logger.log(Level.FINE, "[{0}] Created with target {1}", new Object[] {getLogId(), target});
}
@@ -687,7 +660,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
// delayedTransport.shutdown() may also add some tasks into the queue. But some things inside
// delayedTransport.shutdown() like setting delayedTransport.shutdown = true are not run in the
// channelExecutor's queue and should not be blocked, so we do not drain() immediately here.
- channelExecutor.executeLater(new Runnable() {
+ final class Shutdown implements Runnable {
@Override
public void run() {
if (channelTracer != null) {
@@ -699,15 +672,19 @@ final class ManagedChannelImpl extends ManagedChannel implements
}
channelStateManager.gotoState(SHUTDOWN);
}
- });
+ }
+
+ channelExecutor.executeLater(new Shutdown());
uncommittedRetriableStreamsRegistry.onShutdown(SHUTDOWN_STATUS);
- channelExecutor.executeLater(new Runnable() {
- @Override
- public void run() {
- cancelIdleTimer(/* permanent= */ true);
- }
- }).drain();
+ final class CancelIdleTimer implements Runnable {
+ @Override
+ public void run() {
+ cancelIdleTimer(/* permanent= */ true);
+ }
+ }
+
+ channelExecutor.executeLater(new CancelIdleTimer()).drain();
logger.log(Level.FINE, "[{0}] Shutting down", getLogId());
return this;
}
@@ -722,16 +699,18 @@ final class ManagedChannelImpl extends ManagedChannel implements
logger.log(Level.FINE, "[{0}] shutdownNow() called", getLogId());
shutdown();
uncommittedRetriableStreamsRegistry.onShutdownNow(SHUTDOWN_NOW_STATUS);
- channelExecutor.executeLater(new Runnable() {
- @Override
- public void run() {
- if (shutdownNowed) {
- return;
- }
- shutdownNowed = true;
- maybeShutdownNowSubchannels();
+ final class ShutdownNow implements Runnable {
+ @Override
+ public void run() {
+ if (shutdownNowed) {
+ return;
}
- }).drain();
+ shutdownNowed = true;
+ maybeShutdownNowSubchannels();
+ }
+ }
+
+ channelExecutor.executeLater(new ShutdownNow()).drain();
return this;
}
@@ -745,16 +724,18 @@ final class ManagedChannelImpl extends ManagedChannel implements
panicMode = true;
cancelIdleTimer(/* permanent= */ true);
shutdownNameResolverAndLoadBalancer(false);
- SubchannelPicker newPicker = new SubchannelPicker() {
- final PickResult panicPickResult =
+ final class PanicSubchannelPicker extends SubchannelPicker {
+ private final PickResult panicPickResult =
PickResult.withDrop(
Status.INTERNAL.withDescription("Panic! This is a bug!").withCause(t));
+
@Override
public PickResult pickSubchannel(PickSubchannelArgs args) {
return panicPickResult;
}
- };
- updateSubchannelPicker(newPicker);
+ }
+
+ updateSubchannelPicker(new PanicSubchannelPicker());
if (channelTracer != null) {
channelTracer.reportEvent(
new ChannelTrace.Event.Builder()
@@ -810,6 +791,14 @@ final class ManagedChannelImpl extends ManagedChannel implements
}
private class RealChannel extends Channel {
+ // Set when the NameResolver is initially created. When we create a new NameResolver for the
+ // same target, the new instance must have the same value.
+ private final String authority;
+
+ private RealChannel(String authority) {
+ this.authority = checkNotNull(authority, "authority");
+ }
+
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> newCall(MethodDescriptor<ReqT, RespT> method,
CallOptions callOptions) {
@@ -828,8 +817,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
@Override
public String authority() {
- String authority = nameResolver.getServiceAuthority();
- return checkNotNull(authority, "authority");
+ return authority;
}
}
@@ -856,60 +844,61 @@ final class ManagedChannelImpl extends ManagedChannel implements
public ConnectivityState getState(boolean requestConnection) {
ConnectivityState savedChannelState = channelStateManager.getState();
if (requestConnection && savedChannelState == IDLE) {
- channelExecutor.executeLater(
- new Runnable() {
- @Override
- public void run() {
- exitIdleMode();
- if (subchannelPicker != null) {
- subchannelPicker.requestConnection();
- }
- }
- }).drain();
+ final class RequestConnection implements Runnable {
+ @Override
+ public void run() {
+ exitIdleMode();
+ if (subchannelPicker != null) {
+ subchannelPicker.requestConnection();
+ }
+ }
+ }
+
+ channelExecutor.executeLater(new RequestConnection()).drain();
}
return savedChannelState;
}
@Override
public void notifyWhenStateChanged(final ConnectivityState source, final Runnable callback) {
- channelExecutor.executeLater(
- new Runnable() {
- @Override
- public void run() {
- channelStateManager.notifyWhenStateChanged(callback, executor, source);
- }
- }).drain();
+ final class NotifyStateChanged implements Runnable {
+ @Override
+ public void run() {
+ channelStateManager.notifyWhenStateChanged(callback, executor, source);
+ }
+ }
+
+ channelExecutor.executeLater(new NotifyStateChanged()).drain();
}
@Override
public void resetConnectBackoff() {
- channelExecutor
- .executeLater(
- new Runnable() {
- @Override
- public void run() {
- if (shutdown.get()) {
- return;
- }
- if (nameResolverRefreshFuture != null) {
- checkState(nameResolverStarted, "name resolver must be started");
- cancelNameResolverBackoff();
- nameResolver.refresh();
- }
- for (InternalSubchannel subchannel : subchannels) {
- subchannel.resetConnectBackoff();
- }
- for (OobChannel oobChannel : oobChannels) {
- oobChannel.resetConnectBackoff();
- }
- }
- })
- .drain();
+ final class ResetConnectBackoff implements Runnable {
+ @Override
+ public void run() {
+ if (shutdown.get()) {
+ return;
+ }
+ if (nameResolverRefreshFuture != null) {
+ checkState(nameResolverStarted, "name resolver must be started");
+ cancelNameResolverBackoff();
+ nameResolver.refresh();
+ }
+ for (InternalSubchannel subchannel : subchannels) {
+ subchannel.resetConnectBackoff();
+ }
+ for (OobChannel oobChannel : oobChannels) {
+ oobChannel.resetConnectBackoff();
+ }
+ }
+ }
+
+ channelExecutor.executeLater(new ResetConnectBackoff()).drain();
}
@Override
public void enterIdle() {
- class PrepareToLoseNetworkRunnable implements Runnable {
+ final class PrepareToLoseNetworkRunnable implements Runnable {
@Override
public void run() {
if (shutdown.get() || lbHelper == null) {
@@ -933,7 +922,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
final Object lock = new Object();
@GuardedBy("lock")
- Collection<ClientStream> uncommittedRetriableStreams = new HashSet<ClientStream>();
+ Collection<ClientStream> uncommittedRetriableStreams = new HashSet<>();
@GuardedBy("lock")
Status shutdownStatus;
@@ -996,7 +985,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
shutdownStatusCopy = shutdownStatus;
// Because retriable transport is long-lived, we take this opportunity to down-size the
// hashmap.
- uncommittedRetriableStreams = new HashSet<ClientStream>();
+ uncommittedRetriableStreams = new HashSet<>();
}
}
@@ -1034,6 +1023,36 @@ final class ManagedChannelImpl extends ManagedChannel implements
if (maxTraceEvents > 0) {
subchannelTracer = new ChannelTracer(maxTraceEvents, subchannelCreationTime, "Subchannel");
}
+
+ final class ManagedInternalSubchannelCallback extends InternalSubchannel.Callback {
+ // All callbacks are run in channelExecutor
+ @Override
+ void onTerminated(InternalSubchannel is) {
+ subchannels.remove(is);
+ channelz.removeSubchannel(is);
+ maybeTerminateChannel();
+ }
+
+ @Override
+ void onStateChange(InternalSubchannel is, ConnectivityStateInfo newState) {
+ handleInternalSubchannelState(newState);
+ // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match.
+ if (LbHelperImpl.this == ManagedChannelImpl.this.lbHelper) {
+ lb.handleSubchannelState(subchannel, newState);
+ }
+ }
+
+ @Override
+ void onInUse(InternalSubchannel is) {
+ inUseStateAggregator.updateObjectInUse(is, true);
+ }
+
+ @Override
+ void onNotInUse(InternalSubchannel is) {
+ inUseStateAggregator.updateObjectInUse(is, false);
+ }
+ }
+
final InternalSubchannel internalSubchannel = new InternalSubchannel(
addressGroups,
authority(),
@@ -1043,34 +1062,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
transportFactory.getScheduledExecutorService(),
stopwatchSupplier,
channelExecutor,
- new InternalSubchannel.Callback() {
- // All callbacks are run in channelExecutor
- @Override
- void onTerminated(InternalSubchannel is) {
- subchannels.remove(is);
- channelz.removeSubchannel(is);
- maybeTerminateChannel();
- }
-
- @Override
- void onStateChange(InternalSubchannel is, ConnectivityStateInfo newState) {
- handleInternalSubchannelState(newState);
- // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match.
- if (LbHelperImpl.this == ManagedChannelImpl.this.lbHelper) {
- lb.handleSubchannelState(subchannel, newState);
- }
- }
-
- @Override
- void onInUse(InternalSubchannel is) {
- inUseStateAggregator.updateObjectInUse(is, true);
- }
-
- @Override
- void onNotInUse(InternalSubchannel is) {
- inUseStateAggregator.updateObjectInUse(is, false);
- }
- },
+ new ManagedInternalSubchannelCallback(),
channelz,
callTracerFactory.create(),
subchannelTracer,
@@ -1087,24 +1079,27 @@ final class ManagedChannelImpl extends ManagedChannel implements
subchannel.subchannel = internalSubchannel;
logger.log(Level.FINE, "[{0}] {1} created for {2}",
new Object[] {getLogId(), internalSubchannel.getLogId(), addressGroups});
- runSerialized(new Runnable() {
- @Override
- public void run() {
- if (terminating) {
- // Because runSerialized() doesn't guarantee the runnable has been executed upon when
- // returning, the subchannel may still be returned to the balancer without being
- // shutdown even if "terminating" is already true. The subchannel will not be used in
- // this case, because delayed transport has terminated when "terminating" becomes
- // true, and no more requests will be sent to balancer beyond this point.
- internalSubchannel.shutdown(SHUTDOWN_STATUS);
- }
- if (!terminated) {
- // If channel has not terminated, it will track the subchannel and block termination
- // for it.
- subchannels.add(internalSubchannel);
- }
+
+ final class AddSubchannel implements Runnable {
+ @Override
+ public void run() {
+ if (terminating) {
+ // Because runSerialized() doesn't guarantee the runnable has been executed upon when
+ // returning, the subchannel may still be returned to the balancer without being
+ // shutdown even if "terminating" is already true. The subchannel will not be used in
+ // this case, because delayed transport has terminated when "terminating" becomes
+ // true, and no more requests will be sent to balancer beyond this point.
+ internalSubchannel.shutdown(SHUTDOWN_STATUS);
+ }
+ if (!terminated) {
+ // If channel has not terminated, it will track the subchannel and block termination
+ // for it.
+ subchannels.add(internalSubchannel);
}
- });
+ }
+ }
+
+ runSerialized(new AddSubchannel());
return subchannel;
}
@@ -1113,30 +1108,30 @@ final class ManagedChannelImpl extends ManagedChannel implements
final ConnectivityState newState, final SubchannelPicker newPicker) {
checkNotNull(newState, "newState");
checkNotNull(newPicker, "newPicker");
-
- runSerialized(
- new Runnable() {
- @Override
- public void run() {
- if (LbHelperImpl.this != lbHelper) {
- return;
- }
- updateSubchannelPicker(newPicker);
- // It's not appropriate to report SHUTDOWN state from lb.
- // Ignore the case of newState == SHUTDOWN for now.
- if (newState != SHUTDOWN) {
- if (channelTracer != null) {
- channelTracer.reportEvent(
- new ChannelTrace.Event.Builder()
- .setDescription("Entering " + newState + " state")
- .setSeverity(ChannelTrace.Event.Severity.CT_INFO)
- .setTimestampNanos(timeProvider.currentTimeNanos())
- .build());
- }
- channelStateManager.gotoState(newState);
- }
+ final class UpdateBalancingState implements Runnable {
+ @Override
+ public void run() {
+ if (LbHelperImpl.this != lbHelper) {
+ return;
+ }
+ updateSubchannelPicker(newPicker);
+ // It's not appropriate to report SHUTDOWN state from lb.
+ // Ignore the case of newState == SHUTDOWN for now.
+ if (newState != SHUTDOWN) {
+ if (channelTracer != null) {
+ channelTracer.reportEvent(
+ new ChannelTrace.Event.Builder()
+ .setDescription("Entering " + newState + " state")
+ .setSeverity(ChannelTrace.Event.Severity.CT_INFO)
+ .setTimestampNanos(timeProvider.currentTimeNanos())
+ .build());
}
- });
+ channelStateManager.gotoState(newState);
+ }
+ }
+ }
+
+ runSerialized(new UpdateBalancingState());
}
@Override
@@ -1169,26 +1164,28 @@ final class ManagedChannelImpl extends ManagedChannel implements
.build());
subchannelTracer = new ChannelTracer(maxTraceEvents, oobChannelCreationTime, "Subchannel");
}
+ final class ManagedOobChannelCallback extends InternalSubchannel.Callback {
+ @Override
+ void onTerminated(InternalSubchannel is) {
+ oobChannels.remove(oobChannel);
+ channelz.removeSubchannel(is);
+ oobChannel.handleSubchannelTerminated();
+ maybeTerminateChannel();
+ }
+
+ @Override
+ void onStateChange(InternalSubchannel is, ConnectivityStateInfo newState) {
+ handleInternalSubchannelState(newState);
+ oobChannel.handleSubchannelStateChange(newState);
+ }
+ }
+
final InternalSubchannel internalSubchannel = new InternalSubchannel(
Collections.singletonList(addressGroup),
authority, userAgent, backoffPolicyProvider, transportFactory,
transportFactory.getScheduledExecutorService(), stopwatchSupplier, channelExecutor,
// All callback methods are run from channelExecutor
- new InternalSubchannel.Callback() {
- @Override
- void onTerminated(InternalSubchannel is) {
- oobChannels.remove(oobChannel);
- channelz.removeSubchannel(is);
- oobChannel.handleSubchannelTerminated();
- maybeTerminateChannel();
- }
-
- @Override
- void onStateChange(InternalSubchannel is, ConnectivityStateInfo newState) {
- handleInternalSubchannelState(newState);
- oobChannel.handleSubchannelStateChange(newState);
- }
- },
+ new ManagedOobChannelCallback(),
channelz,
callTracerFactory.create(),
subchannelTracer,
@@ -1204,19 +1201,21 @@ final class ManagedChannelImpl extends ManagedChannel implements
channelz.addSubchannel(oobChannel);
channelz.addSubchannel(internalSubchannel);
oobChannel.setSubchannel(internalSubchannel);
- runSerialized(new Runnable() {
- @Override
- public void run() {
- if (terminating) {
- oobChannel.shutdown();
- }
- if (!terminated) {
- // If channel has not terminated, it will track the subchannel and block termination
- // for it.
- oobChannels.add(oobChannel);
- }
+ final class AddOobChannel implements Runnable {
+ @Override
+ public void run() {
+ if (terminating) {
+ oobChannel.shutdown();
+ }
+ if (!terminated) {
+ // If channel has not terminated, it will track the subchannel and block termination
+ // for it.
+ oobChannels.add(oobChannel);
}
- });
+ }
+ }
+
+ runSerialized(new AddOobChannel());
return oobChannel;
}
@@ -1325,41 +1324,40 @@ final class ManagedChannelImpl extends ManagedChannel implements
.build());
haveBackends = false;
}
- channelExecutor
- .executeLater(
- new Runnable() {
- @Override
- public void run() {
- // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match.
- if (NameResolverListenerImpl.this.helper != ManagedChannelImpl.this.lbHelper) {
- return;
- }
- helper.lb.handleNameResolutionError(error);
- if (nameResolverRefreshFuture != null) {
- // The name resolver may invoke onError multiple times, but we only want to
- // schedule one backoff attempt
- // TODO(ericgribkoff) Update contract of NameResolver.Listener or decide if we
- // want to reset the backoff interval upon repeated onError() calls
- return;
- }
- if (nameResolverBackoffPolicy == null) {
- nameResolverBackoffPolicy = backoffPolicyProvider.get();
- }
- long delayNanos = nameResolverBackoffPolicy.nextBackoffNanos();
- if (logger.isLoggable(Level.FINE)) {
- logger.log(
- Level.FINE,
- "[{0}] Scheduling DNS resolution backoff for {1} ns",
- new Object[] {logId, delayNanos});
- }
- nameResolverRefresh = new NameResolverRefresh();
- nameResolverRefreshFuture =
- transportFactory
- .getScheduledExecutorService()
- .schedule(nameResolverRefresh, delayNanos, TimeUnit.NANOSECONDS);
- }
- })
- .drain();
+ final class NameResolverErrorHandler implements Runnable {
+ @Override
+ public void run() {
+ // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match.
+ if (NameResolverListenerImpl.this.helper != ManagedChannelImpl.this.lbHelper) {
+ return;
+ }
+ helper.lb.handleNameResolutionError(error);
+ if (nameResolverRefreshFuture != null) {
+ // The name resolver may invoke onError multiple times, but we only want to
+ // schedule one backoff attempt
+ // TODO(ericgribkoff) Update contract of NameResolver.Listener or decide if we
+ // want to reset the backoff interval upon repeated onError() calls
+ return;
+ }
+ if (nameResolverBackoffPolicy == null) {
+ nameResolverBackoffPolicy = backoffPolicyProvider.get();
+ }
+ long delayNanos = nameResolverBackoffPolicy.nextBackoffNanos();
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(
+ Level.FINE,
+ "[{0}] Scheduling DNS resolution backoff for {1} ns",
+ new Object[] {logId, delayNanos});
+ }
+ nameResolverRefresh = new NameResolverRefresh();
+ nameResolverRefreshFuture =
+ transportFactory
+ .getScheduledExecutorService()
+ .schedule(nameResolverRefresh, delayNanos, TimeUnit.NANOSECONDS);
+ }
+ }
+
+ channelExecutor.executeLater(new NameResolverErrorHandler()).drain();
}
}
@@ -1419,14 +1417,16 @@ final class ManagedChannelImpl extends ManagedChannel implements
// TODO(zhangkun83): consider a better approach
// (https://github.com/grpc/grpc-java/issues/2562).
if (!terminating) {
+ final class ShutdownSubchannel implements Runnable {
+ @Override
+ public void run() {
+ subchannel.shutdown(SUBCHANNEL_SHUTDOWN_STATUS);
+ }
+ }
+
delayedShutdownTask = transportFactory.getScheduledExecutorService().schedule(
new LogExceptionRunnable(
- new Runnable() {
- @Override
- public void run() {
- subchannel.shutdown(SUBCHANNEL_SHUTDOWN_STATUS);
- }
- }), SUBCHANNEL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS);
+ new ShutdownSubchannel()), SUBCHANNEL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS);
return;
}
}
@@ -1463,4 +1463,62 @@ final class ManagedChannelImpl extends ManagedChannel implements
.add("target", target)
.toString();
}
+
+ private final class PanicChannelExecutor extends ChannelExecutor {
+ @Override
+ void handleUncaughtThrowable(Throwable t) {
+ super.handleUncaughtThrowable(t);
+ panic(t);
+ }
+ }
+
+ /**
+ * Called from channelExecutor.
+ */
+ private final class DelayedTransportListener implements ManagedClientTransport.Listener {
+ @Override
+ public void transportShutdown(Status s) {
+ checkState(shutdown.get(), "Channel must have been shut down");
+ }
+
+ @Override
+ public void transportReady() {
+ // Don't care
+ }
+
+ @Override
+ public void transportInUse(final boolean inUse) {
+ inUseStateAggregator.updateObjectInUse(delayedTransport, inUse);
+ }
+
+ @Override
+ public void transportTerminated() {
+ checkState(shutdown.get(), "Channel must have been shut down");
+ terminating = true;
+ shutdownNameResolverAndLoadBalancer(false);
+ // No need to call channelStateManager since we are already in SHUTDOWN state.
+ // Until LoadBalancer is shutdown, it may still create new subchannels. We catch them
+ // here.
+ maybeShutdownNowSubchannels();
+ maybeTerminateChannel();
+ }
+ }
+
+ /**
+ * Must be accessed from channelExecutor.
+ */
+ private final class IdleModeStateAggregator extends InUseStateAggregator<Object> {
+ @Override
+ void handleInUse() {
+ exitIdleMode();
+ }
+
+ @Override
+ void handleNotInUse() {
+ if (shutdown.get()) {
+ return;
+ }
+ rescheduleIdleTimer();
+ }
+ }
}
diff --git a/core/src/main/java/io/grpc/internal/MetadataApplierImpl.java b/core/src/main/java/io/grpc/internal/MetadataApplierImpl.java
index 48e00665c..56548b282 100644
--- a/core/src/main/java/io/grpc/internal/MetadataApplierImpl.java
+++ b/core/src/main/java/io/grpc/internal/MetadataApplierImpl.java
@@ -20,7 +20,7 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
-import io.grpc.CallCredentials.MetadataApplier;
+import io.grpc.CallCredentials2.MetadataApplier;
import io.grpc.CallOptions;
import io.grpc.Context;
import io.grpc.Metadata;
@@ -29,7 +29,7 @@ import io.grpc.Status;
import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy;
-final class MetadataApplierImpl implements MetadataApplier {
+final class MetadataApplierImpl extends MetadataApplier {
private final ClientTransport transport;
private final MethodDescriptor<?, ?> method;
private final Metadata origHeaders;
diff --git a/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java b/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java
new file mode 100644
index 000000000..e2a9720d4
--- /dev/null
+++ b/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 The gRPC Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.grpc.util;
+
+import com.google.common.base.MoreObjects;
+import io.grpc.Attributes;
+import io.grpc.ConnectivityState;
+import io.grpc.EquivalentAddressGroup;
+import io.grpc.ExperimentalApi;
+import io.grpc.LoadBalancer.Subchannel;
+import io.grpc.LoadBalancer.SubchannelPicker;
+import io.grpc.LoadBalancer;
+import io.grpc.ManagedChannel;
+import io.grpc.NameResolver;
+import java.util.List;
+
+@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1771")
+public abstract class ForwardingLoadBalancerHelper extends LoadBalancer.Helper {
+ /**
+ * Returns the underlying helper.
+ */
+ protected abstract LoadBalancer.Helper delegate();
+
+ @Override
+ public Subchannel createSubchannel(EquivalentAddressGroup addrs, Attributes attrs) {
+ return delegate().createSubchannel(addrs, attrs);
+ }
+
+ @Override
+ public Subchannel createSubchannel(List<EquivalentAddressGroup> addrs, Attributes attrs) {
+ return delegate().createSubchannel(addrs, attrs);
+ }
+
+ @Override
+ public void updateSubchannelAddresses(
+ Subchannel subchannel, EquivalentAddressGroup addrs) {
+ delegate().updateSubchannelAddresses(subchannel, addrs);
+ }
+
+ @Override
+ public void updateSubchannelAddresses(
+ Subchannel subchannel, List<EquivalentAddressGroup> addrs) {
+ delegate().updateSubchannelAddresses(subchannel, addrs);
+ }
+
+ @Override
+ public ManagedChannel createOobChannel(EquivalentAddressGroup eag, String authority) {
+ return delegate().createOobChannel(eag, authority);
+ }
+
+ @Override
+ public void updateOobChannelAddresses(ManagedChannel channel, EquivalentAddressGroup eag) {
+ delegate().updateOobChannelAddresses(channel, eag);
+ }
+
+ @Override
+ public void updateBalancingState(
+ ConnectivityState newState, SubchannelPicker newPicker) {
+ delegate().updateBalancingState(newState, newPicker);
+ }
+
+ @Override
+ public void runSerialized(Runnable task) {
+ delegate().runSerialized(task);
+ }
+
+ @Override
+ public NameResolver.Factory getNameResolverFactory() {
+ return delegate().getNameResolverFactory();
+ }
+
+ @Override
+ public String getAuthority() {
+ return delegate().getAuthority();
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("delegate", delegate()).toString();
+ }
+}
diff --git a/core/src/test/java/io/grpc/ForwardingTestUtil.java b/core/src/test/java/io/grpc/ForwardingTestUtil.java
index ce9ca5eb7..e9f1c5b23 100644
--- a/core/src/test/java/io/grpc/ForwardingTestUtil.java
+++ b/core/src/test/java/io/grpc/ForwardingTestUtil.java
@@ -28,6 +28,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Collection;
+import javax.annotation.Nullable;
/**
* A util class to help test forwarding classes.
@@ -35,9 +36,8 @@ import java.util.Collection;
public final class ForwardingTestUtil {
/**
* Use reflection to perform a basic sanity test. The forwarding class should forward all public
- * methods to the delegate, except for those in skippedMethods.
- * This does NOT verify that arguments or return values are forwarded properly. It only alerts
- * the developer if a forward method is missing.
+ * methods to the delegate, except for those in skippedMethods. This does NOT verify that
+ * arguments or return values are forwarded properly.
*
* @param delegateClass The class whose methods should be forwarded.
* @param mockDelegate The mockito mock of the delegate class.
@@ -49,6 +49,34 @@ public final class ForwardingTestUtil {
T mockDelegate,
T forwarder,
Collection<Method> skippedMethods) throws Exception {
+ testMethodsForwarded(
+ delegateClass, mockDelegate, forwarder, skippedMethods,
+ new ArgumentProvider() {
+ @Override
+ public Object get(Class<?> clazz) {
+ return null;
+ }
+ });
+ }
+
+ /**
+ * Use reflection to perform a basic sanity test. The forwarding class should forward all public
+ * methods to the delegate, except for those in skippedMethods. This does NOT verify that return
+ * values are forwarded properly, and can only verify the propagation of arguments for which
+ * {@code argProvider} returns distinctive non-null values.
+ *
+ * @param delegateClass The class whose methods should be forwarded.
+ * @param mockDelegate The mockito mock of the delegate class.
+ * @param forwarder The forwarder object that forwards to the mockDelegate.
+ * @param skippedMethods A collection of methods that are skipped by the test.
+ * @param argProvider provides argument to be passed to tested forwarding methods.
+ */
+ public static <T> void testMethodsForwarded(
+ Class<T> delegateClass,
+ T mockDelegate,
+ T forwarder,
+ Collection<Method> skippedMethods,
+ ArgumentProvider argProvider) throws Exception {
assertTrue(mockingDetails(mockDelegate).isMock());
assertFalse(mockingDetails(forwarder).isMock());
@@ -61,7 +89,9 @@ public final class ForwardingTestUtil {
Class<?>[] argTypes = method.getParameterTypes();
Object[] args = new Object[argTypes.length];
for (int i = 0; i < argTypes.length; i++) {
- args[i] = Defaults.defaultValue(argTypes[i]);
+ if ((args[i] = argProvider.get(argTypes[i])) == null) {
+ args[i] = Defaults.defaultValue(argTypes[i]);
+ }
}
method.invoke(forwarder, args);
try {
@@ -85,4 +115,20 @@ public final class ForwardingTestUtil {
assertEquals("Method toString() was not forwarded properly", expected, actual);
}
}
+
+ /**
+ * Provides arguments for forwarded methods tested in {@link #testMethodsForwarded}.
+ */
+ public interface ArgumentProvider {
+ /**
+ * Return an instance of the given class to be used as an argument passed to one method call.
+ * If one method has multiple arguments with the same type, each occurrence will call this
+ * method once. It is recommended that each invocation returns a distinctive object for the
+ * same type, in order to verify that arguments are passed by the tested class correctly.
+ *
+ * @return a value to be passed as an argument. If {@code null}, {@link Default#defaultValue}
+ * will be used.
+ */
+ @Nullable Object get(Class<?> clazz);
+ }
}
diff --git a/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java b/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
index 1542a6fac..71c574298 100644
--- a/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
+++ b/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
@@ -19,11 +19,14 @@ package io.grpc.internal;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
import io.grpc.Attributes;
import io.grpc.ConnectivityState;
import io.grpc.ConnectivityStateInfo;
import io.grpc.EquivalentAddressGroup;
+import io.grpc.InternalChannelz;
import io.grpc.LoadBalancer;
import io.grpc.LoadBalancer.Helper;
import io.grpc.LoadBalancer.Subchannel;
@@ -52,7 +55,8 @@ import org.junit.runners.JUnit4;
*/
@RunWith(JUnit4.class)
public class AutoConfiguredLoadBalancerFactoryTest {
- private final AutoConfiguredLoadBalancerFactory lbf = new AutoConfiguredLoadBalancerFactory();
+ private final AutoConfiguredLoadBalancerFactory lbf =
+ new AutoConfiguredLoadBalancerFactory(null, null);
@Test
public void newLoadBalancer_isAuto() {
@@ -258,6 +262,80 @@ public class AutoConfiguredLoadBalancerFactoryTest {
}
}
+ @Test
+ public void channelTracing_lbPolicyChanged() {
+ ChannelTracer channelTracer = new ChannelTracer(100, 1000, "dummy_type");
+ TimeProvider timeProvider = new TimeProvider() {
+ @Override
+ public long currentTimeNanos() {
+ return 101;
+ }
+ };
+
+ InternalChannelz.ChannelStats.Builder statsBuilder
+ = new InternalChannelz.ChannelStats.Builder();
+ channelTracer.updateBuilder(statsBuilder);
+ List<EquivalentAddressGroup> servers =
+ Collections.singletonList(
+ new EquivalentAddressGroup(new SocketAddress(){}, Attributes.EMPTY));
+ Helper helper = new TestHelper() {
+ @Override
+ public Subchannel createSubchannel(List<EquivalentAddressGroup> addrs, Attributes attrs) {
+ return new TestSubchannel(addrs, attrs);
+ }
+
+ @Override
+ public ManagedChannel createOobChannel(EquivalentAddressGroup eag, String authority) {
+ return mock(ManagedChannel.class, RETURNS_DEEP_STUBS);
+ }
+
+ @Override
+ public String getAuthority() {
+ return "fake_authority";
+ }
+
+ @Override
+ public void updateBalancingState(ConnectivityState newState, SubchannelPicker newPicker) {
+ // noop
+ }
+ };
+ int prevNumOfEvents = statsBuilder.build().channelTrace.events.size();
+
+ LoadBalancer lb =
+ new AutoConfiguredLoadBalancerFactory(channelTracer, timeProvider).newLoadBalancer(helper);
+ lb.handleResolvedAddressGroups(servers, Attributes.EMPTY);
+ channelTracer.updateBuilder(statsBuilder);
+ assertThat(statsBuilder.build().channelTrace.events).hasSize(prevNumOfEvents);
+
+ Map<String, Object> serviceConfig = new HashMap<String, Object>();
+ serviceConfig.put("loadBalancingPolicy", "round_robin");
+ lb.handleResolvedAddressGroups(servers,
+ Attributes.newBuilder()
+ .set(GrpcAttributes.NAME_RESOLVER_SERVICE_CONFIG, serviceConfig).build());
+ channelTracer.updateBuilder(statsBuilder);
+ assertThat(statsBuilder.build().channelTrace.events).hasSize(prevNumOfEvents + 1);
+ assertThat(statsBuilder.build().channelTrace.events.get(prevNumOfEvents).description)
+ .isEqualTo("Load balancer changed from PickFirstBalancer to RoundRobinLoadBalancer");
+ prevNumOfEvents = statsBuilder.build().channelTrace.events.size();
+
+ serviceConfig.put("loadBalancingPolicy", "round_robin");
+ lb.handleResolvedAddressGroups(servers,
+ Attributes.newBuilder()
+ .set(GrpcAttributes.NAME_RESOLVER_SERVICE_CONFIG, serviceConfig).build());
+ channelTracer.updateBuilder(statsBuilder);
+ assertThat(statsBuilder.build().channelTrace.events).hasSize(prevNumOfEvents);
+
+ servers = Collections.singletonList(new EquivalentAddressGroup(
+ new SocketAddress(){},
+ Attributes.newBuilder().set(GrpcAttributes.ATTR_LB_ADDR_AUTHORITY, "ok").build()));
+ lb.handleResolvedAddressGroups(servers, Attributes.EMPTY);
+
+ channelTracer.updateBuilder(statsBuilder);
+ assertThat(statsBuilder.build().channelTrace.events).hasSize(prevNumOfEvents + 1);
+ assertThat(statsBuilder.build().channelTrace.events.get(prevNumOfEvents).description)
+ .isEqualTo("Load balancer changed from RoundRobinLoadBalancer to GrpclbLoadBalancer");
+ }
+
public static class ForwardingLoadBalancer extends LoadBalancer {
private final LoadBalancer delegate;
diff --git a/core/src/test/java/io/grpc/internal/CallCredentials2ApplyingTest.java b/core/src/test/java/io/grpc/internal/CallCredentials2ApplyingTest.java
new file mode 100644
index 000000000..fd2b2c18f
--- /dev/null
+++ b/core/src/test/java/io/grpc/internal/CallCredentials2ApplyingTest.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2016 The gRPC Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.grpc.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import io.grpc.Attributes;
+import io.grpc.CallCredentials.RequestInfo;
+import io.grpc.CallCredentials2;
+import io.grpc.CallCredentials2.MetadataApplier;
+import io.grpc.CallOptions;
+import io.grpc.IntegerMarshaller;
+import io.grpc.Metadata;
+import io.grpc.MethodDescriptor;
+import io.grpc.SecurityLevel;
+import io.grpc.Status;
+import io.grpc.StringMarshaller;
+import java.net.SocketAddress;
+import java.util.concurrent.Executor;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+/**
+ * Unit test for {@link CallCredentials2} applying functionality implemented by {@link
+ * CallCredentialsApplyingTransportFactory} and {@link MetadataApplierImpl}.
+ */
+@RunWith(JUnit4.class)
+public class CallCredentials2ApplyingTest {
+ @Mock
+ private ClientTransportFactory mockTransportFactory;
+
+ @Mock
+ private ConnectionClientTransport mockTransport;
+
+ @Mock
+ private ClientStream mockStream;
+
+ @Mock
+ private CallCredentials2 mockCreds;
+
+ @Mock
+ private Executor mockExecutor;
+
+ @Mock
+ private SocketAddress address;
+
+ private static final String AUTHORITY = "testauthority";
+ private static final String USER_AGENT = "testuseragent";
+ private static final Attributes.Key<String> ATTR_KEY = Attributes.Key.create("somekey");
+ private static final String ATTR_VALUE = "somevalue";
+ private static final MethodDescriptor<String, Integer> method =
+ MethodDescriptor.<String, Integer>newBuilder()
+ .setType(MethodDescriptor.MethodType.UNKNOWN)
+ .setFullMethodName("service/method")
+ .setRequestMarshaller(new StringMarshaller())
+ .setResponseMarshaller(new IntegerMarshaller())
+ .build();
+ private static final Metadata.Key<String> ORIG_HEADER_KEY =
+ Metadata.Key.of("header1", Metadata.ASCII_STRING_MARSHALLER);
+ private static final String ORIG_HEADER_VALUE = "some original header value";
+ private static final Metadata.Key<String> CREDS_KEY =
+ Metadata.Key.of("test-creds", Metadata.ASCII_STRING_MARSHALLER);
+ private static final String CREDS_VALUE = "some credentials";
+
+ private final Metadata origHeaders = new Metadata();
+ private ForwardingConnectionClientTransport transport;
+ private CallOptions callOptions;
+
+ @Before
+ public void setUp() {
+ ClientTransportFactory.ClientTransportOptions clientTransportOptions =
+ new ClientTransportFactory.ClientTransportOptions()
+ .setAuthority(AUTHORITY)
+ .setUserAgent(USER_AGENT);
+
+ MockitoAnnotations.initMocks(this);
+ origHeaders.put(ORIG_HEADER_KEY, ORIG_HEADER_VALUE);
+ when(mockTransportFactory.newClientTransport(address, clientTransportOptions))
+ .thenReturn(mockTransport);
+ when(mockTransport.newStream(same(method), any(Metadata.class), any(CallOptions.class)))
+ .thenReturn(mockStream);
+ ClientTransportFactory transportFactory = new CallCredentialsApplyingTransportFactory(
+ mockTransportFactory, mockExecutor);
+ transport = (ForwardingConnectionClientTransport)
+ transportFactory.newClientTransport(address, clientTransportOptions);
+ callOptions = CallOptions.DEFAULT.withCallCredentials(mockCreds);
+ verify(mockTransportFactory).newClientTransport(address, clientTransportOptions);
+ assertSame(mockTransport, transport.delegate());
+ }
+
+ @Test
+ public void parameterPropagation_base() {
+ Attributes transportAttrs = Attributes.newBuilder().set(ATTR_KEY, ATTR_VALUE).build();
+ when(mockTransport.getAttributes()).thenReturn(transportAttrs);
+
+ transport.newStream(method, origHeaders, callOptions);
+
+ ArgumentCaptor<RequestInfo> infoCaptor = ArgumentCaptor.forClass(null);
+ verify(mockCreds).applyRequestMetadata(
+ infoCaptor.capture(), same(mockExecutor), any(MetadataApplier.class));
+ RequestInfo info = infoCaptor.getValue();
+ assertSame(method, info.getMethodDescriptor());
+ Attributes attrs = info.getTransportAttrs();
+ assertSame(ATTR_VALUE, info.getTransportAttrs().get(ATTR_KEY));
+ assertSame(AUTHORITY, info.getAuthority());
+ assertSame(SecurityLevel.NONE, info.getSecurityLevel());
+ }
+
+ @Test
+ public void parameterPropagation_transportSetSecurityLevel() {
+ Attributes transportAttrs = Attributes.newBuilder()
+ .set(ATTR_KEY, ATTR_VALUE)
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.INTEGRITY)
+ .build();
+ when(mockTransport.getAttributes()).thenReturn(transportAttrs);
+
+ transport.newStream(method, origHeaders, callOptions);
+
+ ArgumentCaptor<RequestInfo> infoCaptor = ArgumentCaptor.forClass(null);
+ verify(mockCreds).applyRequestMetadata(
+ infoCaptor.capture(), same(mockExecutor), any(MetadataApplier.class));
+ RequestInfo info = infoCaptor.getValue();
+ assertSame(method, info.getMethodDescriptor());
+ assertSame(ATTR_VALUE, info.getTransportAttrs().get(ATTR_KEY));
+ assertSame(AUTHORITY, info.getAuthority());
+ assertSame(SecurityLevel.INTEGRITY, info.getSecurityLevel());
+ }
+
+ @Test
+ public void parameterPropagation_callOptionsSetAuthority() {
+ Attributes transportAttrs = Attributes.newBuilder()
+ .set(ATTR_KEY, ATTR_VALUE)
+ .build();
+ when(mockTransport.getAttributes()).thenReturn(transportAttrs);
+ Executor anotherExecutor = mock(Executor.class);
+
+ transport.newStream(method, origHeaders,
+ callOptions.withAuthority("calloptions-authority").withExecutor(anotherExecutor));
+
+ ArgumentCaptor<RequestInfo> infoCaptor = ArgumentCaptor.forClass(null);
+ verify(mockCreds).applyRequestMetadata(
+ infoCaptor.capture(), same(anotherExecutor), any(MetadataApplier.class));
+ RequestInfo info = infoCaptor.getValue();
+ assertSame(method, info.getMethodDescriptor());
+ assertSame(ATTR_VALUE, info.getTransportAttrs().get(ATTR_KEY));
+ assertEquals("calloptions-authority", info.getAuthority());
+ assertSame(SecurityLevel.NONE, info.getSecurityLevel());
+ }
+
+ @Test
+ public void credentialThrows() {
+ final RuntimeException ex = new RuntimeException();
+ when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
+ doThrow(ex).when(mockCreds).applyRequestMetadata(
+ any(RequestInfo.class), same(mockExecutor), any(MetadataApplier.class));
+
+ FailingClientStream stream =
+ (FailingClientStream) transport.newStream(method, origHeaders, callOptions);
+
+ verify(mockTransport, never()).newStream(method, origHeaders, callOptions);
+ assertEquals(Status.Code.UNAUTHENTICATED, stream.getError().getCode());
+ assertSame(ex, stream.getError().getCause());
+ }
+
+ @Test
+ public void applyMetadata_inline() {
+ when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ MetadataApplier applier = (MetadataApplier) invocation.getArguments()[2];
+ Metadata headers = new Metadata();
+ headers.put(CREDS_KEY, CREDS_VALUE);
+ applier.apply(headers);
+ return null;
+ }
+ }).when(mockCreds).applyRequestMetadata(
+ any(RequestInfo.class), same(mockExecutor), any(MetadataApplier.class));
+
+ ClientStream stream = transport.newStream(method, origHeaders, callOptions);
+
+ verify(mockTransport).newStream(method, origHeaders, callOptions);
+ assertSame(mockStream, stream);
+ assertEquals(CREDS_VALUE, origHeaders.get(CREDS_KEY));
+ assertEquals(ORIG_HEADER_VALUE, origHeaders.get(ORIG_HEADER_KEY));
+ }
+
+ @Test
+ public void fail_inline() {
+ final Status error = Status.FAILED_PRECONDITION.withDescription("channel not secure for creds");
+ when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ MetadataApplier applier = (MetadataApplier) invocation.getArguments()[2];
+ applier.fail(error);
+ return null;
+ }
+ }).when(mockCreds).applyRequestMetadata(
+ any(RequestInfo.class), same(mockExecutor), any(MetadataApplier.class));
+
+ FailingClientStream stream =
+ (FailingClientStream) transport.newStream(method, origHeaders, callOptions);
+
+ verify(mockTransport, never()).newStream(method, origHeaders, callOptions);
+ assertSame(error, stream.getError());
+ }
+
+ @Test
+ public void applyMetadata_delayed() {
+ when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
+
+ // Will call applyRequestMetadata(), which is no-op.
+ DelayedStream stream = (DelayedStream) transport.newStream(method, origHeaders, callOptions);
+
+ ArgumentCaptor<MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
+ verify(mockCreds).applyRequestMetadata(
+ any(RequestInfo.class), same(mockExecutor), applierCaptor.capture());
+ verify(mockTransport, never()).newStream(method, origHeaders, callOptions);
+
+ Metadata headers = new Metadata();
+ headers.put(CREDS_KEY, CREDS_VALUE);
+ applierCaptor.getValue().apply(headers);
+
+ verify(mockTransport).newStream(method, origHeaders, callOptions);
+ assertSame(mockStream, stream.getRealStream());
+ assertEquals(CREDS_VALUE, origHeaders.get(CREDS_KEY));
+ assertEquals(ORIG_HEADER_VALUE, origHeaders.get(ORIG_HEADER_KEY));
+ }
+
+ @Test
+ public void fail_delayed() {
+ when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
+
+ // Will call applyRequestMetadata(), which is no-op.
+ DelayedStream stream = (DelayedStream) transport.newStream(method, origHeaders, callOptions);
+
+ ArgumentCaptor<MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
+ verify(mockCreds).applyRequestMetadata(
+ any(RequestInfo.class), same(mockExecutor), applierCaptor.capture());
+
+ Status error = Status.FAILED_PRECONDITION.withDescription("channel not secure for creds");
+ applierCaptor.getValue().fail(error);
+
+ verify(mockTransport, never()).newStream(method, origHeaders, callOptions);
+ FailingClientStream failingStream = (FailingClientStream) stream.getRealStream();
+ assertSame(error, failingStream.getError());
+ }
+
+ @Test
+ public void noCreds() {
+ callOptions = callOptions.withCallCredentials(null);
+ ClientStream stream = transport.newStream(method, origHeaders, callOptions);
+
+ verify(mockTransport).newStream(method, origHeaders, callOptions);
+ assertSame(mockStream, stream);
+ assertNull(origHeaders.get(CREDS_KEY));
+ assertEquals(ORIG_HEADER_VALUE, origHeaders.get(ORIG_HEADER_KEY));
+ }
+}
diff --git a/core/src/test/java/io/grpc/internal/CallCredentialsApplyingTest.java b/core/src/test/java/io/grpc/internal/CallCredentialsApplyingTest.java
index c6a9bfb43..a8ca1219b 100644
--- a/core/src/test/java/io/grpc/internal/CallCredentialsApplyingTest.java
+++ b/core/src/test/java/io/grpc/internal/CallCredentialsApplyingTest.java
@@ -30,7 +30,6 @@ import static org.mockito.Mockito.when;
import io.grpc.Attributes;
import io.grpc.CallCredentials;
-import io.grpc.CallCredentials.MetadataApplier;
import io.grpc.CallOptions;
import io.grpc.IntegerMarshaller;
import io.grpc.Metadata;
@@ -55,6 +54,7 @@ import org.mockito.stubbing.Answer;
* CallCredentialsApplyingTransportFactory} and {@link MetadataApplierImpl}.
*/
@RunWith(JUnit4.class)
+@Deprecated
public class CallCredentialsApplyingTest {
@Mock
private ClientTransportFactory mockTransportFactory;
@@ -127,7 +127,7 @@ public class CallCredentialsApplyingTest {
ArgumentCaptor<Attributes> attrsCaptor = ArgumentCaptor.forClass(null);
verify(mockCreds).applyRequestMetadata(same(method), attrsCaptor.capture(), same(mockExecutor),
- any(MetadataApplier.class));
+ any(CallCredentials.MetadataApplier.class));
Attributes attrs = attrsCaptor.getValue();
assertSame(ATTR_VALUE, attrs.get(ATTR_KEY));
assertSame(AUTHORITY, attrs.get(CallCredentials.ATTR_AUTHORITY));
@@ -147,7 +147,7 @@ public class CallCredentialsApplyingTest {
ArgumentCaptor<Attributes> attrsCaptor = ArgumentCaptor.forClass(null);
verify(mockCreds).applyRequestMetadata(same(method), attrsCaptor.capture(), same(mockExecutor),
- any(MetadataApplier.class));
+ any(CallCredentials.MetadataApplier.class));
Attributes attrs = attrsCaptor.getValue();
assertSame(ATTR_VALUE, attrs.get(ATTR_KEY));
assertEquals("transport-override-authority", attrs.get(CallCredentials.ATTR_AUTHORITY));
@@ -169,7 +169,7 @@ public class CallCredentialsApplyingTest {
ArgumentCaptor<Attributes> attrsCaptor = ArgumentCaptor.forClass(null);
verify(mockCreds).applyRequestMetadata(same(method), attrsCaptor.capture(),
- same(anotherExecutor), any(MetadataApplier.class));
+ same(anotherExecutor), any(CallCredentials.MetadataApplier.class));
Attributes attrs = attrsCaptor.getValue();
assertSame(ATTR_VALUE, attrs.get(ATTR_KEY));
assertEquals("calloptions-authority", attrs.get(CallCredentials.ATTR_AUTHORITY));
@@ -181,7 +181,8 @@ public class CallCredentialsApplyingTest {
final RuntimeException ex = new RuntimeException();
when(mockTransport.getAttributes()).thenReturn(Attributes.EMPTY);
doThrow(ex).when(mockCreds).applyRequestMetadata(
- same(method), any(Attributes.class), same(mockExecutor), any(MetadataApplier.class));
+ same(method), any(Attributes.class), same(mockExecutor),
+ any(CallCredentials.MetadataApplier.class));
FailingClientStream stream =
(FailingClientStream) transport.newStream(method, origHeaders, callOptions);
@@ -197,14 +198,15 @@ public class CallCredentialsApplyingTest {
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
- MetadataApplier applier = (MetadataApplier) invocation.getArguments()[3];
+ CallCredentials.MetadataApplier applier =
+ (CallCredentials.MetadataApplier) invocation.getArguments()[3];
Metadata headers = new Metadata();
headers.put(CREDS_KEY, CREDS_VALUE);
applier.apply(headers);
return null;
}
}).when(mockCreds).applyRequestMetadata(same(method), any(Attributes.class),
- same(mockExecutor), any(MetadataApplier.class));
+ same(mockExecutor), any(CallCredentials.MetadataApplier.class));
ClientStream stream = transport.newStream(method, origHeaders, callOptions);
@@ -221,12 +223,13 @@ public class CallCredentialsApplyingTest {
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
- MetadataApplier applier = (MetadataApplier) invocation.getArguments()[3];
+ CallCredentials.MetadataApplier applier =
+ (CallCredentials.MetadataApplier) invocation.getArguments()[3];
applier.fail(error);
return null;
}
}).when(mockCreds).applyRequestMetadata(same(method), any(Attributes.class),
- same(mockExecutor), any(MetadataApplier.class));
+ same(mockExecutor), any(CallCredentials.MetadataApplier.class));
FailingClientStream stream =
(FailingClientStream) transport.newStream(method, origHeaders, callOptions);
@@ -242,7 +245,7 @@ public class CallCredentialsApplyingTest {
// Will call applyRequestMetadata(), which is no-op.
DelayedStream stream = (DelayedStream) transport.newStream(method, origHeaders, callOptions);
- ArgumentCaptor<MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
+ ArgumentCaptor<CallCredentials.MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
verify(mockCreds).applyRequestMetadata(same(method), any(Attributes.class),
same(mockExecutor), applierCaptor.capture());
verify(mockTransport, never()).newStream(method, origHeaders, callOptions);
@@ -264,7 +267,7 @@ public class CallCredentialsApplyingTest {
// Will call applyRequestMetadata(), which is no-op.
DelayedStream stream = (DelayedStream) transport.newStream(method, origHeaders, callOptions);
- ArgumentCaptor<MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
+ ArgumentCaptor<CallCredentials.MetadataApplier> applierCaptor = ArgumentCaptor.forClass(null);
verify(mockCreds).applyRequestMetadata(same(method), any(Attributes.class),
same(mockExecutor), applierCaptor.capture());
diff --git a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java
index 44bde2222..3f7adfa57 100644
--- a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java
+++ b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java
@@ -18,6 +18,7 @@ package io.grpc.internal;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
@@ -27,13 +28,10 @@ import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import com.google.common.base.Stopwatch;
import com.google.common.collect.Iterables;
import com.google.common.net.InetAddresses;
-import com.google.common.testing.FakeTicker;
import io.grpc.Attributes;
import io.grpc.EquivalentAddressGroup;
import io.grpc.NameResolver;
@@ -42,6 +40,7 @@ import io.grpc.internal.DnsNameResolver.ResolutionResults;
import io.grpc.internal.DnsNameResolver.ResourceResolver;
import io.grpc.internal.DnsNameResolver.ResourceResolverFactory;
import io.grpc.internal.SharedResourceHolder.Resource;
+import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -55,8 +54,6 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
-import javax.annotation.Nullable;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -108,25 +105,21 @@ public class DnsNameResolverTest {
private NameResolver.Listener mockListener;
@Captor
private ArgumentCaptor<List<EquivalentAddressGroup>> resultCaptor;
- @Nullable
- private String networkaddressCacheTtlPropertyValue;
private DnsNameResolver newResolver(String name, int port) {
- return newResolver(name, port, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted());
+ return newResolver(name, port, GrpcUtil.NOOP_PROXY_DETECTOR);
}
private DnsNameResolver newResolver(
String name,
int port,
- ProxyDetector proxyDetector,
- Stopwatch stopwatch) {
+ ProxyDetector proxyDetector) {
DnsNameResolver dnsResolver = new DnsNameResolver(
null,
name,
Attributes.newBuilder().set(NameResolver.Factory.PARAMS_DEFAULT_PORT, port).build(),
fakeExecutorResource,
- proxyDetector,
- stopwatch);
+ proxyDetector);
return dnsResolver;
}
@@ -134,19 +127,6 @@ public class DnsNameResolverTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
DnsNameResolver.enableJndi = true;
- networkaddressCacheTtlPropertyValue =
- System.getProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
- }
-
- @After
- public void restoreSystemProperty() {
- if (networkaddressCacheTtlPropertyValue == null) {
- System.clearProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
- } else {
- System.setProperty(
- DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY,
- networkaddressCacheTtlPropertyValue);
- }
}
@After
@@ -198,8 +178,7 @@ public class DnsNameResolverTest {
}
@Test
- public void resolve_neverCache() throws Exception {
- System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "0");
+ public void resolve() throws Exception {
final List<InetAddress> answer1 = createAddressList(2);
final List<InetAddress> answer2 = createAddressList(1);
String name = "foo.googleapis.com";
@@ -227,156 +206,6 @@ public class DnsNameResolverTest {
}
@Test
- public void resolve_cacheForever() throws Exception {
- System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "-1");
- final List<InetAddress> answer1 = createAddressList(2);
- String name = "foo.googleapis.com";
- FakeTicker fakeTicker = new FakeTicker();
-
- DnsNameResolver resolver =
- newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
- AddressResolver mockResolver = mock(AddressResolver.class);
- when(mockResolver.resolveAddress(Matchers.anyString()))
- .thenReturn(answer1)
- .thenThrow(new AssertionError("should not called twice"));
- resolver.setAddressResolver(mockResolver);
-
- resolver.start(mockListener);
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer1, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- fakeTicker.advance(1, TimeUnit.DAYS);
- resolver.refresh();
- assertEquals(1, fakeExecutor.runDueTasks());
- verifyNoMoreInteractions(mockListener);
- assertAnswerMatches(answer1, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- resolver.shutdown();
-
- verify(mockResolver).resolveAddress(Matchers.anyString());
- }
-
- @Test
- public void resolve_usingCache() throws Exception {
- long ttl = 60;
- System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, Long.toString(ttl));
- final List<InetAddress> answer = createAddressList(2);
- String name = "foo.googleapis.com";
- FakeTicker fakeTicker = new FakeTicker();
-
- DnsNameResolver resolver =
- newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
- AddressResolver mockResolver = mock(AddressResolver.class);
- when(mockResolver.resolveAddress(Matchers.anyString()))
- .thenReturn(answer)
- .thenThrow(new AssertionError("should not reach here."));
- resolver.setAddressResolver(mockResolver);
-
- resolver.start(mockListener);
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- // this refresh should return cached result
- fakeTicker.advance(ttl - 1, TimeUnit.SECONDS);
- resolver.refresh();
- assertEquals(1, fakeExecutor.runDueTasks());
- verifyNoMoreInteractions(mockListener);
- assertAnswerMatches(answer, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- resolver.shutdown();
-
- verify(mockResolver).resolveAddress(Matchers.anyString());
- }
-
- @Test
- public void resolve_cacheExpired() throws Exception {
- long ttl = 60;
- System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, Long.toString(ttl));
- final List<InetAddress> answer1 = createAddressList(2);
- final List<InetAddress> answer2 = createAddressList(1);
- String name = "foo.googleapis.com";
- FakeTicker fakeTicker = new FakeTicker();
-
- DnsNameResolver resolver =
- newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
- AddressResolver mockResolver = mock(AddressResolver.class);
- when(mockResolver.resolveAddress(Matchers.anyString())).thenReturn(answer1).thenReturn(answer2);
- resolver.setAddressResolver(mockResolver);
-
- resolver.start(mockListener);
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer1, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- fakeTicker.advance(ttl + 1, TimeUnit.SECONDS);
- resolver.refresh();
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener, times(2)).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer2, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- resolver.shutdown();
-
- verify(mockResolver, times(2)).resolveAddress(Matchers.anyString());
- }
-
- @Test
- public void resolve_invalidTtlPropertyValue() throws Exception {
- System.setProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY, "not_a_number");
- resolveDefaultValue();
- }
-
- @Test
- public void resolve_noPropertyValue() throws Exception {
- System.clearProperty(DnsNameResolver.NETWORKADDRESS_CACHE_TTL_PROPERTY);
- resolveDefaultValue();
- }
-
- private void resolveDefaultValue() throws Exception {
- final List<InetAddress> answer1 = createAddressList(2);
- final List<InetAddress> answer2 = createAddressList(1);
- String name = "foo.googleapis.com";
- FakeTicker fakeTicker = new FakeTicker();
-
- DnsNameResolver resolver =
- newResolver(name, 81, GrpcUtil.NOOP_PROXY_DETECTOR, Stopwatch.createUnstarted(fakeTicker));
- AddressResolver mockResolver = mock(AddressResolver.class);
- when(mockResolver.resolveAddress(Matchers.anyString())).thenReturn(answer1).thenReturn(answer2);
- resolver.setAddressResolver(mockResolver);
-
- resolver.start(mockListener);
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer1, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- fakeTicker.advance(DnsNameResolver.DEFAULT_NETWORK_CACHE_TTL_SECONDS, TimeUnit.SECONDS);
- resolver.refresh();
- assertEquals(1, fakeExecutor.runDueTasks());
- verifyNoMoreInteractions(mockListener);
- assertAnswerMatches(answer1, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- fakeTicker.advance(1, TimeUnit.SECONDS);
- resolver.refresh();
- assertEquals(1, fakeExecutor.runDueTasks());
- verify(mockListener, times(2)).onAddresses(resultCaptor.capture(), any(Attributes.class));
- assertAnswerMatches(answer2, 81, resultCaptor.getValue());
- assertEquals(0, fakeClock.numPendingTasks());
-
- resolver.shutdown();
-
- verify(mockResolver, times(2)).resolveAddress(Matchers.anyString());
- }
-
- @Test
public void resolveAll_nullResourceResolver() throws Exception {
final String hostname = "addr.fake";
final Inet4Address backendAddr = InetAddresses.fromInteger(0x7f000001);
@@ -397,6 +226,23 @@ public class DnsNameResolverTest {
}
@Test
+ public void resolveAll_nullResourceResolver_addressFailure() throws Exception {
+ final String hostname = "addr.fake";
+
+ AddressResolver mockResolver = mock(AddressResolver.class);
+ when(mockResolver.resolveAddress(Matchers.anyString()))
+ .thenThrow(new IOException("no addr"));
+ ResourceResolver resourceResolver = null;
+ boolean resovleSrv = true;
+ boolean resolveTxt = true;
+
+ thrown.expect(RuntimeException.class);
+ thrown.expectMessage("no addr");
+
+ DnsNameResolver.resolveAll(mockResolver, resourceResolver, resovleSrv, resolveTxt, hostname);
+ }
+
+ @Test
public void resolveAll_presentResourceResolver() throws Exception {
final String hostname = "addr.fake";
final Inet4Address backendAddr = InetAddresses.fromInteger(0x7f000001);
@@ -502,8 +348,7 @@ public class DnsNameResolverTest {
"password");
when(alwaysDetectProxy.proxyFor(any(SocketAddress.class)))
.thenReturn(proxyParameters);
- DnsNameResolver resolver =
- newResolver(name, port, alwaysDetectProxy, Stopwatch.createUnstarted());
+ DnsNameResolver resolver = newResolver(name, port, alwaysDetectProxy);
AddressResolver mockAddressResolver = mock(AddressResolver.class);
when(mockAddressResolver.resolveAddress(Matchers.anyString())).thenThrow(new AssertionError());
resolver.setAddressResolver(mockAddressResolver);
@@ -754,6 +599,82 @@ public class DnsNameResolverTest {
assertNotNull(DnsNameResolver.maybeChooseServiceConfig(choice, new Random(), "localhost"));
}
+ @Test
+ public void shouldUseJndi_alwaysFalseIfDisabled() {
+ boolean enableJndi = false;
+ boolean enableJndiLocalhost = true;
+ String host = "seemingly.valid.host";
+
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, host));
+ }
+
+ @Test
+ public void shouldUseJndi_falseIfDisabledForLocalhost() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = false;
+
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "localhost"));
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "LOCALHOST"));
+ }
+
+ @Test
+ public void shouldUseJndi_trueIfLocalhostOverriden() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = true;
+ String host = "localhost";
+
+ assertTrue(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, host));
+ }
+
+ @Test
+ public void shouldUseJndi_falseForIpv6() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = false;
+
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "::"));
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "::1"));
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "2001:db8:1234::"));
+ assertFalse(DnsNameResolver.shouldUseJndi(
+ enableJndi, enableJndiLocalhost, "[2001:db8:1234::]"));
+ assertFalse(DnsNameResolver.shouldUseJndi(
+ enableJndi, enableJndiLocalhost, "2001:db8:1234::%3"));
+ }
+
+ @Test
+ public void shouldUseJndi_falseForIpv4() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = false;
+
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "127.0.0.1"));
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "192.168.0.1"));
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "134744072"));
+ }
+
+ @Test
+ public void shouldUseJndi_falseForEmpty() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = false;
+
+ assertFalse(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, ""));
+ }
+
+ @Test
+ public void shouldUseJndi_trueIfItMightPossiblyBeValid() {
+ boolean enableJndi = true;
+ boolean enableJndiLocalhost = false;
+
+ assertTrue(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "remotehost"));
+ assertTrue(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "remotehost.gov"));
+ assertTrue(DnsNameResolver.shouldUseJndi(enableJndi, enableJndiLocalhost, "f.q.d.n."));
+ assertTrue(DnsNameResolver.shouldUseJndi(
+ enableJndi, enableJndiLocalhost, "8.8.8.8.in-addr.arpa."));
+ assertTrue(DnsNameResolver.shouldUseJndi(
+ enableJndi, enableJndiLocalhost, "2001-db8-1234--as3.ipv6-literal.net"));
+
+
+
+ }
+
private void testInvalidUri(URI uri) {
try {
provider.newNameResolver(uri, NAME_RESOLVER_PARAMS);
diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java
index ffc92b1bf..c5fdf713e 100644
--- a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java
+++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java
@@ -57,7 +57,6 @@ import com.google.common.util.concurrent.SettableFuture;
import io.grpc.Attributes;
import io.grpc.BinaryLog;
import io.grpc.CallCredentials;
-import io.grpc.CallCredentials.MetadataApplier;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
@@ -1388,6 +1387,7 @@ public class ManagedChannelImplTest {
* propagated to newStream() and applyRequestMetadata().
*/
@Test
+ @SuppressWarnings("deprecation")
public void informationPropagatedToNewStreamAndCallCredentials() {
createChannel();
CallOptions callOptions = CallOptions.DEFAULT.withCallCredentials(creds);
@@ -1401,9 +1401,9 @@ public class ManagedChannelImplTest {
credsApplyContexts.add(Context.current());
return null;
}
- }).when(creds).applyRequestMetadata(
+ }).when(creds).applyRequestMetadata( // TODO(zhangkun83): remove suppression of deprecations
any(MethodDescriptor.class), any(Attributes.class), any(Executor.class),
- any(MetadataApplier.class));
+ any(CallCredentials.MetadataApplier.class));
// First call will be on delayed transport. Only newCall() is run within the expected context,
// so that we can verify that the context is explicitly attached before calling newStream() and
@@ -1435,7 +1435,7 @@ public class ManagedChannelImplTest {
verify(creds, never()).applyRequestMetadata(
any(MethodDescriptor.class), any(Attributes.class), any(Executor.class),
- any(MetadataApplier.class));
+ any(CallCredentials.MetadataApplier.class));
// applyRequestMetadata() is called after the transport becomes ready.
transportInfo.listener.transportReady();
@@ -1444,7 +1444,8 @@ public class ManagedChannelImplTest {
helper.updateBalancingState(READY, mockPicker);
executor.runDueTasks();
ArgumentCaptor<Attributes> attrsCaptor = ArgumentCaptor.forClass(Attributes.class);
- ArgumentCaptor<MetadataApplier> applierCaptor = ArgumentCaptor.forClass(MetadataApplier.class);
+ ArgumentCaptor<CallCredentials.MetadataApplier> applierCaptor
+ = ArgumentCaptor.forClass(CallCredentials.MetadataApplier.class);
verify(creds).applyRequestMetadata(same(method), attrsCaptor.capture(),
same(executor.getScheduledExecutorService()), applierCaptor.capture());
assertEquals("testValue", testKey.get(credsApplyContexts.poll()));
@@ -2761,7 +2762,7 @@ public class ManagedChannelImplTest {
ManagedChannel mychannel = new CustomBuilder()
.nameResolverFactory(factory)
- .loadBalancerFactory(new AutoConfiguredLoadBalancerFactory()).build();
+ .loadBalancerFactory(new AutoConfiguredLoadBalancerFactory(null, null)).build();
ClientCall<Void, Void> call1 =
mychannel.newCall(TestMethodDescriptors.voidMethod(), CallOptions.DEFAULT);
@@ -2801,6 +2802,14 @@ public class ManagedChannelImplTest {
mychannel.shutdownNow();
}
+ @Test
+ public void getAuthorityAfterShutdown() throws Exception {
+ createChannel();
+ assertEquals(SERVICE_NAME, channel.authority());
+ channel.shutdownNow().awaitTermination(1, TimeUnit.SECONDS);
+ assertEquals(SERVICE_NAME, channel.authority());
+ }
+
private static final class ChannelBuilder
extends AbstractManagedChannelImplBuilder<ChannelBuilder> {
diff --git a/core/src/test/java/io/grpc/util/ForwardingLoadBalancerHelperTest.java b/core/src/test/java/io/grpc/util/ForwardingLoadBalancerHelperTest.java
new file mode 100644
index 000000000..ebc883b9a
--- /dev/null
+++ b/core/src/test/java/io/grpc/util/ForwardingLoadBalancerHelperTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 The gRPC Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.grpc.util;
+
+import static org.mockito.Mockito.mock;
+
+import io.grpc.EquivalentAddressGroup;
+import io.grpc.ForwardingTestUtil;
+import io.grpc.LoadBalancer;
+import java.lang.reflect.Method;
+import java.net.SocketAddress;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link ForwardingLoadBalancerHelper}. */
+@RunWith(JUnit4.class)
+public class ForwardingLoadBalancerHelperTest {
+ private final LoadBalancer.Helper mockDelegate = mock(LoadBalancer.Helper.class);
+
+ private final class TestHelper extends ForwardingLoadBalancerHelper {
+ @Override
+ protected LoadBalancer.Helper delegate() {
+ return mockDelegate;
+ }
+ }
+
+ @Test
+ public void allMethodsForwarded() throws Exception {
+ final SocketAddress mockAddr = mock(SocketAddress.class);
+ ForwardingTestUtil.testMethodsForwarded(
+ LoadBalancer.Helper.class,
+ mockDelegate,
+ new TestHelper(),
+ Collections.<Method>emptyList(),
+ new ForwardingTestUtil.ArgumentProvider() {
+ @Override
+ public Object get(Class<?> clazz) {
+ if (clazz.equals(EquivalentAddressGroup.class)) {
+ return new EquivalentAddressGroup(Arrays.asList(mockAddr));
+ } else if (clazz.equals(List.class)) {
+ return Collections.<Object>emptyList();
+ }
+ return null;
+ }
+ });
+ }
+}
diff --git a/cronet/build.gradle b/cronet/build.gradle
index ae0efd25e..dd9209df4 100644
--- a/cronet/build.gradle
+++ b/cronet/build.gradle
@@ -39,8 +39,8 @@ android {
}
dependencies {
- implementation 'io.grpc:grpc-core:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- testImplementation 'io.grpc:grpc-testing:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-core:1.16.1' // CURRENT_GRPC_VERSION
+ testImplementation 'io.grpc:grpc-testing:1.16.1' // CURRENT_GRPC_VERSION
implementation "org.chromium.net:cronet-embedded:66.3359.158"
diff --git a/cronet/src/main/java/io/grpc/cronet/CronetClientTransport.java b/cronet/src/main/java/io/grpc/cronet/CronetClientTransport.java
index 38b871d33..102aad923 100644
--- a/cronet/src/main/java/io/grpc/cronet/CronetClientTransport.java
+++ b/cronet/src/main/java/io/grpc/cronet/CronetClientTransport.java
@@ -20,7 +20,6 @@ import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
import io.grpc.CallOptions;
import io.grpc.InternalChannelz.SocketStats;
import io.grpc.InternalLogId;
@@ -31,6 +30,7 @@ import io.grpc.Status;
import io.grpc.Status.Code;
import io.grpc.cronet.CronetChannelBuilder.StreamBuilderFactory;
import io.grpc.internal.ConnectionClientTransport;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.StatsTraceContext;
import io.grpc.internal.TransportTracer;
@@ -95,8 +95,7 @@ class CronetClientTransport implements ConnectionClientTransport {
this.streamFactory = Preconditions.checkNotNull(streamFactory, "streamFactory");
this.transportTracer = Preconditions.checkNotNull(transportTracer, "transportTracer");
this.attrs = Attributes.newBuilder()
- .set(CallCredentials.ATTR_AUTHORITY, authority)
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
.build();
}
diff --git a/cronet/src/test/java/io/grpc/cronet/CronetClientTransportTest.java b/cronet/src/test/java/io/grpc/cronet/CronetClientTransportTest.java
index 539ba1ccd..194e4c9ed 100644
--- a/cronet/src/test/java/io/grpc/cronet/CronetClientTransportTest.java
+++ b/cronet/src/test/java/io/grpc/cronet/CronetClientTransportTest.java
@@ -33,6 +33,7 @@ import io.grpc.SecurityLevel;
import io.grpc.Status;
import io.grpc.cronet.CronetChannelBuilder.StreamBuilderFactory;
import io.grpc.internal.ClientStreamListener;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.ManagedClientTransport;
import io.grpc.internal.TransportTracer;
import io.grpc.testing.TestMethodDescriptors;
@@ -82,9 +83,8 @@ public final class CronetClientTransportTest {
@Test
public void transportAttributes() {
Attributes attrs = transport.getAttributes();
- assertEquals(AUTHORITY, attrs.get(CallCredentials.ATTR_AUTHORITY));
assertEquals(
- SecurityLevel.PRIVACY_AND_INTEGRITY, attrs.get(CallCredentials.ATTR_SECURITY_LEVEL));
+ SecurityLevel.PRIVACY_AND_INTEGRITY, attrs.get(GrpcAttributes.ATTR_SECURITY_LEVEL));
}
@Test
diff --git a/documentation/android-channel-builder.md b/documentation/android-channel-builder.md
index cd316b4c8..4f82d2c95 100644
--- a/documentation/android-channel-builder.md
+++ b/documentation/android-channel-builder.md
@@ -36,8 +36,8 @@ In your `build.gradle` file, include a dependency on both `grpc-android` and
`grpc-okhttp`:
```
-compile 'io.grpc:grpc-android:1.16.0' // CURRENT_GRPC_VERSION
-compile 'io.grpc:grpc-okhttp:1.16.0' // CURRENT_GRPC_VERSION
+compile 'io.grpc:grpc-android:1.16.1' // CURRENT_GRPC_VERSION
+compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
```
You will also need permission to access the device's network state in your
diff --git a/examples/android/clientcache/app/build.gradle b/examples/android/clientcache/app/build.gradle
index 1b6952941..27e018d0c 100644
--- a/examples/android/clientcache/app/build.gradle
+++ b/examples/android/clientcache/app/build.gradle
@@ -31,7 +31,7 @@ protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.4.0' }
plugins {
javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -49,12 +49,12 @@ dependencies {
compile 'com.android.support:appcompat-v7:27.0.2'
// You need to build grpc-java to obtain these libraries below.
- compile 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-protobuf-lite:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-stub:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-protobuf-lite:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-stub:1.16.1' // CURRENT_GRPC_VERSION
compile 'javax.annotation:javax.annotation-api:1.2'
testCompile 'junit:junit:4.12'
testCompile 'com.google.truth:truth:0.36'
- testCompile 'io.grpc:grpc-testing:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ testCompile 'io.grpc:grpc-testing:1.16.1' // CURRENT_GRPC_VERSION
}
diff --git a/examples/android/helloworld/app/build.gradle b/examples/android/helloworld/app/build.gradle
index a994ab47e..1fdc4a558 100644
--- a/examples/android/helloworld/app/build.gradle
+++ b/examples/android/helloworld/app/build.gradle
@@ -30,7 +30,7 @@ protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' }
plugins {
javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -48,8 +48,8 @@ dependencies {
compile 'com.android.support:appcompat-v7:27.0.2'
// You need to build grpc-java to obtain these libraries below.
- compile 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-protobuf-lite:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-stub:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-protobuf-lite:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-stub:1.16.1' // CURRENT_GRPC_VERSION
compile 'javax.annotation:javax.annotation-api:1.2'
}
diff --git a/examples/android/routeguide/app/build.gradle b/examples/android/routeguide/app/build.gradle
index f92a99620..75c8d4c16 100644
--- a/examples/android/routeguide/app/build.gradle
+++ b/examples/android/routeguide/app/build.gradle
@@ -29,7 +29,7 @@ protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' }
plugins {
javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -47,8 +47,8 @@ dependencies {
compile 'com.android.support:appcompat-v7:27.0.2'
// You need to build grpc-java to obtain these libraries below.
- compile 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-protobuf-lite:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-stub:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-protobuf-lite:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-stub:1.16.1' // CURRENT_GRPC_VERSION
compile 'javax.annotation:javax.annotation-api:1.2'
}
diff --git a/examples/build.gradle b/examples/build.gradle
index 1649e7f8c..aa4695405 100644
--- a/examples/build.gradle
+++ b/examples/build.gradle
@@ -22,7 +22,7 @@ repositories {
// Feel free to delete the comment at the next line. It is just for safely
// updating the version in our release process.
-def grpcVersion = '1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.16.1' // CURRENT_GRPC_VERSION
def nettyTcNativeVersion = '2.0.7.Final'
def protobufVersion = '3.5.1'
def protocVersion = '3.5.1-1'
diff --git a/examples/example-kotlin/android/helloworld/app/build.gradle b/examples/example-kotlin/android/helloworld/app/build.gradle
index 64c8dc299..a7dcae36d 100644
--- a/examples/example-kotlin/android/helloworld/app/build.gradle
+++ b/examples/example-kotlin/android/helloworld/app/build.gradle
@@ -52,7 +52,7 @@ protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.5.1-1' }
plugins {
javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -72,9 +72,9 @@ dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// You need to build grpc-java to obtain these libraries below.
- compile 'io.grpc:grpc-okhttp:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-protobuf-lite:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- compile 'io.grpc:grpc-stub:1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-protobuf-lite:1.16.1' // CURRENT_GRPC_VERSION
+ compile 'io.grpc:grpc-stub:1.16.1' // CURRENT_GRPC_VERSION
}
repositories { mavenCentral() }
diff --git a/examples/example-kotlin/build.gradle b/examples/example-kotlin/build.gradle
index 4ebe65b02..b8acca876 100644
--- a/examples/example-kotlin/build.gradle
+++ b/examples/example-kotlin/build.gradle
@@ -35,7 +35,7 @@ repositories {
// Feel free to delete the comment at the next line. It is just for safely
// updating the version in our release process.
-def grpcVersion = '1.16.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.16.1' // CURRENT_GRPC_VERSION
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
diff --git a/examples/pom.xml b/examples/pom.xml
index 6de552405..31220ed24 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -6,12 +6,12 @@
<packaging>jar</packaging>
<!-- Feel free to delete the comment at the end of these lines. It is just
for safely updating the version in our release process. -->
- <version>1.16.0-SNAPSHOT</version><!-- CURRENT_GRPC_VERSION -->
+ <version>1.16.1</version><!-- CURRENT_GRPC_VERSION -->
<name>examples</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <grpc.version>1.16.0-SNAPSHOT</grpc.version><!-- CURRENT_GRPC_VERSION -->
+ <grpc.version>1.16.1</grpc.version><!-- CURRENT_GRPC_VERSION -->
<protobuf.version>3.5.1</protobuf.version>
<protoc.version>3.5.1-1</protoc.version>
<netty.tcnative.version>2.0.7.Final</netty.tcnative.version>
diff --git a/grpclb/src/main/java/io/grpc/grpclb/GrpclbState.java b/grpclb/src/main/java/io/grpc/grpclb/GrpclbState.java
index 95ad81341..c583e839b 100644
--- a/grpclb/src/main/java/io/grpc/grpclb/GrpclbState.java
+++ b/grpclb/src/main/java/io/grpc/grpclb/GrpclbState.java
@@ -215,9 +215,6 @@ final class GrpclbState {
if (usingFallbackBackends) {
return;
}
- if (fallbackTimer != null && !fallbackTimer.discarded) {
- return;
- }
int numReadySubchannels = 0;
for (Subchannel subchannel : subchannels.values()) {
if (subchannel.getAttributes().get(STATE_INFO).get().getState() == READY) {
@@ -392,7 +389,6 @@ final class GrpclbState {
@VisibleForTesting
class FallbackModeTask implements Runnable {
private ScheduledFuture<?> scheduledFuture;
- private boolean discarded;
@Override
public void run() {
@@ -400,7 +396,6 @@ final class GrpclbState {
@Override
public void run() {
checkState(fallbackTimer == FallbackModeTask.this, "fallback timer mismatch");
- discarded = true;
maybeUseFallbackBackends();
maybeUpdatePicker();
}
@@ -408,7 +403,6 @@ final class GrpclbState {
}
void cancel() {
- discarded = true;
scheduledFuture.cancel(false);
}
diff --git a/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java b/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java
index e54052810..9c394893a 100644
--- a/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java
+++ b/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java
@@ -43,7 +43,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import com.google.common.collect.Iterables;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.ByteString;
import com.google.protobuf.util.Durations;
@@ -1077,29 +1076,6 @@ public class GrpclbLoadBalancerTest {
fakeClock.forwardTime(GrpclbState.FALLBACK_TIMEOUT_MS - 1, TimeUnit.MILLISECONDS);
assertEquals(1, fakeClock.numPendingTasks(FALLBACK_MODE_TASK_FILTER));
- /////////////////////////////////////////////
- // Break the LB stream before timer expires
- /////////////////////////////////////////////
- Status streamError = Status.UNAVAILABLE.withDescription("OOB stream broken");
- lbResponseObserver.onError(streamError.asException());
- // Not in fallback mode. The error will be propagated.
- verify(helper).updateBalancingState(eq(TRANSIENT_FAILURE), pickerCaptor.capture());
- RoundRobinPicker picker = (RoundRobinPicker) pickerCaptor.getValue();
- assertThat(picker.dropList).isEmpty();
- ErrorEntry errorEntry = (ErrorEntry) Iterables.getOnlyElement(picker.pickList);
- Status status = errorEntry.result.getStatus();
- assertThat(status.getCode()).isEqualTo(streamError.getCode());
- assertThat(status.getDescription()).contains(streamError.getDescription());
- // A new stream is created
- verify(mockLbService, times(2)).balanceLoad(lbResponseObserverCaptor.capture());
- lbResponseObserver = lbResponseObserverCaptor.getValue();
- assertEquals(1, lbRequestObservers.size());
- lbRequestObserver = lbRequestObservers.poll();
- verify(lbRequestObserver).onNext(
- eq(LoadBalanceRequest.newBuilder().setInitialRequest(
- InitialLoadBalanceRequest.newBuilder().setName(SERVICE_AUTHORITY).build())
- .build()));
-
//////////////////////////////////
// Fallback timer expires (or not)
//////////////////////////////////
@@ -1156,13 +1132,14 @@ public class GrpclbLoadBalancerTest {
// Break the LB stream after the timer expires
////////////////////////////////////////////////
if (timerExpires) {
+ Status streamError = Status.UNAVAILABLE.withDescription("OOB stream broken");
lbResponseObserver.onError(streamError.asException());
// The error will NOT propagate to picker because fallback list is in use.
inOrder.verify(helper, never())
.updateBalancingState(any(ConnectivityState.class), any(SubchannelPicker.class));
// A new stream is created
- verify(mockLbService, times(3)).balanceLoad(lbResponseObserverCaptor.capture());
+ verify(mockLbService, times(2)).balanceLoad(lbResponseObserverCaptor.capture());
lbResponseObserver = lbResponseObserverCaptor.getValue();
assertEquals(1, lbRequestObservers.size());
lbRequestObserver = lbRequestObservers.poll();
@@ -1198,6 +1175,60 @@ public class GrpclbLoadBalancerTest {
}
@Test
+ public void grpclbFallback_breakLbStreamBeforeFallbackTimerExpires() {
+ long loadReportIntervalMillis = 1983;
+ InOrder inOrder = inOrder(helper, subchannelPool);
+
+ // Create a resolution list with a mixture of balancer and backend addresses
+ List<EquivalentAddressGroup> resolutionList =
+ createResolvedServerAddresses(false, true, false);
+ Attributes resolutionAttrs = Attributes.EMPTY;
+ deliverResolvedAddresses(resolutionList, resolutionAttrs);
+
+ inOrder.verify(helper).createOobChannel(eq(resolutionList.get(1)), eq(lbAuthority(0)));
+
+ // Attempted to connect to balancer
+ assertEquals(1, fakeOobChannels.size());
+ ManagedChannel oobChannel = fakeOobChannels.poll();
+ verify(mockLbService).balanceLoad(lbResponseObserverCaptor.capture());
+ StreamObserver<LoadBalanceResponse> lbResponseObserver = lbResponseObserverCaptor.getValue();
+ assertEquals(1, lbRequestObservers.size());
+ StreamObserver<LoadBalanceRequest> lbRequestObserver = lbRequestObservers.poll();
+
+ verify(lbRequestObserver).onNext(
+ eq(LoadBalanceRequest.newBuilder().setInitialRequest(
+ InitialLoadBalanceRequest.newBuilder().setName(SERVICE_AUTHORITY).build())
+ .build()));
+ lbResponseObserver.onNext(buildInitialResponse(loadReportIntervalMillis));
+ // We don't care if runSerialized() has been run.
+ inOrder.verify(helper, atLeast(0)).runSerialized(any(Runnable.class));
+
+ inOrder.verifyNoMoreInteractions();
+
+ assertEquals(1, fakeClock.numPendingTasks(FALLBACK_MODE_TASK_FILTER));
+
+ /////////////////////////////////////////////
+ // Break the LB stream before timer expires
+ /////////////////////////////////////////////
+ Status streamError = Status.UNAVAILABLE.withDescription("OOB stream broken");
+ lbResponseObserver.onError(streamError.asException());
+
+ // Fall back to the backends from resolver
+ fallbackTestVerifyUseOfFallbackBackendLists(
+ inOrder, Arrays.asList(resolutionList.get(0), resolutionList.get(2)));
+
+ // A new stream is created
+ verify(mockLbService, times(2)).balanceLoad(lbResponseObserverCaptor.capture());
+ lbResponseObserver = lbResponseObserverCaptor.getValue();
+ assertEquals(1, lbRequestObservers.size());
+ lbRequestObserver = lbRequestObservers.poll();
+ verify(lbRequestObserver).onNext(
+ eq(LoadBalanceRequest.newBuilder().setInitialRequest(
+ InitialLoadBalanceRequest.newBuilder().setName(SERVICE_AUTHORITY).build())
+ .build()));
+ }
+
+ @Test
public void grpclbFallback_balancerLost() {
subtestGrpclbFallbackConnectionLost(true, false);
}
diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
index ac724f618..f4ffff427 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
@@ -1759,7 +1759,7 @@ public abstract class AbstractInteropTest {
}
}
- /** Helper for getting remote address {@link io.grpc.ServerCall#getAttributes()} */
+ /** Helper for getting remote address from {@link io.grpc.ServerCall#getAttributes()} */
protected SocketAddress obtainRemoteClientAddr() {
TestServiceGrpc.TestServiceBlockingStub stub =
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS);
@@ -1769,6 +1769,16 @@ public abstract class AbstractInteropTest {
return serverCallCapture.get().getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
}
+ /** Helper for getting local address from {@link io.grpc.ServerCall#getAttributes()} */
+ protected SocketAddress obtainLocalClientAddr() {
+ TestServiceGrpc.TestServiceBlockingStub stub =
+ blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS);
+
+ stub.unaryCall(SimpleRequest.getDefaultInstance());
+
+ return serverCallCapture.get().getAttributes().get(Grpc.TRANSPORT_ATTR_LOCAL_ADDR);
+ }
+
/** Helper for asserting TLS info in SSLSession {@link io.grpc.ServerCall#getAttributes()} */
protected void assertX500SubjectDn(String tlsInfo) {
TestServiceGrpc.TestServiceBlockingStub stub =
diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/Http2NettyTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/Http2NettyTest.java
index 57b65ea21..5164feabf 100644
--- a/interop-testing/src/test/java/io/grpc/testing/integration/Http2NettyTest.java
+++ b/interop-testing/src/test/java/io/grpc/testing/integration/Http2NettyTest.java
@@ -88,6 +88,13 @@ public class Http2NettyTest extends AbstractInteropTest {
}
@Test
+ public void localAddr() throws Exception {
+ InetSocketAddress isa = (InetSocketAddress) obtainLocalClientAddr();
+ assertEquals(InetAddress.getLoopbackAddress(), isa.getAddress());
+ assertEquals(getPort(), isa.getPort());
+ }
+
+ @Test
public void tlsInfo() {
assertX500SubjectDn("CN=testclient, O=Internet Widgits Pty Ltd, ST=Some-State, C=AU");
}
diff --git a/netty/src/main/java/io/grpc/netty/InternalNettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/InternalNettyChannelBuilder.java
index 4711af97b..bbceb364e 100644
--- a/netty/src/main/java/io/grpc/netty/InternalNettyChannelBuilder.java
+++ b/netty/src/main/java/io/grpc/netty/InternalNettyChannelBuilder.java
@@ -18,8 +18,6 @@ package io.grpc.netty;
import io.grpc.Internal;
import io.grpc.internal.ClientTransportFactory;
-import io.grpc.internal.ProxyParameters;
-import java.net.SocketAddress;
/**
* Internal {@link NettyChannelBuilder} accessor. This is intended for usage internal to the gRPC
@@ -39,28 +37,17 @@ public final class InternalNettyChannelBuilder {
channelBuilder.overrideAuthorityChecker(authorityChecker);
}
- /**
- * Interface to create netty dynamic parameters.
- */
- public interface TransportCreationParamsFilterFactory
- extends NettyChannelBuilder.TransportCreationParamsFilterFactory {
- @Override
- TransportCreationParamsFilter create(
- SocketAddress targetServerAddress, String authority, String userAgent,
- ProxyParameters proxy);
- }
+ /** A class that provides a Netty handler to control protocol negotiation. */
+ public interface ProtocolNegotiatorFactory
+ extends NettyChannelBuilder.ProtocolNegotiatorFactory {}
/**
- * {@link TransportCreationParamsFilter} are those that may depend on late-known information about
- * a client transport. This interface can be used to dynamically alter params based on the
- * params of {@code ClientTransportFactory#newClientTransport}.
+ * Sets the {@link ProtocolNegotiatorFactory} to be used. Overrides any specified negotiation type
+ * and {@code SslContext}.
*/
- public interface TransportCreationParamsFilter
- extends NettyChannelBuilder.TransportCreationParamsFilter {}
-
- public static void setDynamicTransportParamsFactory(
- NettyChannelBuilder builder, TransportCreationParamsFilterFactory factory) {
- builder.setDynamicParamsFactory(factory);
+ public static void setProtocolNegotiatorFactory(
+ NettyChannelBuilder builder, ProtocolNegotiatorFactory protocolNegotiator) {
+ builder.protocolNegotiatorFactory(protocolNegotiator);
}
public static void setStatsEnabled(NettyChannelBuilder builder, boolean value) {
diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java
index 633cb3232..46beec533 100644
--- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java
+++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java
@@ -17,7 +17,6 @@
package io.grpc.netty;
import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static io.grpc.internal.GrpcUtil.DEFAULT_KEEPALIVE_TIMEOUT_NANOS;
import static io.grpc.internal.GrpcUtil.DEFAULT_KEEPALIVE_TIME_NANOS;
@@ -27,6 +26,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.grpc.Attributes;
+import io.grpc.EquivalentAddressGroup;
import io.grpc.ExperimentalApi;
import io.grpc.Internal;
import io.grpc.NameResolver;
@@ -80,7 +80,8 @@ public final class NettyChannelBuilder
private long keepAliveTimeNanos = KEEPALIVE_TIME_NANOS_DISABLED;
private long keepAliveTimeoutNanos = DEFAULT_KEEPALIVE_TIMEOUT_NANOS;
private boolean keepAliveWithoutCalls;
- private TransportCreationParamsFilterFactory dynamicParamsFactory;
+ private ProtocolNegotiatorFactory protocolNegotiatorFactory;
+ private LocalSocketPicker localSocketPicker;
/**
* Creates a new builder with the given server address. This factory method is primarily intended
@@ -327,13 +328,49 @@ public final class NettyChannelBuilder
return this;
}
+
+ /**
+ * If non-{@code null}, attempts to create connections bound to a local port.
+ */
+ public NettyChannelBuilder localSocketPicker(@Nullable LocalSocketPicker localSocketPicker) {
+ this.localSocketPicker = localSocketPicker;
+ return this;
+ }
+
+ /**
+ * This class is meant to be overriden with a custom implementation of
+ * {@link #createSocketAddress}. The default implementation is a no-op.
+ *
+ * @since 1.16.0
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4917")
+ public static class LocalSocketPicker {
+
+ /**
+ * Called by gRPC to pick local socket to bind to. This may be called multiple times.
+ * Subclasses are expected to override this method.
+ *
+ * @param remoteAddress the remote address to connect to.
+ * @param attrs the Attributes present on the {@link io.grpc.EquivalentAddressGroup} associated
+ * with the address.
+ * @return a {@link SocketAddress} suitable for binding, or else {@code null}.
+ * @since 1.16.0
+ */
+ @Nullable
+ public SocketAddress createSocketAddress(
+ SocketAddress remoteAddress, @EquivalentAddressGroup.Attr Attributes attrs) {
+ return null;
+ }
+ }
+
@Override
@CheckReturnValue
@Internal
protected ClientTransportFactory buildTransportFactory() {
- TransportCreationParamsFilterFactory transportCreationParamsFilterFactory =
- dynamicParamsFactory;
- if (transportCreationParamsFilterFactory == null) {
+ ProtocolNegotiator negotiator;
+ if (protocolNegotiatorFactory != null) {
+ negotiator = protocolNegotiatorFactory.buildProtocolNegotiator();
+ } else {
SslContext localSslContext = sslContext;
if (negotiationType == NegotiationType.TLS && localSslContext == null) {
try {
@@ -342,16 +379,13 @@ public final class NettyChannelBuilder
throw new RuntimeException(ex);
}
}
- ProtocolNegotiator negotiator =
- createProtocolNegotiatorByType(negotiationType, localSslContext);
- transportCreationParamsFilterFactory =
- new DefaultNettyTransportCreationParamsFilterFactory(negotiator);
+ negotiator = createProtocolNegotiatorByType(negotiationType, localSslContext);
}
return new NettyTransportFactory(
- transportCreationParamsFilterFactory, channelType, channelOptions,
+ negotiator, channelType, channelOptions,
eventLoopGroup, flowControlWindow, maxInboundMessageSize(),
maxHeaderListSize, keepAliveTimeNanos, keepAliveTimeoutNanos, keepAliveWithoutCalls,
- transportTracerFactory.create());
+ transportTracerFactory.create(), localSocketPicker);
}
@Override
@@ -409,8 +443,9 @@ public final class NettyChannelBuilder
return super.checkAuthority(authority);
}
- void setDynamicParamsFactory(TransportCreationParamsFilterFactory factory) {
- this.dynamicParamsFactory = checkNotNull(factory, "factory");
+ void protocolNegotiatorFactory(ProtocolNegotiatorFactory protocolNegotiatorFactory) {
+ this.protocolNegotiatorFactory
+ = Preconditions.checkNotNull(protocolNegotiatorFactory, "protocolNegotiatorFactory");
}
@Override
@@ -434,24 +469,12 @@ public final class NettyChannelBuilder
return this;
}
- interface TransportCreationParamsFilterFactory {
- @CheckReturnValue
- TransportCreationParamsFilter create(
- SocketAddress targetServerAddress,
- String authority,
- @Nullable String userAgent,
- @Nullable ProxyParameters proxy);
- }
-
- @CheckReturnValue
- interface TransportCreationParamsFilter {
- SocketAddress getTargetServerAddress();
-
- String getAuthority();
-
- @Nullable String getUserAgent();
-
- ProtocolNegotiator getProtocolNegotiator();
+ interface ProtocolNegotiatorFactory {
+ /**
+ * Returns a ProtocolNegotatior instance configured for this Builder. This method is called
+ * during {@code ManagedChannelBuilder#build()}.
+ */
+ ProtocolNegotiator buildProtocolNegotiator();
}
/**
@@ -459,7 +482,7 @@ public final class NettyChannelBuilder
*/
@CheckReturnValue
private static final class NettyTransportFactory implements ClientTransportFactory {
- private final TransportCreationParamsFilterFactory transportCreationParamsFilterFactory;
+ private final ProtocolNegotiator protocolNegotiator;
private final Class<? extends Channel> channelType;
private final Map<ChannelOption<?>, ?> channelOptions;
private final EventLoopGroup group;
@@ -471,15 +494,16 @@ public final class NettyChannelBuilder
private final long keepAliveTimeoutNanos;
private final boolean keepAliveWithoutCalls;
private final TransportTracer transportTracer;
+ private final LocalSocketPicker localSocketPicker;
private boolean closed;
- NettyTransportFactory(TransportCreationParamsFilterFactory transportCreationParamsFilterFactory,
+ NettyTransportFactory(ProtocolNegotiator protocolNegotiator,
Class<? extends Channel> channelType, Map<ChannelOption<?>, ?> channelOptions,
EventLoopGroup group, int flowControlWindow, int maxMessageSize, int maxHeaderListSize,
long keepAliveTimeNanos, long keepAliveTimeoutNanos, boolean keepAliveWithoutCalls,
- TransportTracer transportTracer) {
- this.transportCreationParamsFilterFactory = transportCreationParamsFilterFactory;
+ TransportTracer transportTracer, LocalSocketPicker localSocketPicker) {
+ this.protocolNegotiator = protocolNegotiator;
this.channelType = channelType;
this.channelOptions = new HashMap<ChannelOption<?>, Object>(channelOptions);
this.flowControlWindow = flowControlWindow;
@@ -489,6 +513,8 @@ public final class NettyChannelBuilder
this.keepAliveTimeoutNanos = keepAliveTimeoutNanos;
this.keepAliveWithoutCalls = keepAliveWithoutCalls;
this.transportTracer = transportTracer;
+ this.localSocketPicker =
+ localSocketPicker != null ? localSocketPicker : new LocalSocketPicker();
usingSharedGroup = group == null;
if (usingSharedGroup) {
@@ -504,12 +530,13 @@ public final class NettyChannelBuilder
SocketAddress serverAddress, ClientTransportOptions options) {
checkState(!closed, "The transport factory is closed.");
- TransportCreationParamsFilter dparams =
- transportCreationParamsFilterFactory.create(
- serverAddress,
- options.getAuthority(),
- options.getUserAgent(),
- options.getProxyParameters());
+ ProtocolNegotiator localNegotiator = protocolNegotiator;
+ ProxyParameters proxyParams = options.getProxyParameters();
+ if (proxyParams != null) {
+ localNegotiator = ProtocolNegotiators.httpProxy(
+ proxyParams.proxyAddress, proxyParams.username, proxyParams.password,
+ protocolNegotiator);
+ }
final AtomicBackoff.State keepAliveTimeNanosState = keepAliveTimeNanos.getState();
Runnable tooManyPingsRunnable = new Runnable() {
@@ -518,12 +545,14 @@ public final class NettyChannelBuilder
keepAliveTimeNanosState.backoff();
}
};
+
NettyClientTransport transport = new NettyClientTransport(
- dparams.getTargetServerAddress(), channelType, channelOptions, group,
- dparams.getProtocolNegotiator(), flowControlWindow,
+ serverAddress, channelType, channelOptions, group,
+ localNegotiator, flowControlWindow,
maxMessageSize, maxHeaderListSize, keepAliveTimeNanosState.get(), keepAliveTimeoutNanos,
- keepAliveWithoutCalls, dparams.getAuthority(), dparams.getUserAgent(),
- tooManyPingsRunnable, transportTracer, options.getEagAttributes());
+ keepAliveWithoutCalls, options.getAuthority(), options.getUserAgent(),
+ tooManyPingsRunnable, transportTracer, options.getEagAttributes(),
+ localSocketPicker);
return transport;
}
@@ -539,73 +568,10 @@ public final class NettyChannelBuilder
}
closed = true;
+ protocolNegotiator.close();
if (usingSharedGroup) {
SharedResourceHolder.release(Utils.DEFAULT_WORKER_EVENT_LOOP_GROUP, group);
}
}
}
-
- private static final class DefaultNettyTransportCreationParamsFilterFactory
- implements TransportCreationParamsFilterFactory {
- final ProtocolNegotiator negotiator;
-
- DefaultNettyTransportCreationParamsFilterFactory(ProtocolNegotiator negotiator) {
- this.negotiator = negotiator;
- }
-
- @Override
- public TransportCreationParamsFilter create(
- SocketAddress targetServerAddress,
- String authority,
- String userAgent,
- ProxyParameters proxyParams) {
- ProtocolNegotiator localNegotiator = negotiator;
- if (proxyParams != null) {
- localNegotiator = ProtocolNegotiators.httpProxy(
- proxyParams.proxyAddress, proxyParams.username, proxyParams.password, negotiator);
- }
- return new DynamicNettyTransportParams(
- targetServerAddress, authority, userAgent, localNegotiator);
- }
- }
-
- @CheckReturnValue
- private static final class DynamicNettyTransportParams implements TransportCreationParamsFilter {
-
- private final SocketAddress targetServerAddress;
- private final String authority;
- @Nullable private final String userAgent;
- private final ProtocolNegotiator protocolNegotiator;
-
- private DynamicNettyTransportParams(
- SocketAddress targetServerAddress,
- String authority,
- String userAgent,
- ProtocolNegotiator protocolNegotiator) {
- this.targetServerAddress = targetServerAddress;
- this.authority = authority;
- this.userAgent = userAgent;
- this.protocolNegotiator = protocolNegotiator;
- }
-
- @Override
- public SocketAddress getTargetServerAddress() {
- return targetServerAddress;
- }
-
- @Override
- public String getAuthority() {
- return authority;
- }
-
- @Override
- public String getUserAgent() {
- return userAgent;
- }
-
- @Override
- public ProtocolNegotiator getProtocolNegotiator() {
- return protocolNegotiator;
- }
- }
}
diff --git a/netty/src/main/java/io/grpc/netty/NettyClientTransport.java b/netty/src/main/java/io/grpc/netty/NettyClientTransport.java
index 6141db2fe..c1cc07850 100644
--- a/netty/src/main/java/io/grpc/netty/NettyClientTransport.java
+++ b/netty/src/main/java/io/grpc/netty/NettyClientTransport.java
@@ -40,6 +40,7 @@ import io.grpc.internal.KeepAliveManager;
import io.grpc.internal.KeepAliveManager.ClientKeepAlivePinger;
import io.grpc.internal.StatsTraceContext;
import io.grpc.internal.TransportTracer;
+import io.grpc.netty.NettyChannelBuilder.LocalSocketPicker;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
@@ -64,7 +65,7 @@ import javax.annotation.Nullable;
class NettyClientTransport implements ConnectionClientTransport {
private final InternalLogId logId = InternalLogId.allocate(getClass().getName());
private final Map<ChannelOption<?>, ?> channelOptions;
- private final SocketAddress address;
+ private final SocketAddress remoteAddress;
private final Class<? extends Channel> channelType;
private final EventLoopGroup group;
private final ProtocolNegotiator negotiator;
@@ -91,6 +92,7 @@ class NettyClientTransport implements ConnectionClientTransport {
/** Since not thread-safe, may only be used from event loop. */
private final TransportTracer transportTracer;
private final Attributes eagAttributes;
+ private final LocalSocketPicker localSocketPicker;
NettyClientTransport(
SocketAddress address, Class<? extends Channel> channelType,
@@ -98,9 +100,10 @@ class NettyClientTransport implements ConnectionClientTransport {
ProtocolNegotiator negotiator, int flowControlWindow, int maxMessageSize,
int maxHeaderListSize, long keepAliveTimeNanos, long keepAliveTimeoutNanos,
boolean keepAliveWithoutCalls, String authority, @Nullable String userAgent,
- Runnable tooManyPingsRunnable, TransportTracer transportTracer, Attributes eagAttributes) {
+ Runnable tooManyPingsRunnable, TransportTracer transportTracer, Attributes eagAttributes,
+ LocalSocketPicker localSocketPicker) {
this.negotiator = Preconditions.checkNotNull(negotiator, "negotiator");
- this.address = Preconditions.checkNotNull(address, "address");
+ this.remoteAddress = Preconditions.checkNotNull(address, "address");
this.group = Preconditions.checkNotNull(group, "group");
this.channelType = Preconditions.checkNotNull(channelType, "channelType");
this.channelOptions = Preconditions.checkNotNull(channelOptions, "channelOptions");
@@ -117,6 +120,7 @@ class NettyClientTransport implements ConnectionClientTransport {
Preconditions.checkNotNull(tooManyPingsRunnable, "tooManyPingsRunnable");
this.transportTracer = Preconditions.checkNotNull(transportTracer, "transportTracer");
this.eagAttributes = Preconditions.checkNotNull(eagAttributes, "eagAttributes");
+ this.localSocketPicker = Preconditions.checkNotNull(localSocketPicker, "localSocketPicker");
}
@Override
@@ -263,7 +267,13 @@ class NettyClientTransport implements ConnectionClientTransport {
}
});
// Start the connection operation to the server.
- channel.connect(address);
+ SocketAddress localAddress =
+ localSocketPicker.createSocketAddress(remoteAddress, eagAttributes);
+ if (localAddress != null) {
+ channel.connect(remoteAddress, localAddress);
+ } else {
+ channel.connect(remoteAddress);
+ }
if (keepAliveManager != null) {
keepAliveManager.onTransportStarted();
@@ -305,7 +315,7 @@ class NettyClientTransport implements ConnectionClientTransport {
public String toString() {
return MoreObjects.toStringHelper(this)
.add("logId", logId.getId())
- .add("address", address)
+ .add("remoteAddress", remoteAddress)
.add("channel", channel)
.toString();
}
diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java
index 132e96a03..098ba73fb 100644
--- a/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java
+++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java
@@ -43,4 +43,11 @@ public interface ProtocolNegotiator {
* completed successfully.
*/
Handler newHandler(GrpcHttp2ConnectionHandler grpcHandler);
+
+ /**
+ * Releases resources held by this negotiator. Called when the Channel transitions to terminated.
+ * Is currently only supported on client-side; server-side protocol negotiators will not see this
+ * method called.
+ */
+ void close();
}
diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
index 3a13207cb..061801705 100644
--- a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
+++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
@@ -22,12 +22,12 @@ import static io.grpc.netty.GrpcSslContexts.NEXT_PROTOCOL_VERSIONS;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
import io.grpc.Grpc;
import io.grpc.Internal;
import io.grpc.InternalChannelz;
import io.grpc.SecurityLevel;
import io.grpc.Status;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.GrpcUtil;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelFuture;
@@ -90,6 +90,7 @@ public final class ProtocolNegotiators {
// Set sttributes before replace to be sure we pass it before accepting any requests.
handler.handleProtocolNegotiationCompleted(Attributes.newBuilder()
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
.build(),
/*securityInfo=*/ null);
// Just replace this handler with the gRPC handler.
@@ -104,6 +105,9 @@ public final class ProtocolNegotiators {
return new PlaintextHandler();
}
+
+ @Override
+ public void close() {}
};
}
@@ -117,6 +121,9 @@ public final class ProtocolNegotiators {
public Handler newHandler(GrpcHttp2ConnectionHandler handler) {
return new ServerTlsHandler(sslContext, handler);
}
+
+ @Override
+ public void close() {}
};
}
@@ -157,6 +164,7 @@ public final class ProtocolNegotiators {
Attributes.newBuilder()
.set(Grpc.TRANSPORT_ATTR_SSL_SESSION, session)
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
.build(),
new InternalChannelz.Security(new InternalChannelz.Tls(session)));
// Replace this handler with the GRPC handler.
@@ -207,6 +215,13 @@ public final class ProtocolNegotiators {
return new BufferUntilProxyTunnelledHandler(
proxyHandler, negotiator.newHandler(http2Handler));
}
+
+ // This method is not normally called, because we use httpProxy on a per-connection basis in
+ // NettyChannelBuilder. Instead, we expect `negotiator' to be closed by NettyTransportFactory.
+ @Override
+ public void close() {
+ negotiator.close();
+ }
}
return new ProxyNegotiator();
@@ -310,6 +325,9 @@ public final class ProtocolNegotiators {
};
return new BufferUntilTlsNegotiatedHandler(sslBootstrap, handler);
}
+
+ @Override
+ public void close() {}
}
/** A tuple of (host, port). */
@@ -341,6 +359,9 @@ public final class ProtocolNegotiators {
new HttpClientUpgradeHandler(httpClientCodec, upgradeCodec, 1000);
return new BufferingHttp2UpgradeHandler(upgrader, handler);
}
+
+ @Override
+ public void close() {}
}
/**
@@ -357,6 +378,9 @@ public final class ProtocolNegotiators {
public Handler newHandler(GrpcHttp2ConnectionHandler handler) {
return new BufferUntilChannelActiveHandler(handler);
}
+
+ @Override
+ public void close() {}
}
private static RuntimeException unavailableException(String msg) {
@@ -651,7 +675,8 @@ public final class ProtocolNegotiators {
Attributes.newBuilder()
.set(Grpc.TRANSPORT_ATTR_SSL_SESSION, session)
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.PRIVACY_AND_INTEGRITY)
.build(),
new InternalChannelz.Security(new InternalChannelz.Tls(session)));
writeBufferedAndRemove(ctx);
@@ -699,7 +724,8 @@ public final class ProtocolNegotiators {
Attributes
.newBuilder()
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.NONE)
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.NONE)
.build(),
/*securityInfo=*/ null);
super.channelActive(ctx);
@@ -742,7 +768,8 @@ public final class ProtocolNegotiators {
Attributes
.newBuilder()
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, ctx.channel().remoteAddress())
- .set(CallCredentials.ATTR_SECURITY_LEVEL, SecurityLevel.NONE)
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, ctx.channel().localAddress())
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.NONE)
.build(),
/*securityInfo=*/ null);
} else if (evt == HttpClientUpgradeHandler.UpgradeEvent.UPGRADE_REJECTED) {
diff --git a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
index 682af1b9e..7b28fac5c 100644
--- a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
+++ b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
@@ -61,6 +61,7 @@ import io.grpc.internal.ServerTransport;
import io.grpc.internal.ServerTransportListener;
import io.grpc.internal.TransportTracer;
import io.grpc.internal.testing.TestUtils;
+import io.grpc.netty.NettyChannelBuilder.LocalSocketPicker;
import io.netty.channel.ChannelConfig;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
@@ -77,14 +78,17 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
+import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import javax.annotation.Nullable;
import javax.net.ssl.SSLHandshakeException;
import org.junit.After;
import org.junit.Before;
@@ -105,6 +109,8 @@ public class NettyClientTransportTest {
private ManagedClientTransport.Listener clientTransportListener;
private final List<NettyClientTransport> transports = new ArrayList<>();
+ private final LinkedBlockingQueue<Attributes> serverTransportAttributesList =
+ new LinkedBlockingQueue<>();
private final NioEventLoopGroup group = new NioEventLoopGroup(1);
private final EchoServerListener serverListener = new EchoServerListener();
private final InternalChannelz channelz = new InternalChannelz();
@@ -175,7 +181,7 @@ public class NettyClientTransportTest {
address, NioSocketChannel.class, channelOptions, group, newNegotiator(),
DEFAULT_WINDOW_SIZE, DEFAULT_MAX_MESSAGE_SIZE, GrpcUtil.DEFAULT_MAX_HEADER_LIST_SIZE,
KEEPALIVE_TIME_NANOS_DISABLED, 1L, false, authority, null /* user agent */,
- tooManyPingsRunnable, new TransportTracer(), Attributes.EMPTY);
+ tooManyPingsRunnable, new TransportTracer(), Attributes.EMPTY, new SocketPicker());
transports.add(transport);
callMeMaybe(transport.start(clientTransportListener));
@@ -415,7 +421,7 @@ public class NettyClientTransportTest {
address, CantConstructChannel.class, new HashMap<ChannelOption<?>, Object>(), group,
newNegotiator(), DEFAULT_WINDOW_SIZE, DEFAULT_MAX_MESSAGE_SIZE,
GrpcUtil.DEFAULT_MAX_HEADER_LIST_SIZE, KEEPALIVE_TIME_NANOS_DISABLED, 1, false, authority,
- null, tooManyPingsRunnable, new TransportTracer(), Attributes.EMPTY);
+ null, tooManyPingsRunnable, new TransportTracer(), Attributes.EMPTY, new SocketPicker());
transports.add(transport);
// Should not throw
@@ -536,6 +542,11 @@ public class NettyClientTransportTest {
assertNotNull(rpc.stream.getAttributes().get(Grpc.TRANSPORT_ATTR_SSL_SESSION));
assertEquals(address, rpc.stream.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR));
+ Attributes serverTransportAttrs = serverTransportAttributesList.poll(1, TimeUnit.SECONDS);
+ assertNotNull(serverTransportAttrs);
+ SocketAddress clientAddr = serverTransportAttrs.get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
+ assertNotNull(clientAddr);
+ assertEquals(clientAddr, rpc.stream.getAttributes().get(Grpc.TRANSPORT_ATTR_LOCAL_ADDR));
}
@Test
@@ -593,7 +604,7 @@ public class NettyClientTransportTest {
DEFAULT_WINDOW_SIZE, maxMsgSize, maxHeaderListSize,
keepAliveTimeNano, keepAliveTimeoutNano,
false, authority, userAgent, tooManyPingsRunnable,
- new TransportTracer(), eagAttributes);
+ new TransportTracer(), eagAttributes, new SocketPicker());
transports.add(transport);
return transport;
}
@@ -749,7 +760,7 @@ public class NettyClientTransportTest {
}
}
- private static final class EchoServerListener implements ServerListener {
+ private final class EchoServerListener implements ServerListener {
final List<NettyServerTransport> transports = new ArrayList<>();
final List<EchoServerStreamListener> streamListeners =
Collections.synchronizedList(new ArrayList<EchoServerStreamListener>());
@@ -769,6 +780,7 @@ public class NettyClientTransportTest {
@Override
public Attributes transportReady(Attributes transportAttrs) {
+ serverTransportAttributesList.add(transportAttrs);
return transportAttrs;
}
@@ -821,5 +833,17 @@ public class NettyClientTransportTest {
this.grpcHandler = grpcHandler;
return handler = new NoopHandler(grpcHandler);
}
+
+ @Override
+ public void close() {}
+ }
+
+ private static final class SocketPicker extends LocalSocketPicker {
+
+ @Nullable
+ @Override
+ public SocketAddress createSocketAddress(SocketAddress remoteAddress, Attributes attrs) {
+ return null;
+ }
}
}
diff --git a/okhttp/src/main/java/io/grpc/okhttp/AsyncFrameWriter.java b/okhttp/src/main/java/io/grpc/okhttp/AsyncFrameWriter.java
index 3049c5bd6..210aaa1f0 100644
--- a/okhttp/src/main/java/io/grpc/okhttp/AsyncFrameWriter.java
+++ b/okhttp/src/main/java/io/grpc/okhttp/AsyncFrameWriter.java
@@ -16,6 +16,7 @@
package io.grpc.okhttp;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import io.grpc.internal.SerializingExecutor;
import io.grpc.okhttp.internal.framed.ErrorCode;
@@ -24,7 +25,11 @@ import io.grpc.okhttp.internal.framed.Header;
import io.grpc.okhttp.internal.framed.Settings;
import java.io.IOException;
import java.net.Socket;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -39,6 +44,9 @@ class AsyncFrameWriter implements FrameWriter {
private final SerializingExecutor executor;
private final TransportExceptionHandler transportExceptionHandler;
private final AtomicLong flushCounter = new AtomicLong();
+ // Some exceptions are not very useful and add too much noise to the log
+ private static final Set<String> QUIET_ERRORS =
+ Collections.unmodifiableSet(new HashSet<>(Arrays.asList("Socket closed")));
public AsyncFrameWriter(
TransportExceptionHandler transportExceptionHandler, SerializingExecutor executor) {
@@ -213,13 +221,28 @@ class AsyncFrameWriter implements FrameWriter {
frameWriter.close();
socket.close();
} catch (IOException e) {
- log.log(Level.WARNING, "Failed closing connection", e);
+ log.log(getLogLevel(e), "Failed closing connection", e);
}
}
}
});
}
+ /**
+ * Accepts a throwable and returns the appropriate logging level. Uninteresting exceptions
+ * should not clutter the log.
+ */
+ @VisibleForTesting
+ static Level getLogLevel(Throwable t) {
+ if (t instanceof IOException
+ && t.getMessage() != null
+ && QUIET_ERRORS.contains(t.getMessage())) {
+ return Level.FINE;
+
+ }
+ return Level.INFO;
+ }
+
private abstract class WriteRunnable implements Runnable {
@Override
public final void run() {
diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java
index 9bca807eb..aa9e07499 100644
--- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java
+++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java
@@ -31,7 +31,6 @@ import com.squareup.okhttp.HttpUrl;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.internal.http.StatusLine;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
import io.grpc.CallOptions;
import io.grpc.Grpc;
import io.grpc.InternalChannelz;
@@ -46,6 +45,7 @@ import io.grpc.Status.Code;
import io.grpc.StatusException;
import io.grpc.internal.ClientStreamListener.RpcProgress;
import io.grpc.internal.ConnectionClientTransport;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.Http2Ping;
import io.grpc.internal.KeepAliveManager;
@@ -484,8 +484,9 @@ class OkHttpClientTransport implements ConnectionClientTransport, TransportExcep
attributes = Attributes
.newBuilder()
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, sock.getRemoteSocketAddress())
+ .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, sock.getLocalSocketAddress())
.set(Grpc.TRANSPORT_ATTR_SSL_SESSION, sslSession)
- .set(CallCredentials.ATTR_SECURITY_LEVEL,
+ .set(GrpcAttributes.ATTR_SECURITY_LEVEL,
sslSession == null ? SecurityLevel.NONE : SecurityLevel.PRIVACY_AND_INTEGRITY)
.build();
} catch (StatusException e) {
diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpProtocolNegotiator.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpProtocolNegotiator.java
index 1858a9317..eabe385ff 100644
--- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpProtocolNegotiator.java
+++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpProtocolNegotiator.java
@@ -93,7 +93,7 @@ class OkHttpProtocolNegotiator {
String negotiatedProtocol = getSelectedProtocol(sslSocket);
if (negotiatedProtocol == null) {
- throw new RuntimeException("protocol negotiation failed");
+ throw new RuntimeException("TLS ALPN negotiation failed with protocols: " + protocols);
}
return negotiatedProtocol;
} finally {
@@ -185,6 +185,7 @@ class OkHttpProtocolNegotiator {
return new String(alpnResult, Util.UTF_8);
}
} catch (Exception e) {
+ logger.log(Level.FINE, "Failed calling getAlpnSelectedProtocol()", e);
// In some implementations, querying selected protocol before the handshake will fail with
// exception.
}
@@ -198,6 +199,7 @@ class OkHttpProtocolNegotiator {
return new String(npnResult, Util.UTF_8);
}
} catch (Exception e) {
+ logger.log(Level.FINE, "Failed calling getNpnSelectedProtocol()", e);
// In some implementations, querying selected protocol before the handshake will fail with
// exception.
}
diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpTlsUpgrader.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpTlsUpgrader.java
index 0a8672c65..e43713d66 100644
--- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpTlsUpgrader.java
+++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpTlsUpgrader.java
@@ -43,7 +43,7 @@ final class OkHttpTlsUpgrader {
*/
@VisibleForTesting
static final List<Protocol> TLS_PROTOCOLS =
- Collections.unmodifiableList(Arrays.<Protocol>asList(Protocol.GRPC_EXP, Protocol.HTTP_2));
+ Collections.unmodifiableList(Arrays.asList(Protocol.GRPC_EXP, Protocol.HTTP_2));
/**
* Upgrades given Socket to be a SSLSocket.
diff --git a/okhttp/src/test/java/io/grpc/okhttp/AsyncFrameWriterTest.java b/okhttp/src/test/java/io/grpc/okhttp/AsyncFrameWriterTest.java
index 479a35a78..45e80707c 100644
--- a/okhttp/src/test/java/io/grpc/okhttp/AsyncFrameWriterTest.java
+++ b/okhttp/src/test/java/io/grpc/okhttp/AsyncFrameWriterTest.java
@@ -16,11 +16,13 @@
package io.grpc.okhttp;
+import static com.google.common.truth.Truth.assertThat;
+import static io.grpc.okhttp.AsyncFrameWriter.getLogLevel;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.internal.verification.VerificationModeFactory.times;
import io.grpc.internal.SerializingExecutor;
import io.grpc.okhttp.AsyncFrameWriter.TransportExceptionHandler;
@@ -30,6 +32,7 @@ import java.net.Socket;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;
+import java.util.logging.Level;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -92,6 +95,28 @@ public class AsyncFrameWriterTest {
inOrder.verify(frameWriter).flush();
}
+ @Test
+ public void unknownException() {
+ assertThat(getLogLevel(new Exception())).isEqualTo(Level.INFO);
+ }
+
+ @Test
+ public void quiet() {
+ assertThat(getLogLevel(new IOException("Socket closed"))).isEqualTo(Level.FINE);
+ }
+
+ @Test
+ public void nonquiet() {
+ assertThat(getLogLevel(new IOException("foo"))).isEqualTo(Level.INFO);
+ }
+
+ @Test
+ public void nullMessage() {
+ IOException e = new IOException();
+ assertThat(e.getMessage()).isNull();
+ assertThat(getLogLevel(e)).isEqualTo(Level.INFO);
+ }
+
/**
* Executor queues incoming runnables instead of running it. Runnables can be invoked via {@link
* QueueingExecutor#runAll} in serial order.
diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpProtocolNegotiatorTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpProtocolNegotiatorTest.java
index 5f183dcdf..67d678258 100644
--- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpProtocolNegotiatorTest.java
+++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpProtocolNegotiatorTest.java
@@ -128,7 +128,7 @@ public class OkHttpProtocolNegotiatorTest {
OkHttpProtocolNegotiator negotiator = new OkHttpProtocolNegotiator(platform);
thrown.expect(RuntimeException.class);
- thrown.expectMessage("protocol negotiation failed");
+ thrown.expectMessage("TLS ALPN negotiation failed");
negotiator.negotiate(sock, "hostname", ImmutableList.of(Protocol.HTTP_2));
}
diff --git a/okhttp/third_party/okhttp/main/java/io/grpc/okhttp/internal/Platform.java b/okhttp/third_party/okhttp/main/java/io/grpc/okhttp/internal/Platform.java
index 51244c902..2610932a5 100644
--- a/okhttp/third_party/okhttp/main/java/io/grpc/okhttp/internal/Platform.java
+++ b/okhttp/third_party/okhttp/main/java/io/grpc/okhttp/internal/Platform.java
@@ -89,7 +89,8 @@ public class Platform {
"com.google.android.gms.org.conscrypt.OpenSSLProvider",
"org.conscrypt.OpenSSLProvider",
"com.android.org.conscrypt.OpenSSLProvider",
- "org.apache.harmony.xnet.provider.jsse.OpenSSLProvider"
+ "org.apache.harmony.xnet.provider.jsse.OpenSSLProvider",
+ "com.google.android.libraries.stitch.sslguard.SslGuardProvider"
};
private static final Platform PLATFORM = findPlatform();
@@ -185,7 +186,8 @@ public class Platform {
if (GrpcUtil.IS_RESTRICTED_APPENGINE) {
tlsExtensionType = TlsExtensionType.ALPN_AND_NPN;
} else if (androidOrAppEngineProvider.getName().equals("GmsCore_OpenSSL")
- || androidOrAppEngineProvider.getName().equals("Conscrypt")) {
+ || androidOrAppEngineProvider.getName().equals("Conscrypt")
+ || androidOrAppEngineProvider.getName().equals("Ssl_Guard")) {
tlsExtensionType = TlsExtensionType.ALPN_AND_NPN;
} else if (isAtLeastAndroid5()) {
tlsExtensionType = TlsExtensionType.ALPN_AND_NPN;
diff --git a/protobuf-lite/build.gradle b/protobuf-lite/build.gradle
index ead5180b5..0cd67a923 100644
--- a/protobuf-lite/build.gradle
+++ b/protobuf-lite/build.gradle
@@ -13,8 +13,15 @@ description = 'gRPC: Protobuf Lite'
dependencies {
compile project(':grpc-core'),
- libraries.protobuf_lite,
- libraries.guava
+ libraries.protobuf_lite
+ compile (libraries.guava) {
+ // prefer 2.2.0 from libraries instead of 2.1.3
+ exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+ // prefer 3.0.2 from libraries instead of 3.0.1
+ exclude group: 'com.google.code.findbugs', module: 'jsr305'
+ // prefer 1.17 from libraries instead of 1.14
+ exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+ }
testProtobuf libraries.protobuf
diff --git a/protobuf-nano/build.gradle b/protobuf-nano/build.gradle
index dd26db4e7..aae0a7957 100644
--- a/protobuf-nano/build.gradle
+++ b/protobuf-nano/build.gradle
@@ -11,8 +11,15 @@ description = 'gRPC: Protobuf Nano'
dependencies {
compile project(':grpc-core'),
- libraries.protobuf_nano,
- libraries.guava
+ libraries.protobuf_nano
+ compile (libraries.guava) {
+ // prefer 2.2.0 from libraries instead of 2.1.3
+ exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+ // prefer 3.0.2 from libraries instead of 3.0.1
+ exclude group: 'com.google.code.findbugs', module: 'jsr305'
+ // prefer 1.17 from libraries instead of 1.14
+ exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+ }
signature "org.codehaus.mojo.signature:java17:1.0@signature"
signature "net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature"
}
diff --git a/protobuf/build.gradle b/protobuf/build.gradle
index abb2bc7a8..31f4f3c3d 100644
--- a/protobuf/build.gradle
+++ b/protobuf/build.gradle
@@ -10,8 +10,15 @@ buildscript {
dependencies {
compile project(':grpc-core'),
- libraries.protobuf,
- libraries.guava
+ libraries.protobuf
+ compile (libraries.guava) {
+ // prefer 2.2.0 from libraries instead of 2.1.3
+ exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+ // prefer 3.0.2 from libraries instead of 3.0.1
+ exclude group: 'com.google.code.findbugs', module: 'jsr305'
+ // prefer 1.17 from libraries instead of 1.14
+ exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+ }
compile (libraries.google_api_protos) {
// 'com.google.api:api-common' transitively depends on auto-value, which breaks our
diff --git a/protobuf/src/main/java/io/grpc/protobuf/ProtoUtils.java b/protobuf/src/main/java/io/grpc/protobuf/ProtoUtils.java
index a230d5043..c936b3c1b 100644
--- a/protobuf/src/main/java/io/grpc/protobuf/ProtoUtils.java
+++ b/protobuf/src/main/java/io/grpc/protobuf/ProtoUtils.java
@@ -16,6 +16,7 @@
package io.grpc.protobuf;
+import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.Message;
import io.grpc.ExperimentalApi;
import io.grpc.Metadata;
@@ -28,6 +29,26 @@ import io.grpc.protobuf.lite.ProtoLiteUtils;
public final class ProtoUtils {
/**
+ * Sets the global registry for proto marshalling shared across all servers and clients.
+ *
+ * <p>Warning: This API will likely change over time. It is not possible to have separate
+ * registries per Process, Server, Channel, Service, or Method. This is intentional until there
+ * is a more appropriate API to set them.
+ *
+ * <p>Warning: Do NOT modify the extension registry after setting it. It is thread safe to call
+ * {@link #setExtensionRegistry}, but not to modify the underlying object.
+ *
+ * <p>If you need custom parsing behavior for protos, you will need to make your own
+ * {@code MethodDescriptor.Marshaller} for the time being.
+ *
+ * @since 1.16.0
+ */
+ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1787")
+ public static void setExtensionRegistry(ExtensionRegistry registry) {
+ ProtoLiteUtils.setExtensionRegistry(registry);
+ }
+
+ /**
* Create a {@link Marshaller} for protos of the same type as {@code defaultInstance}.
*
* @since 1.0.0
diff --git a/repositories.bzl b/repositories.bzl
index c3bbdfd52..a83bd7a9a 100644
--- a/repositories.bzl
+++ b/repositories.bzl
@@ -132,8 +132,8 @@ def com_google_auth_google_auth_library_oauth2_http():
def com_google_code_findbugs_jsr305():
native.maven_jar(
name = "com_google_code_findbugs_jsr305",
- artifact = "com.google.code.findbugs:jsr305:3.0.0",
- sha1 = "5871fb60dc68d67da54a663c3fd636a10a532948",
+ artifact = "com.google.code.findbugs:jsr305:3.0.2",
+ sha1 = "25ea2e8b0c338a877313bd4672d3fe056ea78f0d",
)
def com_google_code_gson():
@@ -153,8 +153,8 @@ def com_google_errorprone_error_prone_annotations():
def com_google_guava():
native.maven_jar(
name = "com_google_guava_guava",
- artifact = "com.google.guava:guava:20.0",
- sha1 = "89507701249388e1ed5ddcf8c41f4ce1be7831ef",
+ artifact = "com.google.guava:guava:26.0-android",
+ sha1 = "ef69663836b339db335fde0df06fb3cd84e3742b",
)
def com_google_protobuf():
@@ -212,81 +212,81 @@ def com_squareup_okio():
sha1 = "a9283170b7305c8d92d25aff02a6ab7e45d06cbe",
)
-def io_netty_codec_http2():
- native.maven_jar(
- name = "io_netty_netty_codec_http2",
- artifact = "io.netty:netty-codec-http2:4.1.27.Final",
- sha1 = "3769790a2033667d663f9a526d5b63cfecdbdf4e",
- )
-
def io_netty_buffer():
native.maven_jar(
name = "io_netty_netty_buffer",
- artifact = "io.netty:netty-buffer:4.1.27.Final",
- sha1 = "aafe2b9fb0d8f3b200cf10b9fd6486c6a722d7a1",
+ artifact = "io.netty:netty-buffer:4.1.30.Final",
+ sha1 = "597adb653306470fb3ec1af3c0f3f30a37b1310a",
)
-def io_netty_common():
+def io_netty_codec():
native.maven_jar(
- name = "io_netty_netty_common",
- artifact = "io.netty:netty-common:4.1.27.Final",
- sha1 = "6a12a969c27fb37b230c4bde5a67bd822fa6b7a4",
+ name = "io_netty_netty_codec",
+ artifact = "io.netty:netty-codec:4.1.30.Final",
+ sha1 = "515c8f609aaca28a94f984d89a9667dd3359c1b1",
)
-def io_netty_transport():
+def io_netty_codec_http():
native.maven_jar(
- name = "io_netty_netty_transport",
- artifact = "io.netty:netty-transport:4.1.27.Final",
- sha1 = "b5c2da3ea89dd67320925f1504c9eb3615241b7c",
+ name = "io_netty_netty_codec_http",
+ artifact = "io.netty:netty-codec-http:4.1.30.Final",
+ sha1 = "1384c630e8a0eeef33ad12a28791dce6e1d8767c",
)
-def io_netty_codec():
+def io_netty_codec_http2():
native.maven_jar(
- name = "io_netty_netty_codec",
- artifact = "io.netty:netty-codec:4.1.27.Final",
- sha1 = "d2653d78ebaa650064768fb26b10051f5c8efb2c",
+ name = "io_netty_netty_codec_http2",
+ artifact = "io.netty:netty-codec-http2:4.1.30.Final",
+ sha1 = "2da92f518409904954d3e8dcc42eb6a562a70302",
)
def io_netty_codec_socks():
native.maven_jar(
name = "io_netty_netty_codec_socks",
- artifact = "io.netty:netty-codec-socks:4.1.27.Final",
- sha1 = "285b09af98764cf02e4b77b3d95af188469a7133",
+ artifact = "io.netty:netty-codec-socks:4.1.30.Final",
+ sha1 = "ea272e3bb281d3a91d27278f47e61b4de285cc27",
)
-def io_netty_codec_http():
+def io_netty_common():
native.maven_jar(
- name = "io_netty_netty_codec_http",
- artifact = "io.netty:netty-codec-http:4.1.27.Final",
- sha1 = "a1722d6bcbbef1c4c7877e8bf38b07a3db5ed07f",
+ name = "io_netty_netty_common",
+ artifact = "io.netty:netty-common:4.1.30.Final",
+ sha1 = "5dca0c34d8f38af51a2398614e81888f51cf811a",
)
def io_netty_handler():
native.maven_jar(
name = "io_netty_netty_handler",
- artifact = "io.netty:netty-handler:4.1.27.Final",
- sha1 = "21bd9cf565390a8d72579b8664303e3c175dfc6a",
+ artifact = "io.netty:netty-handler:4.1.30.Final",
+ sha1 = "ecc076332ed103411347f4806a44ee32d9d9cb5f",
)
def io_netty_handler_proxy():
native.maven_jar(
name = "io_netty_netty_handler_proxy",
- artifact = "io.netty:netty-handler-proxy:4.1.27.Final",
- sha1 = "1a822ce7760bc6eb4937b7e448c9e081fedcc807",
+ artifact = "io.netty:netty-handler-proxy:4.1.30.Final",
+ sha1 = "1baa1568fa936caddca0fae96fdf127fd5cbad16",
)
def io_netty_resolver():
native.maven_jar(
name = "io_netty_netty_resolver",
- artifact = "io.netty:netty-resolver:4.1.27.Final",
- sha1 = "2536447ef9605ccb2b5203aa22392c6514484ea9",
+ artifact = "io.netty:netty-resolver:4.1.30.Final",
+ sha1 = "5106fd687066ffd712e5295d32af4e2ac6482613",
)
def io_netty_tcnative_boringssl_static():
native.maven_jar(
name = "io_netty_netty_tcnative_boringssl_static",
- artifact = "io.netty:netty-tcnative-boringssl-static:2.0.12.Final",
- sha1 = "b884be1450a7fd0854b98743836b8ccb0dfd75a4",
+ artifact = "io.netty:netty-tcnative-boringssl-static:2.0.17.Final",
+ sha1 = "b1e5acbde8c444c656131238ac6ab9e73f694300",
+ )
+
+def io_netty_transport():
+ native.maven_jar(
+ name = "io_netty_netty_transport",
+ artifact = "io.netty:netty-transport:4.1.30.Final",
+ sha1 = "3d27bb432a3b125167ac161b26415ad29ec17f02",
)
def io_opencensus_api():
diff --git a/services/src/generated/main/grpc/io/grpc/health/v1/HealthGrpc.java b/services/src/generated/main/grpc/io/grpc/health/v1/HealthGrpc.java
index 295a747fc..4a4f9fba7 100644
--- a/services/src/generated/main/grpc/io/grpc/health/v1/HealthGrpc.java
+++ b/services/src/generated/main/grpc/io/grpc/health/v1/HealthGrpc.java
@@ -59,6 +59,38 @@ public final class HealthGrpc {
return getCheckMethod;
}
+ private static volatile io.grpc.MethodDescriptor<io.grpc.health.v1.HealthCheckRequest,
+ io.grpc.health.v1.HealthCheckResponse> getWatchMethod;
+
+ @io.grpc.stub.annotations.RpcMethod(
+ fullMethodName = SERVICE_NAME + '/' + "Watch",
+ requestType = io.grpc.health.v1.HealthCheckRequest.class,
+ responseType = io.grpc.health.v1.HealthCheckResponse.class,
+ methodType = io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+ public static io.grpc.MethodDescriptor<io.grpc.health.v1.HealthCheckRequest,
+ io.grpc.health.v1.HealthCheckResponse> getWatchMethod() {
+ io.grpc.MethodDescriptor<io.grpc.health.v1.HealthCheckRequest, io.grpc.health.v1.HealthCheckResponse> getWatchMethod;
+ if ((getWatchMethod = HealthGrpc.getWatchMethod) == null) {
+ synchronized (HealthGrpc.class) {
+ if ((getWatchMethod = HealthGrpc.getWatchMethod) == null) {
+ HealthGrpc.getWatchMethod = getWatchMethod =
+ io.grpc.MethodDescriptor.<io.grpc.health.v1.HealthCheckRequest, io.grpc.health.v1.HealthCheckResponse>newBuilder()
+ .setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+ .setFullMethodName(generateFullMethodName(
+ "grpc.health.v1.Health", "Watch"))
+ .setSampledToLocalTracing(true)
+ .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+ io.grpc.health.v1.HealthCheckRequest.getDefaultInstance()))
+ .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+ io.grpc.health.v1.HealthCheckResponse.getDefaultInstance()))
+ .setSchemaDescriptor(new HealthMethodDescriptorSupplier("Watch"))
+ .build();
+ }
+ }
+ }
+ return getWatchMethod;
+ }
+
/**
* Creates a new async stub that supports all call types for the service
*/
@@ -87,12 +119,38 @@ public final class HealthGrpc {
public static abstract class HealthImplBase implements io.grpc.BindableService {
/**
+ * <pre>
+ * If the requested service is unknown, the call will fail with status
+ * NOT_FOUND.
+ * </pre>
*/
public void check(io.grpc.health.v1.HealthCheckRequest request,
io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse> responseObserver) {
asyncUnimplementedUnaryCall(getCheckMethod(), responseObserver);
}
+ /**
+ * <pre>
+ * Performs a watch for the serving status of the requested service.
+ * The server will immediately send back a message indicating the current
+ * serving status. It will then subsequently send a new message whenever
+ * the service's serving status changes.
+ * If the requested service is unknown when the call is received, the
+ * server will send a message setting the serving status to
+ * SERVICE_UNKNOWN but will *not* terminate the call. If at some
+ * future point, the serving status of the service becomes known, the
+ * server will send a new message with the service's serving status.
+ * If the call terminates with status UNIMPLEMENTED, then clients
+ * should assume this method is not supported and should not retry the
+ * call. If the call terminates with any other status (including OK),
+ * clients should retry the call with appropriate exponential backoff.
+ * </pre>
+ */
+ public void watch(io.grpc.health.v1.HealthCheckRequest request,
+ io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse> responseObserver) {
+ asyncUnimplementedUnaryCall(getWatchMethod(), responseObserver);
+ }
+
@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
.addMethod(
@@ -102,6 +160,13 @@ public final class HealthGrpc {
io.grpc.health.v1.HealthCheckRequest,
io.grpc.health.v1.HealthCheckResponse>(
this, METHODID_CHECK)))
+ .addMethod(
+ getWatchMethod(),
+ asyncServerStreamingCall(
+ new MethodHandlers<
+ io.grpc.health.v1.HealthCheckRequest,
+ io.grpc.health.v1.HealthCheckResponse>(
+ this, METHODID_WATCH)))
.build();
}
}
@@ -125,12 +190,39 @@ public final class HealthGrpc {
}
/**
+ * <pre>
+ * If the requested service is unknown, the call will fail with status
+ * NOT_FOUND.
+ * </pre>
*/
public void check(io.grpc.health.v1.HealthCheckRequest request,
io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse> responseObserver) {
asyncUnaryCall(
getChannel().newCall(getCheckMethod(), getCallOptions()), request, responseObserver);
}
+
+ /**
+ * <pre>
+ * Performs a watch for the serving status of the requested service.
+ * The server will immediately send back a message indicating the current
+ * serving status. It will then subsequently send a new message whenever
+ * the service's serving status changes.
+ * If the requested service is unknown when the call is received, the
+ * server will send a message setting the serving status to
+ * SERVICE_UNKNOWN but will *not* terminate the call. If at some
+ * future point, the serving status of the service becomes known, the
+ * server will send a new message with the service's serving status.
+ * If the call terminates with status UNIMPLEMENTED, then clients
+ * should assume this method is not supported and should not retry the
+ * call. If the call terminates with any other status (including OK),
+ * clients should retry the call with appropriate exponential backoff.
+ * </pre>
+ */
+ public void watch(io.grpc.health.v1.HealthCheckRequest request,
+ io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse> responseObserver) {
+ asyncServerStreamingCall(
+ getChannel().newCall(getWatchMethod(), getCallOptions()), request, responseObserver);
+ }
}
/**
@@ -152,11 +244,38 @@ public final class HealthGrpc {
}
/**
+ * <pre>
+ * If the requested service is unknown, the call will fail with status
+ * NOT_FOUND.
+ * </pre>
*/
public io.grpc.health.v1.HealthCheckResponse check(io.grpc.health.v1.HealthCheckRequest request) {
return blockingUnaryCall(
getChannel(), getCheckMethod(), getCallOptions(), request);
}
+
+ /**
+ * <pre>
+ * Performs a watch for the serving status of the requested service.
+ * The server will immediately send back a message indicating the current
+ * serving status. It will then subsequently send a new message whenever
+ * the service's serving status changes.
+ * If the requested service is unknown when the call is received, the
+ * server will send a message setting the serving status to
+ * SERVICE_UNKNOWN but will *not* terminate the call. If at some
+ * future point, the serving status of the service becomes known, the
+ * server will send a new message with the service's serving status.
+ * If the call terminates with status UNIMPLEMENTED, then clients
+ * should assume this method is not supported and should not retry the
+ * call. If the call terminates with any other status (including OK),
+ * clients should retry the call with appropriate exponential backoff.
+ * </pre>
+ */
+ public java.util.Iterator<io.grpc.health.v1.HealthCheckResponse> watch(
+ io.grpc.health.v1.HealthCheckRequest request) {
+ return blockingServerStreamingCall(
+ getChannel(), getWatchMethod(), getCallOptions(), request);
+ }
}
/**
@@ -178,6 +297,10 @@ public final class HealthGrpc {
}
/**
+ * <pre>
+ * If the requested service is unknown, the call will fail with status
+ * NOT_FOUND.
+ * </pre>
*/
public com.google.common.util.concurrent.ListenableFuture<io.grpc.health.v1.HealthCheckResponse> check(
io.grpc.health.v1.HealthCheckRequest request) {
@@ -187,6 +310,7 @@ public final class HealthGrpc {
}
private static final int METHODID_CHECK = 0;
+ private static final int METHODID_WATCH = 1;
private static final class MethodHandlers<Req, Resp> implements
io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -209,6 +333,10 @@ public final class HealthGrpc {
serviceImpl.check((io.grpc.health.v1.HealthCheckRequest) request,
(io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse>) responseObserver);
break;
+ case METHODID_WATCH:
+ serviceImpl.watch((io.grpc.health.v1.HealthCheckRequest) request,
+ (io.grpc.stub.StreamObserver<io.grpc.health.v1.HealthCheckResponse>) responseObserver);
+ break;
default:
throw new AssertionError();
}
@@ -271,6 +399,7 @@ public final class HealthGrpc {
serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
.setSchemaDescriptor(new HealthFileDescriptorSupplier())
.addMethod(getCheckMethod())
+ .addMethod(getWatchMethod())
.build();
}
}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/Address.java b/services/src/generated/main/java/io/grpc/binarylog/v1/Address.java
new file mode 100644
index 000000000..c4c64a498
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/Address.java
@@ -0,0 +1,823 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * <pre>
+ * Address information
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Address}
+ */
+public final class Address extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.Address)
+ AddressOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use Address.newBuilder() to construct.
+ private Address(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private Address() {
+ type_ = 0;
+ address_ = "";
+ ipPort_ = 0;
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private Address(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 8: {
+ int rawValue = input.readEnum();
+
+ type_ = rawValue;
+ break;
+ }
+ case 18: {
+ java.lang.String s = input.readStringRequireUtf8();
+
+ address_ = s;
+ break;
+ }
+ case 24: {
+
+ ipPort_ = input.readUInt32();
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Address_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Address_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Address.class, io.grpc.binarylog.v1.Address.Builder.class);
+ }
+
+ /**
+ * Protobuf enum {@code grpc.binarylog.v1.Address.Type}
+ */
+ public enum Type
+ implements com.google.protobuf.ProtocolMessageEnum {
+ /**
+ * <code>TYPE_UNKNOWN = 0;</code>
+ */
+ TYPE_UNKNOWN(0),
+ /**
+ * <pre>
+ * address is in 1.2.3.4 form
+ * </pre>
+ *
+ * <code>TYPE_IPV4 = 1;</code>
+ */
+ TYPE_IPV4(1),
+ /**
+ * <pre>
+ * address is in IPv6 canonical form (RFC5952 section 4)
+ * The scope is NOT included in the address string.
+ * </pre>
+ *
+ * <code>TYPE_IPV6 = 2;</code>
+ */
+ TYPE_IPV6(2),
+ /**
+ * <pre>
+ * address is UDS string
+ * </pre>
+ *
+ * <code>TYPE_UNIX = 3;</code>
+ */
+ TYPE_UNIX(3),
+ UNRECOGNIZED(-1),
+ ;
+
+ /**
+ * <code>TYPE_UNKNOWN = 0;</code>
+ */
+ public static final int TYPE_UNKNOWN_VALUE = 0;
+ /**
+ * <pre>
+ * address is in 1.2.3.4 form
+ * </pre>
+ *
+ * <code>TYPE_IPV4 = 1;</code>
+ */
+ public static final int TYPE_IPV4_VALUE = 1;
+ /**
+ * <pre>
+ * address is in IPv6 canonical form (RFC5952 section 4)
+ * The scope is NOT included in the address string.
+ * </pre>
+ *
+ * <code>TYPE_IPV6 = 2;</code>
+ */
+ public static final int TYPE_IPV6_VALUE = 2;
+ /**
+ * <pre>
+ * address is UDS string
+ * </pre>
+ *
+ * <code>TYPE_UNIX = 3;</code>
+ */
+ public static final int TYPE_UNIX_VALUE = 3;
+
+
+ public final int getNumber() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalArgumentException(
+ "Can't get the number of an unknown enum value.");
+ }
+ return value;
+ }
+
+ /**
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static Type valueOf(int value) {
+ return forNumber(value);
+ }
+
+ public static Type forNumber(int value) {
+ switch (value) {
+ case 0: return TYPE_UNKNOWN;
+ case 1: return TYPE_IPV4;
+ case 2: return TYPE_IPV6;
+ case 3: return TYPE_UNIX;
+ default: return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap<Type>
+ internalGetValueMap() {
+ return internalValueMap;
+ }
+ private static final com.google.protobuf.Internal.EnumLiteMap<
+ Type> internalValueMap =
+ new com.google.protobuf.Internal.EnumLiteMap<Type>() {
+ public Type findValueByNumber(int number) {
+ return Type.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor
+ getValueDescriptor() {
+ return getDescriptor().getValues().get(ordinal());
+ }
+ public final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptorForType() {
+ return getDescriptor();
+ }
+ public static final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.Address.getDescriptor().getEnumTypes().get(0);
+ }
+
+ private static final Type[] VALUES = values();
+
+ public static Type valueOf(
+ com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException(
+ "EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private Type(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:grpc.binarylog.v1.Address.Type)
+ }
+
+ public static final int TYPE_FIELD_NUMBER = 1;
+ private int type_;
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public int getTypeValue() {
+ return type_;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Address.Type getType() {
+ io.grpc.binarylog.v1.Address.Type result = io.grpc.binarylog.v1.Address.Type.valueOf(type_);
+ return result == null ? io.grpc.binarylog.v1.Address.Type.UNRECOGNIZED : result;
+ }
+
+ public static final int ADDRESS_FIELD_NUMBER = 2;
+ private volatile java.lang.Object address_;
+ /**
+ * <code>string address = 2;</code>
+ */
+ public java.lang.String getAddress() {
+ java.lang.Object ref = address_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ address_ = s;
+ return s;
+ }
+ }
+ /**
+ * <code>string address = 2;</code>
+ */
+ public com.google.protobuf.ByteString
+ getAddressBytes() {
+ java.lang.Object ref = address_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ address_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int IP_PORT_FIELD_NUMBER = 3;
+ private int ipPort_;
+ /**
+ * <pre>
+ * only for TYPE_IPV4 and TYPE_IPV6
+ * </pre>
+ *
+ * <code>uint32 ip_port = 3;</code>
+ */
+ public int getIpPort() {
+ return ipPort_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (type_ != io.grpc.binarylog.v1.Address.Type.TYPE_UNKNOWN.getNumber()) {
+ output.writeEnum(1, type_);
+ }
+ if (!getAddressBytes().isEmpty()) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 2, address_);
+ }
+ if (ipPort_ != 0) {
+ output.writeUInt32(3, ipPort_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (type_ != io.grpc.binarylog.v1.Address.Type.TYPE_UNKNOWN.getNumber()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeEnumSize(1, type_);
+ }
+ if (!getAddressBytes().isEmpty()) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, address_);
+ }
+ if (ipPort_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(3, ipPort_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.Address)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.Address other = (io.grpc.binarylog.v1.Address) obj;
+
+ boolean result = true;
+ result = result && type_ == other.type_;
+ result = result && getAddress()
+ .equals(other.getAddress());
+ result = result && (getIpPort()
+ == other.getIpPort());
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + TYPE_FIELD_NUMBER;
+ hash = (53 * hash) + type_;
+ hash = (37 * hash) + ADDRESS_FIELD_NUMBER;
+ hash = (53 * hash) + getAddress().hashCode();
+ hash = (37 * hash) + IP_PORT_FIELD_NUMBER;
+ hash = (53 * hash) + getIpPort();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Address parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Address parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Address parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.Address prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * <pre>
+ * Address information
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Address}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.Address)
+ io.grpc.binarylog.v1.AddressOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Address_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Address_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Address.class, io.grpc.binarylog.v1.Address.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.Address.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ type_ = 0;
+
+ address_ = "";
+
+ ipPort_ = 0;
+
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Address_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.Address getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.Address.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.Address build() {
+ io.grpc.binarylog.v1.Address result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.Address buildPartial() {
+ io.grpc.binarylog.v1.Address result = new io.grpc.binarylog.v1.Address(this);
+ result.type_ = type_;
+ result.address_ = address_;
+ result.ipPort_ = ipPort_;
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.Address) {
+ return mergeFrom((io.grpc.binarylog.v1.Address)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.Address other) {
+ if (other == io.grpc.binarylog.v1.Address.getDefaultInstance()) return this;
+ if (other.type_ != 0) {
+ setTypeValue(other.getTypeValue());
+ }
+ if (!other.getAddress().isEmpty()) {
+ address_ = other.address_;
+ onChanged();
+ }
+ if (other.getIpPort() != 0) {
+ setIpPort(other.getIpPort());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.Address parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.Address) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private int type_ = 0;
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public int getTypeValue() {
+ return type_;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public Builder setTypeValue(int value) {
+ type_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Address.Type getType() {
+ io.grpc.binarylog.v1.Address.Type result = io.grpc.binarylog.v1.Address.Type.valueOf(type_);
+ return result == null ? io.grpc.binarylog.v1.Address.Type.UNRECOGNIZED : result;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public Builder setType(io.grpc.binarylog.v1.Address.Type value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ type_ = value.getNumber();
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ public Builder clearType() {
+
+ type_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private java.lang.Object address_ = "";
+ /**
+ * <code>string address = 2;</code>
+ */
+ public java.lang.String getAddress() {
+ java.lang.Object ref = address_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ address_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * <code>string address = 2;</code>
+ */
+ public com.google.protobuf.ByteString
+ getAddressBytes() {
+ java.lang.Object ref = address_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ address_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * <code>string address = 2;</code>
+ */
+ public Builder setAddress(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ address_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>string address = 2;</code>
+ */
+ public Builder clearAddress() {
+
+ address_ = getDefaultInstance().getAddress();
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>string address = 2;</code>
+ */
+ public Builder setAddressBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+
+ address_ = value;
+ onChanged();
+ return this;
+ }
+
+ private int ipPort_ ;
+ /**
+ * <pre>
+ * only for TYPE_IPV4 and TYPE_IPV6
+ * </pre>
+ *
+ * <code>uint32 ip_port = 3;</code>
+ */
+ public int getIpPort() {
+ return ipPort_;
+ }
+ /**
+ * <pre>
+ * only for TYPE_IPV4 and TYPE_IPV6
+ * </pre>
+ *
+ * <code>uint32 ip_port = 3;</code>
+ */
+ public Builder setIpPort(int value) {
+
+ ipPort_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * only for TYPE_IPV4 and TYPE_IPV6
+ * </pre>
+ *
+ * <code>uint32 ip_port = 3;</code>
+ */
+ public Builder clearIpPort() {
+
+ ipPort_ = 0;
+ onChanged();
+ return this;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.Address)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.Address)
+ private static final io.grpc.binarylog.v1.Address DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.Address();
+ }
+
+ public static io.grpc.binarylog.v1.Address getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<Address>
+ PARSER = new com.google.protobuf.AbstractParser<Address>() {
+ public Address parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new Address(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<Address> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<Address> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.Address getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/AddressOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/AddressOrBuilder.java
new file mode 100644
index 000000000..7bb915871
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/AddressOrBuilder.java
@@ -0,0 +1,37 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface AddressOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.Address)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ int getTypeValue();
+ /**
+ * <code>.grpc.binarylog.v1.Address.Type type = 1;</code>
+ */
+ io.grpc.binarylog.v1.Address.Type getType();
+
+ /**
+ * <code>string address = 2;</code>
+ */
+ java.lang.String getAddress();
+ /**
+ * <code>string address = 2;</code>
+ */
+ com.google.protobuf.ByteString
+ getAddressBytes();
+
+ /**
+ * <pre>
+ * only for TYPE_IPV4 and TYPE_IPV6
+ * </pre>
+ *
+ * <code>uint32 ip_port = 3;</code>
+ */
+ int getIpPort();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/BinaryLogProto.java b/services/src/generated/main/java/io/grpc/binarylog/v1/BinaryLogProto.java
new file mode 100644
index 000000000..271d14115
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/BinaryLogProto.java
@@ -0,0 +1,177 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public final class BinaryLogProto {
+ private BinaryLogProto() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_GrpcLogEntry_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_ClientHeader_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_ClientHeader_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_ServerHeader_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_ServerHeader_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_Trailer_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_Trailer_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_Message_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_Message_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_Metadata_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_Metadata_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_MetadataEntry_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_MetadataEntry_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_grpc_binarylog_v1_Address_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_grpc_binarylog_v1_Address_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\036grpc/binlog/v1/binarylog.proto\022\021grpc.b" +
+ "inarylog.v1\032\036google/protobuf/duration.pr" +
+ "oto\032\037google/protobuf/timestamp.proto\"\276\006\n" +
+ "\014GrpcLogEntry\022-\n\ttimestamp\030\001 \001(\0132\032.googl" +
+ "e.protobuf.Timestamp\022\017\n\007call_id\030\002 \001(\004\022\037\n" +
+ "\027sequence_id_within_call\030\003 \001(\004\0227\n\004type\030\004" +
+ " \001(\0162).grpc.binarylog.v1.GrpcLogEntry.Ev" +
+ "entType\0226\n\006logger\030\005 \001(\0162&.grpc.binarylog" +
+ ".v1.GrpcLogEntry.Logger\0228\n\rclient_header" +
+ "\030\006 \001(\0132\037.grpc.binarylog.v1.ClientHeaderH" +
+ "\000\0228\n\rserver_header\030\007 \001(\0132\037.grpc.binarylo" +
+ "g.v1.ServerHeaderH\000\022-\n\007message\030\010 \001(\0132\032.g" +
+ "rpc.binarylog.v1.MessageH\000\022-\n\007trailer\030\t " +
+ "\001(\0132\032.grpc.binarylog.v1.TrailerH\000\022\031\n\021pay" +
+ "load_truncated\030\n \001(\010\022(\n\004peer\030\013 \001(\0132\032.grp" +
+ "c.binarylog.v1.Address\"\365\001\n\tEventType\022\026\n\022" +
+ "EVENT_TYPE_UNKNOWN\020\000\022\034\n\030EVENT_TYPE_CLIEN" +
+ "T_HEADER\020\001\022\034\n\030EVENT_TYPE_SERVER_HEADER\020\002" +
+ "\022\035\n\031EVENT_TYPE_CLIENT_MESSAGE\020\003\022\035\n\031EVENT" +
+ "_TYPE_SERVER_MESSAGE\020\004\022 \n\034EVENT_TYPE_CLI" +
+ "ENT_HALF_CLOSE\020\005\022\035\n\031EVENT_TYPE_SERVER_TR" +
+ "AILER\020\006\022\025\n\021EVENT_TYPE_CANCEL\020\007\"B\n\006Logger" +
+ "\022\022\n\016LOGGER_UNKNOWN\020\000\022\021\n\rLOGGER_CLIENT\020\001\022" +
+ "\021\n\rLOGGER_SERVER\020\002B\t\n\007payload\"\221\001\n\014Client" +
+ "Header\022-\n\010metadata\030\001 \001(\0132\033.grpc.binarylo" +
+ "g.v1.Metadata\022\023\n\013method_name\030\002 \001(\t\022\021\n\tau" +
+ "thority\030\003 \001(\t\022*\n\007timeout\030\004 \001(\0132\031.google." +
+ "protobuf.Duration\"=\n\014ServerHeader\022-\n\010met" +
+ "adata\030\001 \001(\0132\033.grpc.binarylog.v1.Metadata" +
+ "\"}\n\007Trailer\022-\n\010metadata\030\001 \001(\0132\033.grpc.bin" +
+ "arylog.v1.Metadata\022\023\n\013status_code\030\002 \001(\r\022" +
+ "\026\n\016status_message\030\003 \001(\t\022\026\n\016status_detail" +
+ "s\030\004 \001(\014\"\'\n\007Message\022\016\n\006length\030\001 \001(\r\022\014\n\004da" +
+ "ta\030\002 \001(\014\";\n\010Metadata\022/\n\005entry\030\001 \003(\0132 .gr" +
+ "pc.binarylog.v1.MetadataEntry\"+\n\rMetadat" +
+ "aEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\014\"\241\001\n\007A" +
+ "ddress\022-\n\004type\030\001 \001(\0162\037.grpc.binarylog.v1" +
+ ".Address.Type\022\017\n\007address\030\002 \001(\t\022\017\n\007ip_por" +
+ "t\030\003 \001(\r\"E\n\004Type\022\020\n\014TYPE_UNKNOWN\020\000\022\r\n\tTYP" +
+ "E_IPV4\020\001\022\r\n\tTYPE_IPV6\020\002\022\r\n\tTYPE_UNIX\020\003B\\" +
+ "\n\024io.grpc.binarylog.v1B\016BinaryLogProtoP\001" +
+ "Z2google.golang.org/grpc/binarylog/grpc_" +
+ "binarylog_v1b\006proto3"
+ };
+ com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+ new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
+ public com.google.protobuf.ExtensionRegistry assignDescriptors(
+ com.google.protobuf.Descriptors.FileDescriptor root) {
+ descriptor = root;
+ return null;
+ }
+ };
+ com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ com.google.protobuf.DurationProto.getDescriptor(),
+ com.google.protobuf.TimestampProto.getDescriptor(),
+ }, assigner);
+ internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_grpc_binarylog_v1_GrpcLogEntry_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor,
+ new java.lang.String[] { "Timestamp", "CallId", "SequenceIdWithinCall", "Type", "Logger", "ClientHeader", "ServerHeader", "Message", "Trailer", "PayloadTruncated", "Peer", "Payload", });
+ internal_static_grpc_binarylog_v1_ClientHeader_descriptor =
+ getDescriptor().getMessageTypes().get(1);
+ internal_static_grpc_binarylog_v1_ClientHeader_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_ClientHeader_descriptor,
+ new java.lang.String[] { "Metadata", "MethodName", "Authority", "Timeout", });
+ internal_static_grpc_binarylog_v1_ServerHeader_descriptor =
+ getDescriptor().getMessageTypes().get(2);
+ internal_static_grpc_binarylog_v1_ServerHeader_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_ServerHeader_descriptor,
+ new java.lang.String[] { "Metadata", });
+ internal_static_grpc_binarylog_v1_Trailer_descriptor =
+ getDescriptor().getMessageTypes().get(3);
+ internal_static_grpc_binarylog_v1_Trailer_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_Trailer_descriptor,
+ new java.lang.String[] { "Metadata", "StatusCode", "StatusMessage", "StatusDetails", });
+ internal_static_grpc_binarylog_v1_Message_descriptor =
+ getDescriptor().getMessageTypes().get(4);
+ internal_static_grpc_binarylog_v1_Message_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_Message_descriptor,
+ new java.lang.String[] { "Length", "Data", });
+ internal_static_grpc_binarylog_v1_Metadata_descriptor =
+ getDescriptor().getMessageTypes().get(5);
+ internal_static_grpc_binarylog_v1_Metadata_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_Metadata_descriptor,
+ new java.lang.String[] { "Entry", });
+ internal_static_grpc_binarylog_v1_MetadataEntry_descriptor =
+ getDescriptor().getMessageTypes().get(6);
+ internal_static_grpc_binarylog_v1_MetadataEntry_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_MetadataEntry_descriptor,
+ new java.lang.String[] { "Key", "Value", });
+ internal_static_grpc_binarylog_v1_Address_descriptor =
+ getDescriptor().getMessageTypes().get(7);
+ internal_static_grpc_binarylog_v1_Address_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_grpc_binarylog_v1_Address_descriptor,
+ new java.lang.String[] { "Type", "Address", "IpPort", });
+ com.google.protobuf.DurationProto.getDescriptor();
+ com.google.protobuf.TimestampProto.getDescriptor();
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeader.java b/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeader.java
new file mode 100644
index 000000000..02b4c3db2
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeader.java
@@ -0,0 +1,1199 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * Protobuf type {@code grpc.binarylog.v1.ClientHeader}
+ */
+public final class ClientHeader extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.ClientHeader)
+ ClientHeaderOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use ClientHeader.newBuilder() to construct.
+ private ClientHeader(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private ClientHeader() {
+ methodName_ = "";
+ authority_ = "";
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private ClientHeader(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ io.grpc.binarylog.v1.Metadata.Builder subBuilder = null;
+ if (metadata_ != null) {
+ subBuilder = metadata_.toBuilder();
+ }
+ metadata_ = input.readMessage(io.grpc.binarylog.v1.Metadata.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(metadata_);
+ metadata_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ case 18: {
+ java.lang.String s = input.readStringRequireUtf8();
+
+ methodName_ = s;
+ break;
+ }
+ case 26: {
+ java.lang.String s = input.readStringRequireUtf8();
+
+ authority_ = s;
+ break;
+ }
+ case 34: {
+ com.google.protobuf.Duration.Builder subBuilder = null;
+ if (timeout_ != null) {
+ subBuilder = timeout_.toBuilder();
+ }
+ timeout_ = input.readMessage(com.google.protobuf.Duration.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(timeout_);
+ timeout_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ClientHeader_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ClientHeader_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.ClientHeader.class, io.grpc.binarylog.v1.ClientHeader.Builder.class);
+ }
+
+ public static final int METADATA_FIELD_NUMBER = 1;
+ private io.grpc.binarylog.v1.Metadata metadata_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ return getMetadata();
+ }
+
+ public static final int METHOD_NAME_FIELD_NUMBER = 2;
+ private volatile java.lang.Object methodName_;
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public java.lang.String getMethodName() {
+ java.lang.Object ref = methodName_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ methodName_ = s;
+ return s;
+ }
+ }
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public com.google.protobuf.ByteString
+ getMethodNameBytes() {
+ java.lang.Object ref = methodName_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ methodName_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int AUTHORITY_FIELD_NUMBER = 3;
+ private volatile java.lang.Object authority_;
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public java.lang.String getAuthority() {
+ java.lang.Object ref = authority_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ authority_ = s;
+ return s;
+ }
+ }
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public com.google.protobuf.ByteString
+ getAuthorityBytes() {
+ java.lang.Object ref = authority_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ authority_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int TIMEOUT_FIELD_NUMBER = 4;
+ private com.google.protobuf.Duration timeout_;
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public boolean hasTimeout() {
+ return timeout_ != null;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public com.google.protobuf.Duration getTimeout() {
+ return timeout_ == null ? com.google.protobuf.Duration.getDefaultInstance() : timeout_;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public com.google.protobuf.DurationOrBuilder getTimeoutOrBuilder() {
+ return getTimeout();
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (metadata_ != null) {
+ output.writeMessage(1, getMetadata());
+ }
+ if (!getMethodNameBytes().isEmpty()) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 2, methodName_);
+ }
+ if (!getAuthorityBytes().isEmpty()) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 3, authority_);
+ }
+ if (timeout_ != null) {
+ output.writeMessage(4, getTimeout());
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (metadata_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(1, getMetadata());
+ }
+ if (!getMethodNameBytes().isEmpty()) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, methodName_);
+ }
+ if (!getAuthorityBytes().isEmpty()) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, authority_);
+ }
+ if (timeout_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(4, getTimeout());
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.ClientHeader)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.ClientHeader other = (io.grpc.binarylog.v1.ClientHeader) obj;
+
+ boolean result = true;
+ result = result && (hasMetadata() == other.hasMetadata());
+ if (hasMetadata()) {
+ result = result && getMetadata()
+ .equals(other.getMetadata());
+ }
+ result = result && getMethodName()
+ .equals(other.getMethodName());
+ result = result && getAuthority()
+ .equals(other.getAuthority());
+ result = result && (hasTimeout() == other.hasTimeout());
+ if (hasTimeout()) {
+ result = result && getTimeout()
+ .equals(other.getTimeout());
+ }
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (hasMetadata()) {
+ hash = (37 * hash) + METADATA_FIELD_NUMBER;
+ hash = (53 * hash) + getMetadata().hashCode();
+ }
+ hash = (37 * hash) + METHOD_NAME_FIELD_NUMBER;
+ hash = (53 * hash) + getMethodName().hashCode();
+ hash = (37 * hash) + AUTHORITY_FIELD_NUMBER;
+ hash = (53 * hash) + getAuthority().hashCode();
+ if (hasTimeout()) {
+ hash = (37 * hash) + TIMEOUT_FIELD_NUMBER;
+ hash = (53 * hash) + getTimeout().hashCode();
+ }
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ClientHeader parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.ClientHeader prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code grpc.binarylog.v1.ClientHeader}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.ClientHeader)
+ io.grpc.binarylog.v1.ClientHeaderOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ClientHeader_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ClientHeader_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.ClientHeader.class, io.grpc.binarylog.v1.ClientHeader.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.ClientHeader.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+ methodName_ = "";
+
+ authority_ = "";
+
+ if (timeoutBuilder_ == null) {
+ timeout_ = null;
+ } else {
+ timeout_ = null;
+ timeoutBuilder_ = null;
+ }
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ClientHeader_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.ClientHeader getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.ClientHeader build() {
+ io.grpc.binarylog.v1.ClientHeader result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.ClientHeader buildPartial() {
+ io.grpc.binarylog.v1.ClientHeader result = new io.grpc.binarylog.v1.ClientHeader(this);
+ if (metadataBuilder_ == null) {
+ result.metadata_ = metadata_;
+ } else {
+ result.metadata_ = metadataBuilder_.build();
+ }
+ result.methodName_ = methodName_;
+ result.authority_ = authority_;
+ if (timeoutBuilder_ == null) {
+ result.timeout_ = timeout_;
+ } else {
+ result.timeout_ = timeoutBuilder_.build();
+ }
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.ClientHeader) {
+ return mergeFrom((io.grpc.binarylog.v1.ClientHeader)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.ClientHeader other) {
+ if (other == io.grpc.binarylog.v1.ClientHeader.getDefaultInstance()) return this;
+ if (other.hasMetadata()) {
+ mergeMetadata(other.getMetadata());
+ }
+ if (!other.getMethodName().isEmpty()) {
+ methodName_ = other.methodName_;
+ onChanged();
+ }
+ if (!other.getAuthority().isEmpty()) {
+ authority_ = other.authority_;
+ onChanged();
+ }
+ if (other.hasTimeout()) {
+ mergeTimeout(other.getTimeout());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.ClientHeader parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.ClientHeader) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private io.grpc.binarylog.v1.Metadata metadata_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder> metadataBuilder_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadataBuilder_ != null || metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ if (metadataBuilder_ == null) {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ } else {
+ return metadataBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ metadata_ = value;
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(
+ io.grpc.binarylog.v1.Metadata.Builder builderForValue) {
+ if (metadataBuilder_ == null) {
+ metadata_ = builderForValue.build();
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder mergeMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (metadata_ != null) {
+ metadata_ =
+ io.grpc.binarylog.v1.Metadata.newBuilder(metadata_).mergeFrom(value).buildPartial();
+ } else {
+ metadata_ = value;
+ }
+ onChanged();
+ } else {
+ metadataBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder clearMetadata() {
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ onChanged();
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata.Builder getMetadataBuilder() {
+
+ onChanged();
+ return getMetadataFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ if (metadataBuilder_ != null) {
+ return metadataBuilder_.getMessageOrBuilder();
+ } else {
+ return metadata_ == null ?
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>
+ getMetadataFieldBuilder() {
+ if (metadataBuilder_ == null) {
+ metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>(
+ getMetadata(),
+ getParentForChildren(),
+ isClean());
+ metadata_ = null;
+ }
+ return metadataBuilder_;
+ }
+
+ private java.lang.Object methodName_ = "";
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public java.lang.String getMethodName() {
+ java.lang.Object ref = methodName_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ methodName_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public com.google.protobuf.ByteString
+ getMethodNameBytes() {
+ java.lang.Object ref = methodName_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ methodName_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public Builder setMethodName(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ methodName_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public Builder clearMethodName() {
+
+ methodName_ = getDefaultInstance().getMethodName();
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ public Builder setMethodNameBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+
+ methodName_ = value;
+ onChanged();
+ return this;
+ }
+
+ private java.lang.Object authority_ = "";
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public java.lang.String getAuthority() {
+ java.lang.Object ref = authority_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ authority_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public com.google.protobuf.ByteString
+ getAuthorityBytes() {
+ java.lang.Object ref = authority_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ authority_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public Builder setAuthority(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ authority_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public Builder clearAuthority() {
+
+ authority_ = getDefaultInstance().getAuthority();
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ public Builder setAuthorityBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+
+ authority_ = value;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.Duration timeout_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> timeoutBuilder_;
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public boolean hasTimeout() {
+ return timeoutBuilder_ != null || timeout_ != null;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public com.google.protobuf.Duration getTimeout() {
+ if (timeoutBuilder_ == null) {
+ return timeout_ == null ? com.google.protobuf.Duration.getDefaultInstance() : timeout_;
+ } else {
+ return timeoutBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public Builder setTimeout(com.google.protobuf.Duration value) {
+ if (timeoutBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ timeout_ = value;
+ onChanged();
+ } else {
+ timeoutBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public Builder setTimeout(
+ com.google.protobuf.Duration.Builder builderForValue) {
+ if (timeoutBuilder_ == null) {
+ timeout_ = builderForValue.build();
+ onChanged();
+ } else {
+ timeoutBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public Builder mergeTimeout(com.google.protobuf.Duration value) {
+ if (timeoutBuilder_ == null) {
+ if (timeout_ != null) {
+ timeout_ =
+ com.google.protobuf.Duration.newBuilder(timeout_).mergeFrom(value).buildPartial();
+ } else {
+ timeout_ = value;
+ }
+ onChanged();
+ } else {
+ timeoutBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public Builder clearTimeout() {
+ if (timeoutBuilder_ == null) {
+ timeout_ = null;
+ onChanged();
+ } else {
+ timeout_ = null;
+ timeoutBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public com.google.protobuf.Duration.Builder getTimeoutBuilder() {
+
+ onChanged();
+ return getTimeoutFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ public com.google.protobuf.DurationOrBuilder getTimeoutOrBuilder() {
+ if (timeoutBuilder_ != null) {
+ return timeoutBuilder_.getMessageOrBuilder();
+ } else {
+ return timeout_ == null ?
+ com.google.protobuf.Duration.getDefaultInstance() : timeout_;
+ }
+ }
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>
+ getTimeoutFieldBuilder() {
+ if (timeoutBuilder_ == null) {
+ timeoutBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>(
+ getTimeout(),
+ getParentForChildren(),
+ isClean());
+ timeout_ = null;
+ }
+ return timeoutBuilder_;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.ClientHeader)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.ClientHeader)
+ private static final io.grpc.binarylog.v1.ClientHeader DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.ClientHeader();
+ }
+
+ public static io.grpc.binarylog.v1.ClientHeader getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<ClientHeader>
+ PARSER = new com.google.protobuf.AbstractParser<ClientHeader>() {
+ public ClientHeader parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new ClientHeader(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<ClientHeader> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<ClientHeader> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.ClientHeader getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeaderOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeaderOrBuilder.java
new file mode 100644
index 000000000..3dab835c0
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/ClientHeaderOrBuilder.java
@@ -0,0 +1,107 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface ClientHeaderOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.ClientHeader)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ boolean hasMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.Metadata getMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder();
+
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ java.lang.String getMethodName();
+ /**
+ * <pre>
+ * The name of the RPC method, which looks something like:
+ * /&lt;service&gt;/&lt;method&gt;
+ * Note the leading "/" character.
+ * </pre>
+ *
+ * <code>string method_name = 2;</code>
+ */
+ com.google.protobuf.ByteString
+ getMethodNameBytes();
+
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ java.lang.String getAuthority();
+ /**
+ * <pre>
+ * A single process may be used to run multiple virtual
+ * servers with different identities.
+ * The authority is the name of such a server identitiy.
+ * It is typically a portion of the URI in the form of
+ * &lt;host&gt; or &lt;host&gt;:&lt;port&gt; .
+ * </pre>
+ *
+ * <code>string authority = 3;</code>
+ */
+ com.google.protobuf.ByteString
+ getAuthorityBytes();
+
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ boolean hasTimeout();
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ com.google.protobuf.Duration getTimeout();
+ /**
+ * <pre>
+ * the RPC timeout
+ * </pre>
+ *
+ * <code>.google.protobuf.Duration timeout = 4;</code>
+ */
+ com.google.protobuf.DurationOrBuilder getTimeoutOrBuilder();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntry.java b/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntry.java
new file mode 100644
index 000000000..4f885a2e6
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntry.java
@@ -0,0 +1,2629 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * <pre>
+ * Log entry we store in binary logs
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.GrpcLogEntry}
+ */
+public final class GrpcLogEntry extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.GrpcLogEntry)
+ GrpcLogEntryOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use GrpcLogEntry.newBuilder() to construct.
+ private GrpcLogEntry(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private GrpcLogEntry() {
+ callId_ = 0L;
+ sequenceIdWithinCall_ = 0L;
+ type_ = 0;
+ logger_ = 0;
+ payloadTruncated_ = false;
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private GrpcLogEntry(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ com.google.protobuf.Timestamp.Builder subBuilder = null;
+ if (timestamp_ != null) {
+ subBuilder = timestamp_.toBuilder();
+ }
+ timestamp_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(timestamp_);
+ timestamp_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ case 16: {
+
+ callId_ = input.readUInt64();
+ break;
+ }
+ case 24: {
+
+ sequenceIdWithinCall_ = input.readUInt64();
+ break;
+ }
+ case 32: {
+ int rawValue = input.readEnum();
+
+ type_ = rawValue;
+ break;
+ }
+ case 40: {
+ int rawValue = input.readEnum();
+
+ logger_ = rawValue;
+ break;
+ }
+ case 50: {
+ io.grpc.binarylog.v1.ClientHeader.Builder subBuilder = null;
+ if (payloadCase_ == 6) {
+ subBuilder = ((io.grpc.binarylog.v1.ClientHeader) payload_).toBuilder();
+ }
+ payload_ =
+ input.readMessage(io.grpc.binarylog.v1.ClientHeader.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom((io.grpc.binarylog.v1.ClientHeader) payload_);
+ payload_ = subBuilder.buildPartial();
+ }
+ payloadCase_ = 6;
+ break;
+ }
+ case 58: {
+ io.grpc.binarylog.v1.ServerHeader.Builder subBuilder = null;
+ if (payloadCase_ == 7) {
+ subBuilder = ((io.grpc.binarylog.v1.ServerHeader) payload_).toBuilder();
+ }
+ payload_ =
+ input.readMessage(io.grpc.binarylog.v1.ServerHeader.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom((io.grpc.binarylog.v1.ServerHeader) payload_);
+ payload_ = subBuilder.buildPartial();
+ }
+ payloadCase_ = 7;
+ break;
+ }
+ case 66: {
+ io.grpc.binarylog.v1.Message.Builder subBuilder = null;
+ if (payloadCase_ == 8) {
+ subBuilder = ((io.grpc.binarylog.v1.Message) payload_).toBuilder();
+ }
+ payload_ =
+ input.readMessage(io.grpc.binarylog.v1.Message.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom((io.grpc.binarylog.v1.Message) payload_);
+ payload_ = subBuilder.buildPartial();
+ }
+ payloadCase_ = 8;
+ break;
+ }
+ case 74: {
+ io.grpc.binarylog.v1.Trailer.Builder subBuilder = null;
+ if (payloadCase_ == 9) {
+ subBuilder = ((io.grpc.binarylog.v1.Trailer) payload_).toBuilder();
+ }
+ payload_ =
+ input.readMessage(io.grpc.binarylog.v1.Trailer.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom((io.grpc.binarylog.v1.Trailer) payload_);
+ payload_ = subBuilder.buildPartial();
+ }
+ payloadCase_ = 9;
+ break;
+ }
+ case 80: {
+
+ payloadTruncated_ = input.readBool();
+ break;
+ }
+ case 90: {
+ io.grpc.binarylog.v1.Address.Builder subBuilder = null;
+ if (peer_ != null) {
+ subBuilder = peer_.toBuilder();
+ }
+ peer_ = input.readMessage(io.grpc.binarylog.v1.Address.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(peer_);
+ peer_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_GrpcLogEntry_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.GrpcLogEntry.class, io.grpc.binarylog.v1.GrpcLogEntry.Builder.class);
+ }
+
+ /**
+ * <pre>
+ * Enumerates the type of event
+ * Note the terminology is different from the RPC semantics
+ * definition, but the same meaning is expressed here.
+ * </pre>
+ *
+ * Protobuf enum {@code grpc.binarylog.v1.GrpcLogEntry.EventType}
+ */
+ public enum EventType
+ implements com.google.protobuf.ProtocolMessageEnum {
+ /**
+ * <code>EVENT_TYPE_UNKNOWN = 0;</code>
+ */
+ EVENT_TYPE_UNKNOWN(0),
+ /**
+ * <pre>
+ * Header sent from client to server
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_HEADER = 1;</code>
+ */
+ EVENT_TYPE_CLIENT_HEADER(1),
+ /**
+ * <pre>
+ * Header sent from server to client
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_HEADER = 2;</code>
+ */
+ EVENT_TYPE_SERVER_HEADER(2),
+ /**
+ * <pre>
+ * Message sent from client to server
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_MESSAGE = 3;</code>
+ */
+ EVENT_TYPE_CLIENT_MESSAGE(3),
+ /**
+ * <pre>
+ * Message sent from server to client
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_MESSAGE = 4;</code>
+ */
+ EVENT_TYPE_SERVER_MESSAGE(4),
+ /**
+ * <pre>
+ * A signal that client is done sending
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_HALF_CLOSE = 5;</code>
+ */
+ EVENT_TYPE_CLIENT_HALF_CLOSE(5),
+ /**
+ * <pre>
+ * Trailer indicates the end of the RPC.
+ * On client side, this event means a trailer was either received
+ * from the network or the gRPC library locally generated a status
+ * to inform the application about a failure.
+ * On server side, this event means the server application requested
+ * to send a trailer. Note: EVENT_TYPE_CANCEL may still arrive after
+ * this due to races on server side.
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_TRAILER = 6;</code>
+ */
+ EVENT_TYPE_SERVER_TRAILER(6),
+ /**
+ * <pre>
+ * A signal that the RPC is cancelled. On client side, this
+ * indicates the client application requests a cancellation.
+ * On server side, this indicates that cancellation was detected.
+ * Note: This marks the end of the RPC. Events may arrive after
+ * this due to races. For example, on client side a trailer
+ * may arrive even though the application requested to cancel the RPC.
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CANCEL = 7;</code>
+ */
+ EVENT_TYPE_CANCEL(7),
+ UNRECOGNIZED(-1),
+ ;
+
+ /**
+ * <code>EVENT_TYPE_UNKNOWN = 0;</code>
+ */
+ public static final int EVENT_TYPE_UNKNOWN_VALUE = 0;
+ /**
+ * <pre>
+ * Header sent from client to server
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_HEADER = 1;</code>
+ */
+ public static final int EVENT_TYPE_CLIENT_HEADER_VALUE = 1;
+ /**
+ * <pre>
+ * Header sent from server to client
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_HEADER = 2;</code>
+ */
+ public static final int EVENT_TYPE_SERVER_HEADER_VALUE = 2;
+ /**
+ * <pre>
+ * Message sent from client to server
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_MESSAGE = 3;</code>
+ */
+ public static final int EVENT_TYPE_CLIENT_MESSAGE_VALUE = 3;
+ /**
+ * <pre>
+ * Message sent from server to client
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_MESSAGE = 4;</code>
+ */
+ public static final int EVENT_TYPE_SERVER_MESSAGE_VALUE = 4;
+ /**
+ * <pre>
+ * A signal that client is done sending
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CLIENT_HALF_CLOSE = 5;</code>
+ */
+ public static final int EVENT_TYPE_CLIENT_HALF_CLOSE_VALUE = 5;
+ /**
+ * <pre>
+ * Trailer indicates the end of the RPC.
+ * On client side, this event means a trailer was either received
+ * from the network or the gRPC library locally generated a status
+ * to inform the application about a failure.
+ * On server side, this event means the server application requested
+ * to send a trailer. Note: EVENT_TYPE_CANCEL may still arrive after
+ * this due to races on server side.
+ * </pre>
+ *
+ * <code>EVENT_TYPE_SERVER_TRAILER = 6;</code>
+ */
+ public static final int EVENT_TYPE_SERVER_TRAILER_VALUE = 6;
+ /**
+ * <pre>
+ * A signal that the RPC is cancelled. On client side, this
+ * indicates the client application requests a cancellation.
+ * On server side, this indicates that cancellation was detected.
+ * Note: This marks the end of the RPC. Events may arrive after
+ * this due to races. For example, on client side a trailer
+ * may arrive even though the application requested to cancel the RPC.
+ * </pre>
+ *
+ * <code>EVENT_TYPE_CANCEL = 7;</code>
+ */
+ public static final int EVENT_TYPE_CANCEL_VALUE = 7;
+
+
+ public final int getNumber() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalArgumentException(
+ "Can't get the number of an unknown enum value.");
+ }
+ return value;
+ }
+
+ /**
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static EventType valueOf(int value) {
+ return forNumber(value);
+ }
+
+ public static EventType forNumber(int value) {
+ switch (value) {
+ case 0: return EVENT_TYPE_UNKNOWN;
+ case 1: return EVENT_TYPE_CLIENT_HEADER;
+ case 2: return EVENT_TYPE_SERVER_HEADER;
+ case 3: return EVENT_TYPE_CLIENT_MESSAGE;
+ case 4: return EVENT_TYPE_SERVER_MESSAGE;
+ case 5: return EVENT_TYPE_CLIENT_HALF_CLOSE;
+ case 6: return EVENT_TYPE_SERVER_TRAILER;
+ case 7: return EVENT_TYPE_CANCEL;
+ default: return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap<EventType>
+ internalGetValueMap() {
+ return internalValueMap;
+ }
+ private static final com.google.protobuf.Internal.EnumLiteMap<
+ EventType> internalValueMap =
+ new com.google.protobuf.Internal.EnumLiteMap<EventType>() {
+ public EventType findValueByNumber(int number) {
+ return EventType.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor
+ getValueDescriptor() {
+ return getDescriptor().getValues().get(ordinal());
+ }
+ public final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptorForType() {
+ return getDescriptor();
+ }
+ public static final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.GrpcLogEntry.getDescriptor().getEnumTypes().get(0);
+ }
+
+ private static final EventType[] VALUES = values();
+
+ public static EventType valueOf(
+ com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException(
+ "EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private EventType(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:grpc.binarylog.v1.GrpcLogEntry.EventType)
+ }
+
+ /**
+ * <pre>
+ * Enumerates the entity that generates the log entry
+ * </pre>
+ *
+ * Protobuf enum {@code grpc.binarylog.v1.GrpcLogEntry.Logger}
+ */
+ public enum Logger
+ implements com.google.protobuf.ProtocolMessageEnum {
+ /**
+ * <code>LOGGER_UNKNOWN = 0;</code>
+ */
+ LOGGER_UNKNOWN(0),
+ /**
+ * <code>LOGGER_CLIENT = 1;</code>
+ */
+ LOGGER_CLIENT(1),
+ /**
+ * <code>LOGGER_SERVER = 2;</code>
+ */
+ LOGGER_SERVER(2),
+ UNRECOGNIZED(-1),
+ ;
+
+ /**
+ * <code>LOGGER_UNKNOWN = 0;</code>
+ */
+ public static final int LOGGER_UNKNOWN_VALUE = 0;
+ /**
+ * <code>LOGGER_CLIENT = 1;</code>
+ */
+ public static final int LOGGER_CLIENT_VALUE = 1;
+ /**
+ * <code>LOGGER_SERVER = 2;</code>
+ */
+ public static final int LOGGER_SERVER_VALUE = 2;
+
+
+ public final int getNumber() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalArgumentException(
+ "Can't get the number of an unknown enum value.");
+ }
+ return value;
+ }
+
+ /**
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static Logger valueOf(int value) {
+ return forNumber(value);
+ }
+
+ public static Logger forNumber(int value) {
+ switch (value) {
+ case 0: return LOGGER_UNKNOWN;
+ case 1: return LOGGER_CLIENT;
+ case 2: return LOGGER_SERVER;
+ default: return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap<Logger>
+ internalGetValueMap() {
+ return internalValueMap;
+ }
+ private static final com.google.protobuf.Internal.EnumLiteMap<
+ Logger> internalValueMap =
+ new com.google.protobuf.Internal.EnumLiteMap<Logger>() {
+ public Logger findValueByNumber(int number) {
+ return Logger.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor
+ getValueDescriptor() {
+ return getDescriptor().getValues().get(ordinal());
+ }
+ public final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptorForType() {
+ return getDescriptor();
+ }
+ public static final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.GrpcLogEntry.getDescriptor().getEnumTypes().get(1);
+ }
+
+ private static final Logger[] VALUES = values();
+
+ public static Logger valueOf(
+ com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException(
+ "EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private Logger(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:grpc.binarylog.v1.GrpcLogEntry.Logger)
+ }
+
+ private int payloadCase_ = 0;
+ private java.lang.Object payload_;
+ public enum PayloadCase
+ implements com.google.protobuf.Internal.EnumLite {
+ CLIENT_HEADER(6),
+ SERVER_HEADER(7),
+ MESSAGE(8),
+ TRAILER(9),
+ PAYLOAD_NOT_SET(0);
+ private final int value;
+ private PayloadCase(int value) {
+ this.value = value;
+ }
+ /**
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static PayloadCase valueOf(int value) {
+ return forNumber(value);
+ }
+
+ public static PayloadCase forNumber(int value) {
+ switch (value) {
+ case 6: return CLIENT_HEADER;
+ case 7: return SERVER_HEADER;
+ case 8: return MESSAGE;
+ case 9: return TRAILER;
+ case 0: return PAYLOAD_NOT_SET;
+ default: return null;
+ }
+ }
+ public int getNumber() {
+ return this.value;
+ }
+ };
+
+ public PayloadCase
+ getPayloadCase() {
+ return PayloadCase.forNumber(
+ payloadCase_);
+ }
+
+ public static final int TIMESTAMP_FIELD_NUMBER = 1;
+ private com.google.protobuf.Timestamp timestamp_;
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public boolean hasTimestamp() {
+ return timestamp_ != null;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public com.google.protobuf.Timestamp getTimestamp() {
+ return timestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder() {
+ return getTimestamp();
+ }
+
+ public static final int CALL_ID_FIELD_NUMBER = 2;
+ private long callId_;
+ /**
+ * <pre>
+ * Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ * from an unset value.
+ * Each call may have several log entries, they will all have the same call_id.
+ * Nothing is guaranteed about their value other than they are unique across
+ * different RPCs in the same gRPC process.
+ * </pre>
+ *
+ * <code>uint64 call_id = 2;</code>
+ */
+ public long getCallId() {
+ return callId_;
+ }
+
+ public static final int SEQUENCE_ID_WITHIN_CALL_FIELD_NUMBER = 3;
+ private long sequenceIdWithinCall_;
+ /**
+ * <pre>
+ * The entry sequence id for this call. The first GrpcLogEntry has a
+ * value of 1, to disambiguate from an unset value. The purpose of
+ * this field is to detect missing entries in environments where
+ * durability or ordering is not guaranteed.
+ * </pre>
+ *
+ * <code>uint64 sequence_id_within_call = 3;</code>
+ */
+ public long getSequenceIdWithinCall() {
+ return sequenceIdWithinCall_;
+ }
+
+ public static final int TYPE_FIELD_NUMBER = 4;
+ private int type_;
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public int getTypeValue() {
+ return type_;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public io.grpc.binarylog.v1.GrpcLogEntry.EventType getType() {
+ io.grpc.binarylog.v1.GrpcLogEntry.EventType result = io.grpc.binarylog.v1.GrpcLogEntry.EventType.valueOf(type_);
+ return result == null ? io.grpc.binarylog.v1.GrpcLogEntry.EventType.UNRECOGNIZED : result;
+ }
+
+ public static final int LOGGER_FIELD_NUMBER = 5;
+ private int logger_;
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public int getLoggerValue() {
+ return logger_;
+ }
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public io.grpc.binarylog.v1.GrpcLogEntry.Logger getLogger() {
+ io.grpc.binarylog.v1.GrpcLogEntry.Logger result = io.grpc.binarylog.v1.GrpcLogEntry.Logger.valueOf(logger_);
+ return result == null ? io.grpc.binarylog.v1.GrpcLogEntry.Logger.UNRECOGNIZED : result;
+ }
+
+ public static final int CLIENT_HEADER_FIELD_NUMBER = 6;
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public boolean hasClientHeader() {
+ return payloadCase_ == 6;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public io.grpc.binarylog.v1.ClientHeader getClientHeader() {
+ if (payloadCase_ == 6) {
+ return (io.grpc.binarylog.v1.ClientHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public io.grpc.binarylog.v1.ClientHeaderOrBuilder getClientHeaderOrBuilder() {
+ if (payloadCase_ == 6) {
+ return (io.grpc.binarylog.v1.ClientHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+
+ public static final int SERVER_HEADER_FIELD_NUMBER = 7;
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public boolean hasServerHeader() {
+ return payloadCase_ == 7;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public io.grpc.binarylog.v1.ServerHeader getServerHeader() {
+ if (payloadCase_ == 7) {
+ return (io.grpc.binarylog.v1.ServerHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public io.grpc.binarylog.v1.ServerHeaderOrBuilder getServerHeaderOrBuilder() {
+ if (payloadCase_ == 7) {
+ return (io.grpc.binarylog.v1.ServerHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+
+ public static final int MESSAGE_FIELD_NUMBER = 8;
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public boolean hasMessage() {
+ return payloadCase_ == 8;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public io.grpc.binarylog.v1.Message getMessage() {
+ if (payloadCase_ == 8) {
+ return (io.grpc.binarylog.v1.Message) payload_;
+ }
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public io.grpc.binarylog.v1.MessageOrBuilder getMessageOrBuilder() {
+ if (payloadCase_ == 8) {
+ return (io.grpc.binarylog.v1.Message) payload_;
+ }
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+
+ public static final int TRAILER_FIELD_NUMBER = 9;
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public boolean hasTrailer() {
+ return payloadCase_ == 9;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public io.grpc.binarylog.v1.Trailer getTrailer() {
+ if (payloadCase_ == 9) {
+ return (io.grpc.binarylog.v1.Trailer) payload_;
+ }
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public io.grpc.binarylog.v1.TrailerOrBuilder getTrailerOrBuilder() {
+ if (payloadCase_ == 9) {
+ return (io.grpc.binarylog.v1.Trailer) payload_;
+ }
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+
+ public static final int PAYLOAD_TRUNCATED_FIELD_NUMBER = 10;
+ private boolean payloadTruncated_;
+ /**
+ * <pre>
+ * true if payload does not represent the full message or metadata.
+ * </pre>
+ *
+ * <code>bool payload_truncated = 10;</code>
+ */
+ public boolean getPayloadTruncated() {
+ return payloadTruncated_;
+ }
+
+ public static final int PEER_FIELD_NUMBER = 11;
+ private io.grpc.binarylog.v1.Address peer_;
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public boolean hasPeer() {
+ return peer_ != null;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public io.grpc.binarylog.v1.Address getPeer() {
+ return peer_ == null ? io.grpc.binarylog.v1.Address.getDefaultInstance() : peer_;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public io.grpc.binarylog.v1.AddressOrBuilder getPeerOrBuilder() {
+ return getPeer();
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (timestamp_ != null) {
+ output.writeMessage(1, getTimestamp());
+ }
+ if (callId_ != 0L) {
+ output.writeUInt64(2, callId_);
+ }
+ if (sequenceIdWithinCall_ != 0L) {
+ output.writeUInt64(3, sequenceIdWithinCall_);
+ }
+ if (type_ != io.grpc.binarylog.v1.GrpcLogEntry.EventType.EVENT_TYPE_UNKNOWN.getNumber()) {
+ output.writeEnum(4, type_);
+ }
+ if (logger_ != io.grpc.binarylog.v1.GrpcLogEntry.Logger.LOGGER_UNKNOWN.getNumber()) {
+ output.writeEnum(5, logger_);
+ }
+ if (payloadCase_ == 6) {
+ output.writeMessage(6, (io.grpc.binarylog.v1.ClientHeader) payload_);
+ }
+ if (payloadCase_ == 7) {
+ output.writeMessage(7, (io.grpc.binarylog.v1.ServerHeader) payload_);
+ }
+ if (payloadCase_ == 8) {
+ output.writeMessage(8, (io.grpc.binarylog.v1.Message) payload_);
+ }
+ if (payloadCase_ == 9) {
+ output.writeMessage(9, (io.grpc.binarylog.v1.Trailer) payload_);
+ }
+ if (payloadTruncated_ != false) {
+ output.writeBool(10, payloadTruncated_);
+ }
+ if (peer_ != null) {
+ output.writeMessage(11, getPeer());
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (timestamp_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(1, getTimestamp());
+ }
+ if (callId_ != 0L) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt64Size(2, callId_);
+ }
+ if (sequenceIdWithinCall_ != 0L) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt64Size(3, sequenceIdWithinCall_);
+ }
+ if (type_ != io.grpc.binarylog.v1.GrpcLogEntry.EventType.EVENT_TYPE_UNKNOWN.getNumber()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeEnumSize(4, type_);
+ }
+ if (logger_ != io.grpc.binarylog.v1.GrpcLogEntry.Logger.LOGGER_UNKNOWN.getNumber()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeEnumSize(5, logger_);
+ }
+ if (payloadCase_ == 6) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(6, (io.grpc.binarylog.v1.ClientHeader) payload_);
+ }
+ if (payloadCase_ == 7) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(7, (io.grpc.binarylog.v1.ServerHeader) payload_);
+ }
+ if (payloadCase_ == 8) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(8, (io.grpc.binarylog.v1.Message) payload_);
+ }
+ if (payloadCase_ == 9) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(9, (io.grpc.binarylog.v1.Trailer) payload_);
+ }
+ if (payloadTruncated_ != false) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeBoolSize(10, payloadTruncated_);
+ }
+ if (peer_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(11, getPeer());
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.GrpcLogEntry)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.GrpcLogEntry other = (io.grpc.binarylog.v1.GrpcLogEntry) obj;
+
+ boolean result = true;
+ result = result && (hasTimestamp() == other.hasTimestamp());
+ if (hasTimestamp()) {
+ result = result && getTimestamp()
+ .equals(other.getTimestamp());
+ }
+ result = result && (getCallId()
+ == other.getCallId());
+ result = result && (getSequenceIdWithinCall()
+ == other.getSequenceIdWithinCall());
+ result = result && type_ == other.type_;
+ result = result && logger_ == other.logger_;
+ result = result && (getPayloadTruncated()
+ == other.getPayloadTruncated());
+ result = result && (hasPeer() == other.hasPeer());
+ if (hasPeer()) {
+ result = result && getPeer()
+ .equals(other.getPeer());
+ }
+ result = result && getPayloadCase().equals(
+ other.getPayloadCase());
+ if (!result) return false;
+ switch (payloadCase_) {
+ case 6:
+ result = result && getClientHeader()
+ .equals(other.getClientHeader());
+ break;
+ case 7:
+ result = result && getServerHeader()
+ .equals(other.getServerHeader());
+ break;
+ case 8:
+ result = result && getMessage()
+ .equals(other.getMessage());
+ break;
+ case 9:
+ result = result && getTrailer()
+ .equals(other.getTrailer());
+ break;
+ case 0:
+ default:
+ }
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (hasTimestamp()) {
+ hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+ hash = (53 * hash) + getTimestamp().hashCode();
+ }
+ hash = (37 * hash) + CALL_ID_FIELD_NUMBER;
+ hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+ getCallId());
+ hash = (37 * hash) + SEQUENCE_ID_WITHIN_CALL_FIELD_NUMBER;
+ hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+ getSequenceIdWithinCall());
+ hash = (37 * hash) + TYPE_FIELD_NUMBER;
+ hash = (53 * hash) + type_;
+ hash = (37 * hash) + LOGGER_FIELD_NUMBER;
+ hash = (53 * hash) + logger_;
+ hash = (37 * hash) + PAYLOAD_TRUNCATED_FIELD_NUMBER;
+ hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+ getPayloadTruncated());
+ if (hasPeer()) {
+ hash = (37 * hash) + PEER_FIELD_NUMBER;
+ hash = (53 * hash) + getPeer().hashCode();
+ }
+ switch (payloadCase_) {
+ case 6:
+ hash = (37 * hash) + CLIENT_HEADER_FIELD_NUMBER;
+ hash = (53 * hash) + getClientHeader().hashCode();
+ break;
+ case 7:
+ hash = (37 * hash) + SERVER_HEADER_FIELD_NUMBER;
+ hash = (53 * hash) + getServerHeader().hashCode();
+ break;
+ case 8:
+ hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+ hash = (53 * hash) + getMessage().hashCode();
+ break;
+ case 9:
+ hash = (37 * hash) + TRAILER_FIELD_NUMBER;
+ hash = (53 * hash) + getTrailer().hashCode();
+ break;
+ case 0:
+ default:
+ }
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.GrpcLogEntry parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.GrpcLogEntry prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * <pre>
+ * Log entry we store in binary logs
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.GrpcLogEntry}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.GrpcLogEntry)
+ io.grpc.binarylog.v1.GrpcLogEntryOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_GrpcLogEntry_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.GrpcLogEntry.class, io.grpc.binarylog.v1.GrpcLogEntry.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.GrpcLogEntry.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ if (timestampBuilder_ == null) {
+ timestamp_ = null;
+ } else {
+ timestamp_ = null;
+ timestampBuilder_ = null;
+ }
+ callId_ = 0L;
+
+ sequenceIdWithinCall_ = 0L;
+
+ type_ = 0;
+
+ logger_ = 0;
+
+ payloadTruncated_ = false;
+
+ if (peerBuilder_ == null) {
+ peer_ = null;
+ } else {
+ peer_ = null;
+ peerBuilder_ = null;
+ }
+ payloadCase_ = 0;
+ payload_ = null;
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_GrpcLogEntry_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.GrpcLogEntry getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.GrpcLogEntry.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.GrpcLogEntry build() {
+ io.grpc.binarylog.v1.GrpcLogEntry result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.GrpcLogEntry buildPartial() {
+ io.grpc.binarylog.v1.GrpcLogEntry result = new io.grpc.binarylog.v1.GrpcLogEntry(this);
+ if (timestampBuilder_ == null) {
+ result.timestamp_ = timestamp_;
+ } else {
+ result.timestamp_ = timestampBuilder_.build();
+ }
+ result.callId_ = callId_;
+ result.sequenceIdWithinCall_ = sequenceIdWithinCall_;
+ result.type_ = type_;
+ result.logger_ = logger_;
+ if (payloadCase_ == 6) {
+ if (clientHeaderBuilder_ == null) {
+ result.payload_ = payload_;
+ } else {
+ result.payload_ = clientHeaderBuilder_.build();
+ }
+ }
+ if (payloadCase_ == 7) {
+ if (serverHeaderBuilder_ == null) {
+ result.payload_ = payload_;
+ } else {
+ result.payload_ = serverHeaderBuilder_.build();
+ }
+ }
+ if (payloadCase_ == 8) {
+ if (messageBuilder_ == null) {
+ result.payload_ = payload_;
+ } else {
+ result.payload_ = messageBuilder_.build();
+ }
+ }
+ if (payloadCase_ == 9) {
+ if (trailerBuilder_ == null) {
+ result.payload_ = payload_;
+ } else {
+ result.payload_ = trailerBuilder_.build();
+ }
+ }
+ result.payloadTruncated_ = payloadTruncated_;
+ if (peerBuilder_ == null) {
+ result.peer_ = peer_;
+ } else {
+ result.peer_ = peerBuilder_.build();
+ }
+ result.payloadCase_ = payloadCase_;
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.GrpcLogEntry) {
+ return mergeFrom((io.grpc.binarylog.v1.GrpcLogEntry)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.GrpcLogEntry other) {
+ if (other == io.grpc.binarylog.v1.GrpcLogEntry.getDefaultInstance()) return this;
+ if (other.hasTimestamp()) {
+ mergeTimestamp(other.getTimestamp());
+ }
+ if (other.getCallId() != 0L) {
+ setCallId(other.getCallId());
+ }
+ if (other.getSequenceIdWithinCall() != 0L) {
+ setSequenceIdWithinCall(other.getSequenceIdWithinCall());
+ }
+ if (other.type_ != 0) {
+ setTypeValue(other.getTypeValue());
+ }
+ if (other.logger_ != 0) {
+ setLoggerValue(other.getLoggerValue());
+ }
+ if (other.getPayloadTruncated() != false) {
+ setPayloadTruncated(other.getPayloadTruncated());
+ }
+ if (other.hasPeer()) {
+ mergePeer(other.getPeer());
+ }
+ switch (other.getPayloadCase()) {
+ case CLIENT_HEADER: {
+ mergeClientHeader(other.getClientHeader());
+ break;
+ }
+ case SERVER_HEADER: {
+ mergeServerHeader(other.getServerHeader());
+ break;
+ }
+ case MESSAGE: {
+ mergeMessage(other.getMessage());
+ break;
+ }
+ case TRAILER: {
+ mergeTrailer(other.getTrailer());
+ break;
+ }
+ case PAYLOAD_NOT_SET: {
+ break;
+ }
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.GrpcLogEntry parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.GrpcLogEntry) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+ private int payloadCase_ = 0;
+ private java.lang.Object payload_;
+ public PayloadCase
+ getPayloadCase() {
+ return PayloadCase.forNumber(
+ payloadCase_);
+ }
+
+ public Builder clearPayload() {
+ payloadCase_ = 0;
+ payload_ = null;
+ onChanged();
+ return this;
+ }
+
+
+ private com.google.protobuf.Timestamp timestamp_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> timestampBuilder_;
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public boolean hasTimestamp() {
+ return timestampBuilder_ != null || timestamp_ != null;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public com.google.protobuf.Timestamp getTimestamp() {
+ if (timestampBuilder_ == null) {
+ return timestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_;
+ } else {
+ return timestampBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public Builder setTimestamp(com.google.protobuf.Timestamp value) {
+ if (timestampBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ timestamp_ = value;
+ onChanged();
+ } else {
+ timestampBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public Builder setTimestamp(
+ com.google.protobuf.Timestamp.Builder builderForValue) {
+ if (timestampBuilder_ == null) {
+ timestamp_ = builderForValue.build();
+ onChanged();
+ } else {
+ timestampBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public Builder mergeTimestamp(com.google.protobuf.Timestamp value) {
+ if (timestampBuilder_ == null) {
+ if (timestamp_ != null) {
+ timestamp_ =
+ com.google.protobuf.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
+ } else {
+ timestamp_ = value;
+ }
+ onChanged();
+ } else {
+ timestampBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public Builder clearTimestamp() {
+ if (timestampBuilder_ == null) {
+ timestamp_ = null;
+ onChanged();
+ } else {
+ timestamp_ = null;
+ timestampBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public com.google.protobuf.Timestamp.Builder getTimestampBuilder() {
+
+ onChanged();
+ return getTimestampFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ public com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder() {
+ if (timestampBuilder_ != null) {
+ return timestampBuilder_.getMessageOrBuilder();
+ } else {
+ return timestamp_ == null ?
+ com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_;
+ }
+ }
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>
+ getTimestampFieldBuilder() {
+ if (timestampBuilder_ == null) {
+ timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+ getTimestamp(),
+ getParentForChildren(),
+ isClean());
+ timestamp_ = null;
+ }
+ return timestampBuilder_;
+ }
+
+ private long callId_ ;
+ /**
+ * <pre>
+ * Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ * from an unset value.
+ * Each call may have several log entries, they will all have the same call_id.
+ * Nothing is guaranteed about their value other than they are unique across
+ * different RPCs in the same gRPC process.
+ * </pre>
+ *
+ * <code>uint64 call_id = 2;</code>
+ */
+ public long getCallId() {
+ return callId_;
+ }
+ /**
+ * <pre>
+ * Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ * from an unset value.
+ * Each call may have several log entries, they will all have the same call_id.
+ * Nothing is guaranteed about their value other than they are unique across
+ * different RPCs in the same gRPC process.
+ * </pre>
+ *
+ * <code>uint64 call_id = 2;</code>
+ */
+ public Builder setCallId(long value) {
+
+ callId_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ * from an unset value.
+ * Each call may have several log entries, they will all have the same call_id.
+ * Nothing is guaranteed about their value other than they are unique across
+ * different RPCs in the same gRPC process.
+ * </pre>
+ *
+ * <code>uint64 call_id = 2;</code>
+ */
+ public Builder clearCallId() {
+
+ callId_ = 0L;
+ onChanged();
+ return this;
+ }
+
+ private long sequenceIdWithinCall_ ;
+ /**
+ * <pre>
+ * The entry sequence id for this call. The first GrpcLogEntry has a
+ * value of 1, to disambiguate from an unset value. The purpose of
+ * this field is to detect missing entries in environments where
+ * durability or ordering is not guaranteed.
+ * </pre>
+ *
+ * <code>uint64 sequence_id_within_call = 3;</code>
+ */
+ public long getSequenceIdWithinCall() {
+ return sequenceIdWithinCall_;
+ }
+ /**
+ * <pre>
+ * The entry sequence id for this call. The first GrpcLogEntry has a
+ * value of 1, to disambiguate from an unset value. The purpose of
+ * this field is to detect missing entries in environments where
+ * durability or ordering is not guaranteed.
+ * </pre>
+ *
+ * <code>uint64 sequence_id_within_call = 3;</code>
+ */
+ public Builder setSequenceIdWithinCall(long value) {
+
+ sequenceIdWithinCall_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * The entry sequence id for this call. The first GrpcLogEntry has a
+ * value of 1, to disambiguate from an unset value. The purpose of
+ * this field is to detect missing entries in environments where
+ * durability or ordering is not guaranteed.
+ * </pre>
+ *
+ * <code>uint64 sequence_id_within_call = 3;</code>
+ */
+ public Builder clearSequenceIdWithinCall() {
+
+ sequenceIdWithinCall_ = 0L;
+ onChanged();
+ return this;
+ }
+
+ private int type_ = 0;
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public int getTypeValue() {
+ return type_;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public Builder setTypeValue(int value) {
+ type_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public io.grpc.binarylog.v1.GrpcLogEntry.EventType getType() {
+ io.grpc.binarylog.v1.GrpcLogEntry.EventType result = io.grpc.binarylog.v1.GrpcLogEntry.EventType.valueOf(type_);
+ return result == null ? io.grpc.binarylog.v1.GrpcLogEntry.EventType.UNRECOGNIZED : result;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public Builder setType(io.grpc.binarylog.v1.GrpcLogEntry.EventType value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ type_ = value.getNumber();
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ public Builder clearType() {
+
+ type_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int logger_ = 0;
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public int getLoggerValue() {
+ return logger_;
+ }
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public Builder setLoggerValue(int value) {
+ logger_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public io.grpc.binarylog.v1.GrpcLogEntry.Logger getLogger() {
+ io.grpc.binarylog.v1.GrpcLogEntry.Logger result = io.grpc.binarylog.v1.GrpcLogEntry.Logger.valueOf(logger_);
+ return result == null ? io.grpc.binarylog.v1.GrpcLogEntry.Logger.UNRECOGNIZED : result;
+ }
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public Builder setLogger(io.grpc.binarylog.v1.GrpcLogEntry.Logger value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ logger_ = value.getNumber();
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ public Builder clearLogger() {
+
+ logger_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ClientHeader, io.grpc.binarylog.v1.ClientHeader.Builder, io.grpc.binarylog.v1.ClientHeaderOrBuilder> clientHeaderBuilder_;
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public boolean hasClientHeader() {
+ return payloadCase_ == 6;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public io.grpc.binarylog.v1.ClientHeader getClientHeader() {
+ if (clientHeaderBuilder_ == null) {
+ if (payloadCase_ == 6) {
+ return (io.grpc.binarylog.v1.ClientHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ } else {
+ if (payloadCase_ == 6) {
+ return clientHeaderBuilder_.getMessage();
+ }
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public Builder setClientHeader(io.grpc.binarylog.v1.ClientHeader value) {
+ if (clientHeaderBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ payload_ = value;
+ onChanged();
+ } else {
+ clientHeaderBuilder_.setMessage(value);
+ }
+ payloadCase_ = 6;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public Builder setClientHeader(
+ io.grpc.binarylog.v1.ClientHeader.Builder builderForValue) {
+ if (clientHeaderBuilder_ == null) {
+ payload_ = builderForValue.build();
+ onChanged();
+ } else {
+ clientHeaderBuilder_.setMessage(builderForValue.build());
+ }
+ payloadCase_ = 6;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public Builder mergeClientHeader(io.grpc.binarylog.v1.ClientHeader value) {
+ if (clientHeaderBuilder_ == null) {
+ if (payloadCase_ == 6 &&
+ payload_ != io.grpc.binarylog.v1.ClientHeader.getDefaultInstance()) {
+ payload_ = io.grpc.binarylog.v1.ClientHeader.newBuilder((io.grpc.binarylog.v1.ClientHeader) payload_)
+ .mergeFrom(value).buildPartial();
+ } else {
+ payload_ = value;
+ }
+ onChanged();
+ } else {
+ if (payloadCase_ == 6) {
+ clientHeaderBuilder_.mergeFrom(value);
+ }
+ clientHeaderBuilder_.setMessage(value);
+ }
+ payloadCase_ = 6;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public Builder clearClientHeader() {
+ if (clientHeaderBuilder_ == null) {
+ if (payloadCase_ == 6) {
+ payloadCase_ = 0;
+ payload_ = null;
+ onChanged();
+ }
+ } else {
+ if (payloadCase_ == 6) {
+ payloadCase_ = 0;
+ payload_ = null;
+ }
+ clientHeaderBuilder_.clear();
+ }
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public io.grpc.binarylog.v1.ClientHeader.Builder getClientHeaderBuilder() {
+ return getClientHeaderFieldBuilder().getBuilder();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ public io.grpc.binarylog.v1.ClientHeaderOrBuilder getClientHeaderOrBuilder() {
+ if ((payloadCase_ == 6) && (clientHeaderBuilder_ != null)) {
+ return clientHeaderBuilder_.getMessageOrBuilder();
+ } else {
+ if (payloadCase_ == 6) {
+ return (io.grpc.binarylog.v1.ClientHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ClientHeader, io.grpc.binarylog.v1.ClientHeader.Builder, io.grpc.binarylog.v1.ClientHeaderOrBuilder>
+ getClientHeaderFieldBuilder() {
+ if (clientHeaderBuilder_ == null) {
+ if (!(payloadCase_ == 6)) {
+ payload_ = io.grpc.binarylog.v1.ClientHeader.getDefaultInstance();
+ }
+ clientHeaderBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ClientHeader, io.grpc.binarylog.v1.ClientHeader.Builder, io.grpc.binarylog.v1.ClientHeaderOrBuilder>(
+ (io.grpc.binarylog.v1.ClientHeader) payload_,
+ getParentForChildren(),
+ isClean());
+ payload_ = null;
+ }
+ payloadCase_ = 6;
+ onChanged();;
+ return clientHeaderBuilder_;
+ }
+
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ServerHeader, io.grpc.binarylog.v1.ServerHeader.Builder, io.grpc.binarylog.v1.ServerHeaderOrBuilder> serverHeaderBuilder_;
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public boolean hasServerHeader() {
+ return payloadCase_ == 7;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public io.grpc.binarylog.v1.ServerHeader getServerHeader() {
+ if (serverHeaderBuilder_ == null) {
+ if (payloadCase_ == 7) {
+ return (io.grpc.binarylog.v1.ServerHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ } else {
+ if (payloadCase_ == 7) {
+ return serverHeaderBuilder_.getMessage();
+ }
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public Builder setServerHeader(io.grpc.binarylog.v1.ServerHeader value) {
+ if (serverHeaderBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ payload_ = value;
+ onChanged();
+ } else {
+ serverHeaderBuilder_.setMessage(value);
+ }
+ payloadCase_ = 7;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public Builder setServerHeader(
+ io.grpc.binarylog.v1.ServerHeader.Builder builderForValue) {
+ if (serverHeaderBuilder_ == null) {
+ payload_ = builderForValue.build();
+ onChanged();
+ } else {
+ serverHeaderBuilder_.setMessage(builderForValue.build());
+ }
+ payloadCase_ = 7;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public Builder mergeServerHeader(io.grpc.binarylog.v1.ServerHeader value) {
+ if (serverHeaderBuilder_ == null) {
+ if (payloadCase_ == 7 &&
+ payload_ != io.grpc.binarylog.v1.ServerHeader.getDefaultInstance()) {
+ payload_ = io.grpc.binarylog.v1.ServerHeader.newBuilder((io.grpc.binarylog.v1.ServerHeader) payload_)
+ .mergeFrom(value).buildPartial();
+ } else {
+ payload_ = value;
+ }
+ onChanged();
+ } else {
+ if (payloadCase_ == 7) {
+ serverHeaderBuilder_.mergeFrom(value);
+ }
+ serverHeaderBuilder_.setMessage(value);
+ }
+ payloadCase_ = 7;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public Builder clearServerHeader() {
+ if (serverHeaderBuilder_ == null) {
+ if (payloadCase_ == 7) {
+ payloadCase_ = 0;
+ payload_ = null;
+ onChanged();
+ }
+ } else {
+ if (payloadCase_ == 7) {
+ payloadCase_ = 0;
+ payload_ = null;
+ }
+ serverHeaderBuilder_.clear();
+ }
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public io.grpc.binarylog.v1.ServerHeader.Builder getServerHeaderBuilder() {
+ return getServerHeaderFieldBuilder().getBuilder();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ public io.grpc.binarylog.v1.ServerHeaderOrBuilder getServerHeaderOrBuilder() {
+ if ((payloadCase_ == 7) && (serverHeaderBuilder_ != null)) {
+ return serverHeaderBuilder_.getMessageOrBuilder();
+ } else {
+ if (payloadCase_ == 7) {
+ return (io.grpc.binarylog.v1.ServerHeader) payload_;
+ }
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ServerHeader, io.grpc.binarylog.v1.ServerHeader.Builder, io.grpc.binarylog.v1.ServerHeaderOrBuilder>
+ getServerHeaderFieldBuilder() {
+ if (serverHeaderBuilder_ == null) {
+ if (!(payloadCase_ == 7)) {
+ payload_ = io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+ serverHeaderBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.ServerHeader, io.grpc.binarylog.v1.ServerHeader.Builder, io.grpc.binarylog.v1.ServerHeaderOrBuilder>(
+ (io.grpc.binarylog.v1.ServerHeader) payload_,
+ getParentForChildren(),
+ isClean());
+ payload_ = null;
+ }
+ payloadCase_ = 7;
+ onChanged();;
+ return serverHeaderBuilder_;
+ }
+
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Message, io.grpc.binarylog.v1.Message.Builder, io.grpc.binarylog.v1.MessageOrBuilder> messageBuilder_;
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public boolean hasMessage() {
+ return payloadCase_ == 8;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public io.grpc.binarylog.v1.Message getMessage() {
+ if (messageBuilder_ == null) {
+ if (payloadCase_ == 8) {
+ return (io.grpc.binarylog.v1.Message) payload_;
+ }
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ } else {
+ if (payloadCase_ == 8) {
+ return messageBuilder_.getMessage();
+ }
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public Builder setMessage(io.grpc.binarylog.v1.Message value) {
+ if (messageBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ payload_ = value;
+ onChanged();
+ } else {
+ messageBuilder_.setMessage(value);
+ }
+ payloadCase_ = 8;
+ return this;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public Builder setMessage(
+ io.grpc.binarylog.v1.Message.Builder builderForValue) {
+ if (messageBuilder_ == null) {
+ payload_ = builderForValue.build();
+ onChanged();
+ } else {
+ messageBuilder_.setMessage(builderForValue.build());
+ }
+ payloadCase_ = 8;
+ return this;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public Builder mergeMessage(io.grpc.binarylog.v1.Message value) {
+ if (messageBuilder_ == null) {
+ if (payloadCase_ == 8 &&
+ payload_ != io.grpc.binarylog.v1.Message.getDefaultInstance()) {
+ payload_ = io.grpc.binarylog.v1.Message.newBuilder((io.grpc.binarylog.v1.Message) payload_)
+ .mergeFrom(value).buildPartial();
+ } else {
+ payload_ = value;
+ }
+ onChanged();
+ } else {
+ if (payloadCase_ == 8) {
+ messageBuilder_.mergeFrom(value);
+ }
+ messageBuilder_.setMessage(value);
+ }
+ payloadCase_ = 8;
+ return this;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public Builder clearMessage() {
+ if (messageBuilder_ == null) {
+ if (payloadCase_ == 8) {
+ payloadCase_ = 0;
+ payload_ = null;
+ onChanged();
+ }
+ } else {
+ if (payloadCase_ == 8) {
+ payloadCase_ = 0;
+ payload_ = null;
+ }
+ messageBuilder_.clear();
+ }
+ return this;
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public io.grpc.binarylog.v1.Message.Builder getMessageBuilder() {
+ return getMessageFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ public io.grpc.binarylog.v1.MessageOrBuilder getMessageOrBuilder() {
+ if ((payloadCase_ == 8) && (messageBuilder_ != null)) {
+ return messageBuilder_.getMessageOrBuilder();
+ } else {
+ if (payloadCase_ == 8) {
+ return (io.grpc.binarylog.v1.Message) payload_;
+ }
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+ }
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Message, io.grpc.binarylog.v1.Message.Builder, io.grpc.binarylog.v1.MessageOrBuilder>
+ getMessageFieldBuilder() {
+ if (messageBuilder_ == null) {
+ if (!(payloadCase_ == 8)) {
+ payload_ = io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+ messageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Message, io.grpc.binarylog.v1.Message.Builder, io.grpc.binarylog.v1.MessageOrBuilder>(
+ (io.grpc.binarylog.v1.Message) payload_,
+ getParentForChildren(),
+ isClean());
+ payload_ = null;
+ }
+ payloadCase_ = 8;
+ onChanged();;
+ return messageBuilder_;
+ }
+
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Trailer, io.grpc.binarylog.v1.Trailer.Builder, io.grpc.binarylog.v1.TrailerOrBuilder> trailerBuilder_;
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public boolean hasTrailer() {
+ return payloadCase_ == 9;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public io.grpc.binarylog.v1.Trailer getTrailer() {
+ if (trailerBuilder_ == null) {
+ if (payloadCase_ == 9) {
+ return (io.grpc.binarylog.v1.Trailer) payload_;
+ }
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ } else {
+ if (payloadCase_ == 9) {
+ return trailerBuilder_.getMessage();
+ }
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public Builder setTrailer(io.grpc.binarylog.v1.Trailer value) {
+ if (trailerBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ payload_ = value;
+ onChanged();
+ } else {
+ trailerBuilder_.setMessage(value);
+ }
+ payloadCase_ = 9;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public Builder setTrailer(
+ io.grpc.binarylog.v1.Trailer.Builder builderForValue) {
+ if (trailerBuilder_ == null) {
+ payload_ = builderForValue.build();
+ onChanged();
+ } else {
+ trailerBuilder_.setMessage(builderForValue.build());
+ }
+ payloadCase_ = 9;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public Builder mergeTrailer(io.grpc.binarylog.v1.Trailer value) {
+ if (trailerBuilder_ == null) {
+ if (payloadCase_ == 9 &&
+ payload_ != io.grpc.binarylog.v1.Trailer.getDefaultInstance()) {
+ payload_ = io.grpc.binarylog.v1.Trailer.newBuilder((io.grpc.binarylog.v1.Trailer) payload_)
+ .mergeFrom(value).buildPartial();
+ } else {
+ payload_ = value;
+ }
+ onChanged();
+ } else {
+ if (payloadCase_ == 9) {
+ trailerBuilder_.mergeFrom(value);
+ }
+ trailerBuilder_.setMessage(value);
+ }
+ payloadCase_ = 9;
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public Builder clearTrailer() {
+ if (trailerBuilder_ == null) {
+ if (payloadCase_ == 9) {
+ payloadCase_ = 0;
+ payload_ = null;
+ onChanged();
+ }
+ } else {
+ if (payloadCase_ == 9) {
+ payloadCase_ = 0;
+ payload_ = null;
+ }
+ trailerBuilder_.clear();
+ }
+ return this;
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public io.grpc.binarylog.v1.Trailer.Builder getTrailerBuilder() {
+ return getTrailerFieldBuilder().getBuilder();
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ public io.grpc.binarylog.v1.TrailerOrBuilder getTrailerOrBuilder() {
+ if ((payloadCase_ == 9) && (trailerBuilder_ != null)) {
+ return trailerBuilder_.getMessageOrBuilder();
+ } else {
+ if (payloadCase_ == 9) {
+ return (io.grpc.binarylog.v1.Trailer) payload_;
+ }
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+ }
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Trailer, io.grpc.binarylog.v1.Trailer.Builder, io.grpc.binarylog.v1.TrailerOrBuilder>
+ getTrailerFieldBuilder() {
+ if (trailerBuilder_ == null) {
+ if (!(payloadCase_ == 9)) {
+ payload_ = io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+ trailerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Trailer, io.grpc.binarylog.v1.Trailer.Builder, io.grpc.binarylog.v1.TrailerOrBuilder>(
+ (io.grpc.binarylog.v1.Trailer) payload_,
+ getParentForChildren(),
+ isClean());
+ payload_ = null;
+ }
+ payloadCase_ = 9;
+ onChanged();;
+ return trailerBuilder_;
+ }
+
+ private boolean payloadTruncated_ ;
+ /**
+ * <pre>
+ * true if payload does not represent the full message or metadata.
+ * </pre>
+ *
+ * <code>bool payload_truncated = 10;</code>
+ */
+ public boolean getPayloadTruncated() {
+ return payloadTruncated_;
+ }
+ /**
+ * <pre>
+ * true if payload does not represent the full message or metadata.
+ * </pre>
+ *
+ * <code>bool payload_truncated = 10;</code>
+ */
+ public Builder setPayloadTruncated(boolean value) {
+
+ payloadTruncated_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * true if payload does not represent the full message or metadata.
+ * </pre>
+ *
+ * <code>bool payload_truncated = 10;</code>
+ */
+ public Builder clearPayloadTruncated() {
+
+ payloadTruncated_ = false;
+ onChanged();
+ return this;
+ }
+
+ private io.grpc.binarylog.v1.Address peer_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Address, io.grpc.binarylog.v1.Address.Builder, io.grpc.binarylog.v1.AddressOrBuilder> peerBuilder_;
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public boolean hasPeer() {
+ return peerBuilder_ != null || peer_ != null;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public io.grpc.binarylog.v1.Address getPeer() {
+ if (peerBuilder_ == null) {
+ return peer_ == null ? io.grpc.binarylog.v1.Address.getDefaultInstance() : peer_;
+ } else {
+ return peerBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public Builder setPeer(io.grpc.binarylog.v1.Address value) {
+ if (peerBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ peer_ = value;
+ onChanged();
+ } else {
+ peerBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public Builder setPeer(
+ io.grpc.binarylog.v1.Address.Builder builderForValue) {
+ if (peerBuilder_ == null) {
+ peer_ = builderForValue.build();
+ onChanged();
+ } else {
+ peerBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public Builder mergePeer(io.grpc.binarylog.v1.Address value) {
+ if (peerBuilder_ == null) {
+ if (peer_ != null) {
+ peer_ =
+ io.grpc.binarylog.v1.Address.newBuilder(peer_).mergeFrom(value).buildPartial();
+ } else {
+ peer_ = value;
+ }
+ onChanged();
+ } else {
+ peerBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public Builder clearPeer() {
+ if (peerBuilder_ == null) {
+ peer_ = null;
+ onChanged();
+ } else {
+ peer_ = null;
+ peerBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public io.grpc.binarylog.v1.Address.Builder getPeerBuilder() {
+
+ onChanged();
+ return getPeerFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ public io.grpc.binarylog.v1.AddressOrBuilder getPeerOrBuilder() {
+ if (peerBuilder_ != null) {
+ return peerBuilder_.getMessageOrBuilder();
+ } else {
+ return peer_ == null ?
+ io.grpc.binarylog.v1.Address.getDefaultInstance() : peer_;
+ }
+ }
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Address, io.grpc.binarylog.v1.Address.Builder, io.grpc.binarylog.v1.AddressOrBuilder>
+ getPeerFieldBuilder() {
+ if (peerBuilder_ == null) {
+ peerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Address, io.grpc.binarylog.v1.Address.Builder, io.grpc.binarylog.v1.AddressOrBuilder>(
+ getPeer(),
+ getParentForChildren(),
+ isClean());
+ peer_ = null;
+ }
+ return peerBuilder_;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.GrpcLogEntry)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.GrpcLogEntry)
+ private static final io.grpc.binarylog.v1.GrpcLogEntry DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.GrpcLogEntry();
+ }
+
+ public static io.grpc.binarylog.v1.GrpcLogEntry getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<GrpcLogEntry>
+ PARSER = new com.google.protobuf.AbstractParser<GrpcLogEntry>() {
+ public GrpcLogEntry parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new GrpcLogEntry(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<GrpcLogEntry> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<GrpcLogEntry> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.GrpcLogEntry getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntryOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntryOrBuilder.java
new file mode 100644
index 000000000..46fb28f02
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/GrpcLogEntryOrBuilder.java
@@ -0,0 +1,197 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface GrpcLogEntryOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.GrpcLogEntry)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ boolean hasTimestamp();
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ com.google.protobuf.Timestamp getTimestamp();
+ /**
+ * <pre>
+ * The timestamp of the binary log message
+ * </pre>
+ *
+ * <code>.google.protobuf.Timestamp timestamp = 1;</code>
+ */
+ com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder();
+
+ /**
+ * <pre>
+ * Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ * from an unset value.
+ * Each call may have several log entries, they will all have the same call_id.
+ * Nothing is guaranteed about their value other than they are unique across
+ * different RPCs in the same gRPC process.
+ * </pre>
+ *
+ * <code>uint64 call_id = 2;</code>
+ */
+ long getCallId();
+
+ /**
+ * <pre>
+ * The entry sequence id for this call. The first GrpcLogEntry has a
+ * value of 1, to disambiguate from an unset value. The purpose of
+ * this field is to detect missing entries in environments where
+ * durability or ordering is not guaranteed.
+ * </pre>
+ *
+ * <code>uint64 sequence_id_within_call = 3;</code>
+ */
+ long getSequenceIdWithinCall();
+
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ int getTypeValue();
+ /**
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.EventType type = 4;</code>
+ */
+ io.grpc.binarylog.v1.GrpcLogEntry.EventType getType();
+
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ int getLoggerValue();
+ /**
+ * <pre>
+ * One of the above Logger enum
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.GrpcLogEntry.Logger logger = 5;</code>
+ */
+ io.grpc.binarylog.v1.GrpcLogEntry.Logger getLogger();
+
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ boolean hasClientHeader();
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ io.grpc.binarylog.v1.ClientHeader getClientHeader();
+ /**
+ * <code>.grpc.binarylog.v1.ClientHeader client_header = 6;</code>
+ */
+ io.grpc.binarylog.v1.ClientHeaderOrBuilder getClientHeaderOrBuilder();
+
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ boolean hasServerHeader();
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ io.grpc.binarylog.v1.ServerHeader getServerHeader();
+ /**
+ * <code>.grpc.binarylog.v1.ServerHeader server_header = 7;</code>
+ */
+ io.grpc.binarylog.v1.ServerHeaderOrBuilder getServerHeaderOrBuilder();
+
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ boolean hasMessage();
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ io.grpc.binarylog.v1.Message getMessage();
+ /**
+ * <pre>
+ * Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Message message = 8;</code>
+ */
+ io.grpc.binarylog.v1.MessageOrBuilder getMessageOrBuilder();
+
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ boolean hasTrailer();
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ io.grpc.binarylog.v1.Trailer getTrailer();
+ /**
+ * <code>.grpc.binarylog.v1.Trailer trailer = 9;</code>
+ */
+ io.grpc.binarylog.v1.TrailerOrBuilder getTrailerOrBuilder();
+
+ /**
+ * <pre>
+ * true if payload does not represent the full message or metadata.
+ * </pre>
+ *
+ * <code>bool payload_truncated = 10;</code>
+ */
+ boolean getPayloadTruncated();
+
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ boolean hasPeer();
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ io.grpc.binarylog.v1.Address getPeer();
+ /**
+ * <pre>
+ * Peer address information, will only be recorded on the first
+ * incoming event. On client side, peer is logged on
+ * EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ * the case of trailers-only. On server side, peer is always
+ * logged on EVENT_TYPE_CLIENT_HEADER.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Address peer = 11;</code>
+ */
+ io.grpc.binarylog.v1.AddressOrBuilder getPeerOrBuilder();
+
+ public io.grpc.binarylog.v1.GrpcLogEntry.PayloadCase getPayloadCase();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/Message.java b/services/src/generated/main/java/io/grpc/binarylog/v1/Message.java
new file mode 100644
index 000000000..bdde8f3ca
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/Message.java
@@ -0,0 +1,552 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * <pre>
+ * Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Message}
+ */
+public final class Message extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.Message)
+ MessageOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use Message.newBuilder() to construct.
+ private Message(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private Message() {
+ length_ = 0;
+ data_ = com.google.protobuf.ByteString.EMPTY;
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private Message(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 8: {
+
+ length_ = input.readUInt32();
+ break;
+ }
+ case 18: {
+
+ data_ = input.readBytes();
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Message_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Message_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Message.class, io.grpc.binarylog.v1.Message.Builder.class);
+ }
+
+ public static final int LENGTH_FIELD_NUMBER = 1;
+ private int length_;
+ /**
+ * <pre>
+ * Length of the message. It may not be the same as the length of the
+ * data field, as the logging payload can be truncated or omitted.
+ * </pre>
+ *
+ * <code>uint32 length = 1;</code>
+ */
+ public int getLength() {
+ return length_;
+ }
+
+ public static final int DATA_FIELD_NUMBER = 2;
+ private com.google.protobuf.ByteString data_;
+ /**
+ * <pre>
+ * May be truncated or omitted.
+ * </pre>
+ *
+ * <code>bytes data = 2;</code>
+ */
+ public com.google.protobuf.ByteString getData() {
+ return data_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (length_ != 0) {
+ output.writeUInt32(1, length_);
+ }
+ if (!data_.isEmpty()) {
+ output.writeBytes(2, data_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (length_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(1, length_);
+ }
+ if (!data_.isEmpty()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeBytesSize(2, data_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.Message)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.Message other = (io.grpc.binarylog.v1.Message) obj;
+
+ boolean result = true;
+ result = result && (getLength()
+ == other.getLength());
+ result = result && getData()
+ .equals(other.getData());
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + LENGTH_FIELD_NUMBER;
+ hash = (53 * hash) + getLength();
+ hash = (37 * hash) + DATA_FIELD_NUMBER;
+ hash = (53 * hash) + getData().hashCode();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Message parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Message parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Message parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.Message prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * <pre>
+ * Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Message}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.Message)
+ io.grpc.binarylog.v1.MessageOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Message_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Message_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Message.class, io.grpc.binarylog.v1.Message.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.Message.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ length_ = 0;
+
+ data_ = com.google.protobuf.ByteString.EMPTY;
+
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Message_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.Message getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.Message.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.Message build() {
+ io.grpc.binarylog.v1.Message result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.Message buildPartial() {
+ io.grpc.binarylog.v1.Message result = new io.grpc.binarylog.v1.Message(this);
+ result.length_ = length_;
+ result.data_ = data_;
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.Message) {
+ return mergeFrom((io.grpc.binarylog.v1.Message)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.Message other) {
+ if (other == io.grpc.binarylog.v1.Message.getDefaultInstance()) return this;
+ if (other.getLength() != 0) {
+ setLength(other.getLength());
+ }
+ if (other.getData() != com.google.protobuf.ByteString.EMPTY) {
+ setData(other.getData());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.Message parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.Message) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private int length_ ;
+ /**
+ * <pre>
+ * Length of the message. It may not be the same as the length of the
+ * data field, as the logging payload can be truncated or omitted.
+ * </pre>
+ *
+ * <code>uint32 length = 1;</code>
+ */
+ public int getLength() {
+ return length_;
+ }
+ /**
+ * <pre>
+ * Length of the message. It may not be the same as the length of the
+ * data field, as the logging payload can be truncated or omitted.
+ * </pre>
+ *
+ * <code>uint32 length = 1;</code>
+ */
+ public Builder setLength(int value) {
+
+ length_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * Length of the message. It may not be the same as the length of the
+ * data field, as the logging payload can be truncated or omitted.
+ * </pre>
+ *
+ * <code>uint32 length = 1;</code>
+ */
+ public Builder clearLength() {
+
+ length_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY;
+ /**
+ * <pre>
+ * May be truncated or omitted.
+ * </pre>
+ *
+ * <code>bytes data = 2;</code>
+ */
+ public com.google.protobuf.ByteString getData() {
+ return data_;
+ }
+ /**
+ * <pre>
+ * May be truncated or omitted.
+ * </pre>
+ *
+ * <code>bytes data = 2;</code>
+ */
+ public Builder setData(com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ data_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * May be truncated or omitted.
+ * </pre>
+ *
+ * <code>bytes data = 2;</code>
+ */
+ public Builder clearData() {
+
+ data_ = getDefaultInstance().getData();
+ onChanged();
+ return this;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.Message)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.Message)
+ private static final io.grpc.binarylog.v1.Message DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.Message();
+ }
+
+ public static io.grpc.binarylog.v1.Message getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<Message>
+ PARSER = new com.google.protobuf.AbstractParser<Message>() {
+ public Message parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new Message(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<Message> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<Message> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.Message getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/MessageOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/MessageOrBuilder.java
new file mode 100644
index 000000000..084cd35ff
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/MessageOrBuilder.java
@@ -0,0 +1,28 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface MessageOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.Message)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <pre>
+ * Length of the message. It may not be the same as the length of the
+ * data field, as the logging payload can be truncated or omitted.
+ * </pre>
+ *
+ * <code>uint32 length = 1;</code>
+ */
+ int getLength();
+
+ /**
+ * <pre>
+ * May be truncated or omitted.
+ * </pre>
+ *
+ * <code>bytes data = 2;</code>
+ */
+ com.google.protobuf.ByteString getData();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/Metadata.java b/services/src/generated/main/java/io/grpc/binarylog/v1/Metadata.java
new file mode 100644
index 000000000..56052d5d8
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/Metadata.java
@@ -0,0 +1,778 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * <pre>
+ * A list of metadata pairs, used in the payload of client header,
+ * server header, and server trailer.
+ * Implementations may omit some entries to honor the header limits
+ * of GRPC_BINARY_LOG_CONFIG.
+ * Header keys added by gRPC are omitted. To be more specific,
+ * implementations will not log the following entries, and this is
+ * not to be treated as a truncation:
+ * - entries handled by grpc that are not user visible, such as those
+ * that begin with 'grpc-' (with exception of grpc-trace-bin)
+ * or keys like 'lb-token'
+ * - transport specific entries, including but not limited to:
+ * ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc
+ * - entries added for call credentials
+ * Implementations must always log grpc-trace-bin if it is present.
+ * Practically speaking it will only be visible on server side because
+ * grpc-trace-bin is managed by low level client side mechanisms
+ * inaccessible from the application level. On server side, the
+ * header is just a normal metadata key.
+ * The pair will not count towards the size limit.
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Metadata}
+ */
+public final class Metadata extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.Metadata)
+ MetadataOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use Metadata.newBuilder() to construct.
+ private Metadata(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private Metadata() {
+ entry_ = java.util.Collections.emptyList();
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private Metadata(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+ entry_ = new java.util.ArrayList<io.grpc.binarylog.v1.MetadataEntry>();
+ mutable_bitField0_ |= 0x00000001;
+ }
+ entry_.add(
+ input.readMessage(io.grpc.binarylog.v1.MetadataEntry.parser(), extensionRegistry));
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+ entry_ = java.util.Collections.unmodifiableList(entry_);
+ }
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Metadata_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Metadata_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Metadata.class, io.grpc.binarylog.v1.Metadata.Builder.class);
+ }
+
+ public static final int ENTRY_FIELD_NUMBER = 1;
+ private java.util.List<io.grpc.binarylog.v1.MetadataEntry> entry_;
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public java.util.List<io.grpc.binarylog.v1.MetadataEntry> getEntryList() {
+ return entry_;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public java.util.List<? extends io.grpc.binarylog.v1.MetadataEntryOrBuilder>
+ getEntryOrBuilderList() {
+ return entry_;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public int getEntryCount() {
+ return entry_.size();
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntry getEntry(int index) {
+ return entry_.get(index);
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntryOrBuilder getEntryOrBuilder(
+ int index) {
+ return entry_.get(index);
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ for (int i = 0; i < entry_.size(); i++) {
+ output.writeMessage(1, entry_.get(i));
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ for (int i = 0; i < entry_.size(); i++) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(1, entry_.get(i));
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.Metadata)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.Metadata other = (io.grpc.binarylog.v1.Metadata) obj;
+
+ boolean result = true;
+ result = result && getEntryList()
+ .equals(other.getEntryList());
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (getEntryCount() > 0) {
+ hash = (37 * hash) + ENTRY_FIELD_NUMBER;
+ hash = (53 * hash) + getEntryList().hashCode();
+ }
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Metadata parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.Metadata prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * <pre>
+ * A list of metadata pairs, used in the payload of client header,
+ * server header, and server trailer.
+ * Implementations may omit some entries to honor the header limits
+ * of GRPC_BINARY_LOG_CONFIG.
+ * Header keys added by gRPC are omitted. To be more specific,
+ * implementations will not log the following entries, and this is
+ * not to be treated as a truncation:
+ * - entries handled by grpc that are not user visible, such as those
+ * that begin with 'grpc-' (with exception of grpc-trace-bin)
+ * or keys like 'lb-token'
+ * - transport specific entries, including but not limited to:
+ * ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc
+ * - entries added for call credentials
+ * Implementations must always log grpc-trace-bin if it is present.
+ * Practically speaking it will only be visible on server side because
+ * grpc-trace-bin is managed by low level client side mechanisms
+ * inaccessible from the application level. On server side, the
+ * header is just a normal metadata key.
+ * The pair will not count towards the size limit.
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.Metadata}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.Metadata)
+ io.grpc.binarylog.v1.MetadataOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Metadata_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Metadata_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Metadata.class, io.grpc.binarylog.v1.Metadata.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.Metadata.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ getEntryFieldBuilder();
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ if (entryBuilder_ == null) {
+ entry_ = java.util.Collections.emptyList();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ } else {
+ entryBuilder_.clear();
+ }
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Metadata_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.Metadata getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.Metadata.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.Metadata build() {
+ io.grpc.binarylog.v1.Metadata result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.Metadata buildPartial() {
+ io.grpc.binarylog.v1.Metadata result = new io.grpc.binarylog.v1.Metadata(this);
+ int from_bitField0_ = bitField0_;
+ if (entryBuilder_ == null) {
+ if (((bitField0_ & 0x00000001) == 0x00000001)) {
+ entry_ = java.util.Collections.unmodifiableList(entry_);
+ bitField0_ = (bitField0_ & ~0x00000001);
+ }
+ result.entry_ = entry_;
+ } else {
+ result.entry_ = entryBuilder_.build();
+ }
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.Metadata) {
+ return mergeFrom((io.grpc.binarylog.v1.Metadata)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.Metadata other) {
+ if (other == io.grpc.binarylog.v1.Metadata.getDefaultInstance()) return this;
+ if (entryBuilder_ == null) {
+ if (!other.entry_.isEmpty()) {
+ if (entry_.isEmpty()) {
+ entry_ = other.entry_;
+ bitField0_ = (bitField0_ & ~0x00000001);
+ } else {
+ ensureEntryIsMutable();
+ entry_.addAll(other.entry_);
+ }
+ onChanged();
+ }
+ } else {
+ if (!other.entry_.isEmpty()) {
+ if (entryBuilder_.isEmpty()) {
+ entryBuilder_.dispose();
+ entryBuilder_ = null;
+ entry_ = other.entry_;
+ bitField0_ = (bitField0_ & ~0x00000001);
+ entryBuilder_ =
+ com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+ getEntryFieldBuilder() : null;
+ } else {
+ entryBuilder_.addAllMessages(other.entry_);
+ }
+ }
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.Metadata parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.Metadata) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+ private int bitField0_;
+
+ private java.util.List<io.grpc.binarylog.v1.MetadataEntry> entry_ =
+ java.util.Collections.emptyList();
+ private void ensureEntryIsMutable() {
+ if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+ entry_ = new java.util.ArrayList<io.grpc.binarylog.v1.MetadataEntry>(entry_);
+ bitField0_ |= 0x00000001;
+ }
+ }
+
+ private com.google.protobuf.RepeatedFieldBuilderV3<
+ io.grpc.binarylog.v1.MetadataEntry, io.grpc.binarylog.v1.MetadataEntry.Builder, io.grpc.binarylog.v1.MetadataEntryOrBuilder> entryBuilder_;
+
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public java.util.List<io.grpc.binarylog.v1.MetadataEntry> getEntryList() {
+ if (entryBuilder_ == null) {
+ return java.util.Collections.unmodifiableList(entry_);
+ } else {
+ return entryBuilder_.getMessageList();
+ }
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public int getEntryCount() {
+ if (entryBuilder_ == null) {
+ return entry_.size();
+ } else {
+ return entryBuilder_.getCount();
+ }
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntry getEntry(int index) {
+ if (entryBuilder_ == null) {
+ return entry_.get(index);
+ } else {
+ return entryBuilder_.getMessage(index);
+ }
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder setEntry(
+ int index, io.grpc.binarylog.v1.MetadataEntry value) {
+ if (entryBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ ensureEntryIsMutable();
+ entry_.set(index, value);
+ onChanged();
+ } else {
+ entryBuilder_.setMessage(index, value);
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder setEntry(
+ int index, io.grpc.binarylog.v1.MetadataEntry.Builder builderForValue) {
+ if (entryBuilder_ == null) {
+ ensureEntryIsMutable();
+ entry_.set(index, builderForValue.build());
+ onChanged();
+ } else {
+ entryBuilder_.setMessage(index, builderForValue.build());
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder addEntry(io.grpc.binarylog.v1.MetadataEntry value) {
+ if (entryBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ ensureEntryIsMutable();
+ entry_.add(value);
+ onChanged();
+ } else {
+ entryBuilder_.addMessage(value);
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder addEntry(
+ int index, io.grpc.binarylog.v1.MetadataEntry value) {
+ if (entryBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ ensureEntryIsMutable();
+ entry_.add(index, value);
+ onChanged();
+ } else {
+ entryBuilder_.addMessage(index, value);
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder addEntry(
+ io.grpc.binarylog.v1.MetadataEntry.Builder builderForValue) {
+ if (entryBuilder_ == null) {
+ ensureEntryIsMutable();
+ entry_.add(builderForValue.build());
+ onChanged();
+ } else {
+ entryBuilder_.addMessage(builderForValue.build());
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder addEntry(
+ int index, io.grpc.binarylog.v1.MetadataEntry.Builder builderForValue) {
+ if (entryBuilder_ == null) {
+ ensureEntryIsMutable();
+ entry_.add(index, builderForValue.build());
+ onChanged();
+ } else {
+ entryBuilder_.addMessage(index, builderForValue.build());
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder addAllEntry(
+ java.lang.Iterable<? extends io.grpc.binarylog.v1.MetadataEntry> values) {
+ if (entryBuilder_ == null) {
+ ensureEntryIsMutable();
+ com.google.protobuf.AbstractMessageLite.Builder.addAll(
+ values, entry_);
+ onChanged();
+ } else {
+ entryBuilder_.addAllMessages(values);
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder clearEntry() {
+ if (entryBuilder_ == null) {
+ entry_ = java.util.Collections.emptyList();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ onChanged();
+ } else {
+ entryBuilder_.clear();
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public Builder removeEntry(int index) {
+ if (entryBuilder_ == null) {
+ ensureEntryIsMutable();
+ entry_.remove(index);
+ onChanged();
+ } else {
+ entryBuilder_.remove(index);
+ }
+ return this;
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntry.Builder getEntryBuilder(
+ int index) {
+ return getEntryFieldBuilder().getBuilder(index);
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntryOrBuilder getEntryOrBuilder(
+ int index) {
+ if (entryBuilder_ == null) {
+ return entry_.get(index); } else {
+ return entryBuilder_.getMessageOrBuilder(index);
+ }
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public java.util.List<? extends io.grpc.binarylog.v1.MetadataEntryOrBuilder>
+ getEntryOrBuilderList() {
+ if (entryBuilder_ != null) {
+ return entryBuilder_.getMessageOrBuilderList();
+ } else {
+ return java.util.Collections.unmodifiableList(entry_);
+ }
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntry.Builder addEntryBuilder() {
+ return getEntryFieldBuilder().addBuilder(
+ io.grpc.binarylog.v1.MetadataEntry.getDefaultInstance());
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataEntry.Builder addEntryBuilder(
+ int index) {
+ return getEntryFieldBuilder().addBuilder(
+ index, io.grpc.binarylog.v1.MetadataEntry.getDefaultInstance());
+ }
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ public java.util.List<io.grpc.binarylog.v1.MetadataEntry.Builder>
+ getEntryBuilderList() {
+ return getEntryFieldBuilder().getBuilderList();
+ }
+ private com.google.protobuf.RepeatedFieldBuilderV3<
+ io.grpc.binarylog.v1.MetadataEntry, io.grpc.binarylog.v1.MetadataEntry.Builder, io.grpc.binarylog.v1.MetadataEntryOrBuilder>
+ getEntryFieldBuilder() {
+ if (entryBuilder_ == null) {
+ entryBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+ io.grpc.binarylog.v1.MetadataEntry, io.grpc.binarylog.v1.MetadataEntry.Builder, io.grpc.binarylog.v1.MetadataEntryOrBuilder>(
+ entry_,
+ ((bitField0_ & 0x00000001) == 0x00000001),
+ getParentForChildren(),
+ isClean());
+ entry_ = null;
+ }
+ return entryBuilder_;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.Metadata)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.Metadata)
+ private static final io.grpc.binarylog.v1.Metadata DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.Metadata();
+ }
+
+ public static io.grpc.binarylog.v1.Metadata getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<Metadata>
+ PARSER = new com.google.protobuf.AbstractParser<Metadata>() {
+ public Metadata parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new Metadata(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<Metadata> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<Metadata> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.Metadata getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntry.java b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntry.java
new file mode 100644
index 000000000..ce48266ed
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntry.java
@@ -0,0 +1,585 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * <pre>
+ * A metadata key value pair
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.MetadataEntry}
+ */
+public final class MetadataEntry extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.MetadataEntry)
+ MetadataEntryOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use MetadataEntry.newBuilder() to construct.
+ private MetadataEntry(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private MetadataEntry() {
+ key_ = "";
+ value_ = com.google.protobuf.ByteString.EMPTY;
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private MetadataEntry(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ java.lang.String s = input.readStringRequireUtf8();
+
+ key_ = s;
+ break;
+ }
+ case 18: {
+
+ value_ = input.readBytes();
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_MetadataEntry_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_MetadataEntry_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.MetadataEntry.class, io.grpc.binarylog.v1.MetadataEntry.Builder.class);
+ }
+
+ public static final int KEY_FIELD_NUMBER = 1;
+ private volatile java.lang.Object key_;
+ /**
+ * <code>string key = 1;</code>
+ */
+ public java.lang.String getKey() {
+ java.lang.Object ref = key_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ key_ = s;
+ return s;
+ }
+ }
+ /**
+ * <code>string key = 1;</code>
+ */
+ public com.google.protobuf.ByteString
+ getKeyBytes() {
+ java.lang.Object ref = key_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ key_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int VALUE_FIELD_NUMBER = 2;
+ private com.google.protobuf.ByteString value_;
+ /**
+ * <code>bytes value = 2;</code>
+ */
+ public com.google.protobuf.ByteString getValue() {
+ return value_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (!getKeyBytes().isEmpty()) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 1, key_);
+ }
+ if (!value_.isEmpty()) {
+ output.writeBytes(2, value_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (!getKeyBytes().isEmpty()) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, key_);
+ }
+ if (!value_.isEmpty()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeBytesSize(2, value_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.MetadataEntry)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.MetadataEntry other = (io.grpc.binarylog.v1.MetadataEntry) obj;
+
+ boolean result = true;
+ result = result && getKey()
+ .equals(other.getKey());
+ result = result && getValue()
+ .equals(other.getValue());
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + KEY_FIELD_NUMBER;
+ hash = (53 * hash) + getKey().hashCode();
+ hash = (37 * hash) + VALUE_FIELD_NUMBER;
+ hash = (53 * hash) + getValue().hashCode();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.MetadataEntry parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.MetadataEntry prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * <pre>
+ * A metadata key value pair
+ * </pre>
+ *
+ * Protobuf type {@code grpc.binarylog.v1.MetadataEntry}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.MetadataEntry)
+ io.grpc.binarylog.v1.MetadataEntryOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_MetadataEntry_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_MetadataEntry_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.MetadataEntry.class, io.grpc.binarylog.v1.MetadataEntry.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.MetadataEntry.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ key_ = "";
+
+ value_ = com.google.protobuf.ByteString.EMPTY;
+
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_MetadataEntry_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.MetadataEntry getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.MetadataEntry.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.MetadataEntry build() {
+ io.grpc.binarylog.v1.MetadataEntry result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.MetadataEntry buildPartial() {
+ io.grpc.binarylog.v1.MetadataEntry result = new io.grpc.binarylog.v1.MetadataEntry(this);
+ result.key_ = key_;
+ result.value_ = value_;
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.MetadataEntry) {
+ return mergeFrom((io.grpc.binarylog.v1.MetadataEntry)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.MetadataEntry other) {
+ if (other == io.grpc.binarylog.v1.MetadataEntry.getDefaultInstance()) return this;
+ if (!other.getKey().isEmpty()) {
+ key_ = other.key_;
+ onChanged();
+ }
+ if (other.getValue() != com.google.protobuf.ByteString.EMPTY) {
+ setValue(other.getValue());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.MetadataEntry parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.MetadataEntry) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private java.lang.Object key_ = "";
+ /**
+ * <code>string key = 1;</code>
+ */
+ public java.lang.String getKey() {
+ java.lang.Object ref = key_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ key_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * <code>string key = 1;</code>
+ */
+ public com.google.protobuf.ByteString
+ getKeyBytes() {
+ java.lang.Object ref = key_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ key_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * <code>string key = 1;</code>
+ */
+ public Builder setKey(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ key_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>string key = 1;</code>
+ */
+ public Builder clearKey() {
+
+ key_ = getDefaultInstance().getKey();
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>string key = 1;</code>
+ */
+ public Builder setKeyBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+
+ key_ = value;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY;
+ /**
+ * <code>bytes value = 2;</code>
+ */
+ public com.google.protobuf.ByteString getValue() {
+ return value_;
+ }
+ /**
+ * <code>bytes value = 2;</code>
+ */
+ public Builder setValue(com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ value_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <code>bytes value = 2;</code>
+ */
+ public Builder clearValue() {
+
+ value_ = getDefaultInstance().getValue();
+ onChanged();
+ return this;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.MetadataEntry)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.MetadataEntry)
+ private static final io.grpc.binarylog.v1.MetadataEntry DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.MetadataEntry();
+ }
+
+ public static io.grpc.binarylog.v1.MetadataEntry getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<MetadataEntry>
+ PARSER = new com.google.protobuf.AbstractParser<MetadataEntry>() {
+ public MetadataEntry parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new MetadataEntry(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<MetadataEntry> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<MetadataEntry> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.MetadataEntry getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntryOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntryOrBuilder.java
new file mode 100644
index 000000000..57b6b6f73
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataEntryOrBuilder.java
@@ -0,0 +1,24 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface MetadataEntryOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.MetadataEntry)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <code>string key = 1;</code>
+ */
+ java.lang.String getKey();
+ /**
+ * <code>string key = 1;</code>
+ */
+ com.google.protobuf.ByteString
+ getKeyBytes();
+
+ /**
+ * <code>bytes value = 2;</code>
+ */
+ com.google.protobuf.ByteString getValue();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataOrBuilder.java
new file mode 100644
index 000000000..cd13fb1a6
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/MetadataOrBuilder.java
@@ -0,0 +1,33 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface MetadataOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.Metadata)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ java.util.List<io.grpc.binarylog.v1.MetadataEntry>
+ getEntryList();
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ io.grpc.binarylog.v1.MetadataEntry getEntry(int index);
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ int getEntryCount();
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ java.util.List<? extends io.grpc.binarylog.v1.MetadataEntryOrBuilder>
+ getEntryOrBuilderList();
+ /**
+ * <code>repeated .grpc.binarylog.v1.MetadataEntry entry = 1;</code>
+ */
+ io.grpc.binarylog.v1.MetadataEntryOrBuilder getEntryOrBuilder(
+ int index);
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeader.java b/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeader.java
new file mode 100644
index 000000000..be4477af9
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeader.java
@@ -0,0 +1,618 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * Protobuf type {@code grpc.binarylog.v1.ServerHeader}
+ */
+public final class ServerHeader extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.ServerHeader)
+ ServerHeaderOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use ServerHeader.newBuilder() to construct.
+ private ServerHeader(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private ServerHeader() {
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private ServerHeader(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ io.grpc.binarylog.v1.Metadata.Builder subBuilder = null;
+ if (metadata_ != null) {
+ subBuilder = metadata_.toBuilder();
+ }
+ metadata_ = input.readMessage(io.grpc.binarylog.v1.Metadata.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(metadata_);
+ metadata_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ServerHeader_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ServerHeader_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.ServerHeader.class, io.grpc.binarylog.v1.ServerHeader.Builder.class);
+ }
+
+ public static final int METADATA_FIELD_NUMBER = 1;
+ private io.grpc.binarylog.v1.Metadata metadata_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ return getMetadata();
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (metadata_ != null) {
+ output.writeMessage(1, getMetadata());
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (metadata_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(1, getMetadata());
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.ServerHeader)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.ServerHeader other = (io.grpc.binarylog.v1.ServerHeader) obj;
+
+ boolean result = true;
+ result = result && (hasMetadata() == other.hasMetadata());
+ if (hasMetadata()) {
+ result = result && getMetadata()
+ .equals(other.getMetadata());
+ }
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (hasMetadata()) {
+ hash = (37 * hash) + METADATA_FIELD_NUMBER;
+ hash = (53 * hash) + getMetadata().hashCode();
+ }
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.ServerHeader parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.ServerHeader prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code grpc.binarylog.v1.ServerHeader}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.ServerHeader)
+ io.grpc.binarylog.v1.ServerHeaderOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ServerHeader_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ServerHeader_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.ServerHeader.class, io.grpc.binarylog.v1.ServerHeader.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.ServerHeader.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_ServerHeader_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.ServerHeader getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.ServerHeader.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.ServerHeader build() {
+ io.grpc.binarylog.v1.ServerHeader result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.ServerHeader buildPartial() {
+ io.grpc.binarylog.v1.ServerHeader result = new io.grpc.binarylog.v1.ServerHeader(this);
+ if (metadataBuilder_ == null) {
+ result.metadata_ = metadata_;
+ } else {
+ result.metadata_ = metadataBuilder_.build();
+ }
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.ServerHeader) {
+ return mergeFrom((io.grpc.binarylog.v1.ServerHeader)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.ServerHeader other) {
+ if (other == io.grpc.binarylog.v1.ServerHeader.getDefaultInstance()) return this;
+ if (other.hasMetadata()) {
+ mergeMetadata(other.getMetadata());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.ServerHeader parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.ServerHeader) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private io.grpc.binarylog.v1.Metadata metadata_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder> metadataBuilder_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadataBuilder_ != null || metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ if (metadataBuilder_ == null) {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ } else {
+ return metadataBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ metadata_ = value;
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(
+ io.grpc.binarylog.v1.Metadata.Builder builderForValue) {
+ if (metadataBuilder_ == null) {
+ metadata_ = builderForValue.build();
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder mergeMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (metadata_ != null) {
+ metadata_ =
+ io.grpc.binarylog.v1.Metadata.newBuilder(metadata_).mergeFrom(value).buildPartial();
+ } else {
+ metadata_ = value;
+ }
+ onChanged();
+ } else {
+ metadataBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder clearMetadata() {
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ onChanged();
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata.Builder getMetadataBuilder() {
+
+ onChanged();
+ return getMetadataFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ if (metadataBuilder_ != null) {
+ return metadataBuilder_.getMessageOrBuilder();
+ } else {
+ return metadata_ == null ?
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>
+ getMetadataFieldBuilder() {
+ if (metadataBuilder_ == null) {
+ metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>(
+ getMetadata(),
+ getParentForChildren(),
+ isClean());
+ metadata_ = null;
+ }
+ return metadataBuilder_;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.ServerHeader)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.ServerHeader)
+ private static final io.grpc.binarylog.v1.ServerHeader DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.ServerHeader();
+ }
+
+ public static io.grpc.binarylog.v1.ServerHeader getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<ServerHeader>
+ PARSER = new com.google.protobuf.AbstractParser<ServerHeader>() {
+ public ServerHeader parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new ServerHeader(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<ServerHeader> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<ServerHeader> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.ServerHeader getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeaderOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeaderOrBuilder.java
new file mode 100644
index 000000000..077748ba0
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/ServerHeaderOrBuilder.java
@@ -0,0 +1,34 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface ServerHeaderOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.ServerHeader)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ boolean hasMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.Metadata getMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder();
+}
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/Trailer.java b/services/src/generated/main/java/io/grpc/binarylog/v1/Trailer.java
new file mode 100644
index 000000000..270265f0f
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/Trailer.java
@@ -0,0 +1,935 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+/**
+ * Protobuf type {@code grpc.binarylog.v1.Trailer}
+ */
+public final class Trailer extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:grpc.binarylog.v1.Trailer)
+ TrailerOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use Trailer.newBuilder() to construct.
+ private Trailer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+ super(builder);
+ }
+ private Trailer() {
+ statusCode_ = 0;
+ statusMessage_ = "";
+ statusDetails_ = com.google.protobuf.ByteString.EMPTY;
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private Trailer(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownFieldProto3(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ case 10: {
+ io.grpc.binarylog.v1.Metadata.Builder subBuilder = null;
+ if (metadata_ != null) {
+ subBuilder = metadata_.toBuilder();
+ }
+ metadata_ = input.readMessage(io.grpc.binarylog.v1.Metadata.parser(), extensionRegistry);
+ if (subBuilder != null) {
+ subBuilder.mergeFrom(metadata_);
+ metadata_ = subBuilder.buildPartial();
+ }
+
+ break;
+ }
+ case 16: {
+
+ statusCode_ = input.readUInt32();
+ break;
+ }
+ case 26: {
+ java.lang.String s = input.readStringRequireUtf8();
+
+ statusMessage_ = s;
+ break;
+ }
+ case 34: {
+
+ statusDetails_ = input.readBytes();
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Trailer_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Trailer_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Trailer.class, io.grpc.binarylog.v1.Trailer.Builder.class);
+ }
+
+ public static final int METADATA_FIELD_NUMBER = 1;
+ private io.grpc.binarylog.v1.Metadata metadata_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ return getMetadata();
+ }
+
+ public static final int STATUS_CODE_FIELD_NUMBER = 2;
+ private int statusCode_;
+ /**
+ * <pre>
+ * The gRPC status code.
+ * </pre>
+ *
+ * <code>uint32 status_code = 2;</code>
+ */
+ public int getStatusCode() {
+ return statusCode_;
+ }
+
+ public static final int STATUS_MESSAGE_FIELD_NUMBER = 3;
+ private volatile java.lang.Object statusMessage_;
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public java.lang.String getStatusMessage() {
+ java.lang.Object ref = statusMessage_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ statusMessage_ = s;
+ return s;
+ }
+ }
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public com.google.protobuf.ByteString
+ getStatusMessageBytes() {
+ java.lang.Object ref = statusMessage_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ statusMessage_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int STATUS_DETAILS_FIELD_NUMBER = 4;
+ private com.google.protobuf.ByteString statusDetails_;
+ /**
+ * <pre>
+ * The value of the 'grpc-status-details-bin' metadata key. If
+ * present, this is always an encoded 'google.rpc.Status' message.
+ * </pre>
+ *
+ * <code>bytes status_details = 4;</code>
+ */
+ public com.google.protobuf.ByteString getStatusDetails() {
+ return statusDetails_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (metadata_ != null) {
+ output.writeMessage(1, getMetadata());
+ }
+ if (statusCode_ != 0) {
+ output.writeUInt32(2, statusCode_);
+ }
+ if (!getStatusMessageBytes().isEmpty()) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 3, statusMessage_);
+ }
+ if (!statusDetails_.isEmpty()) {
+ output.writeBytes(4, statusDetails_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (metadata_ != null) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(1, getMetadata());
+ }
+ if (statusCode_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(2, statusCode_);
+ }
+ if (!getStatusMessageBytes().isEmpty()) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, statusMessage_);
+ }
+ if (!statusDetails_.isEmpty()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeBytesSize(4, statusDetails_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof io.grpc.binarylog.v1.Trailer)) {
+ return super.equals(obj);
+ }
+ io.grpc.binarylog.v1.Trailer other = (io.grpc.binarylog.v1.Trailer) obj;
+
+ boolean result = true;
+ result = result && (hasMetadata() == other.hasMetadata());
+ if (hasMetadata()) {
+ result = result && getMetadata()
+ .equals(other.getMetadata());
+ }
+ result = result && (getStatusCode()
+ == other.getStatusCode());
+ result = result && getStatusMessage()
+ .equals(other.getStatusMessage());
+ result = result && getStatusDetails()
+ .equals(other.getStatusDetails());
+ result = result && unknownFields.equals(other.unknownFields);
+ return result;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (hasMetadata()) {
+ hash = (37 * hash) + METADATA_FIELD_NUMBER;
+ hash = (53 * hash) + getMetadata().hashCode();
+ }
+ hash = (37 * hash) + STATUS_CODE_FIELD_NUMBER;
+ hash = (53 * hash) + getStatusCode();
+ hash = (37 * hash) + STATUS_MESSAGE_FIELD_NUMBER;
+ hash = (53 * hash) + getStatusMessage().hashCode();
+ hash = (37 * hash) + STATUS_DETAILS_FIELD_NUMBER;
+ hash = (53 * hash) + getStatusDetails().hashCode();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static io.grpc.binarylog.v1.Trailer parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(io.grpc.binarylog.v1.Trailer prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code grpc.binarylog.v1.Trailer}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+ // @@protoc_insertion_point(builder_implements:grpc.binarylog.v1.Trailer)
+ io.grpc.binarylog.v1.TrailerOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Trailer_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Trailer_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ io.grpc.binarylog.v1.Trailer.class, io.grpc.binarylog.v1.Trailer.Builder.class);
+ }
+
+ // Construct using io.grpc.binarylog.v1.Trailer.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ public Builder clear() {
+ super.clear();
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+ statusCode_ = 0;
+
+ statusMessage_ = "";
+
+ statusDetails_ = com.google.protobuf.ByteString.EMPTY;
+
+ return this;
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return io.grpc.binarylog.v1.BinaryLogProto.internal_static_grpc_binarylog_v1_Trailer_descriptor;
+ }
+
+ public io.grpc.binarylog.v1.Trailer getDefaultInstanceForType() {
+ return io.grpc.binarylog.v1.Trailer.getDefaultInstance();
+ }
+
+ public io.grpc.binarylog.v1.Trailer build() {
+ io.grpc.binarylog.v1.Trailer result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ public io.grpc.binarylog.v1.Trailer buildPartial() {
+ io.grpc.binarylog.v1.Trailer result = new io.grpc.binarylog.v1.Trailer(this);
+ if (metadataBuilder_ == null) {
+ result.metadata_ = metadata_;
+ } else {
+ result.metadata_ = metadataBuilder_.build();
+ }
+ result.statusCode_ = statusCode_;
+ result.statusMessage_ = statusMessage_;
+ result.statusDetails_ = statusDetails_;
+ onBuilt();
+ return result;
+ }
+
+ public Builder clone() {
+ return (Builder) super.clone();
+ }
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.setField(field, value);
+ }
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return (Builder) super.clearField(field);
+ }
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return (Builder) super.clearOneof(oneof);
+ }
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return (Builder) super.setRepeatedField(field, index, value);
+ }
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return (Builder) super.addRepeatedField(field, value);
+ }
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof io.grpc.binarylog.v1.Trailer) {
+ return mergeFrom((io.grpc.binarylog.v1.Trailer)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(io.grpc.binarylog.v1.Trailer other) {
+ if (other == io.grpc.binarylog.v1.Trailer.getDefaultInstance()) return this;
+ if (other.hasMetadata()) {
+ mergeMetadata(other.getMetadata());
+ }
+ if (other.getStatusCode() != 0) {
+ setStatusCode(other.getStatusCode());
+ }
+ if (!other.getStatusMessage().isEmpty()) {
+ statusMessage_ = other.statusMessage_;
+ onChanged();
+ }
+ if (other.getStatusDetails() != com.google.protobuf.ByteString.EMPTY) {
+ setStatusDetails(other.getStatusDetails());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ io.grpc.binarylog.v1.Trailer parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (io.grpc.binarylog.v1.Trailer) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private io.grpc.binarylog.v1.Metadata metadata_ = null;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder> metadataBuilder_;
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public boolean hasMetadata() {
+ return metadataBuilder_ != null || metadata_ != null;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata getMetadata() {
+ if (metadataBuilder_ == null) {
+ return metadata_ == null ? io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ } else {
+ return metadataBuilder_.getMessage();
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ metadata_ = value;
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder setMetadata(
+ io.grpc.binarylog.v1.Metadata.Builder builderForValue) {
+ if (metadataBuilder_ == null) {
+ metadata_ = builderForValue.build();
+ onChanged();
+ } else {
+ metadataBuilder_.setMessage(builderForValue.build());
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder mergeMetadata(io.grpc.binarylog.v1.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (metadata_ != null) {
+ metadata_ =
+ io.grpc.binarylog.v1.Metadata.newBuilder(metadata_).mergeFrom(value).buildPartial();
+ } else {
+ metadata_ = value;
+ }
+ onChanged();
+ } else {
+ metadataBuilder_.mergeFrom(value);
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public Builder clearMetadata() {
+ if (metadataBuilder_ == null) {
+ metadata_ = null;
+ onChanged();
+ } else {
+ metadata_ = null;
+ metadataBuilder_ = null;
+ }
+
+ return this;
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.Metadata.Builder getMetadataBuilder() {
+
+ onChanged();
+ return getMetadataFieldBuilder().getBuilder();
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ public io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder() {
+ if (metadataBuilder_ != null) {
+ return metadataBuilder_.getMessageOrBuilder();
+ } else {
+ return metadata_ == null ?
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance() : metadata_;
+ }
+ }
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>
+ getMetadataFieldBuilder() {
+ if (metadataBuilder_ == null) {
+ metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ io.grpc.binarylog.v1.Metadata, io.grpc.binarylog.v1.Metadata.Builder, io.grpc.binarylog.v1.MetadataOrBuilder>(
+ getMetadata(),
+ getParentForChildren(),
+ isClean());
+ metadata_ = null;
+ }
+ return metadataBuilder_;
+ }
+
+ private int statusCode_ ;
+ /**
+ * <pre>
+ * The gRPC status code.
+ * </pre>
+ *
+ * <code>uint32 status_code = 2;</code>
+ */
+ public int getStatusCode() {
+ return statusCode_;
+ }
+ /**
+ * <pre>
+ * The gRPC status code.
+ * </pre>
+ *
+ * <code>uint32 status_code = 2;</code>
+ */
+ public Builder setStatusCode(int value) {
+
+ statusCode_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * The gRPC status code.
+ * </pre>
+ *
+ * <code>uint32 status_code = 2;</code>
+ */
+ public Builder clearStatusCode() {
+
+ statusCode_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private java.lang.Object statusMessage_ = "";
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public java.lang.String getStatusMessage() {
+ java.lang.Object ref = statusMessage_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ statusMessage_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public com.google.protobuf.ByteString
+ getStatusMessageBytes() {
+ java.lang.Object ref = statusMessage_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ statusMessage_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public Builder setStatusMessage(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ statusMessage_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public Builder clearStatusMessage() {
+
+ statusMessage_ = getDefaultInstance().getStatusMessage();
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ public Builder setStatusMessageBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+
+ statusMessage_ = value;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.ByteString statusDetails_ = com.google.protobuf.ByteString.EMPTY;
+ /**
+ * <pre>
+ * The value of the 'grpc-status-details-bin' metadata key. If
+ * present, this is always an encoded 'google.rpc.Status' message.
+ * </pre>
+ *
+ * <code>bytes status_details = 4;</code>
+ */
+ public com.google.protobuf.ByteString getStatusDetails() {
+ return statusDetails_;
+ }
+ /**
+ * <pre>
+ * The value of the 'grpc-status-details-bin' metadata key. If
+ * present, this is always an encoded 'google.rpc.Status' message.
+ * </pre>
+ *
+ * <code>bytes status_details = 4;</code>
+ */
+ public Builder setStatusDetails(com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+
+ statusDetails_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * <pre>
+ * The value of the 'grpc-status-details-bin' metadata key. If
+ * present, this is always an encoded 'google.rpc.Status' message.
+ * </pre>
+ *
+ * <code>bytes status_details = 4;</code>
+ */
+ public Builder clearStatusDetails() {
+
+ statusDetails_ = getDefaultInstance().getStatusDetails();
+ onChanged();
+ return this;
+ }
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFieldsProto3(unknownFields);
+ }
+
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:grpc.binarylog.v1.Trailer)
+ }
+
+ // @@protoc_insertion_point(class_scope:grpc.binarylog.v1.Trailer)
+ private static final io.grpc.binarylog.v1.Trailer DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new io.grpc.binarylog.v1.Trailer();
+ }
+
+ public static io.grpc.binarylog.v1.Trailer getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser<Trailer>
+ PARSER = new com.google.protobuf.AbstractParser<Trailer>() {
+ public Trailer parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new Trailer(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser<Trailer> parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser<Trailer> getParserForType() {
+ return PARSER;
+ }
+
+ public io.grpc.binarylog.v1.Trailer getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/services/src/generated/main/java/io/grpc/binarylog/v1/TrailerOrBuilder.java b/services/src/generated/main/java/io/grpc/binarylog/v1/TrailerOrBuilder.java
new file mode 100644
index 000000000..359e63d22
--- /dev/null
+++ b/services/src/generated/main/java/io/grpc/binarylog/v1/TrailerOrBuilder.java
@@ -0,0 +1,73 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: grpc/binlog/v1/binarylog.proto
+
+package io.grpc.binarylog.v1;
+
+public interface TrailerOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:grpc.binarylog.v1.Trailer)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ boolean hasMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.Metadata getMetadata();
+ /**
+ * <pre>
+ * This contains only the metadata from the application.
+ * </pre>
+ *
+ * <code>.grpc.binarylog.v1.Metadata metadata = 1;</code>
+ */
+ io.grpc.binarylog.v1.MetadataOrBuilder getMetadataOrBuilder();
+
+ /**
+ * <pre>
+ * The gRPC status code.
+ * </pre>
+ *
+ * <code>uint32 status_code = 2;</code>
+ */
+ int getStatusCode();
+
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ java.lang.String getStatusMessage();
+ /**
+ * <pre>
+ * An original status message before any transport specific
+ * encoding.
+ * </pre>
+ *
+ * <code>string status_message = 3;</code>
+ */
+ com.google.protobuf.ByteString
+ getStatusMessageBytes();
+
+ /**
+ * <pre>
+ * The value of the 'grpc-status-details-bin' metadata key. If
+ * present, this is always an encoded 'google.rpc.Status' message.
+ * </pre>
+ *
+ * <code>bytes status_details = 4;</code>
+ */
+ com.google.protobuf.ByteString getStatusDetails();
+}
diff --git a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
index efe312cad..cfb969b49 100644
--- a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
+++ b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
@@ -97,6 +97,14 @@ private static final long serialVersionUID = 0L;
* <code>NOT_SERVING = 2;</code>
*/
NOT_SERVING(2),
+ /**
+ * <pre>
+ * Used only by the Watch method.
+ * </pre>
+ *
+ * <code>SERVICE_UNKNOWN = 3;</code>
+ */
+ SERVICE_UNKNOWN(3),
UNRECOGNIZED(-1),
;
@@ -112,6 +120,14 @@ private static final long serialVersionUID = 0L;
* <code>NOT_SERVING = 2;</code>
*/
public static final int NOT_SERVING_VALUE = 2;
+ /**
+ * <pre>
+ * Used only by the Watch method.
+ * </pre>
+ *
+ * <code>SERVICE_UNKNOWN = 3;</code>
+ */
+ public static final int SERVICE_UNKNOWN_VALUE = 3;
public final int getNumber() {
@@ -135,6 +151,7 @@ private static final long serialVersionUID = 0L;
case 0: return UNKNOWN;
case 1: return SERVING;
case 2: return NOT_SERVING;
+ case 3: return SERVICE_UNKNOWN;
default: return null;
}
}
diff --git a/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java b/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
index ce0d1bde1..8329cbea5 100644
--- a/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
+++ b/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
@@ -35,14 +35,18 @@ public final class HealthProto {
java.lang.String[] descriptorData = {
"\n\033grpc/health/v1/health.proto\022\016grpc.heal" +
"th.v1\"%\n\022HealthCheckRequest\022\017\n\007service\030\001" +
- " \001(\t\"\224\001\n\023HealthCheckResponse\022A\n\006status\030\001" +
+ " \001(\t\"\251\001\n\023HealthCheckResponse\022A\n\006status\030\001" +
" \001(\01621.grpc.health.v1.HealthCheckRespons" +
- "e.ServingStatus\":\n\rServingStatus\022\013\n\007UNKN" +
- "OWN\020\000\022\013\n\007SERVING\020\001\022\017\n\013NOT_SERVING\020\0022Z\n\006H" +
- "ealth\022P\n\005Check\022\".grpc.health.v1.HealthCh" +
- "eckRequest\032#.grpc.health.v1.HealthCheckR" +
- "esponseB3\n\021io.grpc.health.v1B\013HealthProt" +
- "oP\001\252\002\016Grpc.Health.V1b\006proto3"
+ "e.ServingStatus\"O\n\rServingStatus\022\013\n\007UNKN" +
+ "OWN\020\000\022\013\n\007SERVING\020\001\022\017\n\013NOT_SERVING\020\002\022\023\n\017S" +
+ "ERVICE_UNKNOWN\020\0032\256\001\n\006Health\022P\n\005Check\022\".g" +
+ "rpc.health.v1.HealthCheckRequest\032#.grpc." +
+ "health.v1.HealthCheckResponse\022R\n\005Watch\022\"" +
+ ".grpc.health.v1.HealthCheckRequest\032#.grp" +
+ "c.health.v1.HealthCheckResponse0\001Ba\n\021io." +
+ "grpc.health.v1B\013HealthProtoP\001Z,google.go" +
+ "lang.org/grpc/health/grpc_health_v1\252\002\016Gr" +
+ "pc.Health.V1b\006proto3"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
diff --git a/services/src/main/java/io/grpc/services/BinaryLogProviderImpl.java b/services/src/main/java/io/grpc/services/BinaryLogProviderImpl.java
index 420281360..dee13a924 100644
--- a/services/src/main/java/io/grpc/services/BinaryLogProviderImpl.java
+++ b/services/src/main/java/io/grpc/services/BinaryLogProviderImpl.java
@@ -28,14 +28,20 @@ import javax.annotation.Nullable;
* The default implementation of a {@link BinaryLogProvider}.
*/
class BinaryLogProviderImpl extends BinaryLogProvider {
+ // avoid using 0 because proto3 long fields default to 0 when unset
+ private static final AtomicLong counter = new AtomicLong(1);
+
private final BinlogHelper.Factory factory;
private final BinaryLogSink sink;
- private final AtomicLong counter = new AtomicLong();
public BinaryLogProviderImpl() throws IOException {
this(new TempFileSink(), System.getenv("GRPC_BINARY_LOG_CONFIG"));
}
+ /**
+ * Deprecated and will be removed in a future version of gRPC.
+ */
+ @Deprecated
public BinaryLogProviderImpl(BinaryLogSink sink) throws IOException {
this(sink, System.getenv("GRPC_BINARY_LOG_CONFIG"));
}
@@ -46,7 +52,7 @@ class BinaryLogProviderImpl extends BinaryLogProvider {
* @param configStr config string to parse to determine logged methods and msg size limits.
* @throws IOException if initialization failed.
*/
- BinaryLogProviderImpl(BinaryLogSink sink, String configStr) throws IOException {
+ public BinaryLogProviderImpl(BinaryLogSink sink, String configStr) throws IOException {
this.sink = Preconditions.checkNotNull(sink);
try {
factory = new BinlogHelper.FactoryImpl(sink, configStr);
@@ -65,7 +71,7 @@ class BinaryLogProviderImpl extends BinaryLogProvider {
if (helperForMethod == null) {
return null;
}
- return helperForMethod.getServerInterceptor(getServerCallId());
+ return helperForMethod.getServerInterceptor(counter.getAndIncrement());
}
@Nullable
@@ -76,19 +82,11 @@ class BinaryLogProviderImpl extends BinaryLogProvider {
if (helperForMethod == null) {
return null;
}
- return helperForMethod.getClientInterceptor(getClientCallId(callOptions));
+ return helperForMethod.getClientInterceptor(counter.getAndIncrement());
}
@Override
public void close() throws IOException {
sink.close();
}
-
- protected CallId getServerCallId() {
- return new CallId(0, counter.getAndIncrement());
- }
-
- protected CallId getClientCallId(CallOptions options) {
- return new CallId(0, counter.getAndIncrement());
- }
}
diff --git a/services/src/main/java/io/grpc/services/BinaryLogs.java b/services/src/main/java/io/grpc/services/BinaryLogs.java
index de7f79116..fc2d8d84a 100644
--- a/services/src/main/java/io/grpc/services/BinaryLogs.java
+++ b/services/src/main/java/io/grpc/services/BinaryLogs.java
@@ -32,11 +32,22 @@ public final class BinaryLogs {
}
/**
- * Creates a binary log with a custom {@link BinaryLogSink} for receiving the logged data.
+ * Deprecated and will be removed in a future version of gRPC.
*/
+ @Deprecated
public static BinaryLog createBinaryLog(BinaryLogSink sink) throws IOException {
return new BinaryLogProviderImpl(sink);
}
+ /**
+ * Creates a binary log with a custom {@link BinaryLogSink} for receiving the logged data,
+ * and a config string as defined by
+ * <a href="https://github.com/grpc/proposal/blob/master/A16-binary-logging.md">
+ * A16-binary-logging</a>.
+ */
+ public static BinaryLog createBinaryLog(BinaryLogSink sink, String configStr) throws IOException {
+ return new BinaryLogProviderImpl(sink, configStr);
+ }
+
private BinaryLogs() {}
}
diff --git a/services/src/main/java/io/grpc/services/BinlogHelper.java b/services/src/main/java/io/grpc/services/BinlogHelper.java
index 260016756..ecdcc8630 100644
--- a/services/src/main/java/io/grpc/services/BinlogHelper.java
+++ b/services/src/main/java/io/grpc/services/BinlogHelper.java
@@ -18,18 +18,20 @@ package io.grpc.services;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
import static io.grpc.services.BinaryLogProvider.BYTEARRAY_MARSHALLER;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Charsets;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.protobuf.ByteString;
import com.google.protobuf.Duration;
import com.google.protobuf.util.Durations;
+import com.google.protobuf.util.Timestamps;
import com.google.re2j.Matcher;
import com.google.re2j.Pattern;
import io.grpc.Attributes;
-import io.grpc.BinaryLog.CallId;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
@@ -50,14 +52,12 @@ import io.grpc.ServerCall.Listener;
import io.grpc.ServerCallHandler;
import io.grpc.ServerInterceptor;
import io.grpc.Status;
-import io.grpc.binarylog.v1alpha.GrpcLogEntry;
-import io.grpc.binarylog.v1alpha.GrpcLogEntry.Type;
-import io.grpc.binarylog.v1alpha.Message;
-import io.grpc.binarylog.v1alpha.Metadata.Builder;
-import io.grpc.binarylog.v1alpha.Peer;
-import io.grpc.binarylog.v1alpha.Peer.PeerType;
-import io.grpc.binarylog.v1alpha.Uint128;
-import io.grpc.internal.GrpcUtil;
+import io.grpc.binarylog.v1.Address;
+import io.grpc.binarylog.v1.Address.Type;
+import io.grpc.binarylog.v1.GrpcLogEntry;
+import io.grpc.binarylog.v1.GrpcLogEntry.EventType;
+import io.grpc.binarylog.v1.Message;
+import io.grpc.binarylog.v1.Message.Builder;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -69,7 +69,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;
@@ -81,8 +81,6 @@ import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
final class BinlogHelper {
private static final Logger logger = Logger.getLogger(BinlogHelper.class.getName());
- private static final boolean SERVER = true;
- private static final boolean CLIENT = false;
// Normally 'grpc-' metadata keys are set from within gRPC, and applications are not allowed
// to set them. This key is a special well known key that set from the application layer, but
// represents a com.google.rpc.Status and is given special first class treatment.
@@ -93,11 +91,6 @@ final class BinlogHelper {
Metadata.BINARY_BYTE_MARSHALLER);
@VisibleForTesting
- static final SocketAddress DUMMY_SOCKET = new DummySocketAddress();
- @VisibleForTesting
- static final boolean DUMMY_IS_COMPRESSED = false;
-
- @VisibleForTesting
final SinkWriter writer;
@VisibleForTesting
@@ -108,134 +101,191 @@ final class BinlogHelper {
// TODO(zpencer): move proto related static helpers into this class
static final class SinkWriterImpl extends SinkWriter {
private final BinaryLogSink sink;
+ private TimeProvider timeProvider;
private final int maxHeaderBytes;
private final int maxMessageBytes;
- SinkWriterImpl(BinaryLogSink sink, int maxHeaderBytes, int maxMessageBytes) {
+ private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
+
+ SinkWriterImpl(
+ BinaryLogSink sink,
+ TimeProvider timeProvider,
+ int maxHeaderBytes,
+ int maxMessageBytes) {
this.sink = sink;
+ this.timeProvider = timeProvider;
this.maxHeaderBytes = maxHeaderBytes;
this.maxMessageBytes = maxMessageBytes;
}
+ GrpcLogEntry.Builder newTimestampedBuilder() {
+ long epochNanos = timeProvider.currentTimeNanos();
+ return GrpcLogEntry.newBuilder().setTimestamp(Timestamps.fromNanos(epochNanos));
+ }
+
@Override
- void logSendInitialMetadata(
- int seq,
- @Nullable String methodName, // null on server
- @Nullable Duration timeout, // null on server
+ void logClientHeader(
+ long seq,
+ String methodName,
+ // not all transports have the concept of authority
+ @Nullable String authority,
+ @Nullable Duration timeout,
Metadata metadata,
- boolean isServer,
- CallId callId) {
- Preconditions.checkArgument(methodName == null || !isServer);
- Preconditions.checkArgument(timeout == null || !isServer);
- // Java does not include the leading '/'. To be consistent with the rest of gRPC we must
- // include the '/' in the fully qualified name for binlogs.
- Preconditions.checkArgument(methodName == null || !methodName.startsWith("/"));
- GrpcLogEntry.Builder entryBuilder = GrpcLogEntry.newBuilder()
- .setSequenceIdWithinCall(seq)
- .setType(Type.SEND_INITIAL_METADATA)
- .setLogger(isServer ? GrpcLogEntry.Logger.SERVER : GrpcLogEntry.Logger.CLIENT)
- .setCallId(callIdToProto(callId));
- addMetadataToProto(entryBuilder, metadata, maxHeaderBytes);
- if (methodName != null) {
- entryBuilder.setMethodName("/" + methodName);
- }
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on client side
+ @Nullable SocketAddress peerAddress) {
+ Preconditions.checkArgument(methodName != null, "methodName can not be null");
+ Preconditions.checkArgument(
+ !methodName.startsWith("/"),
+ "in grpc-java method names should not have a leading '/'. However this class will "
+ + "add one to be consistent with language agnostic conventions.");
+ Preconditions.checkArgument(
+ peerAddress == null || logger == GrpcLogEntry.Logger.LOGGER_SERVER,
+ "peerSocket can only be specified for server");
+
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair
+ = createMetadataProto(metadata, maxHeaderBytes);
+ io.grpc.binarylog.v1.ClientHeader.Builder clientHeaderBuilder
+ = io.grpc.binarylog.v1.ClientHeader.newBuilder()
+ .setMetadata(pair.proto)
+ .setMethodName("/" + methodName);
if (timeout != null) {
- entryBuilder.setTimeout(timeout);
+ clientHeaderBuilder.setTimeout(timeout);
+ }
+ if (authority != null) {
+ clientHeaderBuilder.setAuthority(authority);
+ }
+
+ GrpcLogEntry.Builder entryBuilder = newTimestampedBuilder()
+ .setSequenceIdWithinCall(seq)
+ .setType(EventType.EVENT_TYPE_CLIENT_HEADER)
+ .setClientHeader(clientHeaderBuilder)
+ .setPayloadTruncated(pair.truncated)
+ .setLogger(logger)
+ .setCallId(callId);
+ if (peerAddress != null) {
+ entryBuilder.setPeer(socketToProto(peerAddress));
}
sink.write(entryBuilder.build());
}
@Override
- void logRecvInitialMetadata(
- int seq,
- @Nullable String methodName, // null on client
- @Nullable Duration timeout, // null on client
+ void logServerHeader(
+ long seq,
Metadata metadata,
- boolean isServer,
- CallId callId,
- SocketAddress peerSocket) {
- Preconditions.checkArgument(methodName == null || isServer);
- Preconditions.checkArgument(timeout == null || isServer);
- // Java does not include the leading '/'. To be consistent with the rest of gRPC we must
- // include the '/' in the fully qualified name for binlogs.
- Preconditions.checkArgument(methodName == null || !methodName.startsWith("/"));
- GrpcLogEntry.Builder entryBuilder = GrpcLogEntry.newBuilder()
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on server
+ @Nullable SocketAddress peerAddress) {
+ Preconditions.checkArgument(
+ peerAddress == null || logger == GrpcLogEntry.Logger.LOGGER_CLIENT,
+ "peerSocket can only be specified for client");
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair
+ = createMetadataProto(metadata, maxHeaderBytes);
+
+ GrpcLogEntry.Builder entryBuilder = newTimestampedBuilder()
.setSequenceIdWithinCall(seq)
- .setType(Type.RECV_INITIAL_METADATA)
- .setLogger(isServer ? GrpcLogEntry.Logger.SERVER : GrpcLogEntry.Logger.CLIENT)
- .setCallId(callIdToProto(callId))
- .setPeer(socketToProto(peerSocket));
- addMetadataToProto(entryBuilder, metadata, maxHeaderBytes);
- if (methodName != null) {
- entryBuilder.setMethodName("/" + methodName);
- }
- if (timeout != null) {
- entryBuilder.setTimeout(timeout);
+ .setType(EventType.EVENT_TYPE_SERVER_HEADER)
+ .setServerHeader(
+ io.grpc.binarylog.v1.ServerHeader.newBuilder()
+ .setMetadata(pair.proto))
+ .setPayloadTruncated(pair.truncated)
+ .setLogger(logger)
+ .setCallId(callId);
+ if (peerAddress != null) {
+ entryBuilder.setPeer(socketToProto(peerAddress));
}
sink.write(entryBuilder.build());
}
@Override
- void logTrailingMetadata(
- int seq, Status status, Metadata metadata, boolean isServer, CallId callId) {
- GrpcLogEntry.Builder entryBuilder = GrpcLogEntry.newBuilder()
- .setSequenceIdWithinCall(seq)
- .setType(isServer ? Type.SEND_TRAILING_METADATA : Type.RECV_TRAILING_METADATA)
- .setLogger(isServer ? GrpcLogEntry.Logger.SERVER : GrpcLogEntry.Logger.CLIENT)
- .setCallId(callIdToProto(callId))
- .setStatusCode(status.getCode().value());
+ void logTrailer(
+ long seq,
+ Status status,
+ Metadata metadata,
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on server, can be non null on client if this is a trailer-only response
+ @Nullable SocketAddress peerAddress) {
+ Preconditions.checkArgument(
+ peerAddress == null || logger == GrpcLogEntry.Logger.LOGGER_CLIENT,
+ "peerSocket can only be specified for client");
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair
+ = createMetadataProto(metadata, maxHeaderBytes);
+
+ io.grpc.binarylog.v1.Trailer.Builder trailerBuilder
+ = io.grpc.binarylog.v1.Trailer.newBuilder()
+ .setStatusCode(status.getCode().value())
+ .setMetadata(pair.proto);
String statusDescription = status.getDescription();
if (statusDescription != null) {
- entryBuilder.setStatusMessage(statusDescription);
+ trailerBuilder.setStatusMessage(statusDescription);
}
byte[] statusDetailBytes = metadata.get(STATUS_DETAILS_KEY);
if (statusDetailBytes != null) {
- entryBuilder.setStatusDetails(ByteString.copyFrom(statusDetailBytes));
+ trailerBuilder.setStatusDetails(ByteString.copyFrom(statusDetailBytes));
}
- addMetadataToProto(entryBuilder, metadata, maxHeaderBytes);
+ GrpcLogEntry.Builder entryBuilder = newTimestampedBuilder()
+ .setSequenceIdWithinCall(seq)
+ .setType(EventType.EVENT_TYPE_SERVER_TRAILER)
+ .setTrailer(trailerBuilder)
+ .setPayloadTruncated(pair.truncated)
+ .setLogger(logger)
+ .setCallId(callId);
+ if (peerAddress != null) {
+ entryBuilder.setPeer(socketToProto(peerAddress));
+ }
sink.write(entryBuilder.build());
}
@Override
- <T> void logOutboundMessage(
- int seq,
+ <T> void logRpcMessage(
+ long seq,
+ EventType eventType,
Marshaller<T> marshaller,
T message,
- boolean compressed,
- boolean isServer,
- CallId callId) {
+ GrpcLogEntry.Logger logger,
+ long callId) {
+ Preconditions.checkArgument(
+ eventType == EventType.EVENT_TYPE_CLIENT_MESSAGE
+ || eventType == EventType.EVENT_TYPE_SERVER_MESSAGE,
+ "event type must correspond to client message or server message");
if (marshaller != BYTEARRAY_MARSHALLER) {
throw new IllegalStateException("Expected the BinaryLog's ByteArrayMarshaller");
}
- GrpcLogEntry.Builder entryBuilder = GrpcLogEntry.newBuilder()
+ MaybeTruncated<Builder> pair = createMessageProto((byte[]) message, maxMessageBytes);
+ GrpcLogEntry.Builder entryBuilder = newTimestampedBuilder()
.setSequenceIdWithinCall(seq)
- .setType(Type.SEND_MESSAGE)
- .setLogger(isServer ? GrpcLogEntry.Logger.SERVER : GrpcLogEntry.Logger.CLIENT)
- .setCallId(callIdToProto(callId));
- messageToProto(entryBuilder, (byte[]) message, compressed, maxMessageBytes);
+ .setType(eventType)
+ .setMessage(pair.proto)
+ .setPayloadTruncated(pair.truncated)
+ .setLogger(logger)
+ .setCallId(callId);
sink.write(entryBuilder.build());
}
@Override
- <T> void logInboundMessage(
- int seq,
- Marshaller<T> marshaller,
- T message,
- boolean compressed,
- boolean isServer,
- CallId callId) {
- if (marshaller != BYTEARRAY_MARSHALLER) {
- throw new IllegalStateException("Expected the BinaryLog's ByteArrayMarshaller");
- }
- GrpcLogEntry.Builder entryBuilder = GrpcLogEntry.newBuilder()
- .setSequenceIdWithinCall(seq)
- .setType(Type.RECV_MESSAGE)
- .setLogger(isServer ? GrpcLogEntry.Logger.SERVER : GrpcLogEntry.Logger.CLIENT)
- .setCallId(callIdToProto(callId));
+ void logHalfClose(long seq, GrpcLogEntry.Logger logger, long callId) {
+ sink.write(
+ newTimestampedBuilder()
+ .setSequenceIdWithinCall(seq)
+ .setType(EventType.EVENT_TYPE_CLIENT_HALF_CLOSE)
+ .setLogger(logger)
+ .setCallId(callId)
+ .build());
+ }
- messageToProto(entryBuilder, (byte[]) message, compressed, maxMessageBytes);
- sink.write(entryBuilder.build());
+ @Override
+ void logCancel(long seq, GrpcLogEntry.Logger logger, long callId) {
+ sink.write(
+ newTimestampedBuilder()
+ .setSequenceIdWithinCall(seq)
+ .setType(EventType.EVENT_TYPE_CANCEL)
+ .setLogger(logger)
+ .setCallId(callId)
+ .build());
}
@Override
@@ -251,56 +301,64 @@ final class BinlogHelper {
abstract static class SinkWriter {
/**
- * Logs the sending of initial metadata. This method logs the appropriate number of bytes
+ * Logs the client header. This method logs the appropriate number of bytes
* as determined by the binary logging configuration.
*/
- abstract void logSendInitialMetadata(
- int seq,
+ abstract void logClientHeader(
+ long seq,
String methodName,
- Duration timeout,
+ // not all transports have the concept of authority
+ @Nullable String authority,
+ @Nullable Duration timeout,
Metadata metadata,
- boolean isServer,
- CallId callId);
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on client side
+ @Nullable SocketAddress peerAddress);
/**
- * Logs the receiving of initial metadata. This method logs the appropriate number of bytes
+ * Logs the server header. This method logs the appropriate number of bytes
* as determined by the binary logging configuration.
*/
- abstract void logRecvInitialMetadata(
- int seq,
- String methodName,
- Duration timeout,
+ abstract void logServerHeader(
+ long seq,
Metadata metadata,
- boolean isServer,
- CallId callId,
- SocketAddress peerSocket);
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on server
+ @Nullable SocketAddress peerAddress);
/**
- * Logs the trailing metadata. This method logs the appropriate number of bytes
+ * Logs the server trailer. This method logs the appropriate number of bytes
* as determined by the binary logging configuration.
*/
- abstract void logTrailingMetadata(
- int seq, Status status, Metadata metadata, boolean isServer, CallId callId);
+ abstract void logTrailer(
+ long seq,
+ Status status,
+ Metadata metadata,
+ GrpcLogEntry.Logger logger,
+ long callId,
+ // null on server, can be non null on client if this is a trailer-only response
+ @Nullable SocketAddress peerAddress);
/**
- * Logs the outbound message. This method logs the appropriate number of bytes from
- * {@code message}, and returns a duplicate of the message.
- * The number of bytes logged is determined by the binary logging configuration.
- * This method takes ownership of {@code message}.
+ * Logs the message message. The number of bytes logged is determined by the binary
+ * logging configuration.
*/
- abstract <T> void logOutboundMessage(
- int seq, Marshaller<T> marshaller, T message, boolean compressed, boolean isServer,
- CallId callId);
+ abstract <T> void logRpcMessage(
+ long seq,
+ EventType eventType,
+ Marshaller<T> marshaller,
+ T message,
+ GrpcLogEntry.Logger logger,
+ long callId);
+
+ abstract void logHalfClose(long seq, GrpcLogEntry.Logger logger, long callId);
/**
- * Logs the inbound message. This method logs the appropriate number of bytes from
- * {@code message}, and returns a duplicate of the message.
- * The number of bytes logged is determined by the binary logging configuration.
- * This method takes ownership of {@code message}.
+ * Logs the cancellation.
*/
- abstract <T> void logInboundMessage(
- int seq, Marshaller<T> marshaller, T message, boolean compressed, boolean isServer,
- CallId callId);
+ abstract void logCancel(long seq, GrpcLogEntry.Logger logger, long callId);
/**
* Returns the number bytes of the header this writer will log, according to configuration.
@@ -314,11 +372,7 @@ final class BinlogHelper {
}
static SocketAddress getPeerSocket(Attributes streamAttributes) {
- SocketAddress peer = streamAttributes.get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
- if (peer == null) {
- return DUMMY_SOCKET;
- }
- return peer;
+ return streamAttributes.get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
}
private static Deadline min(@Nullable Deadline deadline0, @Nullable Deadline deadline1) {
@@ -331,56 +385,83 @@ final class BinlogHelper {
return deadline0.minimum(deadline1);
}
- public ClientInterceptor getClientInterceptor(final CallId callId) {
+ interface TimeProvider {
+ /** Returns the current nano time. */
+ long currentTimeNanos();
+
+ TimeProvider SYSTEM_TIME_PROVIDER = new TimeProvider() {
+ @Override
+ public long currentTimeNanos() {
+ return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis());
+ }
+ };
+ }
+
+
+ public ClientInterceptor getClientInterceptor(final long callId) {
return new ClientInterceptor() {
+ boolean trailersOnlyResponse = true;
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
final MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
- final AtomicInteger seq = new AtomicInteger(1);
+ final AtomicLong seq = new AtomicLong(1);
final String methodName = method.getFullMethodName();
+ final String authority = next.authority();
// The timeout should reflect the time remaining when the call is started, so do not
// compute remaining time here.
final Deadline deadline = min(callOptions.getDeadline(), Context.current().getDeadline());
return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override
- public void start(Listener<RespT> responseListener, Metadata headers) {
+ public void start(final Listener<RespT> responseListener, Metadata headers) {
final Duration timeout = deadline == null ? null
: Durations.fromNanos(deadline.timeRemaining(TimeUnit.NANOSECONDS));
- writer.logSendInitialMetadata(
- seq.getAndIncrement(), methodName, timeout, headers, CLIENT, callId);
+ writer.logClientHeader(
+ seq.getAndIncrement(),
+ methodName,
+ authority,
+ timeout,
+ headers,
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
+ callId,
+ /*peerAddress=*/ null);
ClientCall.Listener<RespT> wListener =
new SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override
public void onMessage(RespT message) {
- writer.logInboundMessage(
+ writer.logRpcMessage(
seq.getAndIncrement(),
+ EventType.EVENT_TYPE_SERVER_MESSAGE,
method.getResponseMarshaller(),
message,
- DUMMY_IS_COMPRESSED,
- CLIENT,
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
callId);
super.onMessage(message);
}
@Override
public void onHeaders(Metadata headers) {
- SocketAddress peer = getPeerSocket(getAttributes());
- writer.logRecvInitialMetadata(
+ trailersOnlyResponse = false;
+ writer.logServerHeader(
seq.getAndIncrement(),
- /*methodName=*/ null,
- /*timeout=*/ null,
headers,
- CLIENT,
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
callId,
- peer);
+ getPeerSocket(getAttributes()));
super.onHeaders(headers);
}
@Override
public void onClose(Status status, Metadata trailers) {
- writer.logTrailingMetadata(
- seq.getAndIncrement(), status, trailers, CLIENT, callId);
+ SocketAddress peer = trailersOnlyResponse
+ ? getPeerSocket(getAttributes()) : null;
+ writer.logTrailer(
+ seq.getAndIncrement(),
+ status,
+ trailers,
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
+ callId,
+ peer);
super.onClose(status, trailers);
}
};
@@ -389,64 +470,95 @@ final class BinlogHelper {
@Override
public void sendMessage(ReqT message) {
- writer.logOutboundMessage(
+ writer.logRpcMessage(
seq.getAndIncrement(),
+ EventType.EVENT_TYPE_CLIENT_MESSAGE,
method.getRequestMarshaller(),
message,
- DUMMY_IS_COMPRESSED,
- CLIENT,
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
callId);
super.sendMessage(message);
}
+
+ @Override
+ public void halfClose() {
+ writer.logHalfClose(
+ seq.getAndIncrement(),
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
+ callId);
+ super.halfClose();
+ }
+
+ @Override
+ public void cancel(String message, Throwable cause) {
+ writer.logCancel(
+ seq.getAndIncrement(),
+ GrpcLogEntry.Logger.LOGGER_CLIENT,
+ callId);
+ super.cancel(message, cause);
+ }
};
}
};
}
- public ServerInterceptor getServerInterceptor(final CallId callId) {
+ public ServerInterceptor getServerInterceptor(final long callId) {
return new ServerInterceptor() {
@Override
public <ReqT, RespT> Listener<ReqT> interceptCall(
final ServerCall<ReqT, RespT> call,
Metadata headers,
ServerCallHandler<ReqT, RespT> next) {
- final AtomicInteger seq = new AtomicInteger(1);
+ final AtomicLong seq = new AtomicLong(1);
SocketAddress peer = getPeerSocket(call.getAttributes());
String methodName = call.getMethodDescriptor().getFullMethodName();
- Long timeoutNanos = headers.get(GrpcUtil.TIMEOUT_KEY);
- final Duration timeout =
- timeoutNanos == null ? null : Durations.fromNanos(timeoutNanos);
-
- writer.logRecvInitialMetadata(
- seq.getAndIncrement(), methodName, timeout, headers, SERVER, callId, peer);
+ String authority = call.getAuthority();
+ Deadline deadline = Context.current().getDeadline();
+ final Duration timeout = deadline == null ? null
+ : Durations.fromNanos(deadline.timeRemaining(TimeUnit.NANOSECONDS));
+
+ writer.logClientHeader(
+ seq.getAndIncrement(),
+ methodName,
+ authority,
+ timeout,
+ headers,
+ GrpcLogEntry.Logger.LOGGER_SERVER,
+ callId,
+ peer);
ServerCall<ReqT, RespT> wCall = new SimpleForwardingServerCall<ReqT, RespT>(call) {
@Override
public void sendMessage(RespT message) {
- writer.logOutboundMessage(
+ writer.logRpcMessage(
seq.getAndIncrement(),
+ EventType.EVENT_TYPE_SERVER_MESSAGE,
call.getMethodDescriptor().getResponseMarshaller(),
message,
- DUMMY_IS_COMPRESSED,
- SERVER,
+ GrpcLogEntry.Logger.LOGGER_SERVER,
callId);
super.sendMessage(message);
}
@Override
public void sendHeaders(Metadata headers) {
- writer.logSendInitialMetadata(
+ writer.logServerHeader(
seq.getAndIncrement(),
- /*methodName=*/ null,
- /*timeout=*/ null,
headers,
- SERVER,
- callId);
+ GrpcLogEntry.Logger.LOGGER_SERVER,
+ callId,
+ /*peerAddress=*/ null);
super.sendHeaders(headers);
}
@Override
public void close(Status status, Metadata trailers) {
- writer.logTrailingMetadata(seq.getAndIncrement(), status, trailers, SERVER, callId);
+ writer.logTrailer(
+ seq.getAndIncrement(),
+ status,
+ trailers,
+ GrpcLogEntry.Logger.LOGGER_SERVER,
+ callId,
+ /*peerAddress=*/ null);
super.close(status, trailers);
}
};
@@ -454,15 +566,33 @@ final class BinlogHelper {
return new SimpleForwardingServerCallListener<ReqT>(next.startCall(wCall, headers)) {
@Override
public void onMessage(ReqT message) {
- writer.logInboundMessage(
+ writer.logRpcMessage(
seq.getAndIncrement(),
+ EventType.EVENT_TYPE_CLIENT_MESSAGE,
call.getMethodDescriptor().getRequestMarshaller(),
message,
- DUMMY_IS_COMPRESSED,
- SERVER,
+ GrpcLogEntry.Logger.LOGGER_SERVER,
callId);
super.onMessage(message);
}
+
+ @Override
+ public void onHalfClose() {
+ writer.logHalfClose(
+ seq.getAndIncrement(),
+ GrpcLogEntry.Logger.LOGGER_SERVER,
+ callId);
+ super.onHalfClose();
+ }
+
+ @Override
+ public void onCancel() {
+ writer.logCancel(
+ seq.getAndIncrement(),
+ GrpcLogEntry.Logger.LOGGER_SERVER,
+ callId);
+ super.onCancel();
+ }
};
}
};
@@ -507,47 +637,50 @@ final class BinlogHelper {
for (String configuration : Splitter.on(',').split(configurationString)) {
Matcher configMatcher = configRe.matcher(configuration);
if (!configMatcher.matches()) {
- throw new IllegalArgumentException("Bad input: " + configuration);
+ throw new IllegalArgumentException("Illegal log config pattern: " + configuration);
}
String methodOrSvc = configMatcher.group(1);
String binlogOptionStr = configMatcher.group(2);
- BinlogHelper binLog = createBinaryLog(sink, binlogOptionStr);
- if (binLog == null) {
- continue;
- }
if (methodOrSvc.equals("*")) {
- if (globalLog != null) {
- logger.log(Level.SEVERE, "Ignoring duplicate entry: {0}", configuration);
- continue;
- }
- globalLog = binLog;
+ // parse config for "*"
+ checkState(
+ globalLog == null,
+ "Duplicate entry, this is fatal: " + configuration);
+ globalLog = createBinaryLog(sink, binlogOptionStr);
logger.log(Level.INFO, "Global binlog: {0}", binlogOptionStr);
} else if (isServiceGlob(methodOrSvc)) {
+ // parse config for a service, e.g. "service/*"
String service = MethodDescriptor.extractFullServiceName(methodOrSvc);
- if (perServiceLogs.containsKey(service)) {
- logger.log(Level.SEVERE, "Ignoring duplicate entry: {0}", configuration);
- continue;
- }
- perServiceLogs.put(service, binLog);
+ checkState(
+ !perServiceLogs.containsKey(service),
+ "Duplicate entry, this is fatal: " + configuration);
+ perServiceLogs.put(service, createBinaryLog(sink, binlogOptionStr));
logger.log(
Level.INFO,
"Service binlog: service={0} config={1}",
new Object[] {service, binlogOptionStr});
} else if (methodOrSvc.startsWith("-")) {
+ // parse config for a method, e.g. "-service/method"
String blacklistedMethod = methodOrSvc.substring(1);
if (blacklistedMethod.length() == 0) {
continue;
}
- if (!blacklistedMethods.add(blacklistedMethod)) {
- logger.log(Level.SEVERE, "Ignoring duplicate entry: {0}", configuration);
- }
+ checkState(
+ !blacklistedMethods.contains(blacklistedMethod),
+ "Duplicate entry, this is fatal: " + configuration);
+ checkState(
+ !perMethodLogs.containsKey(blacklistedMethod),
+ "Duplicate entry, this is fatal: " + configuration);
+ blacklistedMethods.add(blacklistedMethod);
} else {
- // assume fully qualified method name
- if (perMethodLogs.containsKey(methodOrSvc)) {
- logger.log(Level.SEVERE, "Ignoring duplicate entry: {0}", configuration);
- continue;
- }
- perMethodLogs.put(methodOrSvc, binLog);
+ // parse config for a fully qualified method, e.g "serice/method"
+ checkState(
+ !perMethodLogs.containsKey(methodOrSvc),
+ "Duplicate entry, this is fatal: " + configuration);
+ checkState(
+ !blacklistedMethods.contains(methodOrSvc),
+ "Duplicate entry, this method was blacklisted: " + configuration);
+ perMethodLogs.put(methodOrSvc, createBinaryLog(sink, binlogOptionStr));
logger.log(
Level.INFO,
"Method binlog: method={0} config={1}",
@@ -595,7 +728,8 @@ final class BinlogHelper {
static BinlogHelper createBinaryLog(BinaryLogSink sink, @Nullable String logConfig) {
if (logConfig == null) {
return new BinlogHelper(
- new SinkWriterImpl(sink, Integer.MAX_VALUE, Integer.MAX_VALUE));
+ new SinkWriterImpl(
+ sink, TimeProvider.SYSTEM_TIME_PROVIDER, Integer.MAX_VALUE, Integer.MAX_VALUE));
}
try {
Matcher headerMatcher;
@@ -619,13 +753,13 @@ final class BinlogHelper {
maxHeaderStr != null ? Integer.parseInt(maxHeaderStr) : Integer.MAX_VALUE;
maxMsgBytes = maxMsgStr != null ? Integer.parseInt(maxMsgStr) : Integer.MAX_VALUE;
} else {
- logger.log(Level.SEVERE, "Illegal log config pattern: " + logConfig);
- return null;
+ throw new IllegalArgumentException("Illegal log config pattern");
}
- return new BinlogHelper(new SinkWriterImpl(sink, maxHeaderBytes, maxMsgBytes));
+ return new BinlogHelper(
+ new SinkWriterImpl(
+ sink, TimeProvider.SYSTEM_TIME_PROVIDER, maxHeaderBytes, maxMsgBytes));
} catch (NumberFormatException e) {
- logger.log(Level.SEVERE, "Illegal log config pattern: " + logConfig);
- return null;
+ throw new IllegalArgumentException("Illegal log config pattern");
}
}
@@ -637,30 +771,18 @@ final class BinlogHelper {
}
}
- /**
- * Returns a {@link Uint128} from a CallId.
- */
- static Uint128 callIdToProto(CallId callId) {
- checkNotNull(callId, "callId");
- return Uint128
- .newBuilder()
- .setHigh(callId.hi)
- .setLow(callId.lo)
- .build();
- }
-
@VisibleForTesting
- static Peer socketToProto(SocketAddress address) {
+ static Address socketToProto(SocketAddress address) {
checkNotNull(address, "address");
- Peer.Builder builder = Peer.newBuilder();
+ Address.Builder builder = Address.newBuilder();
if (address instanceof InetSocketAddress) {
InetAddress inetAddress = ((InetSocketAddress) address).getAddress();
if (inetAddress instanceof Inet4Address) {
- builder.setPeerType(PeerType.PEER_IPV4)
+ builder.setType(Type.TYPE_IPV4)
.setAddress(InetAddressUtil.toAddrString(inetAddress));
} else if (inetAddress instanceof Inet6Address) {
- builder.setPeerType(PeerType.PEER_IPV6)
+ builder.setType(Type.TYPE_IPV6)
.setAddress(InetAddressUtil.toAddrString(inetAddress));
} else {
logger.log(Level.SEVERE, "unknown type of InetSocketAddress: {}", address);
@@ -669,69 +791,79 @@ final class BinlogHelper {
builder.setIpPort(((InetSocketAddress) address).getPort());
} else if (address.getClass().getName().equals("io.netty.channel.unix.DomainSocketAddress")) {
// To avoid a compile time dependency on grpc-netty, we check against the runtime class name.
- builder.setPeerType(PeerType.PEER_UNIX)
+ builder.setType(Type.TYPE_UNIX)
.setAddress(address.toString());
} else {
- builder.setPeerType(PeerType.UNKNOWN_PEERTYPE).setAddress(address.toString());
+ builder.setType(Type.TYPE_UNKNOWN).setAddress(address.toString());
}
return builder.build();
}
+ private static final Set<String> NEVER_INCLUDED_METADATA = new HashSet<String>(
+ Collections.singletonList(
+ // grpc-status-details-bin is already logged in a field of the binlog proto
+ STATUS_DETAILS_KEY.name()));
+ private static final Set<String> ALWAYS_INCLUDED_METADATA = new HashSet<String>(
+ Collections.singletonList(
+ "grpc-trace-bin"));
+
+ static final class MaybeTruncated<T> {
+ T proto;
+ boolean truncated;
+
+ private MaybeTruncated(T proto, boolean truncated) {
+ this.proto = proto;
+ this.truncated = truncated;
+ }
+ }
+
@VisibleForTesting
- static void addMetadataToProto(
- GrpcLogEntry.Builder entryBuilder, Metadata metadata, int maxHeaderBytes) {
- checkNotNull(entryBuilder, "entryBuilder");
+ static MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> createMetadataProto(
+ Metadata metadata, int maxHeaderBytes) {
checkNotNull(metadata, "metadata");
checkArgument(maxHeaderBytes >= 0, "maxHeaderBytes must be non negative");
- Builder metaBuilder = io.grpc.binarylog.v1alpha.Metadata.newBuilder();
+ io.grpc.binarylog.v1.Metadata.Builder metaBuilder = io.grpc.binarylog.v1.Metadata.newBuilder();
// This code is tightly coupled with Metadata's implementation
- byte[][] serialized = null;
- if (maxHeaderBytes > 0 && (serialized = InternalMetadata.serialize(metadata)) != null) {
- int written = 0;
- for (int i = 0; i < serialized.length && written < maxHeaderBytes; i += 2) {
- byte[] key = serialized[i];
+ byte[][] serialized = InternalMetadata.serialize(metadata);
+ boolean truncated = false;
+ if (serialized != null) {
+ int curBytes = 0;
+ for (int i = 0; i < serialized.length; i += 2) {
+ String key = new String(serialized[i], Charsets.UTF_8);
byte[] value = serialized[i + 1];
- if (written + key.length + value.length <= maxHeaderBytes) {
- metaBuilder.addEntryBuilder()
- .setKey(ByteString.copyFrom(key))
- .setValue(ByteString.copyFrom(value));
- written += key.length;
- written += value.length;
+ if (NEVER_INCLUDED_METADATA.contains(key)) {
+ continue;
+ }
+ boolean forceInclude = ALWAYS_INCLUDED_METADATA.contains(key);
+ int bytesAfterAdd = curBytes + key.length() + value.length;
+ if (!forceInclude && bytesAfterAdd > maxHeaderBytes) {
+ truncated = true;
+ continue;
+ }
+ metaBuilder.addEntryBuilder()
+ .setKey(key)
+ .setValue(ByteString.copyFrom(value));
+ if (!forceInclude) {
+ // force included keys do not count towards the size limit
+ curBytes = bytesAfterAdd;
}
}
}
- // This check must be updated when we add filtering
- entryBuilder.setTruncated(maxHeaderBytes == 0
- || (serialized != null && metaBuilder.getEntryCount() < (serialized.length / 2)));
- entryBuilder.setMetadata(metaBuilder);
+ return new MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder>(metaBuilder, truncated);
}
@VisibleForTesting
- static void messageToProto(
- GrpcLogEntry.Builder entryBuilder, byte[] message, boolean compressed, int maxMessageBytes) {
+ static MaybeTruncated<Message.Builder> createMessageProto(
+ byte[] message, int maxMessageBytes) {
checkNotNull(message, "message");
checkArgument(maxMessageBytes >= 0, "maxMessageBytes must be non negative");
Message.Builder msgBuilder = Message
.newBuilder()
- .setFlags(flagsForMessage(compressed))
.setLength(message.length);
if (maxMessageBytes > 0) {
int desiredBytes = Math.min(maxMessageBytes, message.length);
msgBuilder.setData(ByteString.copyFrom(message, 0, desiredBytes));
}
- entryBuilder.setMessage(msgBuilder);
- entryBuilder.setTruncated(maxMessageBytes < message.length);
- }
-
- /**
- * Returns a flag based on the arguments.
- */
- @VisibleForTesting
- static int flagsForMessage(boolean compressed) {
- return compressed ? 1 : 0;
- }
-
- private static class DummySocketAddress extends SocketAddress {
- private static final long serialVersionUID = 0;
+ return new MaybeTruncated<Message.Builder>(msgBuilder, maxMessageBytes < message.length);
}
}
diff --git a/services/src/main/java/io/grpc/services/ChannelzService.java b/services/src/main/java/io/grpc/services/ChannelzService.java
index b8b3f1fe7..70702a89a 100644
--- a/services/src/main/java/io/grpc/services/ChannelzService.java
+++ b/services/src/main/java/io/grpc/services/ChannelzService.java
@@ -61,7 +61,7 @@ public final class ChannelzService extends ChannelzGrpc.ChannelzImplBase {
this.maxPageSize = maxPageSize;
}
- /** Returns top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */
+ /** Returns top level channel aka {@link io.grpc.ManagedChannel}. */
@Override
public void getTopChannels(
GetTopChannelsRequest request, StreamObserver<GetTopChannelsResponse> responseObserver) {
@@ -72,7 +72,7 @@ public final class ChannelzService extends ChannelzGrpc.ChannelzImplBase {
responseObserver.onCompleted();
}
- /** Returns a top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */
+ /** Returns a top level channel aka {@link io.grpc.ManagedChannel}. */
@Override
public void getChannel(
GetChannelRequest request, StreamObserver<GetChannelResponse> responseObserver) {
diff --git a/services/src/main/proto/grpc/binlog/v1/binarylog.proto b/services/src/main/proto/grpc/binlog/v1/binarylog.proto
new file mode 100644
index 000000000..9ed1733e2
--- /dev/null
+++ b/services/src/main/proto/grpc/binlog/v1/binarylog.proto
@@ -0,0 +1,209 @@
+// Copyright 2018 The gRPC Authors
+// All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// The canonical version of this proto can be found at
+// https://github.com/grpc/grpc-proto/blob/master/grpc/binlog/v1/binarylog.proto
+
+syntax = "proto3";
+
+package grpc.binarylog.v1;
+
+import "google/protobuf/duration.proto";
+import "google/protobuf/timestamp.proto";
+
+option go_package = "google.golang.org/grpc/binarylog/grpc_binarylog_v1";
+option java_multiple_files = true;
+option java_package = "io.grpc.binarylog.v1";
+option java_outer_classname = "BinaryLogProto";
+
+// Log entry we store in binary logs
+message GrpcLogEntry {
+ // Enumerates the type of event
+ // Note the terminology is different from the RPC semantics
+ // definition, but the same meaning is expressed here.
+ enum EventType {
+ EVENT_TYPE_UNKNOWN = 0;
+ // Header sent from client to server
+ EVENT_TYPE_CLIENT_HEADER = 1;
+ // Header sent from server to client
+ EVENT_TYPE_SERVER_HEADER = 2;
+ // Message sent from client to server
+ EVENT_TYPE_CLIENT_MESSAGE = 3;
+ // Message sent from server to client
+ EVENT_TYPE_SERVER_MESSAGE = 4;
+ // A signal that client is done sending
+ EVENT_TYPE_CLIENT_HALF_CLOSE = 5;
+ // Trailer indicates the end of the RPC.
+ // On client side, this event means a trailer was either received
+ // from the network or the gRPC library locally generated a status
+ // to inform the application about a failure.
+ // On server side, this event means the server application requested
+ // to send a trailer. Note: EVENT_TYPE_CANCEL may still arrive after
+ // this due to races on server side.
+ EVENT_TYPE_SERVER_TRAILER = 6;
+ // A signal that the RPC is cancelled. On client side, this
+ // indicates the client application requests a cancellation.
+ // On server side, this indicates that cancellation was detected.
+ // Note: This marks the end of the RPC. Events may arrive after
+ // this due to races. For example, on client side a trailer
+ // may arrive even though the application requested to cancel the RPC.
+ EVENT_TYPE_CANCEL = 7;
+ }
+
+ // Enumerates the entity that generates the log entry
+ enum Logger {
+ LOGGER_UNKNOWN = 0;
+ LOGGER_CLIENT = 1;
+ LOGGER_SERVER = 2;
+ }
+
+ // The timestamp of the binary log message
+ google.protobuf.Timestamp timestamp = 1;
+
+ // Uniquely identifies a call. The value must not be 0 in order to disambiguate
+ // from an unset value.
+ // Each call may have several log entries, they will all have the same call_id.
+ // Nothing is guaranteed about their value other than they are unique across
+ // different RPCs in the same gRPC process.
+ uint64 call_id = 2;
+
+ // The entry sequence id for this call. The first GrpcLogEntry has a
+ // value of 1, to disambiguate from an unset value. The purpose of
+ // this field is to detect missing entries in environments where
+ // durability or ordering is not guaranteed.
+ uint64 sequence_id_within_call = 3;
+
+ EventType type = 4;
+ Logger logger = 5; // One of the above Logger enum
+
+ // The logger uses one of the following fields to record the payload,
+ // according to the type of the log entry.
+ oneof payload {
+ ClientHeader client_header = 6;
+ ServerHeader server_header = 7;
+ // Used by EVENT_TYPE_CLIENT_MESSAGE, EVENT_TYPE_SERVER_MESSAGE
+ Message message = 8;
+ Trailer trailer = 9;
+ }
+
+ // true if payload does not represent the full message or metadata.
+ bool payload_truncated = 10;
+
+ // Peer address information, will only be recorded on the first
+ // incoming event. On client side, peer is logged on
+ // EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in
+ // the case of trailers-only. On server side, peer is always
+ // logged on EVENT_TYPE_CLIENT_HEADER.
+ Address peer = 11;
+};
+
+message ClientHeader {
+ // This contains only the metadata from the application.
+ Metadata metadata = 1;
+
+ // The name of the RPC method, which looks something like:
+ // /<service>/<method>
+ // Note the leading "/" character.
+ string method_name = 2;
+
+ // A single process may be used to run multiple virtual
+ // servers with different identities.
+ // The authority is the name of such a server identitiy.
+ // It is typically a portion of the URI in the form of
+ // <host> or <host>:<port> .
+ string authority = 3;
+
+ // the RPC timeout
+ google.protobuf.Duration timeout = 4;
+}
+
+message ServerHeader {
+ // This contains only the metadata from the application.
+ Metadata metadata = 1;
+}
+
+message Trailer {
+ // This contains only the metadata from the application.
+ Metadata metadata = 1;
+
+ // The gRPC status code.
+ uint32 status_code = 2;
+
+ // An original status message before any transport specific
+ // encoding.
+ string status_message = 3;
+
+ // The value of the 'grpc-status-details-bin' metadata key. If
+ // present, this is always an encoded 'google.rpc.Status' message.
+ bytes status_details = 4;
+}
+
+// Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE
+message Message {
+ // Length of the message. It may not be the same as the length of the
+ // data field, as the logging payload can be truncated or omitted.
+ uint32 length = 1;
+ // May be truncated or omitted.
+ bytes data = 2;
+}
+
+// A list of metadata pairs, used in the payload of client header,
+// server header, and server trailer.
+// Implementations may omit some entries to honor the header limits
+// of GRPC_BINARY_LOG_CONFIG.
+//
+// Header keys added by gRPC are omitted. To be more specific,
+// implementations will not log the following entries, and this is
+// not to be treated as a truncation:
+// - entries handled by grpc that are not user visible, such as those
+// that begin with 'grpc-' (with exception of grpc-trace-bin)
+// or keys like 'lb-token'
+// - transport specific entries, including but not limited to:
+// ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc
+// - entries added for call credentials
+//
+// Implementations must always log grpc-trace-bin if it is present.
+// Practically speaking it will only be visible on server side because
+// grpc-trace-bin is managed by low level client side mechanisms
+// inaccessible from the application level. On server side, the
+// header is just a normal metadata key.
+// The pair will not count towards the size limit.
+message Metadata {
+ repeated MetadataEntry entry = 1;
+}
+
+// A metadata key value pair
+message MetadataEntry {
+ string key = 1;
+ bytes value = 2;
+}
+
+// Address information
+message Address {
+ enum Type {
+ TYPE_UNKNOWN = 0;
+ // address is in 1.2.3.4 form
+ TYPE_IPV4 = 1;
+ // address is in IPv6 canonical form (RFC5952 section 4)
+ // The scope is NOT included in the address string.
+ TYPE_IPV6 = 2;
+ // address is UDS string
+ TYPE_UNIX = 3;
+ };
+ Type type = 1;
+ string address = 2;
+ // only for TYPE_IPV4 and TYPE_IPV6
+ uint32 ip_port = 3;
+}
diff --git a/services/src/main/proto/grpc/health/v1/health.proto b/services/src/main/proto/grpc/health/v1/health.proto
index 44c443230..38843ff1e 100644
--- a/services/src/main/proto/grpc/health/v1/health.proto
+++ b/services/src/main/proto/grpc/health/v1/health.proto
@@ -12,11 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// The canonical version of this proto can be found at
+// https://github.com/grpc/grpc-proto/blob/master/grpc/health/v1/health.proto
+
syntax = "proto3";
package grpc.health.v1;
option csharp_namespace = "Grpc.Health.V1";
+option go_package = "google.golang.org/grpc/health/grpc_health_v1";
option java_multiple_files = true;
option java_outer_classname = "HealthProto";
option java_package = "io.grpc.health.v1";
@@ -30,10 +34,30 @@ message HealthCheckResponse {
UNKNOWN = 0;
SERVING = 1;
NOT_SERVING = 2;
+ SERVICE_UNKNOWN = 3; // Used only by the Watch method.
}
ServingStatus status = 1;
}
service Health {
+ // If the requested service is unknown, the call will fail with status
+ // NOT_FOUND.
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
+
+ // Performs a watch for the serving status of the requested service.
+ // The server will immediately send back a message indicating the current
+ // serving status. It will then subsequently send a new message whenever
+ // the service's serving status changes.
+ //
+ // If the requested service is unknown when the call is received, the
+ // server will send a message setting the serving status to
+ // SERVICE_UNKNOWN but will *not* terminate the call. If at some
+ // future point, the serving status of the service becomes known, the
+ // server will send a new message with the service's serving status.
+ //
+ // If the call terminates with status UNIMPLEMENTED, then clients
+ // should assume this method is not supported and should not retry the
+ // call. If the call terminates with any other status (including OK),
+ // clients should retry the call with appropriate exponential backoff.
+ rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}
diff --git a/services/src/test/java/io/grpc/services/BinlogHelperTest.java b/services/src/test/java/io/grpc/services/BinlogHelperTest.java
index cdaa83691..5734f1d18 100644
--- a/services/src/test/java/io/grpc/services/BinlogHelperTest.java
+++ b/services/src/test/java/io/grpc/services/BinlogHelperTest.java
@@ -18,13 +18,15 @@ package io.grpc.services;
import static com.google.common.truth.Truth.assertThat;
import static io.grpc.services.BinaryLogProvider.BYTEARRAY_MARSHALLER;
-import static io.grpc.services.BinlogHelper.DUMMY_SOCKET;
-import static io.grpc.services.BinlogHelper.STATUS_DETAILS_KEY;
+import static io.grpc.services.BinlogHelper.createMetadataProto;
import static io.grpc.services.BinlogHelper.getPeerSocket;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
@@ -33,12 +35,15 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import com.google.common.collect.Iterables;
import com.google.common.util.concurrent.SettableFuture;
+import com.google.protobuf.Any;
import com.google.protobuf.ByteString;
import com.google.protobuf.Duration;
+import com.google.protobuf.StringValue;
+import com.google.protobuf.Timestamp;
import com.google.protobuf.util.Durations;
import io.grpc.Attributes;
-import io.grpc.BinaryLog.CallId;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
@@ -51,18 +56,25 @@ import io.grpc.MethodDescriptor.MethodType;
import io.grpc.ServerCall;
import io.grpc.ServerCallHandler;
import io.grpc.Status;
-import io.grpc.binarylog.v1alpha.GrpcLogEntry;
-import io.grpc.binarylog.v1alpha.Message;
-import io.grpc.binarylog.v1alpha.MetadataEntry;
-import io.grpc.binarylog.v1alpha.Peer;
-import io.grpc.binarylog.v1alpha.Peer.PeerType;
-import io.grpc.binarylog.v1alpha.Uint128;
-import io.grpc.internal.GrpcUtil;
+import io.grpc.StatusException;
+import io.grpc.binarylog.v1.Address;
+import io.grpc.binarylog.v1.Address.Type;
+import io.grpc.binarylog.v1.ClientHeader;
+import io.grpc.binarylog.v1.GrpcLogEntry;
+import io.grpc.binarylog.v1.GrpcLogEntry.EventType;
+import io.grpc.binarylog.v1.GrpcLogEntry.Logger;
+import io.grpc.binarylog.v1.Message;
+import io.grpc.binarylog.v1.MetadataEntry;
+import io.grpc.binarylog.v1.ServerHeader;
+import io.grpc.binarylog.v1.Trailer;
import io.grpc.internal.NoopClientCall;
import io.grpc.internal.NoopServerCall;
+import io.grpc.protobuf.StatusProto;
import io.grpc.services.BinlogHelper.FactoryImpl;
+import io.grpc.services.BinlogHelper.MaybeTruncated;
import io.grpc.services.BinlogHelper.SinkWriter;
import io.grpc.services.BinlogHelper.SinkWriterImpl;
+import io.grpc.services.BinlogHelper.TimeProvider;
import io.netty.channel.unix.DomainSocketAddress;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -101,35 +113,41 @@ public final class BinlogHelperTest {
private static final MetadataEntry ENTRY_A =
MetadataEntry
.newBuilder()
- .setKey(ByteString.copyFrom(KEY_A.name(), US_ASCII))
+ .setKey(KEY_A.name())
.setValue(ByteString.copyFrom(DATA_A.getBytes(US_ASCII)))
.build();
private static final MetadataEntry ENTRY_B =
MetadataEntry
.newBuilder()
- .setKey(ByteString.copyFrom(KEY_B.name(), US_ASCII))
+ .setKey(KEY_B.name())
.setValue(ByteString.copyFrom(DATA_B.getBytes(US_ASCII)))
.build();
private static final MetadataEntry ENTRY_C =
MetadataEntry
.newBuilder()
- .setKey(ByteString.copyFrom(KEY_C.name(), US_ASCII))
+ .setKey(KEY_C.name())
.setValue(ByteString.copyFrom(DATA_C.getBytes(US_ASCII)))
.build();
- private static final boolean IS_SERVER = true;
- private static final boolean IS_CLIENT = false;
- private static final boolean IS_COMPRESSED = true;
- private static final boolean IS_UNCOMPRESSED = false;
- // TODO(zpencer): rename this to callId, since byte[] is mutable
- private static final CallId CALL_ID =
- new CallId(0x1112131415161718L, 0x19101a1b1c1d1e1fL);
+ private static final long CALL_ID = 0x1112131415161718L;
private static final int HEADER_LIMIT = 10;
private static final int MESSAGE_LIMIT = Integer.MAX_VALUE;
private final Metadata nonEmptyMetadata = new Metadata();
private final BinaryLogSink sink = mock(BinaryLogSink.class);
+ private final Timestamp timestamp
+ = Timestamp.newBuilder().setSeconds(9876).setNanos(54321).build();
+ private final BinlogHelper.TimeProvider timeProvider = new TimeProvider() {
+ @Override
+ public long currentTimeNanos() {
+ return TimeUnit.SECONDS.toNanos(9876) + 54321;
+ }
+ };
private final SinkWriter sinkWriterImpl =
- new SinkWriterImpl(sink, HEADER_LIMIT, MESSAGE_LIMIT);
+ new SinkWriterImpl(
+ sink,
+ timeProvider,
+ HEADER_LIMIT,
+ MESSAGE_LIMIT);
private final SinkWriter mockSinkWriter = mock(SinkWriter.class);
private final byte[] message = new byte[100];
private SocketAddress peer;
@@ -219,18 +237,37 @@ public final class BinlogHelperTest {
makeLog("{h:256;m}"));
}
+ private void assertIllegalPatternDetected(String perSvcOrMethodConfig) {
+ try {
+ FactoryImpl.createBinaryLog(sink, perSvcOrMethodConfig);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ assertThat(expected).hasMessageThat().startsWith("Illegal log config pattern");
+ }
+ }
+
+ @Test
+ public void badFactoryConfigStrDetected() throws Exception {
+ try {
+ new FactoryImpl(sink, "obviouslybad{");
+ fail();
+ } catch (IllegalArgumentException expected) {
+ assertThat(expected).hasMessageThat().startsWith("Illegal log config pattern");
+ }
+ }
+
@Test
public void createLogFromOptionString_malformed() throws Exception {
- assertNull(makeLog("bad"));
- assertNull(makeLog("{bad}"));
- assertNull(makeLog("{x;y}"));
- assertNull(makeLog("{h:abc}"));
- assertNull(makeLog("{2}"));
- assertNull(makeLog("{2;2}"));
+ assertIllegalPatternDetected("bad");
+ assertIllegalPatternDetected("{bad}");
+ assertIllegalPatternDetected("{x;y}");
+ assertIllegalPatternDetected("{h:abc}");
+ assertIllegalPatternDetected("{2}");
+ assertIllegalPatternDetected("{2;2}");
// The grammar specifies that if both h and m are present, h comes before m
- assertNull(makeLog("{m:123;h:123}"));
+ assertIllegalPatternDetected("{m:123;h:123}");
// NumberFormatException
- assertNull(makeLog("{h:99999999999999}"));
+ assertIllegalPatternDetected("{h:99999999999999}");
}
@Test
@@ -289,47 +326,32 @@ public final class BinlogHelperTest {
assertNotNull(makeLog("-p.s/blacklisted,p.s/*", "p.s/allowed"));
}
- @Test
- public void configBinLog_ignoreDuplicates_global() throws Exception {
- String configStr = "*{h},p.s/m,*{h:256}";
- // The duplicate
- assertSameLimits(HEADER_FULL, makeLog(configStr, "p.other1/m"));
- assertSameLimits(HEADER_FULL, makeLog(configStr, "p.other2/m"));
- // Other
- assertSameLimits(BOTH_FULL, makeLog(configStr, "p.s/m"));
+ private void assertDuplicatelPatternDetected(String factoryConfigStr) {
+ try {
+ new BinlogHelper.FactoryImpl(sink, factoryConfigStr);
+ fail();
+ } catch (IllegalStateException expected) {
+ assertThat(expected).hasMessageThat().startsWith("Duplicate entry");
+ }
}
@Test
- public void configBinLog_ignoreDuplicates_service() throws Exception {
- String configStr = "p.s/*,*{h:256},p.s/*{h}";
- // The duplicate
- assertSameLimits(BOTH_FULL, makeLog(configStr, "p.s/m1"));
- assertSameLimits(BOTH_FULL, makeLog(configStr, "p.s/m2"));
- // Other
- assertSameLimits(HEADER_256, makeLog(configStr, "p.other1/m"));
- assertSameLimits(HEADER_256, makeLog(configStr, "p.other2/m"));
+ public void configBinLog_duplicates_global() throws Exception {
+ assertDuplicatelPatternDetected("*{h},*{h:256}");
}
@Test
- public void configBinLog_ignoreDuplicates_method() throws Exception {
- String configStr = "p.s/m,*{h:256},p.s/m{h}";
- // The duplicate
- assertSameLimits(BOTH_FULL, makeLog(configStr, "p.s/m"));
- // Other
- assertSameLimits(HEADER_256, makeLog(configStr, "p.other1/m"));
- assertSameLimits(HEADER_256, makeLog(configStr, "p.other2/m"));
+ public void configBinLog_duplicates_service() throws Exception {
+ assertDuplicatelPatternDetected("p.s/*,p.s/*{h}");
+
}
@Test
- public void callIdToProto() {
- CallId callId = new CallId(0x1112131415161718L, 0x19101a1b1c1d1e1fL);
- assertEquals(
- Uint128
- .newBuilder()
- .setHigh(0x1112131415161718L)
- .setLow(0x19101a1b1c1d1e1fL)
- .build(),
- BinlogHelper.callIdToProto(callId));
+ public void configBinLog_duplicates_method() throws Exception {
+ assertDuplicatelPatternDetected("p.s/*,p.s/*{h:1;m:2}");
+ assertDuplicatelPatternDetected("p.s/m,-p.s/m");
+ assertDuplicatelPatternDetected("-p.s/m,p.s/m");
+ assertDuplicatelPatternDetected("-p.s/m,-p.s/m");
}
@Test
@@ -338,9 +360,9 @@ public final class BinlogHelperTest {
int port = 12345;
InetSocketAddress socketAddress = new InetSocketAddress(address, port);
assertEquals(
- Peer
+ Address
.newBuilder()
- .setPeerType(Peer.PeerType.PEER_IPV4)
+ .setType(Type.TYPE_IPV4)
.setAddress("127.0.0.1")
.setIpPort(12345)
.build(),
@@ -354,9 +376,9 @@ public final class BinlogHelperTest {
int port = 12345;
InetSocketAddress socketAddress = new InetSocketAddress(address, port);
assertEquals(
- Peer
+ Address
.newBuilder()
- .setPeerType(Peer.PeerType.PEER_IPV6)
+ .setType(Type.TYPE_IPV6)
.setAddress("2001:db8::2:1") // RFC 5952 section 4: ipv6 canonical form required
.setIpPort(12345)
.build(),
@@ -368,9 +390,9 @@ public final class BinlogHelperTest {
String path = "/some/path";
DomainSocketAddress socketAddress = new DomainSocketAddress(path);
assertEquals(
- Peer
+ Address
.newBuilder()
- .setPeerType(Peer.PeerType.PEER_UNIX)
+ .setType(Type.TYPE_UNIX)
.setAddress("/some/path")
.build(),
BinlogHelper.socketToProto(socketAddress)
@@ -386,8 +408,8 @@ public final class BinlogHelperTest {
}
};
assertEquals(
- Peer.newBuilder()
- .setPeerType(PeerType.UNKNOWN_PEERTYPE)
+ Address.newBuilder()
+ .setType(Type.TYPE_UNKNOWN)
.setAddress("some-socket-address")
.build(),
BinlogHelper.socketToProto(unknownSocket));
@@ -397,98 +419,86 @@ public final class BinlogHelperTest {
public void metadataToProto_empty() throws Exception {
assertEquals(
GrpcLogEntry.newBuilder()
- .setMetadata(io.grpc.binarylog.v1alpha.Metadata.getDefaultInstance())
+ .setType(EventType.EVENT_TYPE_CLIENT_HEADER)
+ .setClientHeader(
+ ClientHeader.newBuilder().setMetadata(
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance()))
.build(),
- metadataToProtoTestHelper(new Metadata(), Integer.MAX_VALUE));
+ metadataToProtoTestHelper(
+ EventType.EVENT_TYPE_CLIENT_HEADER, new Metadata(), Integer.MAX_VALUE));
}
@Test
public void metadataToProto() throws Exception {
assertEquals(
GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
+ .setType(EventType.EVENT_TYPE_CLIENT_HEADER)
+ .setClientHeader(
+ ClientHeader.newBuilder().setMetadata(
+ io.grpc.binarylog.v1.Metadata
.newBuilder()
.addEntry(ENTRY_A)
.addEntry(ENTRY_B)
.addEntry(ENTRY_C)
- .build())
+ .build()))
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, Integer.MAX_VALUE));
+ metadataToProtoTestHelper(
+ EventType.EVENT_TYPE_CLIENT_HEADER, nonEmptyMetadata, Integer.MAX_VALUE));
+ }
+
+ @Test
+ public void metadataToProto_setsTruncated() throws Exception {
+ assertTrue(BinlogHelper.createMetadataProto(nonEmptyMetadata, 0).truncated);
}
@Test
public void metadataToProto_truncated() throws Exception {
// 0 byte limit not enough for any metadata
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(io.grpc.binarylog.v1alpha.Metadata.getDefaultInstance())
- .setTruncated(true)
- .build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 0));
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance(),
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 0).proto.build());
// not enough bytes for first key value
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(io.grpc.binarylog.v1alpha.Metadata.getDefaultInstance())
- .setTruncated(true)
- .build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 9));
+ io.grpc.binarylog.v1.Metadata.getDefaultInstance(),
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 9).proto.build());
// enough for first key value
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
- .newBuilder()
- .addEntry(ENTRY_A)
- .build())
- .setTruncated(true)
+ io.grpc.binarylog.v1.Metadata
+ .newBuilder()
+ .addEntry(ENTRY_A)
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 10));
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 10).proto.build());
// Test edge cases for >= 2 key values
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
- .newBuilder()
- .addEntry(ENTRY_A)
- .build())
- .setTruncated(true)
+ io.grpc.binarylog.v1.Metadata
+ .newBuilder()
+ .addEntry(ENTRY_A)
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 19));
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 19).proto.build());
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
- .newBuilder()
- .addEntry(ENTRY_A)
- .addEntry(ENTRY_B)
- .build())
- .setTruncated(true)
+ io.grpc.binarylog.v1.Metadata
+ .newBuilder()
+ .addEntry(ENTRY_A)
+ .addEntry(ENTRY_B)
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 20));
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 20).proto.build());
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
- .newBuilder()
- .addEntry(ENTRY_A)
- .addEntry(ENTRY_B)
- .build())
- .setTruncated(true)
+ io.grpc.binarylog.v1.Metadata
+ .newBuilder()
+ .addEntry(ENTRY_A)
+ .addEntry(ENTRY_B)
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 29));
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 29).proto.build());
+
// not truncated: enough for all keys
assertEquals(
- GrpcLogEntry.newBuilder()
- .setMetadata(
- io.grpc.binarylog.v1alpha.Metadata
- .newBuilder()
- .addEntry(ENTRY_A)
- .addEntry(ENTRY_B)
- .addEntry(ENTRY_C)
- .build())
+ io.grpc.binarylog.v1.Metadata
+ .newBuilder()
+ .addEntry(ENTRY_A)
+ .addEntry(ENTRY_B)
+ .addEntry(ENTRY_C)
.build(),
- metadataToProtoTestHelper(nonEmptyMetadata, 30));
+ BinlogHelper.createMetadataProto(nonEmptyMetadata, 30).proto.build());
}
@Test
@@ -501,11 +511,10 @@ public final class BinlogHelperTest {
Message
.newBuilder()
.setData(ByteString.copyFrom(bytes))
- .setFlags(0)
.setLength(bytes.length)
.build())
.build(),
- messageToProtoTestHelper(bytes, false, Integer.MAX_VALUE));
+ messageToProtoTestHelper(bytes, Integer.MAX_VALUE));
}
@Test
@@ -517,12 +526,11 @@ public final class BinlogHelperTest {
.setMessage(
Message
.newBuilder()
- .setFlags(0)
.setLength(bytes.length)
.build())
- .setTruncated(true)
+ .setPayloadTruncated(true)
.build(),
- messageToProtoTestHelper(bytes, false, 0));
+ messageToProtoTestHelper(bytes, 0));
int limit = 10;
String truncatedMessage = "this is a ";
@@ -532,312 +540,437 @@ public final class BinlogHelperTest {
Message
.newBuilder()
.setData(ByteString.copyFrom(truncatedMessage.getBytes(US_ASCII)))
- .setFlags(0)
.setLength(bytes.length)
.build())
- .setTruncated(true)
+ .setPayloadTruncated(true)
.build(),
- messageToProtoTestHelper(bytes, false, limit));
+ messageToProtoTestHelper(bytes, limit));
}
@Test
- public void toFlag() throws Exception {
- assertEquals(0, BinlogHelper.flagsForMessage(IS_UNCOMPRESSED));
- assertEquals(1, BinlogHelper.flagsForMessage(IS_COMPRESSED));
- }
+ public void logClientHeader() throws Exception {
+ long seq = 1;
+ String authority = "authority";
+ String methodName = "service/method";
+ Duration timeout = Durations.fromMillis(1234);
+ InetAddress address = InetAddress.getByName("127.0.0.1");
+ int port = 12345;
+ InetSocketAddress peerAddress = new InetSocketAddress(address, port);
+ long callId = 1000;
+
+ GrpcLogEntry.Builder builder =
+ metadataToProtoTestHelper(EventType.EVENT_TYPE_CLIENT_HEADER, nonEmptyMetadata, 10)
+ .toBuilder()
+ .setTimestamp(timestamp)
+ .setSequenceIdWithinCall(seq)
+ .setLogger(Logger.LOGGER_CLIENT)
+ .setCallId(callId);
+ builder.getClientHeaderBuilder()
+ .setMethodName("/" + methodName)
+ .setAuthority(authority)
+ .setTimeout(timeout);
+ GrpcLogEntry base = builder.build();
+ {
+ sinkWriterImpl.logClientHeader(
+ seq,
+ methodName,
+ authority,
+ timeout,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ /*peerAddress=*/ null);
+ verify(sink).write(base);
+ }
- @Test
- public void logSendInitialMetadata_server() throws Exception {
- sinkWriterImpl.logSendInitialMetadata(
- /*seq=*/ 1,
- /*methodName=*/ null,
- /*timeout=*/ null,
- nonEmptyMetadata,
- IS_SERVER,
- CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
- }
+ // logger is server
+ {
+ sinkWriterImpl.logClientHeader(
+ seq,
+ methodName,
+ authority,
+ timeout,
+ nonEmptyMetadata,
+ Logger.LOGGER_SERVER,
+ callId,
+ peerAddress);
+ verify(sink).write(
+ base.toBuilder()
+ .setPeer(BinlogHelper.socketToProto(peerAddress))
+ .setLogger(Logger.LOGGER_SERVER)
+ .build());
+ }
- @Test
- public void logSendInitialMetadata_client() throws Exception {
- sinkWriterImpl.logSendInitialMetadata(
- /*seq=*/ 1,
- "service/method",
- Durations.fromMillis(1234),
- nonEmptyMetadata,
- IS_CLIENT,
- CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setMethodName("/service/method")
- .setTimeout(Durations.fromMillis(1234))
- .setType(GrpcLogEntry.Type.SEND_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- sinkWriterImpl.logSendInitialMetadata(
- /*seq=*/ 1,
- "service/method",
- /*timeout=*/ null,
- nonEmptyMetadata,
- IS_CLIENT,
- CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setMethodName("/service/method")
- .setType(GrpcLogEntry.Type.SEND_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
+ // authority is null
+ {
+ sinkWriterImpl.logClientHeader(
+ seq,
+ methodName,
+ /*authority=*/ null,
+ timeout,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ /*peerAddress=*/ null);
+
+ verify(sink).write(
+ base.toBuilder()
+ .setClientHeader(builder.getClientHeader().toBuilder().clearAuthority().build())
+ .build());
+ }
+
+ // timeout is null
+ {
+ sinkWriterImpl.logClientHeader(
+ seq,
+ methodName,
+ authority,
+ /*timeout=*/ null,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ /*peerAddress=*/ null);
+
+ verify(sink).write(
+ base.toBuilder()
+ .setClientHeader(builder.getClientHeader().toBuilder().clearTimeout().build())
+ .build());
+ }
+
+ // peerAddress is non null (error for client side)
+ try {
+ sinkWriterImpl.logClientHeader(
+ seq,
+ methodName,
+ authority,
+ timeout,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ peerAddress);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ // noop
+ }
}
@Test
- public void logRecvInitialMetadata_server() throws Exception {
+ public void logServerHeader() throws Exception {
+ long seq = 1;
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 12345;
- InetSocketAddress socketAddress = new InetSocketAddress(address, port);
- sinkWriterImpl.logRecvInitialMetadata(
- /*seq=*/ 1,
- "service/method",
- Durations.fromMillis(1234),
- nonEmptyMetadata,
- IS_SERVER,
- CALL_ID,
- socketAddress);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setMethodName("/service/method")
- .setTimeout(Durations.fromMillis(1234))
- .setType(GrpcLogEntry.Type.RECV_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .setPeer(BinlogHelper.socketToProto(socketAddress))
- .build());
-
- sinkWriterImpl.logRecvInitialMetadata(
- /*seq=*/ 1,
- "service/method",
- /*timeout=*/ null,
- nonEmptyMetadata,
- IS_SERVER,
- CALL_ID,
- socketAddress);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setMethodName("/service/method")
- .setType(GrpcLogEntry.Type.RECV_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .setPeer(BinlogHelper.socketToProto(socketAddress))
- .build());
+ InetSocketAddress peerAddress = new InetSocketAddress(address, port);
+ long callId = 1000;
+
+ GrpcLogEntry.Builder builder =
+ metadataToProtoTestHelper(EventType.EVENT_TYPE_SERVER_HEADER, nonEmptyMetadata, 10)
+ .toBuilder()
+ .setTimestamp(timestamp)
+ .setSequenceIdWithinCall(seq)
+ .setLogger(Logger.LOGGER_CLIENT)
+ .setCallId(callId)
+ .setPeer(BinlogHelper.socketToProto(peerAddress));
+
+ {
+ sinkWriterImpl.logServerHeader(
+ seq,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ peerAddress);
+ verify(sink).write(builder.build());
+ }
+
+ // logger is server
+ // null peerAddress is required for server side
+ {
+ sinkWriterImpl.logServerHeader(
+ seq,
+ nonEmptyMetadata,
+ Logger.LOGGER_SERVER,
+ callId,
+ /*peerAddress=*/ null);
+ verify(sink).write(
+ builder
+ .setLogger(Logger.LOGGER_SERVER)
+ .clearPeer()
+ .build());
+ }
+
+ // logger is server
+ // non null peerAddress is an error
+ try {
+ sinkWriterImpl.logServerHeader(
+ seq,
+ nonEmptyMetadata,
+ Logger.LOGGER_SERVER,
+ callId,
+ peerAddress);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ // noop
+ }
}
@Test
- public void logRecvInitialMetadata_client() throws Exception {
+ public void logTrailer() throws Exception {
+ long seq = 1;
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 12345;
- InetSocketAddress socketAddress = new InetSocketAddress(address, port);
- sinkWriterImpl.logRecvInitialMetadata(
- /*seq=*/ 1,
- /*methodName=*/ null,
- /*timeout=*/ null,
- nonEmptyMetadata,
- IS_CLIENT,
- CALL_ID,
- socketAddress);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_INITIAL_METADATA)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .setPeer(BinlogHelper.socketToProto(socketAddress))
- .build());
- }
+ InetSocketAddress peerAddress = new InetSocketAddress(address, port);
+ long callId = 1000;
+ Status statusDescription = Status.INTERNAL.withDescription("my description");
+
+ GrpcLogEntry.Builder builder =
+ metadataToProtoTestHelper(EventType.EVENT_TYPE_SERVER_TRAILER, nonEmptyMetadata, 10)
+ .toBuilder()
+ .setTimestamp(timestamp)
+ .setSequenceIdWithinCall(seq)
+ .setLogger(Logger.LOGGER_CLIENT)
+ .setCallId(callId)
+ .setPeer(BinlogHelper.socketToProto(peerAddress));
+
+ builder.getTrailerBuilder()
+ .setStatusCode(Status.INTERNAL.getCode().value())
+ .setStatusMessage("my description");
+ GrpcLogEntry base = builder.build();
- @Test
- public void logTrailingMetadata_server() throws Exception {
- sinkWriterImpl.logTrailingMetadata(/*seq=*/ 1, Status.OK, nonEmptyMetadata, IS_SERVER, CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_TRAILING_METADATA)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- Metadata detailedStatus = new Metadata();
- byte[] statusBytes = new byte[] {1, 2, 3, 4};
- detailedStatus.merge(nonEmptyMetadata);
- detailedStatus.put(STATUS_DETAILS_KEY, statusBytes);
- sinkWriterImpl.logTrailingMetadata(
- /*seq=*/ 1,
- Status.INTERNAL.withDescription("description"),
- detailedStatus,
- IS_SERVER,
- CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(detailedStatus, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_TRAILING_METADATA)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .setStatusCode(13)
- .setStatusMessage("description")
- .setStatusDetails(ByteString.copyFrom(statusBytes))
- .build());
- }
+ {
+ sinkWriterImpl.logTrailer(
+ seq,
+ statusDescription,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ peerAddress);
+ verify(sink).write(base);
+ }
- @Test
- public void logTrailingMetadata_client() throws Exception {
- sinkWriterImpl.logTrailingMetadata(/*seq=*/ 1, Status.OK, nonEmptyMetadata, IS_CLIENT, CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(nonEmptyMetadata, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_TRAILING_METADATA)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- Metadata detailedStatus = new Metadata();
- byte[] statusBytes = new byte[] {1, 2, 3, 4};
- detailedStatus.merge(nonEmptyMetadata);
- detailedStatus.put(STATUS_DETAILS_KEY, statusBytes);
- sinkWriterImpl.logTrailingMetadata(
- /*seq=*/ 1,
- Status.INTERNAL.withDescription("description"),
- detailedStatus,
- IS_CLIENT,
- CALL_ID);
- verify(sink).write(
- metadataToProtoTestHelper(detailedStatus, 10).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_TRAILING_METADATA)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .setStatusCode(13)
- .setStatusMessage("description")
- .setStatusDetails(ByteString.copyFrom(statusBytes))
- .build());
+ // logger is server
+ {
+ sinkWriterImpl.logTrailer(
+ seq,
+ statusDescription,
+ nonEmptyMetadata,
+ Logger.LOGGER_SERVER,
+ callId,
+ /*peerAddress=*/ null);
+ verify(sink).write(
+ base.toBuilder()
+ .clearPeer()
+ .setLogger(Logger.LOGGER_SERVER)
+ .build());
+ }
- }
+ // peerAddress is null
+ {
+ sinkWriterImpl.logTrailer(
+ seq,
+ statusDescription,
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ /*peerAddress=*/ null);
+ verify(sink).write(
+ base.toBuilder()
+ .clearPeer()
+ .build());
+ }
- @Test
- public void logOutboundMessage_server() throws Exception {
- sinkWriterImpl.logOutboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_COMPRESSED, IS_SERVER, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_COMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- sinkWriterImpl.logOutboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_UNCOMPRESSED, IS_SERVER, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_UNCOMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
- verifyNoMoreInteractions(sink);
+ // status code is present but description is null
+ {
+ sinkWriterImpl.logTrailer(
+ seq,
+ statusDescription.getCode().toStatus(), // strip the description
+ nonEmptyMetadata,
+ Logger.LOGGER_CLIENT,
+ callId,
+ peerAddress);
+ verify(sink).write(
+ base.toBuilder()
+ .setTrailer(base.getTrailer().toBuilder().clearStatusMessage())
+ .build());
+ }
+
+ // status proto always logged if present (com.google.rpc.Status),
+ {
+ int zeroHeaderBytes = 0;
+ SinkWriterImpl truncatingWriter = new SinkWriterImpl(
+ sink, timeProvider, zeroHeaderBytes, MESSAGE_LIMIT);
+ com.google.rpc.Status statusProto = com.google.rpc.Status.newBuilder()
+ .addDetails(
+ Any.pack(StringValue.newBuilder().setValue("arbitrarypayload").build()))
+ .setCode(Status.INTERNAL.getCode().value())
+ .setMessage("status detail string")
+ .build();
+ StatusException statusException
+ = StatusProto.toStatusException(statusProto, nonEmptyMetadata);
+ truncatingWriter.logTrailer(
+ seq,
+ statusException.getStatus(),
+ statusException.getTrailers(),
+ Logger.LOGGER_CLIENT,
+ callId,
+ peerAddress);
+ verify(sink).write(
+ base.toBuilder()
+ .setTrailer(
+ builder.getTrailerBuilder()
+ .setStatusMessage("status detail string")
+ .setStatusDetails(ByteString.copyFrom(statusProto.toByteArray()))
+ .setMetadata(io.grpc.binarylog.v1.Metadata.getDefaultInstance()))
+ .build());
+ }
}
@Test
- public void logOutboundMessage_client() throws Exception {
- sinkWriterImpl.logOutboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_COMPRESSED, IS_CLIENT, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_COMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- sinkWriterImpl.logOutboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_UNCOMPRESSED, IS_CLIENT, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_UNCOMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.SEND_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
- verifyNoMoreInteractions(sink);
+ public void alwaysLoggedMetadata_grpcTraceBin() throws Exception {
+ Metadata.Key<byte[]> key
+ = Metadata.Key.of("grpc-trace-bin", Metadata.BINARY_BYTE_MARSHALLER);
+ Metadata metadata = new Metadata();
+ metadata.put(key, new byte[1]);
+ int zeroHeaderBytes = 0;
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair =
+ createMetadataProto(metadata, zeroHeaderBytes);
+ assertEquals(
+ key.name(),
+ Iterables.getOnlyElement(pair.proto.getEntryBuilderList()).getKey());
+ assertFalse(pair.truncated);
}
@Test
- public void logInboundMessage_server() throws Exception {
- sinkWriterImpl.logInboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_COMPRESSED, IS_SERVER, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_COMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- sinkWriterImpl.logInboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_UNCOMPRESSED, IS_SERVER, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_UNCOMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.SERVER)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
- verifyNoMoreInteractions(sink);
+ public void neverLoggedMetadata_grpcStatusDetilsBin() throws Exception {
+ Metadata.Key<byte[]> key
+ = Metadata.Key.of("grpc-status-details-bin", Metadata.BINARY_BYTE_MARSHALLER);
+ Metadata metadata = new Metadata();
+ metadata.put(key, new byte[1]);
+ int unlimitedHeaderBytes = Integer.MAX_VALUE;
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair
+ = createMetadataProto(metadata, unlimitedHeaderBytes);
+ assertThat(pair.proto.getEntryBuilderList()).isEmpty();
+ assertFalse(pair.truncated);
}
@Test
- public void logInboundMessage_client() throws Exception {
- sinkWriterImpl.logInboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_COMPRESSED, IS_CLIENT, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_COMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
-
- sinkWriterImpl.logInboundMessage(
- /*seq=*/ 1, BYTEARRAY_MARSHALLER, message, IS_UNCOMPRESSED, IS_CLIENT, CALL_ID);
- verify(sink).write(
- messageToProtoTestHelper(message, IS_UNCOMPRESSED, MESSAGE_LIMIT).toBuilder()
- .setSequenceIdWithinCall(1)
- .setType(GrpcLogEntry.Type.RECV_MESSAGE)
- .setLogger(GrpcLogEntry.Logger.CLIENT)
- .setCallId(BinlogHelper.callIdToProto(CALL_ID))
- .build());
- verifyNoMoreInteractions(sink);
+ public void logRpcMessage() throws Exception {
+ long seq = 1;
+ long callId = 1000;
+ GrpcLogEntry base = messageToProtoTestHelper(message, MESSAGE_LIMIT).toBuilder()
+ .setTimestamp(timestamp)
+ .setType(EventType.EVENT_TYPE_CLIENT_MESSAGE)
+ .setLogger(Logger.LOGGER_CLIENT)
+ .setSequenceIdWithinCall(1)
+ .setCallId(callId)
+ .build();
+ {
+ sinkWriterImpl.logRpcMessage(
+ seq,
+ EventType.EVENT_TYPE_CLIENT_MESSAGE,
+ BYTEARRAY_MARSHALLER,
+ message,
+ Logger.LOGGER_CLIENT,
+ callId);
+ verify(sink).write(base);
+ }
+
+ // server messsage
+ {
+ sinkWriterImpl.logRpcMessage(
+ seq,
+ EventType.EVENT_TYPE_SERVER_MESSAGE,
+ BYTEARRAY_MARSHALLER,
+ message,
+ Logger.LOGGER_CLIENT,
+ callId);
+ verify(sink).write(
+ base.toBuilder()
+ .setType(EventType.EVENT_TYPE_SERVER_MESSAGE)
+ .build());
+ }
+
+ // logger is server
+ {
+ sinkWriterImpl.logRpcMessage(
+ seq,
+ EventType.EVENT_TYPE_CLIENT_MESSAGE,
+ BYTEARRAY_MARSHALLER,
+ message,
+ Logger.LOGGER_SERVER,
+ callId);
+ verify(sink).write(
+ base.toBuilder()
+ .setLogger(Logger.LOGGER_SERVER)
+ .build());
+ }
}
@Test
public void getPeerSocketTest() {
- assertSame(DUMMY_SOCKET, getPeerSocket(Attributes.EMPTY));
+ assertNull(getPeerSocket(Attributes.EMPTY));
assertSame(
peer,
getPeerSocket(Attributes.newBuilder().set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, peer).build()));
}
@Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void serverDeadlineLogged() {
+ final AtomicReference<ServerCall> interceptedCall =
+ new AtomicReference<ServerCall>();
+ final ServerCall.Listener mockListener = mock(ServerCall.Listener.class);
+
+ final MethodDescriptor<byte[], byte[]> method =
+ MethodDescriptor.<byte[], byte[]>newBuilder()
+ .setType(MethodType.UNKNOWN)
+ .setFullMethodName("service/method")
+ .setRequestMarshaller(BYTEARRAY_MARSHALLER)
+ .setResponseMarshaller(BYTEARRAY_MARSHALLER)
+ .build();
+
+ // We expect the contents of the "grpc-timeout" header to be installed the context
+ Context.current()
+ .withDeadlineAfter(1, TimeUnit.SECONDS, Executors.newSingleThreadScheduledExecutor())
+ .run(new Runnable() {
+ @Override
+ public void run() {
+ ServerCall.Listener<byte[]> unused =
+ new BinlogHelper(mockSinkWriter)
+ .getServerInterceptor(CALL_ID)
+ .interceptCall(
+ new NoopServerCall<byte[], byte[]>() {
+ @Override
+ public MethodDescriptor<byte[], byte[]> getMethodDescriptor() {
+ return method;
+ }
+ },
+ new Metadata(),
+ new ServerCallHandler<byte[], byte[]>() {
+ @Override
+ public ServerCall.Listener<byte[]> startCall(
+ ServerCall<byte[], byte[]> call,
+ Metadata headers) {
+ interceptedCall.set(call);
+ return mockListener;
+ }
+ });
+ }
+ });
+ ArgumentCaptor<Duration> timeoutCaptor = ArgumentCaptor.forClass(Duration.class);
+ verify(mockSinkWriter).logClientHeader(
+ /*seq=*/ eq(1L),
+ eq("service/method"),
+ isNull(String.class),
+ timeoutCaptor.capture(),
+ any(Metadata.class),
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
+ verifyNoMoreInteractions(mockSinkWriter);
+ assertThat(TimeUnit.SECONDS.toNanos(1) - timeoutCaptor.getValue().getNanos())
+ .isAtMost(TimeUnit.MILLISECONDS.toNanos(250));
+ }
+
+ @Test
@SuppressWarnings({"unchecked"})
public void clientDeadlineLogged_deadlineSetViaCallOption() {
MethodDescriptor<byte[], byte[]> method =
@@ -870,13 +1003,15 @@ public final class BinlogHelperTest {
});
call.start(mockListener, new Metadata());
ArgumentCaptor<Duration> callOptTimeoutCaptor = ArgumentCaptor.forClass(Duration.class);
- verify(mockSinkWriter).logSendInitialMetadata(
+ verify(mockSinkWriter).logClientHeader(
any(Integer.class),
any(String.class),
+ any(String.class),
callOptTimeoutCaptor.capture(),
any(Metadata.class),
- any(Boolean.class),
- any(CallId.class));
+ any(GrpcLogEntry.Logger.class),
+ any(Long.class),
+ any(SocketAddress.class));
Duration timeout = callOptTimeoutCaptor.getValue();
assertThat(TimeUnit.SECONDS.toNanos(1) - Durations.toNanos(timeout))
.isAtMost(TimeUnit.MILLISECONDS.toNanos(250));
@@ -924,13 +1059,15 @@ public final class BinlogHelperTest {
ClientCall.Listener<byte[]> mockListener = mock(ClientCall.Listener.class);
callFuture.get().start(mockListener, new Metadata());
ArgumentCaptor<Duration> callOptTimeoutCaptor = ArgumentCaptor.forClass(Duration.class);
- verify(mockSinkWriter).logSendInitialMetadata(
+ verify(mockSinkWriter).logClientHeader(
any(Integer.class),
any(String.class),
+ any(String.class),
callOptTimeoutCaptor.capture(),
any(Metadata.class),
- any(Boolean.class),
- any(CallId.class));
+ any(GrpcLogEntry.Logger.class),
+ any(Long.class),
+ any(SocketAddress.class));
Duration timeout = callOptTimeoutCaptor.getValue();
assertThat(TimeUnit.SECONDS.toNanos(1) - Durations.toNanos(timeout))
.isAtMost(TimeUnit.MILLISECONDS.toNanos(250));
@@ -945,6 +1082,8 @@ public final class BinlogHelperTest {
final AtomicReference<Metadata> actualClientInitial = new AtomicReference<Metadata>();
final AtomicReference<Object> actualRequest = new AtomicReference<Object>();
+ final SettableFuture<Void> halfCloseCalled = SettableFuture.create();
+ final SettableFuture<Void> cancelCalled = SettableFuture.create();
Channel channel = new Channel() {
@Override
public <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(
@@ -962,6 +1101,16 @@ public final class BinlogHelperTest {
}
@Override
+ public void cancel(String message, Throwable cause) {
+ cancelCalled.set(null);
+ }
+
+ @Override
+ public void halfClose() {
+ halfCloseCalled.set(null);
+ }
+
+ @Override
public Attributes getAttributes() {
return Attributes.newBuilder().set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, peer).build();
}
@@ -970,7 +1119,7 @@ public final class BinlogHelperTest {
@Override
public String authority() {
- throw new UnsupportedOperationException();
+ return "the-authority";
}
};
@@ -988,86 +1137,189 @@ public final class BinlogHelperTest {
.getClientInterceptor(CALL_ID)
.interceptCall(
method,
- CallOptions.DEFAULT.withDeadlineAfter(1, TimeUnit.SECONDS),
+ CallOptions.DEFAULT,
channel);
- // send initial metadata
+ // send client header
{
Metadata clientInitial = new Metadata();
interceptedCall.start(mockListener, clientInitial);
- ArgumentCaptor<Duration> timeoutCaptor = ArgumentCaptor.forClass(Duration.class);
- verify(mockSinkWriter).logSendInitialMetadata(
- /*seq=*/ eq(1),
+ verify(mockSinkWriter).logClientHeader(
+ /*seq=*/ eq(1L),
eq("service/method"),
- timeoutCaptor.capture(),
+ eq("the-authority"),
+ isNull(Duration.class),
same(clientInitial),
- eq(IS_CLIENT),
- same(CALL_ID));
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
verifyNoMoreInteractions(mockSinkWriter);
- Duration timeout = timeoutCaptor.getValue();
- assertThat(TimeUnit.SECONDS.toNanos(1) - Durations.toNanos(timeout))
- .isAtMost(TimeUnit.MILLISECONDS.toNanos(250));
assertSame(clientInitial, actualClientInitial.get());
}
- // receive initial metadata
+ // receive server header
{
Metadata serverInitial = new Metadata();
interceptedListener.get().onHeaders(serverInitial);
- verify(mockSinkWriter).logRecvInitialMetadata(
- /*seq=*/ eq(2),
- isNull(String.class),
- isNull(Duration.class),
+ verify(mockSinkWriter).logServerHeader(
+ /*seq=*/ eq(2L),
same(serverInitial),
- eq(IS_CLIENT),
- same(CALL_ID),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID),
same(peer));
verifyNoMoreInteractions(mockSinkWriter);
verify(mockListener).onHeaders(same(serverInitial));
}
- // send request
+ // send client msg
{
byte[] request = "this is a request".getBytes(US_ASCII);
interceptedCall.sendMessage(request);
- verify(mockSinkWriter).logOutboundMessage(
- /*seq=*/ eq(3),
+ verify(mockSinkWriter).logRpcMessage(
+ /*seq=*/ eq(3L),
+ eq(EventType.EVENT_TYPE_CLIENT_MESSAGE),
same(BYTEARRAY_MARSHALLER),
same(request),
- eq(BinlogHelper.DUMMY_IS_COMPRESSED),
- eq(IS_CLIENT),
- same(CALL_ID));
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID));
verifyNoMoreInteractions(mockSinkWriter);
assertSame(request, actualRequest.get());
}
- // receive response
+ // client half close
+ {
+ interceptedCall.halfClose();
+ verify(mockSinkWriter).logHalfClose(
+ /*seq=*/ eq(4L),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID));
+ halfCloseCalled.get(1, TimeUnit.SECONDS);
+ verifyNoMoreInteractions(mockSinkWriter);
+ }
+
+ // receive server msg
{
byte[] response = "this is a response".getBytes(US_ASCII);
interceptedListener.get().onMessage(response);
- verify(mockSinkWriter).logInboundMessage(
- /*seq=*/ eq(4),
+ verify(mockSinkWriter).logRpcMessage(
+ /*seq=*/ eq(5L),
+ eq(EventType.EVENT_TYPE_SERVER_MESSAGE),
same(BYTEARRAY_MARSHALLER),
- eq(response),
- eq(BinlogHelper.DUMMY_IS_COMPRESSED),
- eq(IS_CLIENT),
- same(CALL_ID));
+ same(response),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID));
verifyNoMoreInteractions(mockSinkWriter);
verify(mockListener).onMessage(same(response));
}
- // receive trailers
+ // receive trailer
+ {
+ Status status = Status.INTERNAL.withDescription("some description");
+ Metadata trailers = new Metadata();
+
+ interceptedListener.get().onClose(status, trailers);
+ verify(mockSinkWriter).logTrailer(
+ /*seq=*/ eq(6L),
+ same(status),
+ same(trailers),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
+ verifyNoMoreInteractions(mockSinkWriter);
+ verify(mockListener).onClose(same(status), same(trailers));
+ }
+
+ // cancel
+ {
+ interceptedCall.cancel(null, null);
+ verify(mockSinkWriter).logCancel(
+ /*seq=*/ eq(7L),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID));
+ cancelCalled.get(1, TimeUnit.SECONDS);
+ }
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void clientInterceptor_trailersOnlyResponseLogsPeerAddress() throws Exception {
+ final AtomicReference<ClientCall.Listener> interceptedListener =
+ new AtomicReference<ClientCall.Listener>();
+ // capture these manually because ClientCall can not be mocked
+ final AtomicReference<Metadata> actualClientInitial = new AtomicReference<Metadata>();
+ final AtomicReference<Object> actualRequest = new AtomicReference<Object>();
+
+ Channel channel = new Channel() {
+ @Override
+ public <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(
+ MethodDescriptor<RequestT, ResponseT> methodDescriptor, CallOptions callOptions) {
+ return new NoopClientCall<RequestT, ResponseT>() {
+ @Override
+ public void start(Listener<ResponseT> responseListener, Metadata headers) {
+ interceptedListener.set(responseListener);
+ actualClientInitial.set(headers);
+ }
+
+ @Override
+ public void sendMessage(RequestT message) {
+ actualRequest.set(message);
+ }
+
+ @Override
+ public Attributes getAttributes() {
+ return Attributes.newBuilder().set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, peer).build();
+ }
+ };
+ }
+
+ @Override
+ public String authority() {
+ return "the-authority";
+ }
+ };
+
+ ClientCall.Listener<byte[]> mockListener = mock(ClientCall.Listener.class);
+
+ MethodDescriptor<byte[], byte[]> method =
+ MethodDescriptor.<byte[], byte[]>newBuilder()
+ .setType(MethodType.UNKNOWN)
+ .setFullMethodName("service/method")
+ .setRequestMarshaller(BYTEARRAY_MARSHALLER)
+ .setResponseMarshaller(BYTEARRAY_MARSHALLER)
+ .build();
+ ClientCall<byte[], byte[]> interceptedCall =
+ new BinlogHelper(mockSinkWriter)
+ .getClientInterceptor(CALL_ID)
+ .interceptCall(
+ method,
+ CallOptions.DEFAULT.withDeadlineAfter(1, TimeUnit.SECONDS),
+ channel);
+ Metadata clientInitial = new Metadata();
+ interceptedCall.start(mockListener, clientInitial);
+ verify(mockSinkWriter).logClientHeader(
+ /*seq=*/ eq(1L),
+ any(String.class),
+ any(String.class),
+ any(Duration.class),
+ any(Metadata.class),
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
+ verifyNoMoreInteractions(mockSinkWriter);
+
+ // trailer only response
{
Status status = Status.INTERNAL.withDescription("some description");
Metadata trailers = new Metadata();
interceptedListener.get().onClose(status, trailers);
- verify(mockSinkWriter).logTrailingMetadata(
- /*seq=*/ eq(5),
+ verify(mockSinkWriter).logTrailer(
+ /*seq=*/ eq(2L),
same(status),
same(trailers),
- eq(IS_CLIENT),
- same(CALL_ID));
+ eq(Logger.LOGGER_CLIENT),
+ eq(CALL_ID),
+ same(peer));
verifyNoMoreInteractions(mockSinkWriter);
verify(mockListener).onClose(same(status), same(trailers));
}
@@ -1086,10 +1338,9 @@ public final class BinlogHelperTest {
final AtomicReference<Status> actualStatus = new AtomicReference<Status>();
final AtomicReference<Metadata> actualTrailers = new AtomicReference<Metadata>();
- // begin call and receive initial metadata
+ // begin call and receive client header
{
Metadata clientInitial = new Metadata();
- clientInitial.put(GrpcUtil.TIMEOUT_KEY, TimeUnit.MILLISECONDS.toNanos(1234));
final MethodDescriptor<byte[], byte[]> method =
MethodDescriptor.<byte[], byte[]>newBuilder()
.setType(MethodType.UNKNOWN)
@@ -1130,6 +1381,11 @@ public final class BinlogHelperTest {
.set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, peer)
.build();
}
+
+ @Override
+ public String getAuthority() {
+ return "the-authority";
+ }
},
clientInitial,
new ServerCallHandler<byte[], byte[]>() {
@@ -1141,77 +1397,99 @@ public final class BinlogHelperTest {
return mockListener;
}
});
- verify(mockSinkWriter).logRecvInitialMetadata(
- /*seq=*/ eq(1),
+ verify(mockSinkWriter).logClientHeader(
+ /*seq=*/ eq(1L),
eq("service/method"),
- eq(Durations.fromMillis(1234)),
+ eq("the-authority"),
+ isNull(Duration.class),
same(clientInitial),
- eq(IS_SERVER),
- same(CALL_ID),
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID),
same(peer));
verifyNoMoreInteractions(mockSinkWriter);
}
- // send initial metadata
+ // send server header
{
Metadata serverInital = new Metadata();
interceptedCall.get().sendHeaders(serverInital);
- verify(mockSinkWriter).logSendInitialMetadata(
- /*seq=*/ eq(2),
- isNull(String.class),
- isNull(Duration.class),
+ verify(mockSinkWriter).logServerHeader(
+ /*seq=*/ eq(2L),
same(serverInital),
- eq(IS_SERVER),
- same(CALL_ID));
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
verifyNoMoreInteractions(mockSinkWriter);
assertSame(serverInital, actualServerInitial.get());
}
- // receive request
+ // receive client msg
{
byte[] request = "this is a request".getBytes(US_ASCII);
capturedListener.onMessage(request);
- verify(mockSinkWriter).logInboundMessage(
- /*seq=*/ eq(3),
+ verify(mockSinkWriter).logRpcMessage(
+ /*seq=*/ eq(3L),
+ eq(EventType.EVENT_TYPE_CLIENT_MESSAGE),
same(BYTEARRAY_MARSHALLER),
same(request),
- eq(BinlogHelper.DUMMY_IS_COMPRESSED),
- eq(IS_SERVER),
- same(CALL_ID));
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID));
verifyNoMoreInteractions(mockSinkWriter);
verify(mockListener).onMessage(same(request));
}
- // send response
+ // client half close
+ {
+ capturedListener.onHalfClose();
+ verify(mockSinkWriter).logHalfClose(
+ eq(4L),
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID));
+ verifyNoMoreInteractions(mockSinkWriter);
+ verify(mockListener).onHalfClose();
+ }
+
+ // send server msg
{
byte[] response = "this is a response".getBytes(US_ASCII);
interceptedCall.get().sendMessage(response);
- verify(mockSinkWriter).logOutboundMessage(
- /*seq=*/ eq(4),
+ verify(mockSinkWriter).logRpcMessage(
+ /*seq=*/ eq(5L),
+ eq(EventType.EVENT_TYPE_SERVER_MESSAGE),
same(BYTEARRAY_MARSHALLER),
same(response),
- eq(BinlogHelper.DUMMY_IS_COMPRESSED),
- eq(IS_SERVER),
- same(CALL_ID));
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID));
verifyNoMoreInteractions(mockSinkWriter);
assertSame(response, actualResponse.get());
}
- // send trailers
+ // send trailer
{
Status status = Status.INTERNAL.withDescription("some description");
Metadata trailers = new Metadata();
interceptedCall.get().close(status, trailers);
- verify(mockSinkWriter).logTrailingMetadata(
- /*seq=*/ eq(5),
+ verify(mockSinkWriter).logTrailer(
+ /*seq=*/ eq(6L),
same(status),
same(trailers),
- eq(IS_SERVER),
- same(CALL_ID));
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID),
+ isNull(SocketAddress.class));
verifyNoMoreInteractions(mockSinkWriter);
assertSame(status, actualStatus.get());
assertSame(trailers, actualTrailers.get());
}
+
+ // cancel
+ {
+ capturedListener.onCancel();
+ verify(mockSinkWriter).logCancel(
+ /*seq=*/ eq(7L),
+ eq(Logger.LOGGER_SERVER),
+ eq(CALL_ID));
+ verify(mockListener).onCancel();
+ }
}
/** A builder class to make unit test code more readable. */
@@ -1231,7 +1509,7 @@ public final class BinlogHelperTest {
BinlogHelper build() {
return new BinlogHelper(
- new SinkWriterImpl(mock(BinaryLogSink.class), maxHeaderBytes, maxMessageBytes));
+ new SinkWriterImpl(mock(BinaryLogSink.class), null, maxHeaderBytes, maxMessageBytes));
}
}
@@ -1249,16 +1527,33 @@ public final class BinlogHelperTest {
}
private static GrpcLogEntry metadataToProtoTestHelper(
- Metadata metadata, int maxHeaderBytes) {
+ EventType type, Metadata metadata, int maxHeaderBytes) {
GrpcLogEntry.Builder builder = GrpcLogEntry.newBuilder();
- BinlogHelper.addMetadataToProto(builder, metadata, maxHeaderBytes);
+ MaybeTruncated<io.grpc.binarylog.v1.Metadata.Builder> pair
+ = BinlogHelper.createMetadataProto(metadata, maxHeaderBytes);
+ switch (type) {
+ case EVENT_TYPE_CLIENT_HEADER:
+ builder.setClientHeader(ClientHeader.newBuilder().setMetadata(pair.proto));
+ break;
+ case EVENT_TYPE_SERVER_HEADER:
+ builder.setServerHeader(ServerHeader.newBuilder().setMetadata(pair.proto));
+ break;
+ case EVENT_TYPE_SERVER_TRAILER:
+ builder.setTrailer(Trailer.newBuilder().setMetadata(pair.proto));
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ builder.setType(type).setPayloadTruncated(pair.truncated);
return builder.build();
}
private static GrpcLogEntry messageToProtoTestHelper(
- byte[] message, boolean compressed, int maxMessageBytes) {
+ byte[] message, int maxMessageBytes) {
GrpcLogEntry.Builder builder = GrpcLogEntry.newBuilder();
- BinlogHelper.messageToProto(builder, message, compressed, maxMessageBytes);
+ MaybeTruncated<Message.Builder> pair
+ = BinlogHelper.createMessageProto(message, maxMessageBytes);
+ builder.setMessage(pair.proto).setPayloadTruncated(pair.truncated);
return builder.build();
}
}
diff --git a/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java b/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java
index 2acbba932..19f5e1f68 100644
--- a/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java
+++ b/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java
@@ -44,7 +44,6 @@ import com.google.common.collect.Lists;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
import io.grpc.Attributes;
-import io.grpc.CallCredentials;
import io.grpc.CallOptions;
import io.grpc.ClientStreamTracer;
import io.grpc.Grpc;
@@ -59,6 +58,7 @@ import io.grpc.internal.ClientStream;
import io.grpc.internal.ClientStreamListener;
import io.grpc.internal.ClientTransport;
import io.grpc.internal.ConnectionClientTransport;
+import io.grpc.internal.GrpcAttributes;
import io.grpc.internal.InternalServer;
import io.grpc.internal.IoUtils;
import io.grpc.internal.ManagedClientTransport;
@@ -346,7 +346,7 @@ public abstract class AbstractTransportTest {
verify(mockClientTransportListener, timeout(TIMEOUT_MS)).transportReady();
assertNotNull("security level should be set in client attributes",
- connectionClient.getAttributes().get(CallCredentials.ATTR_SECURITY_LEVEL));
+ connectionClient.getAttributes().get(GrpcAttributes.ATTR_SECURITY_LEVEL));
}
@Test
@@ -707,6 +707,7 @@ public abstract class AbstractTransportTest {
assertEquals("additional attribute value",
serverStream.getAttributes().get(ADDITIONAL_TRANSPORT_ATTR_KEY));
assertNotNull(serverStream.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR));
+ assertNotNull(serverStream.getAttributes().get(Grpc.TRANSPORT_ATTR_LOCAL_ADDR));
serverStream.request(1);
assertTrue(clientStreamListener.awaitOnReadyAndDrain(TIMEOUT_MS, TimeUnit.MILLISECONDS));