Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(deps): the libraries BOM 15.0.0 #251

Merged
merged 6 commits into from Nov 8, 2020
Merged

Conversation

suztomo
Copy link
Member

@suztomo suztomo commented Nov 2, 2020

Closes #235 (which was for libraries-bom 12.0.0)

@suztomo suztomo requested review from a team as code owners November 2, 2020 20:02
@google-cla google-cla bot added the cla: yes This human has signed the Contributor License Agreement. label Nov 2, 2020
@product-auto-label product-auto-label bot added the api: spanner Issues related to the googleapis/java-spanner-jdbc API. label Nov 2, 2020
@generated-files-bot
Copy link

Warning: This pull request is touching the following templated files:

  • samples/snippets/pom.xml

@suztomo
Copy link
Member Author

suztomo commented Nov 2, 2020

Build failed. https://github.com/googleapis/java-spanner-jdbc/pull/251/checks?check_run_id=1344099221

[INFO] Running com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest
Error:  Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.014 s <<< FAILURE! - in com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest
Error:  com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest  Time elapsed: 0.01 s  <<< ERROR!
java.lang.NoSuchMethodError: io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.addService(Lio/grpc/BindableService;)Lio/grpc/internal/AbstractServerImplBuilder;
	at com.google.cloud.spanner.connection.AbstractMockServerTest.startStaticServer(AbstractMockServerTest.java:107)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Looking into this.

"ci / dependencies (8)" and mvn install in my local Mac failed:

[WARNING] Rule 2: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:
Failed while enforcing RequireUpperBoundDeps. The error(s) are [
Require upper bound dependencies error for io.grpc:grpc-protobuf-lite:1.32.1 paths to dependency are:
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.cloud:google-cloud-spanner:2.0.2
    +-io.grpc:grpc-protobuf-lite:1.32.1 (managed) <-- io.grpc:grpc-protobuf-lite:1.33.0
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.api.grpc:grpc-google-cloud-spanner-v1:2.0.2
    +-io.grpc:grpc-protobuf-lite:1.32.1 (managed) <-- io.grpc:grpc-protobuf-lite:1.33.0
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.cloud:google-cloud-spanner:2.0.2
    +-io.grpc:grpc-protobuf-lite:1.32.1 (managed) <-- io.grpc:grpc-protobuf-lite:1.33.0
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:2.0.2
    +-io.grpc:grpc-protobuf-lite:1.32.1 (managed) <-- io.grpc:grpc-protobuf-lite:1.33.0
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:2.0.2
    +-io.grpc:grpc-protobuf-lite:1.32.1 (managed) <-- io.grpc:grpc-protobuf-lite:1.33.0
, 
Require upper bound dependencies error for org.apache.httpcomponents:httpclient:4.5.12 paths to dependency are:
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.cloud:google-cloud-spanner:2.0.2
    +-org.apache.httpcomponents:httpclient:4.5.12
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.http-client:google-http-client:1.37.0
    +-org.apache.httpcomponents:httpclient:4.5.13
and
+-com.google.cloud:google-cloud-spanner-jdbc:1.17.3-SNAPSHOT
  +-com.google.cloud:google-cloud-spanner:2.0.2
    +-org.apache.httpcomponents:httpclient:4.5.12
]

On protobuf-lite, there's a pull request for the libraries BOM (https://github.com/GoogleCloudPlatform/cloud-opensource-java/pull/1774/files) to upgrade gRPC version from 1.33.0 to 1.33.1. Where is this io.grpc:grpc-protobuf-lite:1.32.1 (managed) coming from?

On org.apache.httpcomponents:httpclient:4.5.12, ???

It's good to have samples/snippets/pom.xml to use the libraries BOM. But does this library (java-spanner-jdbc; com.google.cloud:google-cloud-spanner-jdbc, at the root pom.xml) have to depend on the libraries-bom? Isn't the shared dependencies BOM enough?

Dependency Tree

Tree with the libraries BOM 13.4.0

