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