diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b9731451..dc948dcd8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,16 @@
# Changelog
+## [2.20.1](https://github.com/googleapis/gax-java/compare/v2.20.0...v2.20.1) (2022-12-02)
+
+
+### Bug Fixes
+
+* **deps:** Update dependency com.google.api.grpc:grpc-google-common-protos to v2.11.0 ([#1906](https://github.com/googleapis/gax-java/issues/1906)) ([d27d848](https://github.com/googleapis/gax-java/commit/d27d8485d3da4de00253c1f5df435516d1af8d8e))
+* **deps:** Update dependency com.google.api.grpc:proto-google-common-protos to v2.11.0 ([#1907](https://github.com/googleapis/gax-java/issues/1907)) ([7504e37](https://github.com/googleapis/gax-java/commit/7504e37163d39d10bd8388101e9ce614e2839aca))
+* **deps:** Update dependency com.google.cloud:google-cloud-shared-config to v1.5.5 ([#1911](https://github.com/googleapis/gax-java/issues/1911)) ([772c221](https://github.com/googleapis/gax-java/commit/772c2213dfa10120b6efccf411550e77df3f9de7))
+* **deps:** Update dependency com.google.protobuf:protobuf-bom to v3.21.10 ([#1912](https://github.com/googleapis/gax-java/issues/1912)) ([f508f24](https://github.com/googleapis/gax-java/commit/f508f245a59b2086c4b56d55f0cb25e9e7c29136))
+* Watchdog controls lifecycle of the future, not executor ([#1890](https://github.com/googleapis/gax-java/issues/1890)) ([bd1714e](https://github.com/googleapis/gax-java/commit/bd1714e484eef8aa8f09632eee976c9da26da5f1))
+
## [2.20.0](https://github.com/googleapis/gax-java/compare/v2.19.5...v2.20.0) (2022-11-30)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2ab6d62b1..f39ea3e17 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -24,13 +24,7 @@ use Github pull requests for this purpose.
To build GAX:
```sh
-./gradlew build
-```
-
-To install GAX into the local maven repository:
-
-```sh
-./gradlew publishToMavenLocal
+mvn clean install
```
### The small print
diff --git a/README.md b/README.md
index 92eb4b47c..a0d1aa77a 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,13 @@ a high risk of diamond dependency problems, because google-cloud-java uses beta
library which can change in breaking ways between versions. See [VERSIONING](#versioning) for
more information.
+> For new and existing Developers/ Contributors:
+>
+> In December 2022, gax-java's build tool has been migrated from gradle to maven.
+> Gradle related files are no longer being maintained and will be eventually removed.
+>
+> The artifact coordinates in Maven Central (`{{ group_id }}:{{ artifact_id }}`) remain the same.
+
Quickstart
----------
diff --git a/build.gradle b/build.gradle
index 9576e341c..9fd95105b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,7 +13,7 @@ plugins {
}
// TODO: Populate this from dependencies.properties version property (for proper Gradle-Bazel sync)
-project.version = "2.20.0" // {x-version-update:gax:current}
+project.version = "2.20.1" // {x-version-update:gax:current}
allprojects {
group = 'com.google.api'
diff --git a/dependencies.properties b/dependencies.properties
index 521a851da..a9c319bda 100644
--- a/dependencies.properties
+++ b/dependencies.properties
@@ -8,22 +8,22 @@
# Versions of oneself
# {x-version-update-start:gax:current}
-version.gax=2.20.0
+version.gax=2.20.1
# {x-version-update-end}
# {x-version-update-start:gax:current}
-version.gax_grpc=2.20.0
+version.gax_grpc=2.20.1
# {x-version-update-end}
# {x-version-update-start:gax:current}
-version.gax_bom=2.20.0
+version.gax_bom=2.20.1
# {x-version-update-end}
# {x-version-update-start:gax-httpjson:current}
-version.gax_httpjson=0.105.0
+version.gax_httpjson=0.105.1
# {x-version-update-end}
# Versions for dependencies which actual artifacts differ between Bazel and Gradle.
# Gradle build depends on prebuilt maven artifacts, while Bazel build depends on Bazel workspaces
# with the sources.
-version.com_google_protobuf=3.21.9
+version.com_google_protobuf=3.21.10
version.google_java_format=1.15.0
version.io_grpc=1.51.0
diff --git a/gax-bom/build.gradle b/gax-bom/build.gradle
index f67965be2..6dfd30ff5 100644
--- a/gax-bom/build.gradle
+++ b/gax-bom/build.gradle
@@ -5,7 +5,7 @@ plugins {
archivesBaseName = 'gax-bom'
-project.version = "2.20.0" // {x-version-update:gax-bom:current}
+project.version = "2.20.1" // {x-version-update:gax-bom:current}
def mavenJavaDir = "$buildDir/publications/mavenJava"
def mavenJavaBomOutputFile = file(mavenJavaDir + '/pom-default.xml')
diff --git a/gax-bom/pom.xml b/gax-bom/pom.xml
index 2bbfc1868..1681cf4f9 100644
--- a/gax-bom/pom.xml
+++ b/gax-bom/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.api
gax-bom
- 2.20.0
+ 2.20.1
pom
GAX (Google Api eXtensions) for Java (BOM)
Google Api eXtensions for Java (BOM)
@@ -11,7 +11,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.4
+ 1.5.5
@@ -42,34 +42,34 @@
com.google.api
gax
- 2.20.0
+ 2.20.1
com.google.api
gax
- 2.20.0
+ 2.20.1
testlib
com.google.api
gax-grpc
- 2.20.0
+ 2.20.1
com.google.api
gax-grpc
- 2.20.0
+ 2.20.1
testlib
com.google.api
gax-httpjson
- 0.105.0
+ 0.105.1
com.google.api
gax-httpjson
- 0.105.0
+ 0.105.1
testlib
diff --git a/gax-grpc/build.gradle b/gax-grpc/build.gradle
index a51edcc13..5c5c86807 100644
--- a/gax-grpc/build.gradle
+++ b/gax-grpc/build.gradle
@@ -1,7 +1,7 @@
archivesBaseName = 'gax-grpc'
// TODO: Populate this from dependencies.properties version property (for proper Gradle-Bazel sync)
-project.version = "2.20.0" // {x-version-update:gax-grpc:current}
+project.version = "2.20.1" // {x-version-update:gax-grpc:current}
dependencies {
api(project(':gax'),
diff --git a/gax-grpc/pom.xml b/gax-grpc/pom.xml
index dc5db8887..ad7addccd 100644
--- a/gax-grpc/pom.xml
+++ b/gax-grpc/pom.xml
@@ -3,7 +3,7 @@
4.0.0
gax-grpc
- 2.20.0
+ 2.20.1
jar
GAX (Google Api eXtensions) for Java (gRPC)
Google Api eXtensions for Java (gRPC)
@@ -11,7 +11,7 @@
com.google.api
gax-parent
- 2.20.0
+ 2.20.1
diff --git a/gax-httpjson/build.gradle b/gax-httpjson/build.gradle
index 7985c661f..d16bf0fed 100644
--- a/gax-httpjson/build.gradle
+++ b/gax-httpjson/build.gradle
@@ -1,7 +1,7 @@
archivesBaseName = 'gax-httpjson'
// TODO: Populate this from dependencies.properties version property (for proper Gradle-Bazel sync)
-project.version = "0.105.0" // {x-version-update:gax-httpjson:current}
+project.version = "0.105.1" // {x-version-update:gax-httpjson:current}
dependencies {
api(project(':gax'),
diff --git a/gax-httpjson/pom.xml b/gax-httpjson/pom.xml
index 7bddcb7fb..32fcdc5f1 100644
--- a/gax-httpjson/pom.xml
+++ b/gax-httpjson/pom.xml
@@ -3,7 +3,7 @@
4.0.0
gax-httpjson
- 0.105.0
+ 0.105.1
jar
GAX (Google Api eXtensions) for Java (HTTP JSON)
Google Api eXtensions for Java (HTTP JSON)
@@ -11,7 +11,7 @@
com.google.api
gax-parent
- 2.20.0
+ 2.20.1
diff --git a/gax/build.gradle b/gax/build.gradle
index 1c7f9a379..f92a8cf9f 100644
--- a/gax/build.gradle
+++ b/gax/build.gradle
@@ -1,7 +1,7 @@
archivesBaseName = "gax"
// TODO: Populate this from dependencies.properties version property (for proper Gradle-Bazel sync)
-project.version = "2.20.0" // {x-version-update:gax:current}
+project.version = "2.20.1" // {x-version-update:gax:current}
dependencies {
api(libraries['maven.com_google_api_api_common'],
diff --git a/gax/pom.xml b/gax/pom.xml
index 5d3e027cc..09f587cb3 100644
--- a/gax/pom.xml
+++ b/gax/pom.xml
@@ -3,7 +3,7 @@
4.0.0
gax
- 2.20.0
+ 2.20.1
jar
GAX (Google Api eXtensions) for Java (Core)
Google Api eXtensions for Java (Core)
@@ -11,7 +11,7 @@
com.google.api
gax-parent
- 2.20.0
+ 2.20.1
diff --git a/gax/src/main/java/com/google/api/gax/rpc/Watchdog.java b/gax/src/main/java/com/google/api/gax/rpc/Watchdog.java
index 83d729933..8ca97876c 100644
--- a/gax/src/main/java/com/google/api/gax/rpc/Watchdog.java
+++ b/gax/src/main/java/com/google/api/gax/rpc/Watchdog.java
@@ -36,9 +36,11 @@
import java.util.Map.Entry;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nonnull;
@@ -61,6 +63,7 @@
*
*/
public final class Watchdog implements Runnable, BackgroundResource {
+
private static final Logger LOG = Logger.getLogger(Watchdog.class.getName());
// Dummy value to convert the ConcurrentHashMap into a Set
@@ -138,12 +141,12 @@ public void shutdown() {
@Override
public boolean isShutdown() {
- return executor.isShutdown();
+ return future.isCancelled();
}
@Override
public boolean isTerminated() {
- return executor.isTerminated();
+ return future.isDone();
}
@Override
@@ -153,7 +156,14 @@ public void shutdownNow() {
@Override
public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException {
- return executor.awaitTermination(duration, unit);
+ try {
+ future.get(duration, unit);
+ return true;
+ } catch (ExecutionException | CancellationException e) {
+ return true;
+ } catch (TimeoutException e) {
+ return false;
+ }
}
@Override
diff --git a/gax/src/main/java/com/google/api/gax/rpc/WatchdogProvider.java b/gax/src/main/java/com/google/api/gax/rpc/WatchdogProvider.java
index e01ed3c20..db3fb20bb 100644
--- a/gax/src/main/java/com/google/api/gax/rpc/WatchdogProvider.java
+++ b/gax/src/main/java/com/google/api/gax/rpc/WatchdogProvider.java
@@ -49,5 +49,6 @@ public interface WatchdogProvider {
Watchdog getWatchdog();
+ /** Return true if the watchdog should be automatically unscheduled. */
boolean shouldAutoClose();
}
diff --git a/gax/src/test/java/com/google/api/gax/rpc/WatchdogTest.java b/gax/src/test/java/com/google/api/gax/rpc/WatchdogTest.java
index 0b161018f..e20218452 100644
--- a/gax/src/test/java/com/google/api/gax/rpc/WatchdogTest.java
+++ b/gax/src/test/java/com/google/api/gax/rpc/WatchdogTest.java
@@ -44,6 +44,7 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -195,14 +196,7 @@ public void testMultiple() throws Exception {
@SuppressWarnings("unchecked")
public void testWatchdogBeingClosed() {
ScheduledFuture future = Mockito.mock(ScheduledFuture.class);
- ScheduledExecutorService mockExecutor = Mockito.mock(ScheduledExecutorService.class);
- Mockito.when(
- mockExecutor.scheduleAtFixedRate(
- Mockito.any(Watchdog.class),
- Mockito.anyLong(),
- Mockito.anyLong(),
- Mockito.any(TimeUnit.class)))
- .thenReturn(future);
+ ScheduledExecutorService mockExecutor = getMockExecutorService(future);
Watchdog underTest = Watchdog.create(clock, checkInterval, mockExecutor);
assertThat(underTest).isInstanceOf(BackgroundResource.class);
@@ -219,6 +213,77 @@ public void testWatchdogBeingClosed() {
Mockito.verifyNoMoreInteractions(mockExecutor);
}
+ @Test
+ public void awaitTermination_shouldReturnTrueIfFutureIsDone() throws Exception {
+ int duration = 1000;
+ TimeUnit timeUnit = TimeUnit.MILLISECONDS;
+ ScheduledFuture future = Mockito.mock(ScheduledFuture.class);
+ ScheduledExecutorService mockExecutor = getMockExecutorService(future);
+ Watchdog watchdog = Watchdog.create(clock, checkInterval, mockExecutor);
+ watchdog.shutdown();
+
+ boolean actual = watchdog.awaitTermination(duration, timeUnit);
+
+ assertThat(actual).isTrue();
+ }
+
+ @Test
+ public void awaitTermination_shouldReturnFalseIfGettingFutureTimedOut() throws Exception {
+ int duration = 1000;
+ TimeUnit timeUnit = TimeUnit.MILLISECONDS;
+ ScheduledFuture future = Mockito.mock(ScheduledFuture.class);
+ Mockito.doThrow(new TimeoutException()).when(future).get(duration, timeUnit);
+ ScheduledExecutorService mockExecutor = getMockExecutorService(future);
+ Watchdog watchdog = Watchdog.create(clock, checkInterval, mockExecutor);
+
+ boolean actual = watchdog.awaitTermination(duration, timeUnit);
+
+ assertThat(actual).isFalse();
+ }
+
+ @Test
+ public void awaitTermination_shouldReturnTrueIfFutureIsAlreadyCancelled() throws Exception {
+ int duration = 1000;
+ TimeUnit timeUnit = TimeUnit.MILLISECONDS;
+ ScheduledFuture future = Mockito.mock(ScheduledFuture.class);
+ Mockito.doThrow(new CancellationException()).when(future).get(duration, timeUnit);
+ ScheduledExecutorService mockExecutor = getMockExecutorService(future);
+ Watchdog watchdog = Watchdog.create(clock, checkInterval, mockExecutor);
+
+ boolean actual = watchdog.awaitTermination(duration, timeUnit);
+
+ assertThat(actual).isTrue();
+ }
+
+ @Test
+ public void awaitTermination_shouldReturnFalseIfGettingFutureThrowsExecutionException()
+ throws Exception {
+ int duration = 1000;
+ TimeUnit timeUnit = TimeUnit.MILLISECONDS;
+ ScheduledFuture future = Mockito.mock(ScheduledFuture.class);
+ Mockito.doThrow(new ExecutionException(new RuntimeException()))
+ .when(future)
+ .get(duration, timeUnit);
+ ScheduledExecutorService mockExecutor = getMockExecutorService(future);
+ Watchdog watchdog = Watchdog.create(clock, checkInterval, mockExecutor);
+
+ boolean actual = watchdog.awaitTermination(duration, timeUnit);
+
+ assertThat(actual).isTrue();
+ }
+
+ private ScheduledExecutorService getMockExecutorService(ScheduledFuture future) {
+ ScheduledExecutorService mockExecutor = Mockito.mock(ScheduledExecutorService.class);
+ Mockito.when(
+ mockExecutor.scheduleAtFixedRate(
+ Mockito.any(Watchdog.class),
+ Mockito.anyLong(),
+ Mockito.anyLong(),
+ Mockito.any(TimeUnit.class)))
+ .thenReturn(future);
+ return mockExecutor;
+ }
+
static class AccumulatingObserver implements ResponseObserver {
SettableApiFuture controller = SettableApiFuture.create();
Queue responses = Queues.newLinkedBlockingDeque();
diff --git a/pom.xml b/pom.xml
index 21aa2f40c..1d9d752b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.api
gax-parent
pom
- 2.20.0
+ 2.20.1
GAX (Google Api eXtensions) for Java (Parent)
https://github.com/googleapis/gax-java
Google Api eXtensions for Java (Parent)
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.4
+ 1.5.5
@@ -123,24 +123,24 @@
com.google.api
gax
- 2.20.0
+ 2.20.1
com.google.api
gax
- 2.20.0
+ 2.20.1
test-jar
testlib
com.google.api.grpc
proto-google-common-protos
- 2.10.0
+ 2.11.0
com.google.api.grpc
grpc-google-common-protos
- 2.10.0
+ 2.11.0
io.grpc
@@ -169,7 +169,7 @@
com.google.protobuf
protobuf-bom
- 3.21.9
+ 3.21.10
pom
import
diff --git a/versions.txt b/versions.txt
index 3c4f62e47..35a770fde 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,7 +1,7 @@
# Format:
# module:released-version:current-version
-gax:2.20.0:2.20.0
-gax-bom:2.20.0:2.20.0
-gax-grpc:2.20.0:2.20.0
-gax-httpjson:0.105.0:0.105.0
+gax:2.20.1:2.20.1
+gax-bom:2.20.1:2.20.1
+gax-grpc:2.20.1:2.20.1
+gax-httpjson:0.105.1:0.105.1