[INFO] com.google.cloud:google-cloud-spanner-jdbc:jar:1.17.3-SNAPSHOT
[INFO] +- io.grpc:grpc-api:jar:1.33.0:compile
[INFO] |  +- io.grpc:grpc-context:jar:1.33.0:compile
[INFO] |  +- com.google.errorprone:error_prone_annotations:jar:2.4.0:compile
[INFO] |  \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.19:runtime
[INFO] +- com.google.cloud:google-cloud-core-grpc:jar:1.93.9:compile
[INFO] |  +- com.google.api:gax:jar:1.60.0:compile
[INFO] |  +- com.google.api:gax-grpc:jar:1.60.0:compile
[INFO] |  \- io.grpc:grpc-core:jar:1.33.0:compile
[INFO] +- com.google.api.grpc:proto-google-common-protos:jar:1.18.1:compile
[INFO] +- com.google.cloud:google-cloud-spanner:jar:2.0.2:compile
[INFO] |  +- io.grpc:grpc-auth:jar:1.33.0:compile
[INFO] |  +- com.google.android:annotations:jar:4.1.1.4:runtime
[INFO] |  +- io.perfmark:perfmark-api:jar:0.19.0:runtime
[INFO] |  +- io.grpc:grpc-protobuf:jar:1.33.0:compile
[INFO] |  +- io.grpc:grpc-protobuf-lite:jar:1.32.1:compile
[INFO] |  +- io.grpc:grpc-stub:jar:1.33.0:compile
[INFO] |  +- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO] |  +- com.google.auto.value:auto-value-annotations:jar:1.7.4:compile
[INFO] |  +- com.google.protobuf:protobuf-java-util:jar:3.13.0:compile
[INFO] |  +- com.google.api.grpc:grpc-google-common-protos:jar:1.18.1:compile
[INFO] |  +- com.google.guava:failureaccess:jar:1.0.1:compile
[INFO] |  +- com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile
[INFO] |  +- org.checkerframework:checker-compat-qual:jar:2.5.5:compile
[INFO] |  +- com.google.j2objc:j2objc-annotations:jar:1.3:compile
[INFO] |  +- com.google.api.grpc:proto-google-iam-v1:jar:1.0.1:compile
[INFO] |  +- com.google.http-client:google-http-client-jackson2:jar:1.37.0:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-core:jar:2.11.1:compile
[INFO] |  +- io.opencensus:opencensus-api:jar:0.24.0:compile
[INFO] |  +- io.opencensus:opencensus-contrib-grpc-util:jar:0.24.0:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.5.12:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  +- commons-codec:commons-codec:jar:1.11:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.4.13:compile
[INFO] |  +- io.opencensus:opencensus-contrib-http-util:jar:0.24.0:compile
[INFO] |  +- com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:jar:2.0.2:compile
[INFO] |  +- com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:jar:2.0.2:compile
[INFO] |  +- io.grpc:grpc-alts:jar:1.33.0:compile
[INFO] |  +- io.grpc:grpc-grpclb:jar:1.33.0:compile
[INFO] |  +- org.conscrypt:conscrypt-openjdk-uber:jar:2.2.1:compile
[INFO] |  +- com.google.code.gson:gson:jar:2.8.6:compile
[INFO] |  \- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO] +- com.google.protobuf:protobuf-java:jar:3.13.0:compile
[INFO] +- com.google.guava:guava:jar:30.0-android:compile
[INFO] +- org.threeten:threetenbp:jar:1.4.4:compile
[INFO] +- io.grpc:grpc-netty-shaded:jar:1.33.0:compile
[INFO] +- com.google.api:api-common:jar:1.10.0:compile
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
[INFO] +- com.google.http-client:google-http-client:jar:1.37.0:compile
[INFO] +- com.google.auth:google-auth-library-oauth2-http:jar:0.22.0:compile
[INFO] +- com.google.auth:google-auth-library-credentials:jar:0.22.0:compile
[INFO] +- com.google.cloud:google-cloud-core:jar:1.93.9:compile
[INFO] +- com.google.api.grpc:proto-google-cloud-spanner-v1:jar:2.0.2:compile
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-v1:jar:2.0.2:test
[INFO] +- com.google.cloud:google-cloud-spanner:test-jar:tests:2.0.2:test
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:jar:2.0.2:test
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:jar:2.0.2:test
[INFO] +- com.google.truth:truth:jar:1.0.1:test
[INFO] |  \- com.googlecode.java-diff-utils:diffutils:jar:1.3.0:test
[INFO] +- org.hamcrest:hamcrest:jar:2.2:test
[INFO] +- org.mockito:mockito-core:jar:1.10.19:test
[INFO] |  \- org.objenesis:objenesis:jar:2.1:test
[INFO] +- junit:junit:jar:4.13.1:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- com.google.api:gax-grpc:jar:testlib:1.58.2:test

