diff --git a/MODULE.bazel b/MODULE.bazel
index 9c18d918a2c..10f264512b2 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -2,7 +2,7 @@ module(
name = "grpc-java",
compatibility_level = 0,
repo_name = "io_grpc_grpc_java",
- version = "1.71.0-SNAPSHOT", # CURRENT_GRPC_VERSION
+ version = "1.71.1-SNAPSHOT", # CURRENT_GRPC_VERSION
)
# GRPC_DEPS_START
diff --git a/README.md b/README.md
index c9f68d4ccb9..756519d0ad0 100644
--- a/README.md
+++ b/README.md
@@ -44,8 +44,8 @@ For a guided tour, take a look at the [quick start
guide](https://grpc.io/docs/languages/java/quickstart) or the more explanatory [gRPC
basics](https://grpc.io/docs/languages/java/basics).
-The [examples](https://github.com/grpc/grpc-java/tree/v1.70.0/examples) and the
-[Android example](https://github.com/grpc/grpc-java/tree/v1.70.0/examples/android)
+The [examples](https://github.com/grpc/grpc-java/tree/v1.71.0/examples) and the
+[Android example](https://github.com/grpc/grpc-java/tree/v1.71.0/examples/android)
are standalone projects that showcase the usage of gRPC.
Download
@@ -56,18 +56,18 @@ Download [the JARs][]. Or for Maven with non-Android, add to your `pom.xml`:
io.grpc
grpc-netty-shaded
- 1.70.0
+ 1.71.0
runtime
io.grpc
grpc-protobuf
- 1.70.0
+ 1.71.0
io.grpc
grpc-stub
- 1.70.0
+ 1.71.0
org.apache.tomcat
@@ -79,18 +79,18 @@ Download [the JARs][]. Or for Maven with non-Android, add to your `pom.xml`:
Or for Gradle with non-Android, add to your dependencies:
```gradle
-runtimeOnly 'io.grpc:grpc-netty-shaded:1.70.0'
-implementation 'io.grpc:grpc-protobuf:1.70.0'
-implementation 'io.grpc:grpc-stub:1.70.0'
+runtimeOnly 'io.grpc:grpc-netty-shaded:1.71.0'
+implementation 'io.grpc:grpc-protobuf:1.71.0'
+implementation 'io.grpc:grpc-stub:1.71.0'
compileOnly 'org.apache.tomcat:annotations-api:6.0.53' // necessary for Java 9+
```
For Android client, use `grpc-okhttp` instead of `grpc-netty-shaded` and
`grpc-protobuf-lite` instead of `grpc-protobuf`:
```gradle
-implementation 'io.grpc:grpc-okhttp:1.70.0'
-implementation 'io.grpc:grpc-protobuf-lite:1.70.0'
-implementation 'io.grpc:grpc-stub:1.70.0'
+implementation 'io.grpc:grpc-okhttp:1.71.0'
+implementation 'io.grpc:grpc-protobuf-lite:1.71.0'
+implementation 'io.grpc:grpc-stub:1.71.0'
compileOnly 'org.apache.tomcat:annotations-api:6.0.53' // necessary for Java 9+
```
@@ -99,7 +99,7 @@ For [Bazel](https://bazel.build), you can either
(with the GAVs from above), or use `@io_grpc_grpc_java//api` et al (see below).
[the JARs]:
-https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.70.0
+https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.71.0
Development snapshots are available in [Sonatypes's snapshot
repository](https://oss.sonatype.org/content/repositories/snapshots/).
@@ -131,7 +131,7 @@ For protobuf-based codegen integrated with the Maven build system, you can use
com.google.protobuf:protoc:3.25.5:exe:${os.detected.classifier}
grpc-java
- io.grpc:protoc-gen-grpc-java:1.70.0:exe:${os.detected.classifier}
+ io.grpc:protoc-gen-grpc-java:1.71.0:exe:${os.detected.classifier}
@@ -161,7 +161,7 @@ protobuf {
}
plugins {
grpc {
- artifact = 'io.grpc:protoc-gen-grpc-java:1.70.0'
+ artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0'
}
}
generateProtoTasks {
@@ -194,7 +194,7 @@ protobuf {
}
plugins {
grpc {
- artifact = 'io.grpc:protoc-gen-grpc-java:1.70.0'
+ artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0'
}
}
generateProtoTasks {
diff --git a/build.gradle b/build.gradle
index 09c78735776..b530f466b1d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,7 +21,7 @@ subprojects {
apply plugin: "net.ltgt.errorprone"
group = "io.grpc"
- version = "1.71.0-SNAPSHOT" // CURRENT_GRPC_VERSION
+ version = "1.71.1-SNAPSHOT" // CURRENT_GRPC_VERSION
repositories {
maven { // The google mirror is less flaky than mavenCentral()
diff --git a/buildscripts/grpc-java-artifacts/Dockerfile b/buildscripts/grpc-java-artifacts/Dockerfile
index 736babe9d8e..bf71a710d74 100644
--- a/buildscripts/grpc-java-artifacts/Dockerfile
+++ b/buildscripts/grpc-java-artifacts/Dockerfile
@@ -28,6 +28,6 @@ RUN mkdir -p "$ANDROID_HOME/cmdline-tools" && \
yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --licenses
# Install Maven
-RUN curl -Ls https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz | \
+RUN curl -Ls https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz | \
tar xz -C /var/local
ENV PATH /var/local/apache-maven-3.8.8/bin:$PATH
diff --git a/buildscripts/kokoro/psm-dualstack.cfg b/buildscripts/kokoro/psm-dualstack.cfg
index 55c906bc4ec..a55d91a95b0 100644
--- a/buildscripts/kokoro/psm-dualstack.cfg
+++ b/buildscripts/kokoro/psm-dualstack.cfg
@@ -2,7 +2,7 @@
# Location of the continuous shell script in repository.
build_file: "grpc-java/buildscripts/kokoro/psm-interop-test-java.sh"
-timeout_mins: 120
+timeout_mins: 240
action {
define_artifacts {
diff --git a/buildscripts/kokoro/psm-fallback.cfg b/buildscripts/kokoro/psm-light.cfg
similarity index 94%
rename from buildscripts/kokoro/psm-fallback.cfg
rename to buildscripts/kokoro/psm-light.cfg
index 7335d1d9fd9..decd179efa3 100644
--- a/buildscripts/kokoro/psm-fallback.cfg
+++ b/buildscripts/kokoro/psm-light.cfg
@@ -13,5 +13,5 @@ action {
}
env_vars {
key: "PSM_TEST_SUITE"
- value: "fallback"
+ value: "light"
}
diff --git a/buildscripts/kokoro/psm-spiffe.cfg b/buildscripts/kokoro/psm-spiffe.cfg
new file mode 100644
index 00000000000..b04d715fca1
--- /dev/null
+++ b/buildscripts/kokoro/psm-spiffe.cfg
@@ -0,0 +1,17 @@
+# Config file for internal CI
+
+# Location of the continuous shell script in repository.
+build_file: "grpc-java/buildscripts/kokoro/psm-interop-test-java.sh"
+timeout_mins: 240
+
+action {
+ define_artifacts {
+ regex: "artifacts/**/*sponge_log.xml"
+ regex: "artifacts/**/*.log"
+ strip_prefix: "artifacts"
+ }
+}
+env_vars {
+ key: "PSM_TEST_SUITE"
+ value: "spiffe"
+}
diff --git a/compiler/src/test/golden/TestDeprecatedService.java.txt b/compiler/src/test/golden/TestDeprecatedService.java.txt
index e696def7b99..225eb8f4806 100644
--- a/compiler/src/test/golden/TestDeprecatedService.java.txt
+++ b/compiler/src/test/golden/TestDeprecatedService.java.txt
@@ -8,7 +8,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
*
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.71.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.71.1-SNAPSHOT)",
comments = "Source: grpc/testing/compiler/test.proto")
@io.grpc.stub.annotations.GrpcGenerated
@java.lang.Deprecated
diff --git a/compiler/src/test/golden/TestService.java.txt b/compiler/src/test/golden/TestService.java.txt
index c052093cbbc..a627aeccb9a 100644
--- a/compiler/src/test/golden/TestService.java.txt
+++ b/compiler/src/test/golden/TestService.java.txt
@@ -8,7 +8,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
*
*/
@javax.annotation.Generated(
- value = "by gRPC proto compiler (version 1.71.0-SNAPSHOT)",
+ value = "by gRPC proto compiler (version 1.71.1-SNAPSHOT)",
comments = "Source: grpc/testing/compiler/test.proto")
@io.grpc.stub.annotations.GrpcGenerated
public final class TestServiceGrpc {
diff --git a/core/src/main/java/io/grpc/internal/DelayedClientTransport.java b/core/src/main/java/io/grpc/internal/DelayedClientTransport.java
index 8ff755af3eb..eccd8fadc8c 100644
--- a/core/src/main/java/io/grpc/internal/DelayedClientTransport.java
+++ b/core/src/main/java/io/grpc/internal/DelayedClientTransport.java
@@ -325,7 +325,11 @@ final void reprocess(@Nullable SubchannelPicker picker) {
if (!hasPendingStreams()) {
return;
}
- pendingStreams.removeAll(toRemove);
+ // Avoid pendingStreams.removeAll() as it can degrade to calling toRemove.contains() for each
+ // element in pendingStreams.
+ for (PendingStream stream : toRemove) {
+ pendingStreams.remove(stream);
+ }
// Because delayed transport is long-lived, we take this opportunity to down-size the
// hashmap.
if (pendingStreams.isEmpty()) {
diff --git a/core/src/main/java/io/grpc/internal/GrpcUtil.java b/core/src/main/java/io/grpc/internal/GrpcUtil.java
index fc420195667..5eece39e1a8 100644
--- a/core/src/main/java/io/grpc/internal/GrpcUtil.java
+++ b/core/src/main/java/io/grpc/internal/GrpcUtil.java
@@ -219,7 +219,7 @@ public byte[] parseAsciiString(byte[] serialized) {
public static final Splitter ACCEPT_ENCODING_SPLITTER = Splitter.on(',').trimResults();
- public static final String IMPLEMENTATION_VERSION = "1.71.0-SNAPSHOT"; // CURRENT_GRPC_VERSION
+ public static final String IMPLEMENTATION_VERSION = "1.71.1-SNAPSHOT"; // CURRENT_GRPC_VERSION
/**
* The default timeout in nanos for a keepalive ping request.
diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel
index 72541817979..64f86a3761a 100644
--- a/examples/MODULE.bazel
+++ b/examples/MODULE.bazel
@@ -1,5 +1,5 @@
bazel_dep(name = "googleapis", repo_name = "com_google_googleapis", version = "0.0.0-20240326-1c8d509c5")
-bazel_dep(name = "grpc-java", repo_name = "io_grpc_grpc_java", version = "1.70.0-SNAPSHOT") # CURRENT_GRPC_VERSION
+bazel_dep(name = "grpc-java", repo_name = "io_grpc_grpc_java", version = "1.71.1-SNAPSHOT") # CURRENT_GRPC_VERSION
bazel_dep(name = "grpc-proto", repo_name = "io_grpc_grpc_proto", version = "0.0.0-20240627-ec30f58")
bazel_dep(name = "protobuf", repo_name = "com_google_protobuf", version = "23.1")
bazel_dep(name = "rules_jvm_external", version = "6.0")
diff --git a/examples/android/clientcache/app/build.gradle b/examples/android/clientcache/app/build.gradle
index 7700b2248eb..294748b93a6 100644
--- a/examples/android/clientcache/app/build.gradle
+++ b/examples/android/clientcache/app/build.gradle
@@ -34,7 +34,7 @@ android {
protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.25.1' }
plugins {
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -54,12 +54,12 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0'
// You need to build grpc-java to obtain these libraries below.
- implementation 'io.grpc:grpc-okhttp:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-protobuf-lite:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-stub:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-okhttp:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-protobuf-lite:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-stub:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
implementation 'org.apache.tomcat:annotations-api:6.0.53'
testImplementation 'junit:junit:4.13.2'
testImplementation 'com.google.truth:truth:1.1.5'
- testImplementation 'io.grpc:grpc-testing:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ testImplementation 'io.grpc:grpc-testing:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
}
diff --git a/examples/android/helloworld/app/build.gradle b/examples/android/helloworld/app/build.gradle
index 0fb396bbe39..500d0bf5e63 100644
--- a/examples/android/helloworld/app/build.gradle
+++ b/examples/android/helloworld/app/build.gradle
@@ -32,7 +32,7 @@ android {
protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.25.1' }
plugins {
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -52,8 +52,8 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0'
// You need to build grpc-java to obtain these libraries below.
- implementation 'io.grpc:grpc-okhttp:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-protobuf-lite:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-stub:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-okhttp:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-protobuf-lite:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-stub:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
implementation 'org.apache.tomcat:annotations-api:6.0.53'
}
diff --git a/examples/android/routeguide/app/build.gradle b/examples/android/routeguide/app/build.gradle
index 1a8209913a2..a9038d2e5f4 100644
--- a/examples/android/routeguide/app/build.gradle
+++ b/examples/android/routeguide/app/build.gradle
@@ -32,7 +32,7 @@ android {
protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.25.1' }
plugins {
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -52,8 +52,8 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0'
// You need to build grpc-java to obtain these libraries below.
- implementation 'io.grpc:grpc-okhttp:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-protobuf-lite:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-stub:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-okhttp:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-protobuf-lite:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-stub:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
implementation 'org.apache.tomcat:annotations-api:6.0.53'
}
diff --git a/examples/android/strictmode/app/build.gradle b/examples/android/strictmode/app/build.gradle
index 02b17c189f9..8a938f007d5 100644
--- a/examples/android/strictmode/app/build.gradle
+++ b/examples/android/strictmode/app/build.gradle
@@ -33,7 +33,7 @@ android {
protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.25.1' }
plugins {
- grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
}
}
generateProtoTasks {
@@ -53,8 +53,8 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0'
// You need to build grpc-java to obtain these libraries below.
- implementation 'io.grpc:grpc-okhttp:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-protobuf-lite:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
- implementation 'io.grpc:grpc-stub:1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-okhttp:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-protobuf-lite:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
+ implementation 'io.grpc:grpc-stub:1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
implementation 'org.apache.tomcat:annotations-api:6.0.53'
}
diff --git a/examples/build.gradle b/examples/build.gradle
index d4991f02f43..3c80105c4b4 100644
--- a/examples/build.gradle
+++ b/examples/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
def protocVersion = protobufVersion
diff --git a/examples/example-alts/build.gradle b/examples/example-alts/build.gradle
index 17b2568c7ea..513f0519991 100644
--- a/examples/example-alts/build.gradle
+++ b/examples/example-alts/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-debug/build.gradle b/examples/example-debug/build.gradle
index 7701465dee2..7df41bf7432 100644
--- a/examples/example-debug/build.gradle
+++ b/examples/example-debug/build.gradle
@@ -23,7 +23,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
dependencies {
diff --git a/examples/example-debug/pom.xml b/examples/example-debug/pom.xml
index 2976782a5d7..f58a7ced1f5 100644
--- a/examples/example-debug/pom.xml
+++ b/examples/example-debug/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-debug
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
1.8
diff --git a/examples/example-dualstack/build.gradle b/examples/example-dualstack/build.gradle
index a0f29660afc..f06d4fe7fb0 100644
--- a/examples/example-dualstack/build.gradle
+++ b/examples/example-dualstack/build.gradle
@@ -23,7 +23,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
dependencies {
diff --git a/examples/example-dualstack/pom.xml b/examples/example-dualstack/pom.xml
index 99f98cc5b48..d4c50322095 100644
--- a/examples/example-dualstack/pom.xml
+++ b/examples/example-dualstack/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-dualstack
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
1.8
diff --git a/examples/example-gauth/build.gradle b/examples/example-gauth/build.gradle
index aea626a5193..066917fed11 100644
--- a/examples/example-gauth/build.gradle
+++ b/examples/example-gauth/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
def protocVersion = protobufVersion
diff --git a/examples/example-gauth/pom.xml b/examples/example-gauth/pom.xml
index 00e7ee0e3ad..640542c3203 100644
--- a/examples/example-gauth/pom.xml
+++ b/examples/example-gauth/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-gauth
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
1.8
diff --git a/examples/example-gcp-csm-observability/build.gradle b/examples/example-gcp-csm-observability/build.gradle
index 5ccb5bb0d3a..7923160debf 100644
--- a/examples/example-gcp-csm-observability/build.gradle
+++ b/examples/example-gcp-csm-observability/build.gradle
@@ -22,7 +22,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
def openTelemetryVersion = '1.40.0'
def openTelemetryPrometheusVersion = '1.40.0-alpha'
diff --git a/examples/example-gcp-observability/build.gradle b/examples/example-gcp-observability/build.gradle
index 3c7b0587e8f..84a0789878a 100644
--- a/examples/example-gcp-observability/build.gradle
+++ b/examples/example-gcp-observability/build.gradle
@@ -22,7 +22,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-hostname/build.gradle b/examples/example-hostname/build.gradle
index 9eb5f38c364..54cbf882d56 100644
--- a/examples/example-hostname/build.gradle
+++ b/examples/example-hostname/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
dependencies {
diff --git a/examples/example-hostname/pom.xml b/examples/example-hostname/pom.xml
index d7ac43e79ae..f6e1e217f97 100644
--- a/examples/example-hostname/pom.xml
+++ b/examples/example-hostname/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-hostname
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
1.8
diff --git a/examples/example-jwt-auth/build.gradle b/examples/example-jwt-auth/build.gradle
index 64ea928456b..7ea6432d8b8 100644
--- a/examples/example-jwt-auth/build.gradle
+++ b/examples/example-jwt-auth/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
def protocVersion = protobufVersion
diff --git a/examples/example-jwt-auth/pom.xml b/examples/example-jwt-auth/pom.xml
index 6c1e172b2e0..87c0dee3381 100644
--- a/examples/example-jwt-auth/pom.xml
+++ b/examples/example-jwt-auth/pom.xml
@@ -7,13 +7,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-jwt-auth
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
3.25.5
diff --git a/examples/example-oauth/build.gradle b/examples/example-oauth/build.gradle
index 4de1183e0d7..b0a3d45158a 100644
--- a/examples/example-oauth/build.gradle
+++ b/examples/example-oauth/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.25.5'
def protocVersion = protobufVersion
diff --git a/examples/example-oauth/pom.xml b/examples/example-oauth/pom.xml
index f01b362347a..6382281ee92 100644
--- a/examples/example-oauth/pom.xml
+++ b/examples/example-oauth/pom.xml
@@ -7,13 +7,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-oauth
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
3.25.5
diff --git a/examples/example-opentelemetry/build.gradle b/examples/example-opentelemetry/build.gradle
index 2e0cbfbe0b6..4c8656a2cfc 100644
--- a/examples/example-opentelemetry/build.gradle
+++ b/examples/example-opentelemetry/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
def openTelemetryVersion = '1.40.0'
def openTelemetryPrometheusVersion = '1.40.0-alpha'
diff --git a/examples/example-orca/build.gradle b/examples/example-orca/build.gradle
index ffa8295f849..b9ae432be32 100644
--- a/examples/example-orca/build.gradle
+++ b/examples/example-orca/build.gradle
@@ -16,7 +16,7 @@ java {
targetCompatibility = JavaVersion.VERSION_1_8
}
-def grpcVersion = '1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-reflection/build.gradle b/examples/example-reflection/build.gradle
index 8c885d9cb99..dc6bdd95432 100644
--- a/examples/example-reflection/build.gradle
+++ b/examples/example-reflection/build.gradle
@@ -16,7 +16,7 @@ java {
targetCompatibility = JavaVersion.VERSION_1_8
}
-def grpcVersion = '1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-servlet/build.gradle b/examples/example-servlet/build.gradle
index 163276aec10..251eda65e64 100644
--- a/examples/example-servlet/build.gradle
+++ b/examples/example-servlet/build.gradle
@@ -15,7 +15,7 @@ java {
targetCompatibility = JavaVersion.VERSION_1_8
}
-def grpcVersion = '1.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-tls/build.gradle b/examples/example-tls/build.gradle
index 87e37c5a3b1..5d5656e4c62 100644
--- a/examples/example-tls/build.gradle
+++ b/examples/example-tls/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/example-tls/pom.xml b/examples/example-tls/pom.xml
index ade33ee8769..77d164f591b 100644
--- a/examples/example-tls/pom.xml
+++ b/examples/example-tls/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
example-tls
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
1.8
diff --git a/examples/example-xds/build.gradle b/examples/example-xds/build.gradle
index ef1bc185816..97425b5da56 100644
--- a/examples/example-xds/build.gradle
+++ b/examples/example-xds/build.gradle
@@ -21,7 +21,7 @@ java {
// 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.71.0-SNAPSHOT' // CURRENT_GRPC_VERSION
+def grpcVersion = '1.71.1-SNAPSHOT' // CURRENT_GRPC_VERSION
def protocVersion = '3.25.5'
dependencies {
diff --git a/examples/pom.xml b/examples/pom.xml
index 6370ce7d56a..cf26bf44730 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -6,13 +6,13 @@
jar
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
examples
https://github.com/grpc/grpc-java
UTF-8
- 1.71.0-SNAPSHOT
+ 1.71.1-SNAPSHOT
3.25.5
3.25.5
diff --git a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java
index 4e08ddc5973..aff61cf7ada 100644
--- a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java
+++ b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java
@@ -32,6 +32,7 @@
import io.grpc.NameResolver;
import io.grpc.NameResolver.ResolutionResult;
import io.grpc.Status;
+import io.grpc.StatusOr;
import io.grpc.SynchronizationContext;
import io.grpc.SynchronizationContext.ScheduledHandle;
import io.grpc.internal.BackoffPolicy;
@@ -615,79 +616,84 @@ private class NameResolverListener extends NameResolver.Listener2 {
@Override
public void onResult(final ResolutionResult resolutionResult) {
- class NameResolved implements Runnable {
- @Override
- public void run() {
- if (shutdown) {
- return;
- }
- backoffPolicy = null; // reset backoff sequence if succeeded
- // Arbitrary priority notation for all DNS-resolved endpoints.
- String priorityName = priorityName(name, 0); // value doesn't matter
- List addresses = new ArrayList<>();
- for (EquivalentAddressGroup eag : resolutionResult.getAddresses()) {
- // No weight attribute is attached, all endpoint-level LB policy should be able
- // to handle such it.
- String localityName = localityName(LOGICAL_DNS_CLUSTER_LOCALITY);
- Attributes attr = eag.getAttributes().toBuilder()
- .set(XdsAttributes.ATTR_LOCALITY, LOGICAL_DNS_CLUSTER_LOCALITY)
- .set(XdsAttributes.ATTR_LOCALITY_NAME, localityName)
- .set(XdsAttributes.ATTR_ADDRESS_NAME, dnsHostName)
- .build();
- eag = new EquivalentAddressGroup(eag.getAddresses(), attr);
- eag = AddressFilter.setPathFilter(eag, Arrays.asList(priorityName, localityName));
- addresses.add(eag);
- }
- PriorityChildConfig priorityChildConfig = generateDnsBasedPriorityChildConfig(
- name, lrsServerInfo, maxConcurrentRequests, tlsContext, filterMetadata,
- lbRegistry, Collections.emptyList());
- status = Status.OK;
- resolved = true;
- result = new ClusterResolutionResult(addresses, priorityName, priorityChildConfig);
- handleEndpointResourceUpdate();
+ syncContext.execute(() -> onResult2(resolutionResult));
+ }
+
+ @Override
+ public Status onResult2(final ResolutionResult resolutionResult) {
+ if (shutdown) {
+ return Status.OK;
+ }
+ // Arbitrary priority notation for all DNS-resolved endpoints.
+ String priorityName = priorityName(name, 0); // value doesn't matter
+ List addresses = new ArrayList<>();
+ StatusOr> addressesOrError =
+ resolutionResult.getAddressesOrError();
+ if (addressesOrError.hasValue()) {
+ backoffPolicy = null; // reset backoff sequence if succeeded
+ for (EquivalentAddressGroup eag : resolutionResult.getAddresses()) {
+ // No weight attribute is attached, all endpoint-level LB policy should be able
+ // to handle such it.
+ String localityName = localityName(LOGICAL_DNS_CLUSTER_LOCALITY);
+ Attributes attr = eag.getAttributes().toBuilder()
+ .set(XdsAttributes.ATTR_LOCALITY, LOGICAL_DNS_CLUSTER_LOCALITY)
+ .set(XdsAttributes.ATTR_LOCALITY_NAME, localityName)
+ .set(XdsAttributes.ATTR_ADDRESS_NAME, dnsHostName)
+ .build();
+ eag = new EquivalentAddressGroup(eag.getAddresses(), attr);
+ eag = AddressFilter.setPathFilter(eag, Arrays.asList(priorityName, localityName));
+ addresses.add(eag);
}
+ PriorityChildConfig priorityChildConfig = generateDnsBasedPriorityChildConfig(
+ name, lrsServerInfo, maxConcurrentRequests, tlsContext, filterMetadata,
+ lbRegistry, Collections.emptyList());
+ status = Status.OK;
+ resolved = true;
+ result = new ClusterResolutionResult(addresses, priorityName, priorityChildConfig);
+ handleEndpointResourceUpdate();
+ return Status.OK;
+ } else {
+ handleErrorInSyncContext(addressesOrError.getStatus());
+ return addressesOrError.getStatus();
}
-
- syncContext.execute(new NameResolved());
}
@Override
public void onError(final Status error) {
- syncContext.execute(new Runnable() {
- @Override
- public void run() {
- if (shutdown) {
- return;
- }
- status = error;
- // NameResolver.Listener API cannot distinguish between address-not-found and
- // transient errors. If the error occurs in the first resolution, treat it as
- // address not found. Otherwise, either there is previously resolved addresses
- // previously encountered error, propagate the error to downstream/upstream and
- // let downstream/upstream handle it.
- if (!resolved) {
- resolved = true;
- handleEndpointResourceUpdate();
- } else {
- handleEndpointResolutionError();
- }
- if (scheduledRefresh != null && scheduledRefresh.isPending()) {
- return;
- }
- if (backoffPolicy == null) {
- backoffPolicy = backoffPolicyProvider.get();
- }
- long delayNanos = backoffPolicy.nextBackoffNanos();
- logger.log(XdsLogLevel.DEBUG,
+ syncContext.execute(() -> handleErrorInSyncContext(error));
+ }
+
+ private void handleErrorInSyncContext(final Status error) {
+ if (shutdown) {
+ return;
+ }
+ status = error;
+ // NameResolver.Listener API cannot distinguish between address-not-found and
+ // transient errors. If the error occurs in the first resolution, treat it as
+ // address not found. Otherwise, either there is previously resolved addresses
+ // previously encountered error, propagate the error to downstream/upstream and
+ // let downstream/upstream handle it.
+ if (!resolved) {
+ resolved = true;
+ handleEndpointResourceUpdate();
+ } else {
+ handleEndpointResolutionError();
+ }
+ if (scheduledRefresh != null && scheduledRefresh.isPending()) {
+ return;
+ }
+ if (backoffPolicy == null) {
+ backoffPolicy = backoffPolicyProvider.get();
+ }
+ long delayNanos = backoffPolicy.nextBackoffNanos();
+ logger.log(XdsLogLevel.DEBUG,
"Logical DNS resolver for cluster {0} encountered name resolution "
- + "error: {1}, scheduling DNS resolution backoff for {2} ns",
+ + "error: {1}, scheduling DNS resolution backoff for {2} ns",
name, error, delayNanos);
- scheduledRefresh =
+ scheduledRefresh =
syncContext.schedule(
- new DelayedNameResolverRefresh(), delayNanos, TimeUnit.NANOSECONDS,
- timeService);
- }
- });
+ new DelayedNameResolverRefresh(), delayNanos, TimeUnit.NANOSECONDS,
+ timeService);
}
}
}
diff --git a/xds/src/test/java/io/grpc/xds/ClusterResolverLoadBalancerTest.java b/xds/src/test/java/io/grpc/xds/ClusterResolverLoadBalancerTest.java
index 9243abba6d3..2a8617912ea 100644
--- a/xds/src/test/java/io/grpc/xds/ClusterResolverLoadBalancerTest.java
+++ b/xds/src/test/java/io/grpc/xds/ClusterResolverLoadBalancerTest.java
@@ -198,6 +198,7 @@ public XdsClient returnObject(Object object) {
private ArgumentCaptor pickerCaptor;
private int xdsClientRefs;
private ClusterResolverLoadBalancer loadBalancer;
+ private NameResolverProvider fakeNameResolverProvider;
@Before
public void setUp() throws URISyntaxException {
@@ -214,7 +215,8 @@ public void setUp() throws URISyntaxException {
.setServiceConfigParser(mock(ServiceConfigParser.class))
.setChannelLogger(mock(ChannelLogger.class))
.build();
- nsRegistry.register(new FakeNameResolverProvider());
+ fakeNameResolverProvider = new FakeNameResolverProvider(false);
+ nsRegistry.register(fakeNameResolverProvider);
when(helper.getNameResolverRegistry()).thenReturn(nsRegistry);
when(helper.getNameResolverArgs()).thenReturn(args);
when(helper.getSynchronizationContext()).thenReturn(syncContext);
@@ -715,6 +717,17 @@ public void handleEdsResource_noHealthyEndpoint() {
@Test
public void onlyLogicalDnsCluster_endpointsResolved() {
+ do_onlyLogicalDnsCluster_endpointsResolved();
+ }
+
+ @Test
+ public void oldListenerCallback_onlyLogicalDnsCluster_endpointsResolved() {
+ nsRegistry.deregister(fakeNameResolverProvider);
+ nsRegistry.register(new FakeNameResolverProvider(true));
+ do_onlyLogicalDnsCluster_endpointsResolved();
+ }
+
+ void do_onlyLogicalDnsCluster_endpointsResolved() {
ClusterResolverConfig config = new ClusterResolverConfig(
Collections.singletonList(logicalDnsDiscoveryMechanism), roundRobin);
deliverLbConfig(config);
@@ -743,7 +756,6 @@ public void onlyLogicalDnsCluster_endpointsResolved() {
.get(XdsAttributes.ATTR_ADDRESS_NAME)).isEqualTo(DNS_HOST_NAME);
assertThat(childBalancer.addresses.get(1).getAttributes()
.get(XdsAttributes.ATTR_ADDRESS_NAME)).isEqualTo(DNS_HOST_NAME);
-
}
@Test
@@ -763,37 +775,48 @@ public void onlyLogicalDnsCluster_handleRefreshNameResolution() {
}
@Test
- public void onlyLogicalDnsCluster_resolutionError_backoffAndRefresh() {
+ public void resolutionError_backoffAndRefresh() {
+ do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh();
+ }
+
+ @Test
+ public void oldListenerCallback_resolutionError_backoffAndRefresh() {
+ nsRegistry.deregister(fakeNameResolverProvider);
+ nsRegistry.register(new FakeNameResolverProvider(true));
+ do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh();
+ }
+
+ void do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh() {
InOrder inOrder = Mockito.inOrder(helper, backoffPolicyProvider,
- backoffPolicy1, backoffPolicy2);
+ backoffPolicy1, backoffPolicy2);
ClusterResolverConfig config = new ClusterResolverConfig(
- Collections.singletonList(logicalDnsDiscoveryMechanism), roundRobin);
+ Collections.singletonList(logicalDnsDiscoveryMechanism), roundRobin);
deliverLbConfig(config);
FakeNameResolver resolver = assertResolverCreated("/" + DNS_HOST_NAME);
assertThat(childBalancers).isEmpty();
Status error = Status.UNAVAILABLE.withDescription("cannot reach DNS server");
resolver.deliverError(error);
inOrder.verify(helper).updateBalancingState(
- eq(ConnectivityState.TRANSIENT_FAILURE), pickerCaptor.capture());
+ eq(ConnectivityState.TRANSIENT_FAILURE), pickerCaptor.capture());
assertPicker(pickerCaptor.getValue(), error, null);
assertThat(resolver.refreshCount).isEqualTo(0);
inOrder.verify(backoffPolicyProvider).get();
inOrder.verify(backoffPolicy1).nextBackoffNanos();
assertThat(fakeClock.getPendingTasks()).hasSize(1);
assertThat(Iterables.getOnlyElement(fakeClock.getPendingTasks()).getDelay(TimeUnit.SECONDS))
- .isEqualTo(1L);
+ .isEqualTo(1L);
fakeClock.forwardTime(1L, TimeUnit.SECONDS);
assertThat(resolver.refreshCount).isEqualTo(1);
error = Status.UNKNOWN.withDescription("I am lost");
resolver.deliverError(error);
inOrder.verify(helper).updateBalancingState(
- eq(ConnectivityState.TRANSIENT_FAILURE), pickerCaptor.capture());
+ eq(ConnectivityState.TRANSIENT_FAILURE), pickerCaptor.capture());
inOrder.verify(backoffPolicy1).nextBackoffNanos();
assertPicker(pickerCaptor.getValue(), error, null);
assertThat(fakeClock.getPendingTasks()).hasSize(1);
assertThat(Iterables.getOnlyElement(fakeClock.getPendingTasks()).getDelay(TimeUnit.SECONDS))
- .isEqualTo(10L);
+ .isEqualTo(10L);
fakeClock.forwardTime(10L, TimeUnit.SECONDS);
assertThat(resolver.refreshCount).isEqualTo(2);
@@ -803,7 +826,7 @@ public void onlyLogicalDnsCluster_resolutionError_backoffAndRefresh() {
resolver.deliverEndpointAddresses(Arrays.asList(endpoint1, endpoint2));
assertThat(childBalancers).hasSize(1);
assertAddressesEqual(Arrays.asList(endpoint1, endpoint2),
- Iterables.getOnlyElement(childBalancers).addresses);
+ Iterables.getOnlyElement(childBalancers).addresses);
assertThat(fakeClock.getPendingTasks()).isEmpty();
inOrder.verifyNoMoreInteractions();
@@ -1204,10 +1227,18 @@ void deliverError(Status error) {
}
private class FakeNameResolverProvider extends NameResolverProvider {
+ private final boolean useOldListenerCallback;
+
+ private FakeNameResolverProvider(boolean useOldListenerCallback) {
+ this.useOldListenerCallback = useOldListenerCallback;
+ }
+
@Override
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
assertThat(targetUri.getScheme()).isEqualTo("dns");
- FakeNameResolver resolver = new FakeNameResolver(targetUri);
+ FakeNameResolver resolver = useOldListenerCallback
+ ? new FakeNameResolverUsingOldListenerCallback(targetUri)
+ : new FakeNameResolver(targetUri);
resolvers.add(resolver);
return resolver;
}
@@ -1228,9 +1259,10 @@ protected int priority() {
}
}
+
private class FakeNameResolver extends NameResolver {
private final URI targetUri;
- private Listener2 listener;
+ protected Listener2 listener;
private int refreshCount;
private FakeNameResolver(URI targetUri) {
@@ -1257,12 +1289,33 @@ public void shutdown() {
resolvers.remove(this);
}
- private void deliverEndpointAddresses(List addresses) {
+ protected void deliverEndpointAddresses(List addresses) {
+ syncContext.execute(() -> {
+ Status ret = listener.onResult2(ResolutionResult.newBuilder()
+ .setAddressesOrError(StatusOr.fromValue(addresses)).build());
+ assertThat(ret.getCode()).isEqualTo(Status.Code.OK);
+ });
+ }
+
+ protected void deliverError(Status error) {
+ syncContext.execute(() -> listener.onResult2(ResolutionResult.newBuilder()
+ .setAddressesOrError(StatusOr.fromStatus(error)).build()));
+ }
+ }
+
+ private class FakeNameResolverUsingOldListenerCallback extends FakeNameResolver {
+ private FakeNameResolverUsingOldListenerCallback(URI targetUri) {
+ super(targetUri);
+ }
+
+ @Override
+ protected void deliverEndpointAddresses(List addresses) {
listener.onResult(ResolutionResult.newBuilder()
- .setAddressesOrError(StatusOr.fromValue(addresses)).build());
+ .setAddressesOrError(StatusOr.fromValue(addresses)).build());
}
- private void deliverError(Status error) {
+ @Override
+ protected void deliverError(Status error) {
listener.onError(error);
}
}