Date: Thu, 19 Oct 2023 17:39:20 -0400
Subject: [PATCH 63/64] fix: Make sure outstanding RPCs count in ChannelPool
can not go negative (#2185)
Add two flags wasClosed and wasReleased to ReleasingClientCall to check various scenarios. The combination of these two flags can make sure the count of outstanding RPCs can never go negative, and help us identify what exactly goes wrong next time it happens.
---
.../com/google/api/gax/grpc/ChannelPool.java | 48 ++++++++--
.../google/api/gax/grpc/ChannelPoolTest.java | 93 +++++++++++++++++--
2 files changed, 125 insertions(+), 16 deletions(-)
diff --git a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
index df3888dfc9..c3e26dc4e2 100644
--- a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
+++ b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
@@ -68,7 +68,7 @@
* Package-private for internal use.
*/
class ChannelPool extends ManagedChannel {
- private static final Logger LOG = Logger.getLogger(ChannelPool.class.getName());
+ @VisibleForTesting static final Logger LOG = Logger.getLogger(ChannelPool.class.getName());
private static final Duration REFRESH_PERIOD = Duration.ofMinutes(50);
private final ChannelPoolSettings settings;
@@ -421,9 +421,25 @@ private Entry getEntry(int affinity) {
}
/** Bundles a gRPC {@link ManagedChannel} with some usage accounting. */
- private static class Entry {
+ static class Entry {
private final ManagedChannel channel;
- private final AtomicInteger outstandingRpcs = new AtomicInteger(0);
+
+ /**
+ * The primary purpose of keeping a count for outstanding RPCs is to track when a channel is
+ * safe to close. In grpc, initialization & starting of rpcs is split between 2 methods:
+ * Channel#newCall() and ClientCall#start. gRPC already has a mechanism to safely close channels
+ * that have rpcs that have been started. However, it does not protect calls that have been
+ * created but not started. In the sequence: Channel#newCall() Channel#shutdown()
+ * ClientCall#Start(), gRpc will error out the call telling the caller that the channel is
+ * shutdown.
+ *
+ *
Hence, the increment of outstanding RPCs has to happen when the ClientCall is initialized,
+ * as part of Channel#newCall(), not after the ClientCall is started. The decrement of
+ * outstanding RPCs has to happen when the ClientCall is closed or the ClientCall failed to
+ * start.
+ */
+ @VisibleForTesting final AtomicInteger outstandingRpcs = new AtomicInteger(0);
+
private final AtomicInteger maxOutstanding = new AtomicInteger();
// Flag that the channel should be closed once all of the outstanding RPC complete.
@@ -470,7 +486,7 @@ private boolean retain() {
private void release() {
int newCount = outstandingRpcs.decrementAndGet();
if (newCount < 0) {
- throw new IllegalStateException("Bug: reference count is negative!: " + newCount);
+ LOG.log(Level.WARNING, "Bug! Reference count is negative (" + newCount + ")!");
}
// Must check outstandingRpcs after shutdownRequested (in reverse order of retain()) to ensure
@@ -526,6 +542,8 @@ public ClientCall newCall(
static class ReleasingClientCall extends SimpleForwardingClientCall {
@Nullable private CancellationException cancellationException;
final Entry entry;
+ private final AtomicBoolean wasClosed = new AtomicBoolean();
+ private final AtomicBoolean wasReleased = new AtomicBoolean();
public ReleasingClientCall(ClientCall delegate, Entry entry) {
super(delegate);
@@ -542,17 +560,35 @@ public void start(Listener responseListener, Metadata headers) {
new SimpleForwardingClientCallListener(responseListener) {
@Override
public void onClose(Status status, Metadata trailers) {
+ if (!wasClosed.compareAndSet(false, true)) {
+ LOG.log(
+ Level.WARNING,
+ "Call is being closed more than once. Please make sure that onClose() is not being manually called.");
+ return;
+ }
try {
super.onClose(status, trailers);
} finally {
- entry.release();
+ if (wasReleased.compareAndSet(false, true)) {
+ entry.release();
+ } else {
+ LOG.log(
+ Level.WARNING,
+ "Entry was released before the call is closed. This may be due to an exception on start of the call.");
+ }
}
}
},
headers);
} catch (Exception e) {
// In case start failed, make sure to release
- entry.release();
+ if (wasReleased.compareAndSet(false, true)) {
+ entry.release();
+ } else {
+ LOG.log(
+ Level.WARNING,
+ "The entry is already released. This indicates that onClose() has already been called previously");
+ }
throw e;
}
}
diff --git a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
index c38d98e91f..173528d6e2 100644
--- a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
+++ b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
@@ -29,17 +29,20 @@
*/
package com.google.api.gax.grpc;
+import static com.google.api.gax.grpc.testing.FakeServiceGrpc.METHOD_RECOGNIZE;
import static com.google.api.gax.grpc.testing.FakeServiceGrpc.METHOD_SERVER_STREAMING_RECOGNIZE;
import static com.google.common.truth.Truth.assertThat;
+import com.google.api.core.ApiFuture;
import com.google.api.gax.grpc.testing.FakeChannelFactory;
import com.google.api.gax.grpc.testing.FakeMethodDescriptor;
-import com.google.api.gax.grpc.testing.FakeServiceGrpc;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.ResponseObserver;
import com.google.api.gax.rpc.ServerStreamingCallSettings;
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.StreamController;
+import com.google.api.gax.rpc.UnaryCallSettings;
+import com.google.api.gax.rpc.UnaryCallable;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -63,6 +66,9 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.stream.Collectors;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
@@ -117,7 +123,7 @@ public void testRoundRobin() throws IOException {
private void verifyTargetChannel(
ChannelPool pool, List channels, ManagedChannel targetChannel) {
- MethodDescriptor methodDescriptor = FakeServiceGrpc.METHOD_RECOGNIZE;
+ MethodDescriptor methodDescriptor = METHOD_RECOGNIZE;
CallOptions callOptions = CallOptions.DEFAULT;
@SuppressWarnings("unchecked")
ClientCall expectedClientCall = Mockito.mock(ClientCall.class);
@@ -143,7 +149,7 @@ public void ensureEvenDistribution() throws InterruptedException, IOException {
final ManagedChannel[] channels = new ManagedChannel[numChannels];
final AtomicInteger[] counts = new AtomicInteger[numChannels];
- final MethodDescriptor methodDescriptor = FakeServiceGrpc.METHOD_RECOGNIZE;
+ final MethodDescriptor methodDescriptor = METHOD_RECOGNIZE;
final CallOptions callOptions = CallOptions.DEFAULT;
@SuppressWarnings("unchecked")
final ClientCall clientCall = Mockito.mock(ClientCall.class);
@@ -472,8 +478,7 @@ public void channelCountShouldNotChangeWhenOutstandingRpcsAreWithinLimits() thro
// Start the minimum number of
for (int i = 0; i < 2; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
pool.resize();
assertThat(pool.entries.get()).hasSize(2);
@@ -481,14 +486,13 @@ public void channelCountShouldNotChangeWhenOutstandingRpcsAreWithinLimits() thro
// Add enough RPCs to be just at the brink of expansion
for (int i = startedCalls.size(); i < 4; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
pool.resize();
assertThat(pool.entries.get()).hasSize(2);
// Add another RPC to push expansion
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT);
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT);
pool.resize();
assertThat(pool.entries.get()).hasSize(4); // += ChannelPool::MAX_RESIZE_DELTA
assertThat(startedCalls).hasSize(5);
@@ -593,8 +597,7 @@ public void removedActiveChannelsAreShutdown() throws Exception {
// Start 2 RPCs
for (int i = 0; i < 2; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
// Complete the first one
@SuppressWarnings("unchecked")
@@ -663,4 +666,74 @@ public void onComplete() {}
assertThat(e.getCause()).isInstanceOf(CancellationException.class);
assertThat(e.getMessage()).isEqualTo("Call is already cancelled");
}
+
+ @Test
+ public void testDoubleRelease() throws Exception {
+ FakeLogHandler logHandler = new FakeLogHandler();
+ ChannelPool.LOG.addHandler(logHandler);
+
+ try {
+ // Create a fake channel pool thats backed by mock channels that simply record invocations
+ ClientCall mockClientCall = Mockito.mock(ClientCall.class);
+ ManagedChannel fakeChannel = Mockito.mock(ManagedChannel.class);
+ Mockito.when(fakeChannel.newCall(Mockito.any(), Mockito.any())).thenReturn(mockClientCall);
+ ChannelPoolSettings channelPoolSettings = ChannelPoolSettings.staticallySized(1);
+ ChannelFactory factory = new FakeChannelFactory(ImmutableList.of(fakeChannel));
+
+ pool = ChannelPool.create(channelPoolSettings, factory);
+
+ // Construct a fake callable to use the channel pool
+ ClientContext context =
+ ClientContext.newBuilder()
+ .setTransportChannel(GrpcTransportChannel.create(pool))
+ .setDefaultCallContext(GrpcCallContext.of(pool, CallOptions.DEFAULT))
+ .build();
+
+ UnaryCallSettings settings =
+ UnaryCallSettings.newUnaryCallSettingsBuilder().build();
+ UnaryCallable callable =
+ GrpcCallableFactory.createUnaryCallable(
+ GrpcCallSettings.create(METHOD_RECOGNIZE), settings, context);
+
+ // Start the RPC
+ ApiFuture rpcFuture =
+ callable.futureCall(Color.getDefaultInstance(), context.getDefaultCallContext());
+
+ // Get the server side listener and intentionally close it twice
+ ArgumentCaptor> clientCallListenerCaptor =
+ ArgumentCaptor.forClass(ClientCall.Listener.class);
+ Mockito.verify(mockClientCall).start(clientCallListenerCaptor.capture(), Mockito.any());
+ clientCallListenerCaptor.getValue().onClose(Status.INTERNAL, new Metadata());
+ clientCallListenerCaptor.getValue().onClose(Status.UNKNOWN, new Metadata());
+
+ // Ensure that the channel pool properly logged the double call and kept the refCount correct
+ assertThat(logHandler.getAllMessages())
+ .contains(
+ "Call is being closed more than once. Please make sure that onClose() is not being manually called.");
+ assertThat(pool.entries.get()).hasSize(1);
+ ChannelPool.Entry entry = pool.entries.get().get(0);
+ assertThat(entry.outstandingRpcs.get()).isEqualTo(0);
+ } finally {
+ ChannelPool.LOG.removeHandler(logHandler);
+ }
+ }
+
+ private static class FakeLogHandler extends Handler {
+ List records = new ArrayList<>();
+
+ @Override
+ public void publish(LogRecord record) {
+ records.add(record);
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void close() throws SecurityException {}
+
+ List getAllMessages() {
+ return records.stream().map(LogRecord::getMessage).collect(Collectors.toList());
+ }
+ }
}
From b6d83dd385bd66b64492ce6a5f70a0a04899c68c Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Thu, 19 Oct 2023 18:19:38 -0400
Subject: [PATCH 64/64] chore(main): release 2.28.0 (#2128)
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
CHANGELOG.md | 62 +++++++++++++++++++
WORKSPACE | 2 +-
api-common-java/pom.xml | 4 +-
coverage-report/pom.xml | 8 +--
gapic-generator-java-bom/pom.xml | 26 ++++----
gapic-generator-java-pom-parent/pom.xml | 2 +-
gapic-generator-java/pom.xml | 6 +-
gax-java/dependencies.properties | 8 +--
gax-java/gax-bom/pom.xml | 20 +++---
gax-java/gax-grpc/pom.xml | 4 +-
gax-java/gax-httpjson/pom.xml | 4 +-
gax-java/gax/pom.xml | 4 +-
gax-java/pom.xml | 14 ++---
.../grpc-google-common-protos/pom.xml | 4 +-
java-common-protos/pom.xml | 8 +--
.../proto-google-common-protos/pom.xml | 4 +-
java-core/google-cloud-core-bom/pom.xml | 10 +--
java-core/google-cloud-core-grpc/pom.xml | 4 +-
java-core/google-cloud-core-http/pom.xml | 4 +-
java-core/google-cloud-core/pom.xml | 4 +-
java-core/pom.xml | 6 +-
java-iam/grpc-google-iam-v1/pom.xml | 4 +-
java-iam/grpc-google-iam-v2/pom.xml | 4 +-
java-iam/grpc-google-iam-v2beta/pom.xml | 4 +-
java-iam/pom.xml | 20 +++---
java-iam/proto-google-iam-v1/pom.xml | 4 +-
java-iam/proto-google-iam-v2/pom.xml | 4 +-
java-iam/proto-google-iam-v2beta/pom.xml | 4 +-
.../dependency-convergence-check/pom.xml | 2 +-
.../first-party-dependencies/pom.xml | 10 +--
java-shared-dependencies/pom.xml | 8 +--
.../third-party-dependencies/pom.xml | 2 +-
.../upper-bound-check/pom.xml | 4 +-
showcase/pom.xml | 2 +-
versions.txt | 32 +++++-----
35 files changed, 187 insertions(+), 125 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da8b6c3f3c..ee0300cf54 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,67 @@
# Changelog
+## [2.28.0](https://github.com/googleapis/sdk-platform-java/compare/v2.27.0...v2.28.0) (2023-10-19)
+
+
+### Features
+
+* Add gapic options as inputs to `generate_library.sh` ([#2121](https://github.com/googleapis/sdk-platform-java/issues/2121)) ([b17d8a1](https://github.com/googleapis/sdk-platform-java/commit/b17d8a12575b273b4536b42c37bf61b321fc0e5a))
+* Log DirectPath misconfiguration ([#2105](https://github.com/googleapis/sdk-platform-java/issues/2105)) ([860ae76](https://github.com/googleapis/sdk-platform-java/commit/860ae7646a985786966af55c5d3be35981e0fab1))
+* Replace graal version declarion with properties placeholder ([#2120](https://github.com/googleapis/sdk-platform-java/issues/2120)) ([e5247ba](https://github.com/googleapis/sdk-platform-java/commit/e5247ba61eb4c2e543bab79110eaba3766a8264f))
+
+
+### Bug Fixes
+
+* Make sure outstanding RPCs count in ChannelPool can not go negative ([#2185](https://github.com/googleapis/sdk-platform-java/issues/2185)) ([d2d624d](https://github.com/googleapis/sdk-platform-java/commit/d2d624def3d72ecdaa3fdf7e2a92fd29d39ff1aa))
+
+
+### Dependencies
+
+* Update dependency attrs to v22.2.0 ([#2146](https://github.com/googleapis/sdk-platform-java/issues/2146)) ([49d7f55](https://github.com/googleapis/sdk-platform-java/commit/49d7f55df0efd1ebf4ec074a8b9c23324de69149))
+* Update dependency cffi to v1.16.0 ([#2147](https://github.com/googleapis/sdk-platform-java/issues/2147)) ([db37d5b](https://github.com/googleapis/sdk-platform-java/commit/db37d5ba609adf571c75f9f2f51c39b7453b862b))
+* Update dependency charset-normalizer to v2.1.1 ([#2148](https://github.com/googleapis/sdk-platform-java/issues/2148)) ([759e957](https://github.com/googleapis/sdk-platform-java/commit/759e957a1a3738218a6e360660d340cb99a3268e))
+* Update dependency com.fasterxml.jackson:jackson-bom to v2.15.3 ([#2136](https://github.com/googleapis/sdk-platform-java/issues/2136)) ([be25555](https://github.com/googleapis/sdk-platform-java/commit/be2555565c91580df0b81ae09ad2cda8ef5a40a7))
+* Update dependency com.google.auto.value:auto-value to v1.10.4 ([#2137](https://github.com/googleapis/sdk-platform-java/issues/2137)) ([5edca8b](https://github.com/googleapis/sdk-platform-java/commit/5edca8b542e767cc9a9a899420f2707a5c91e1e7))
+* Update dependency com.google.auto.value:auto-value-annotations to v1.10.4 ([#2138](https://github.com/googleapis/sdk-platform-java/issues/2138)) ([705c358](https://github.com/googleapis/sdk-platform-java/commit/705c358804767419f742978185fa9a93e622a1da))
+* Update dependency com.google.errorprone:error_prone_annotations to v2.22.0 ([#2130](https://github.com/googleapis/sdk-platform-java/issues/2130)) ([805daf1](https://github.com/googleapis/sdk-platform-java/commit/805daf1a9967f63b747624dd4098d78a80c083bf))
+* Update dependency com.google.errorprone:error_prone_annotations to v2.22.0 ([#2145](https://github.com/googleapis/sdk-platform-java/issues/2145)) ([f936331](https://github.com/googleapis/sdk-platform-java/commit/f9363315f20f27237324a5797ba20a0097283410))
+* Update dependency commons-codec:commons-codec to v1.16.0 ([#2152](https://github.com/googleapis/sdk-platform-java/issues/2152)) ([0cf3440](https://github.com/googleapis/sdk-platform-java/commit/0cf34408d97c5d7dd63ea941de27b64a95e35524))
+* Update dependency cryptography to v41.0.4 [security] ([#2109](https://github.com/googleapis/sdk-platform-java/issues/2109)) ([e2f57f2](https://github.com/googleapis/sdk-platform-java/commit/e2f57f2fe20c920eafb0306ea51c8205e371d972))
+* Update dependency gcp-releasetool to v1.16.0 ([#2111](https://github.com/googleapis/sdk-platform-java/issues/2111)) ([69d1259](https://github.com/googleapis/sdk-platform-java/commit/69d12593dfbd0d69d2bd79df8d42def42eccb892))
+* Update dependency google-api-core to v2.12.0 ([#2153](https://github.com/googleapis/sdk-platform-java/issues/2153)) ([8c1baf5](https://github.com/googleapis/sdk-platform-java/commit/8c1baf59fac515b10698b1548a7104e8ef82cd1e))
+* Update dependency google-auth to v2.23.3 ([#2154](https://github.com/googleapis/sdk-platform-java/issues/2154)) ([3645fed](https://github.com/googleapis/sdk-platform-java/commit/3645fed46926cf4f402e4986749db55b86fab6b6))
+* Update dependency google-cloud-core to v2.3.3 ([#2113](https://github.com/googleapis/sdk-platform-java/issues/2113)) ([c8194cf](https://github.com/googleapis/sdk-platform-java/commit/c8194cf29dfee221d87aaaca13983794ad089433))
+* Update dependency google-cloud-storage to v2.12.0 ([#2155](https://github.com/googleapis/sdk-platform-java/issues/2155)) ([0ec9027](https://github.com/googleapis/sdk-platform-java/commit/0ec902795ae36ff16890a1c02c07b2b977dfed14))
+* Update dependency google-crc32c to v1.5.0 ([#2157](https://github.com/googleapis/sdk-platform-java/issues/2157)) ([6556ed5](https://github.com/googleapis/sdk-platform-java/commit/6556ed588bad9901592949ce5674ac2894102bd2))
+* Update dependency google-resumable-media to v2.6.0 ([#2161](https://github.com/googleapis/sdk-platform-java/issues/2161)) ([87dd6f2](https://github.com/googleapis/sdk-platform-java/commit/87dd6f2862dbd82fe267008306e841c4e9bb5af2))
+* Update dependency googleapis-common-protos to v1.61.0 ([#2156](https://github.com/googleapis/sdk-platform-java/issues/2156)) ([f7fd515](https://github.com/googleapis/sdk-platform-java/commit/f7fd515b00ff615cbd7b86c8471b2a1d8a1ce2ee))
+* Update dependency gradle to v7.6.3 ([#2115](https://github.com/googleapis/sdk-platform-java/issues/2115)) ([cd9748d](https://github.com/googleapis/sdk-platform-java/commit/cd9748d4a62b843080c107309c15d6894eb0eb28))
+* Update dependency importlib-metadata to v4.13.0 ([#2162](https://github.com/googleapis/sdk-platform-java/issues/2162)) ([ac6e3d5](https://github.com/googleapis/sdk-platform-java/commit/ac6e3d5bbeab2dbf35aefc14b20217119e99460d))
+* Update dependency jeepney to v0.8.0 ([#2165](https://github.com/googleapis/sdk-platform-java/issues/2165)) ([59744b5](https://github.com/googleapis/sdk-platform-java/commit/59744b56409564dab142f24533672b1fa9726313))
+* Update dependency jinja2 to v3.1.2 ([#2166](https://github.com/googleapis/sdk-platform-java/issues/2166)) ([c7ac765](https://github.com/googleapis/sdk-platform-java/commit/c7ac765237c7bbed041e7b15b040625f411eee5c))
+* Update dependency markupsafe to v2.1.3 ([#2168](https://github.com/googleapis/sdk-platform-java/issues/2168)) ([ea26b1a](https://github.com/googleapis/sdk-platform-java/commit/ea26b1aedcdb4eb08449194b111b00e07c2c0d02))
+* Update dependency net.bytebuddy:byte-buddy to v1.14.9 ([#2116](https://github.com/googleapis/sdk-platform-java/issues/2116)) ([e0ad3e6](https://github.com/googleapis/sdk-platform-java/commit/e0ad3e678ac9a42cb4c9a6111e8da750a2294ba6))
+* Update dependency org.apache.commons:commons-lang3 to v3.13.0 ([#2131](https://github.com/googleapis/sdk-platform-java/issues/2131)) ([c066286](https://github.com/googleapis/sdk-platform-java/commit/c066286ef3da2f8587d44d2b3d60db63be24875a))
+* Update dependency org.checkerframework:checker-qual to v3.39.0 ([#2158](https://github.com/googleapis/sdk-platform-java/issues/2158)) ([dfe2bbc](https://github.com/googleapis/sdk-platform-java/commit/dfe2bbcd6079ab0b28f091bc132dfc27c9ab98c0))
+* Update dependency org.easymock:easymock to v5.2.0 ([#2159](https://github.com/googleapis/sdk-platform-java/issues/2159)) ([8daf145](https://github.com/googleapis/sdk-platform-java/commit/8daf1452351aa0df2e282676a69e90c3743b4edf))
+* Update dependency org.yaml:snakeyaml to v2.2 ([#2160](https://github.com/googleapis/sdk-platform-java/issues/2160)) ([0664bf6](https://github.com/googleapis/sdk-platform-java/commit/0664bf6e578861197abd3ed31148d7db27b8eb53))
+* Update dependency protobuf to v3.20.3 ([#2169](https://github.com/googleapis/sdk-platform-java/issues/2169)) ([669d369](https://github.com/googleapis/sdk-platform-java/commit/669d3698cb76471cd0c9c6a398fb7b3d848d1571))
+* Update dependency pyasn1 to v0.5.0 ([#2170](https://github.com/googleapis/sdk-platform-java/issues/2170)) ([a842045](https://github.com/googleapis/sdk-platform-java/commit/a842045c71cdf88975505c90b5915eba321f0a65))
+* Update dependency pyasn1-modules to v0.3.0 ([#2171](https://github.com/googleapis/sdk-platform-java/issues/2171)) ([4abbf85](https://github.com/googleapis/sdk-platform-java/commit/4abbf858712b1f629df8b19a9007d1a09451e5e2))
+* Update dependency pyjwt to v2.8.0 ([#2172](https://github.com/googleapis/sdk-platform-java/issues/2172)) ([875146e](https://github.com/googleapis/sdk-platform-java/commit/875146eb3c1ac3cb1953980825f79c75c3251ea6))
+* Update dependency pyparsing to v3.1.1 ([#2173](https://github.com/googleapis/sdk-platform-java/issues/2173)) ([caac831](https://github.com/googleapis/sdk-platform-java/commit/caac8316a12aa0d8b7ef5f57912727a1abfc3151))
+* Update dependency typing-extensions to v4.8.0 ([#2174](https://github.com/googleapis/sdk-platform-java/issues/2174)) ([1a8f7a4](https://github.com/googleapis/sdk-platform-java/commit/1a8f7a446665b6fe03dd98856734ec48b59e080f))
+* Update dependency urllib3 to v1.26.17 [security] ([#2110](https://github.com/googleapis/sdk-platform-java/issues/2110)) ([5f40056](https://github.com/googleapis/sdk-platform-java/commit/5f40056fdb5d62e59744d43dd149d5da20979e59))
+* Update dependency urllib3 to v1.26.18 ([#2177](https://github.com/googleapis/sdk-platform-java/issues/2177)) ([9683111](https://github.com/googleapis/sdk-platform-java/commit/9683111627bca74ed0d123caf37ff0993c71d2ea))
+* Update dependency zipp to v3.17.0 ([#2175](https://github.com/googleapis/sdk-platform-java/issues/2175)) ([1700c59](https://github.com/googleapis/sdk-platform-java/commit/1700c597a74f906689a3a53e023ac094c9deeaff))
+* Update google api dependencies ([#2132](https://github.com/googleapis/sdk-platform-java/issues/2132)) ([bd4ae4f](https://github.com/googleapis/sdk-platform-java/commit/bd4ae4fab88a421ad93e597f99cabb7997f91e1d))
+* Update google auth library dependencies to v1.20.0 ([#2142](https://github.com/googleapis/sdk-platform-java/issues/2142)) ([ce59ed8](https://github.com/googleapis/sdk-platform-java/commit/ce59ed8be29a6b05f7c999bf48cb4d442fc2294a))
+* Update googleapis/java-cloud-bom digest to 4b9b60d ([#2178](https://github.com/googleapis/sdk-platform-java/issues/2178)) ([6a8972e](https://github.com/googleapis/sdk-platform-java/commit/6a8972ea287f665d82046b8314887edee27a6c1a))
+* Update googleapis/java-cloud-bom digest to a0bfee4 ([#2181](https://github.com/googleapis/sdk-platform-java/issues/2181)) ([88bccd9](https://github.com/googleapis/sdk-platform-java/commit/88bccd9e4b6c3245c0fae7e142954155bf373274))
+* Update googleapis/java-cloud-bom digest to e485c2f ([#2134](https://github.com/googleapis/sdk-platform-java/issues/2134)) ([97f97c6](https://github.com/googleapis/sdk-platform-java/commit/97f97c6063f91183af260d875d58958f4bba658b))
+* Update netty dependencies ([#2141](https://github.com/googleapis/sdk-platform-java/issues/2141)) ([fedc7b9](https://github.com/googleapis/sdk-platform-java/commit/fedc7b921f5415b2d51d3147ef1aaebf1b75ccdb))
+* Update protobuf dependencies to v3.24.4 ([#2118](https://github.com/googleapis/sdk-platform-java/issues/2118)) ([7b3f4b9](https://github.com/googleapis/sdk-platform-java/commit/7b3f4b97b013a32f171bd8a365d6d712b94b3849))
+
## [2.27.0](https://github.com/googleapis/sdk-platform-java/compare/v2.26.1...v2.27.0) (2023-10-06)
diff --git a/WORKSPACE b/WORKSPACE
index 99e880b4dc..d86d550b49 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -60,7 +60,7 @@ maven_install(
repositories = ["https://repo.maven.apache.org/maven2/"],
)
-_gapic_generator_java_version = "2.27.1-SNAPSHOT" # {x-version-update:gapic-generator-java:current}
+_gapic_generator_java_version = "2.28.0" # {x-version-update:gapic-generator-java:current}
maven_install(
artifacts = [
diff --git a/api-common-java/pom.xml b/api-common-java/pom.xml
index 990f4317e7..a2e7f86659 100644
--- a/api-common-java/pom.xml
+++ b/api-common-java/pom.xml
@@ -5,14 +5,14 @@
com.google.api
api-common
jar
- 2.18.1-SNAPSHOT
+ 2.19.0
API Common
Common utilities for Google APIs in Java
com.google.api
gapic-generator-java-pom-parent
- 2.27.1-SNAPSHOT
+ 2.28.0
../gapic-generator-java-pom-parent
diff --git a/coverage-report/pom.xml b/coverage-report/pom.xml
index 17cd2ed7b2..b20e5d1f9e 100644
--- a/coverage-report/pom.xml
+++ b/coverage-report/pom.xml
@@ -31,22 +31,22 @@
com.google.api
gax
- 2.35.1-SNAPSHOT
+ 2.36.0
com.google.api
gax-grpc
- 2.35.1-SNAPSHOT
+ 2.36.0
com.google.api
gax-httpjson
- 2.35.1-SNAPSHOT
+ 2.36.0
com.google.api
api-common
- 2.18.1-SNAPSHOT
+ 2.19.0