Tree with the master

[INFO] com.google.cloud:google-cloud-spanner-jdbc:jar:1.17.3-SNAPSHOT
[INFO] +- io.grpc:grpc-api:jar:1.32.1:compile
[INFO] |  +- io.grpc:grpc-context:jar:1.32.1:compile
[INFO] |  +- com.google.errorprone:error_prone_annotations:jar:2.4.0:compile
[INFO] |  \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.19:runtime
[INFO] +- com.google.cloud:google-cloud-core-grpc:jar:1.93.9:compile
[INFO] |  +- com.google.api:gax:jar:1.59.0:compile
[INFO] |  +- com.google.api:gax-grpc:jar:1.59.0:compile
[INFO] |  \- io.grpc:grpc-core:jar:1.32.1:compile
[INFO] +- com.google.api.grpc:proto-google-common-protos:jar:1.18.1:compile
[INFO] +- com.google.cloud:google-cloud-spanner:jar:2.0.1:compile
[INFO] |  +- io.grpc:grpc-auth:jar:1.32.1:compile
[INFO] |  +- com.google.android:annotations:jar:4.1.1.4:runtime
[INFO] |  +- io.perfmark:perfmark-api:jar:0.19.0:runtime
[INFO] |  +- io.grpc:grpc-protobuf:jar:1.32.1:compile
[INFO] |  +- io.grpc:grpc-protobuf-lite:jar:1.32.1:compile
[INFO] |  +- io.grpc:grpc-stub:jar:1.32.1:compile
[INFO] |  +- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO] |  +- com.google.auto.value:auto-value-annotations:jar:1.7.4:compile
[INFO] |  +- com.google.protobuf:protobuf-java-util:jar:3.13.0:compile
[INFO] |  +- com.google.api.grpc:grpc-google-common-protos:jar:1.18.1:compile
[INFO] |  +- com.google.guava:failureaccess:jar:1.0.1:compile
[INFO] |  +- com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile
[INFO] |  +- org.checkerframework:checker-compat-qual:jar:2.5.5:compile
[INFO] |  +- com.google.j2objc:j2objc-annotations:jar:1.3:compile
[INFO] |  +- com.google.api.grpc:proto-google-iam-v1:jar:1.0.1:compile
[INFO] |  +- com.google.http-client:google-http-client-jackson2:jar:1.36.0:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-core:jar:2.11.1:compile
[INFO] |  +- io.opencensus:opencensus-api:jar:0.24.0:compile
[INFO] |  +- io.opencensus:opencensus-contrib-grpc-util:jar:0.24.0:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.5.12:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  +- commons-codec:commons-codec:jar:1.11:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.4.13:compile
[INFO] |  +- io.opencensus:opencensus-contrib-http-util:jar:0.24.0:compile
[INFO] |  +- com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:jar:2.0.1:compile
[INFO] |  +- com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:jar:2.0.1:compile
[INFO] |  +- io.grpc:grpc-alts:jar:1.32.1:compile
[INFO] |  +- io.grpc:grpc-grpclb:jar:1.32.1:compile
[INFO] |  +- org.conscrypt:conscrypt-openjdk-uber:jar:2.2.1:compile
[INFO] |  +- com.google.code.gson:gson:jar:2.8.6:compile
[INFO] |  \- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO] +- com.google.protobuf:protobuf-java:jar:3.13.0:compile
[INFO] +- com.google.guava:guava:jar:29.0-android:compile
[INFO] +- org.threeten:threetenbp:jar:1.4.4:compile
[INFO] +- io.grpc:grpc-netty-shaded:jar:1.32.1:compile
[INFO] +- com.google.api:api-common:jar:1.10.0:compile
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
[INFO] +- com.google.http-client:google-http-client:jar:1.36.0:compile
[INFO] +- com.google.auth:google-auth-library-oauth2-http:jar:0.21.1:compile
[INFO] +- com.google.auth:google-auth-library-credentials:jar:0.21.1:compile
[INFO] +- com.google.cloud:google-cloud-core:jar:1.93.9:compile
[INFO] +- com.google.api.grpc:proto-google-cloud-spanner-v1:jar:2.0.1:compile
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-v1:jar:2.0.1:test
[INFO] +- com.google.cloud:google-cloud-spanner:test-jar:tests:2.0.1:test
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:jar:2.0.1:test
[INFO] +- com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:jar:2.0.1:test
[INFO] +- com.google.truth:truth:jar:1.0.1:test
[INFO] |  \- com.googlecode.java-diff-utils:diffutils:jar:1.3.0:test
[INFO] +- org.hamcrest:hamcrest:jar:2.2:test
[INFO] +- org.mockito:mockito-core:jar:1.10.19:test
[INFO] |  \- org.objenesis:objenesis:jar:2.1:test
[INFO] +- junit:junit:jar:4.13.1:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- com.google.api:gax-grpc:jar:testlib:1.58.2:test

As per the effective pom, grpc-protobuf-lite:1.32.1 is coming from io.grpc:grpc-bom:1.32.1.

      <dependency>
        <groupId>io.grpc</groupId>  <!-- io.grpc:grpc-bom:1.32.1, line 105 -->
        <artifactId>grpc-protobuf-lite</artifactId>  <!-- io.grpc:grpc-bom:1.32.1, line 106 -->
        <version>1.32.1</version>  <!-- io.grpc:grpc-bom:1.32.1, line 107 -->
      </dependency>

The shared-dependencies-bom 0.10.0 https://search.maven.org/artifact/com.google.cloud/google-cloud-shared-dependencies/0.10.0/pom has grpc.version 1.32.1

@suztomo suztomo changed the title chore(deps): the libraries BOM 13.4.0 chore(deps): the libraries BOM 13.3.0 and the shared-dependencies BOM 0.14.1 Nov 3, 2020
@generated-files-bot
Copy link

Warning: This pull request is touching the following templated files:

  • samples/snippets/pom.xml

@generated-files-bot
Copy link

Warning: This pull request is touching the following templated files:

  • samples/snippets/pom.xml

@suztomo
Copy link
Member Author

suztomo commented Nov 3, 2020

053eb20 fails with NoSuchMethodError in test.

[ERROR] Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.011 s <<< FAILURE! - in com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest
[ERROR] com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest  Time elapsed: 0.009 s  <<< ERROR!
java.lang.NoSuchMethodError: io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.addService(Lio/grpc/BindableService;)Lio/grpc/internal/AbstractServerImplBuilder;

[ERROR] com.google.cloud.spanner.jdbc.JdbcQueryOptionsTest  Time elapsed: 0.009 s  <<< ERROR!
java.lang.NullPointerException

The short answer seems that google-cloud-spanner's test library does not work with grpc 1.33.0. But I don't see why the NoSuchMethodError occurs.

Interestingly the missing method does not appear in the output of the Linkage Checker enforcer rule:

https://gist.github.com/suztomo/08b56722ced2deb805afa3fdfffd5989

JdbcQueryOptionsTest extends AbstractMockServerTest, which calls addService.

  @BeforeClass
  public static void startStaticServer() throws IOException {
    mockSpanner = new MockSpannerServiceImpl();
    mockSpanner.setAbortProbability(0.0D);
    mockInstanceAdmin = new MockInstanceAdminImpl();
    mockDatabaseAdmin = new MockDatabaseAdminImpl();
    address = new InetSocketAddress("localhost", 0);
    server = ((NettyServerBuilder)((NettyServerBuilder)((NettyServerBuilder)NettyServerBuilder.forAddress(address).addService(mockSpanner)).addService(mockInstanceAdmin)).addService(mockDatabaseAdmin)).build().start();
    mockSpanner.putStatementResult(StatementResult.query(SELECT_COUNT_STATEMENT, SELECT_COUNT_RESULTSET_BEFORE_INSERT));
    mockSpanner.putStatementResult(StatementResult.update(INSERT_STATEMENT, 1L));
  }

As per IntelliJ, Google-cloud-spanner:2.0.2 used grpc 1.32.1 to test. NettyServerBuilder extends AbstractServerImplBuilder<NettyServerBuilder> The grpc-core-1.32.1's AbstractServerImplBuilder has addService method: T addService(BindableService bindableService). AbstractServerImplBuilder's declaration:

public abstract class AbstractServerImplBuilder<T extends AbstractServerImplBuilder<T>>
        extends ServerBuilder<T> {

The grpc-api 1.33.0's NettyServerBuilder extends ForwardingServerBuilder<NettyServerBuilder>. ForwardingServerBuilder has T addService(BindableService bindableService). ForwardingServerBuilder's declaration:

public abstract class ForwardingServerBuilder<T extends ForwardingServerBuilder<T>>
    extends ServerBuilder<T> {

ForwardingServerBuilder's T needs to extend ForwardingServerBuilder in grpc 1.33.0.

Although the method addService uses type parameter in the return value, the runtime method lookup is done by the return type and argument types at the time of the compilation (return type: NettyServerBuilder, argument type: BindableService). When the test ran, it had grpc-api 1.33.0 in the class path which defines NettyServerBuilder extending ForwardingServerBuilder<NettyServerBuilder>. By inheritance NettyServerBuilder has the method addServer, but the return type of the method is T extends ForwardingServerBuilder<T>.

Why is it looking for AbstractServerImplBuilder rather than NettyServerBuilder?

The javap command shows the method invocation is looking for AbstractServerImplBuilder.

$ javap -verbose -cp /Users/suztomo/.m2/repository/com/google/cloud/google-cloud-spanner/2.0.2/google-cloud-spanner-2.0.2-tests.jar com.google.cloud.spanner.connection.AbstractMockServerTest
...
  public static void startStaticServer() throws java.io.IOException;
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=0, args_size=0
         0: new           #2                  // class com/google/cloud/spanner/MockSpannerServiceImpl
...
        68: invokevirtual #17                 // Method io/grpc/netty/shaded/io/grpc/netty/NettyServerBuilder.addService:(Lio/grpc/BindableService;)Lio/grpc/internal/AbstractServerImplBuilder;

Where is Google Cloud Spanner 2.0.2 coming from?

The Libraries BOM has google-cloud-spanner 2.0.2. (link)

The latest google-cloud-spanner 3.0.1 still has grpc 1.32.1 dependency (link)

@generated-files-bot
Copy link

Warning: This pull request is touching the following templated files:

  • samples/snippets/pom.xml

@suztomo suztomo changed the title chore(deps): the libraries BOM 13.3.0 and the shared-dependencies BOM 0.14.1 chore(deps): the libraries BOM 15.0.0 Nov 6, 2020
@suztomo
Copy link
Member Author

suztomo commented Nov 6, 2020

@elharo PTAL

With #258 , we no longer need to touch the root pom.xml when there's a release of the libraries BOM.

@suztomo suztomo marked this pull request as ready for review November 6, 2020 21:45
@codecov
Copy link

codecov bot commented Nov 6, 2020

Codecov Report

Merging #251 (5bdd6a1) into master (c9906c9) will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff            @@
##             master     #251   +/-   ##
=========================================
  Coverage     71.40%   71.40%           
  Complexity     1104     1104           
=========================================
  Files            24       24           
  Lines          3396     3396           
  Branches        525      525           
=========================================
  Hits           2425     2425           
  Misses          756      756           
  Partials        215      215           

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update c9906c9...5bdd6a1. Read the comment docs.

@thiagotnunes thiagotnunes merged commit 5f6522f into master Nov 8, 2020
@thiagotnunes thiagotnunes deleted the suztomo-patch-1 branch November 8, 2020 23:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: spanner Issues related to the googleapis/java-spanner-jdbc API. cla: yes This human has signed the Contributor License Agreement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants