From 54de51438bac14c66e241fe68a341a47e641c5f2 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 17 Nov 2020 09:36:03 +0000 Subject: [PATCH 01/10] chore: release 3.0.5-SNAPSHOT (#637) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). --- google-cloud-spanner-bom/pom.xml | 18 +++++++++--------- google-cloud-spanner/pom.xml | 4 ++-- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- grpc-google-cloud-spanner-v1/pom.xml | 4 ++-- pom.xml | 16 ++++++++-------- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- proto-google-cloud-spanner-v1/pom.xml | 4 ++-- samples/snapshot/pom.xml | 2 +- versions.txt | 14 +++++++------- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 29853e46e4d..aecd0bc8d26 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner-bom - 3.0.4 + 3.0.5-SNAPSHOT pom com.google.cloud @@ -64,43 +64,43 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.cloud google-cloud-spanner - 3.0.4 + 3.0.5-SNAPSHOT com.google.cloud google-cloud-spanner test-jar - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 91ca5c9b353..10e194c78a8 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner - 3.0.4 + 3.0.5-SNAPSHOT jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT google-cloud-spanner diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml index e7858755880..08d489acd0b 100644 --- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT grpc-google-cloud-spanner-admin-database-v1 GRPC library for grpc-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index c25f47d3d39..aa04f2c5d24 100644 --- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT grpc-google-cloud-spanner-admin-instance-v1 GRPC library for grpc-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index af1db452988..845c5c38409 100644 --- a/grpc-google-cloud-spanner-v1/pom.xml +++ b/grpc-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/pom.xml b/pom.xml index 2408b334c9d..118e6c7bfb9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 3.0.4 + 3.0.5-SNAPSHOT Google Cloud Spanner Parent https://github.com/googleapis/java-spanner @@ -71,37 +71,37 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT com.google.cloud google-cloud-spanner - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index 0d57458b797..be4bb23bd5e 100644 --- a/proto-google-cloud-spanner-admin-database-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.4 + 3.0.5-SNAPSHOT proto-google-cloud-spanner-admin-database-v1 PROTO library for proto-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index 703edec1211..f728449cfc6 100644 --- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.4 + 3.0.5-SNAPSHOT proto-google-cloud-spanner-admin-instance-v1 PROTO library for proto-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index faa7c7c4737..b1ffb6dba2a 100644 --- a/proto-google-cloud-spanner-v1/pom.xml +++ b/proto-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.4 + 3.0.5-SNAPSHOT proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index a0c5c4e483b..9ec2b1076c4 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -31,7 +31,7 @@ com.google.cloud google-cloud-spanner - 3.0.4 + 3.0.5-SNAPSHOT diff --git a/versions.txt b/versions.txt index ae64ae6cd1c..28128a6adcf 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -proto-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.4 -proto-google-cloud-spanner-v1:3.0.4:3.0.4 -proto-google-cloud-spanner-admin-database-v1:3.0.4:3.0.4 -grpc-google-cloud-spanner-v1:3.0.4:3.0.4 -grpc-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.4 -grpc-google-cloud-spanner-admin-database-v1:3.0.4:3.0.4 -google-cloud-spanner:3.0.4:3.0.4 \ No newline at end of file +proto-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.5-SNAPSHOT +proto-google-cloud-spanner-v1:3.0.4:3.0.5-SNAPSHOT +proto-google-cloud-spanner-admin-database-v1:3.0.4:3.0.5-SNAPSHOT +grpc-google-cloud-spanner-v1:3.0.4:3.0.5-SNAPSHOT +grpc-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.5-SNAPSHOT +grpc-google-cloud-spanner-admin-database-v1:3.0.4:3.0.5-SNAPSHOT +google-cloud-spanner:3.0.4:3.0.5-SNAPSHOT \ No newline at end of file From e0323154bd5600b1c22408a7d13a22c49aa19280 Mon Sep 17 00:00:00 2001 From: Yoshi Automation Bot Date: Tue, 17 Nov 2020 02:22:03 -0800 Subject: [PATCH 02/10] chore: regenerate README (#640) This PR was generated using Autosynth. :rainbow:
Log from Synthtool ``` 2020-11-17 09:41:32,582 synthtool [DEBUG] > Executing /root/.cache/synthtool/java-spanner/.github/readme/synth.py. On branch autosynth-readme nothing to commit, working directory clean 2020-11-17 09:41:33,601 synthtool [DEBUG] > Wrote metadata to .github/readme/synth.metadata/synth.metadata. ```
Full log will be available here: https://source.cloud.google.com/results/invocations/005ecbdd-e849-49dc-b49e-0b895e2d2872/targets - [ ] To automatically regenerate this PR, check this box. --- .github/readme/synth.metadata/synth.metadata | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/readme/synth.metadata/synth.metadata b/.github/readme/synth.metadata/synth.metadata index ae839b8a277..9789dbb73a6 100644 --- a/.github/readme/synth.metadata/synth.metadata +++ b/.github/readme/synth.metadata/synth.metadata @@ -4,7 +4,7 @@ "git": { "name": ".", "remote": "https://github.com/googleapis/java-spanner.git", - "sha": "b5150b57108ffdcb054a7b4f2dfa3daf840dfb29" + "sha": "54de51438bac14c66e241fe68a341a47e641c5f2" } }, { diff --git a/README.md b/README.md index 975ac8ae094..ca78e018dc5 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,11 @@ If you are using Maven without BOM, add this to your dependencies: If you are using Gradle, add this to your dependencies ```Groovy -compile 'com.google.cloud:google-cloud-spanner:3.0.3' +compile 'com.google.cloud:google-cloud-spanner:3.0.4' ``` If you are using SBT, add this to your dependencies ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "3.0.3" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "3.0.4" ``` ## Authentication From 7584baa8b7051764f1055ddb1616069e7d591b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 17 Nov 2020 20:25:35 +0100 Subject: [PATCH 03/10] fix: delete stale sample databases (#622) --- .../com/example/spanner/SpannerSampleIT.java | 51 ++++++++++++++++--- .../spanner/SpannerStandaloneExamplesIT.java | 12 ++--- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java index 7130733da83..04f6ce56515 100644 --- a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java @@ -18,7 +18,9 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.cloud.Timestamp; import com.google.cloud.spanner.BackupId; +import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseAdminClient; import com.google.cloud.spanner.DatabaseId; import com.google.cloud.spanner.ErrorCode; @@ -44,10 +46,11 @@ @RunWith(JUnit4.class) @SuppressWarnings("checkstyle:abbreviationaswordinname") public class SpannerSampleIT { + private static final int DBID_LENGTH = 20; // The instance needs to exist for tests to pass. private static final String instanceId = System.getProperty("spanner.test.instance"); - private static final String databaseId = - formatForTest(System.getProperty("spanner.sample.database")); + private static final String baseDbId = System.getProperty("spanner.sample.database"); + private static final String databaseId = formatForTest(baseDbId); static Spanner spanner; static DatabaseId dbId; static DatabaseAdminClient dbClient; @@ -69,9 +72,28 @@ public static void setUp() throws Exception { spanner = options.getService(); dbClient = spanner.getDatabaseAdminClient(); dbId = DatabaseId.of(options.getProjectId(), instanceId, databaseId); - dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase()); - dbClient.dropDatabase( - dbId.getInstanceId().getInstance(), SpannerSample.createRestoredSampleDbId(dbId)); + // Delete stale test databases that have been created earlier by this test, but not deleted. + deleteStaleTestDatabases(instanceId, baseDbId); + } + + static void deleteStaleTestDatabases(String instanceId, String baseDbId) { + Timestamp now = Timestamp.now(); + Pattern samplePattern = getTestDbIdPattern(baseDbId); + Pattern restoredPattern = getTestDbIdPattern("restored"); + for (Database db : dbClient.listDatabases(instanceId).iterateAll()) { + if (TimeUnit.HOURS.convert(now.getSeconds() - db.getCreateTime().getSeconds(), + TimeUnit.SECONDS) > 24) { + if (db.getId().getDatabase().length() >= DBID_LENGTH) { + if (samplePattern.matcher(toComparableId(baseDbId, db.getId().getDatabase())).matches()) { + db.drop(); + } + if (restoredPattern.matcher(toComparableId("restored", db.getId().getDatabase())) + .matches()) { + db.drop(); + } + } + } + } } @AfterClass @@ -399,8 +421,21 @@ public void run() { private static int countOccurrences(String input, String search) { return input.split(search).length - 1; } + + private static String toComparableId(String baseId, String existingId) { + String zeroUuid = "00000000-0000-0000-0000-0000-00000000"; + int shouldBeLength = (baseId + "-" + zeroUuid).length(); + int missingLength = shouldBeLength - existingId.length(); + return existingId + zeroUuid.substring(zeroUuid.length() - missingLength); + } - private static String formatForTest(String name) { - return name + "-" + UUID.randomUUID().toString().substring(0, 20); + private static Pattern getTestDbIdPattern(String baseDbId) { + return Pattern.compile( + baseDbId + "-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{8}", + Pattern.CASE_INSENSITIVE); + } + + static String formatForTest(String name) { + return name + "-" + UUID.randomUUID().toString().substring(0, DBID_LENGTH); } -} +} \ No newline at end of file diff --git a/samples/snippets/src/test/java/com/example/spanner/SpannerStandaloneExamplesIT.java b/samples/snippets/src/test/java/com/example/spanner/SpannerStandaloneExamplesIT.java index 946741c0eea..15108bf38f5 100644 --- a/samples/snippets/src/test/java/com/example/spanner/SpannerStandaloneExamplesIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/SpannerStandaloneExamplesIT.java @@ -34,7 +34,6 @@ import java.math.BigDecimal; import java.util.Collections; import java.util.Iterator; -import java.util.UUID; import java.util.concurrent.ExecutionException; import org.junit.AfterClass; import org.junit.Before; @@ -49,8 +48,8 @@ public class SpannerStandaloneExamplesIT { // The instance needs to exist for tests to pass. private static String instanceId = System.getProperty("spanner.test.instance"); - private static String databaseId = - formatForTest(System.getProperty("spanner.sample.database", "mysample")); + private static String baseDatabaseId = System.getProperty("spanner.sample.database", "mysample"); + private static String databaseId = SpannerSampleIT.formatForTest(baseDatabaseId); private static DatabaseId dbId; private static DatabaseAdminClient dbClient; private static Spanner spanner; @@ -78,7 +77,6 @@ public static void createTestDatabase() throws Exception { } } dbId = DatabaseId.of(options.getProjectId(), instanceId, databaseId); - dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase()); dbClient .createDatabase( instanceId, @@ -190,8 +188,4 @@ public void queryWithNumericParameter_shouldReturnResults() { runExample(() -> QueryWithNumericParameterSample.queryWithNumericParameter(client)); assertThat(out).contains("4 35000"); } - - static String formatForTest(String name) { - return name + "-" + UUID.randomUUID().toString().substring(0, 20); - } -} +} \ No newline at end of file From 48f92e3d1b26644bde62a8d864cec96c3c71687d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 18 Nov 2020 01:16:37 +0100 Subject: [PATCH 04/10] fix: query could hang transaction if ResultSet#next() is not called (#643) If the first statement of a read/write transaction was a query or a read operation, and the application would not call ResultSet#next() on the return result, the transaction would hang indefinetely as the query would be marked as the one that should initiate the transaction (inline the BeginTransaction option). The query would however never be executed, as the actual query execution is deferred until the first call to ResultSet#next(). Fixes #641 --- .../cloud/spanner/AbstractReadContext.java | 31 +++-- .../cloud/spanner/AbstractResultSet.java | 31 +++-- .../cloud/spanner/TransactionRunnerImpl.java | 2 +- .../cloud/spanner/GrpcResultSetTest.java | 9 +- .../spanner/InlineBeginTransactionTest.java | 119 ++++++++++++++++++ .../cloud/spanner/ReadFormatTestRunner.java | 5 +- .../spanner/ResumableStreamIteratorTest.java | 5 + 7 files changed, 171 insertions(+), 31 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java index 4ec5133b1aa..cff8ec1f57b 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java @@ -608,14 +608,10 @@ ExecuteBatchDmlRequest.Builder getExecuteBatchDmlRequestBuilder(Iterable startStream(@Nullable ByteString resumeToken) { GrpcStreamIterator stream = new GrpcStreamIterator(statement, prefetchChunks); + final ExecuteSqlRequest.Builder request = + getExecuteSqlRequestBuilder(statement, queryMode); + if (partitionToken != null) { + request.setPartitionToken(partitionToken); + } if (resumeToken != null) { request.setResumeToken(resumeToken); } SpannerRpc.StreamingCall call = rpc.executeQuery(request.build(), stream.consumer(), session.getOptions()); call.request(prefetchChunks); - stream.setCall(call); + stream.setCall(call, request.hasTransaction() && request.getTransaction().hasBegin()); return stream; } }; - return new GrpcResultSet( - stream, this, request.hasTransaction() && request.getTransaction().hasBegin()); + return new GrpcResultSet(stream, this); } /** @@ -723,10 +723,6 @@ ResultSet readInternalWithOptions( if (index != null) { builder.setIndex(index); } - TransactionSelector selector = getTransactionSelector(); - if (selector != null) { - builder.setTransaction(selector); - } if (partitionToken != null) { builder.setPartitionToken(partitionToken); } @@ -740,15 +736,18 @@ CloseableIterator startStream(@Nullable ByteString resumeToken if (resumeToken != null) { builder.setResumeToken(resumeToken); } + TransactionSelector selector = getTransactionSelector(); + if (selector != null) { + builder.setTransaction(selector); + } SpannerRpc.StreamingCall call = rpc.read(builder.build(), stream.consumer(), session.getOptions()); call.request(prefetchChunks); - stream.setCall(call); + stream.setCall(call, selector != null && selector.hasBegin()); return stream; } }; - GrpcResultSet resultSet = - new GrpcResultSet(stream, this, selector != null && selector.hasBegin()); + GrpcResultSet resultSet = new GrpcResultSet(stream, this); return resultSet; } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java index 3c5e60f51ae..6520b7b8fdd 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java @@ -91,17 +91,14 @@ interface Listener { static class GrpcResultSet extends AbstractResultSet> { private final GrpcValueIterator iterator; private final Listener listener; - private final boolean beginTransaction; private GrpcStruct currRow; private SpannerException error; private ResultSetStats statistics; private boolean closed; - GrpcResultSet( - CloseableIterator iterator, Listener listener, boolean beginTransaction) { + GrpcResultSet(CloseableIterator iterator, Listener listener) { this.iterator = new GrpcValueIterator(iterator); this.listener = listener; - this.beginTransaction = beginTransaction; } @Override @@ -130,7 +127,7 @@ public boolean next() throws SpannerException { } return hasNext; } catch (SpannerException e) { - throw yieldError(e, beginTransaction && currRow == null); + throw yieldError(e, iterator.isWithBeginTransaction() && currRow == null); } } @@ -297,6 +294,10 @@ void close(@Nullable String message) { stream.close(message); } + boolean isWithBeginTransaction() { + return stream.isWithBeginTransaction(); + } + /** @param a is a mutable list and b will be concatenated into a. */ private void concatLists(List a, List b) { if (a.size() == 0 || b.size() == 0) { @@ -760,6 +761,8 @@ interface CloseableIterator extends Iterator { * @param message a message to include in the final RPC status */ void close(@Nullable String message); + + boolean isWithBeginTransaction(); } /** Adapts a streaming read/query call into an iterator over partial result sets. */ @@ -774,6 +777,7 @@ static class GrpcStreamIterator extends AbstractIterator private final Statement statement; private SpannerRpc.StreamingCall call; + private boolean withBeginTransaction; private SpannerException error; @VisibleForTesting @@ -792,8 +796,9 @@ protected final SpannerRpc.ResultStreamConsumer consumer() { return consumer; } - public void setCall(SpannerRpc.StreamingCall call) { + public void setCall(SpannerRpc.StreamingCall call, boolean withBeginTransaction) { this.call = call; + this.withBeginTransaction = withBeginTransaction; } @Override @@ -803,6 +808,11 @@ public void close(@Nullable String message) { } } + @Override + public boolean isWithBeginTransaction() { + return withBeginTransaction; + } + @Override protected final PartialResultSet computeNext() { PartialResultSet next; @@ -873,8 +883,8 @@ public void onError(SpannerException e) { // Visible only for testing. @VisibleForTesting - void setCall(SpannerRpc.StreamingCall call) { - GrpcStreamIterator.this.setCall(call); + void setCall(SpannerRpc.StreamingCall call, boolean withBeginTransaction) { + GrpcStreamIterator.this.setCall(call, withBeginTransaction); } } } @@ -987,6 +997,11 @@ public void close(@Nullable String message) { } } + @Override + public boolean isWithBeginTransaction() { + return stream != null && stream.isWithBeginTransaction(); + } + @Override protected PartialResultSet computeNext() { Context context = Context.current(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java index e38b704f700..02119b13a16 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java @@ -267,7 +267,7 @@ ApiFuture commitAsync() { final SettableApiFuture finishOps; CommitRequest.Builder builder = CommitRequest.newBuilder().setSession(session.getName()); synchronized (lock) { - if (transactionIdFuture == null && transactionId == null) { + if (transactionIdFuture == null && transactionId == null && runningAsyncOperations == 0) { finishOps = SettableApiFuture.create(); createTxnAsync(finishOps); } else { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GrpcResultSetTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GrpcResultSetTest.java index a2ab8dbc90e..f1a1a3e2968 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GrpcResultSetTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GrpcResultSetTest.java @@ -75,13 +75,14 @@ public void cancel(@Nullable String message) {} @Override public void request(int numMessages) {} - }); + }, + false); consumer = stream.consumer(); - resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener(), false); + resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener()); } public AbstractResultSet.GrpcResultSet resultSetWithMode(QueryMode queryMode) { - return new AbstractResultSet.GrpcResultSet(stream, new NoOpListener(), false); + return new AbstractResultSet.GrpcResultSet(stream, new NoOpListener()); } @Test @@ -642,7 +643,7 @@ public com.google.protobuf.Value apply(@Nullable Value input) { private void verifySerialization( Function protoFn, Value... values) { - resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener(), false); + resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener()); PartialResultSet.Builder builder = PartialResultSet.newBuilder(); List types = new ArrayList<>(); for (Value value : values) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java index d1e3d93cb71..b7c7d917207 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java @@ -16,6 +16,7 @@ package com.google.cloud.spanner; +import static com.google.cloud.spanner.MockSpannerTestUtil.SELECT1; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; @@ -65,6 +66,7 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; import org.junit.AfterClass; @@ -1139,6 +1141,123 @@ public ApiFuture apply(TransactionContext txn, Long input) assertThat(countTransactionsStarted()).isEqualTo(1); } + @Test + public void queryWithoutNext() { + DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); + assertThat( + client + .readWriteTransaction() + .run( + new TransactionCallable() { + @Override + public Long run(TransactionContext transaction) throws Exception { + // This will not actually send an RPC, so it will also not request a + // transaction. + transaction.executeQuery(SELECT1); + return transaction.executeUpdate(UPDATE_STATEMENT); + } + })) + .isEqualTo(UPDATE_COUNT); + assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(1L); + assertThat(countTransactionsStarted()).isEqualTo(1); + } + + @Test + public void queryAsyncWithoutCallback() { + DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); + assertThat( + client + .readWriteTransaction() + .run( + new TransactionCallable() { + @Override + public Long run(TransactionContext transaction) throws Exception { + transaction.executeQueryAsync(SELECT1); + return transaction.executeUpdate(UPDATE_STATEMENT); + } + })) + .isEqualTo(UPDATE_COUNT); + assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(1L); + assertThat(countTransactionsStarted()).isEqualTo(1); + } + + @Test + public void readWithoutNext() { + DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); + assertThat( + client + .readWriteTransaction() + .run( + new TransactionCallable() { + @Override + public Long run(TransactionContext transaction) throws Exception { + transaction.read("FOO", KeySet.all(), Arrays.asList("ID")); + return transaction.executeUpdate(UPDATE_STATEMENT); + } + })) + .isEqualTo(UPDATE_COUNT); + assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ReadRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(1L); + assertThat(countTransactionsStarted()).isEqualTo(1); + } + + @Test + public void readAsyncWithoutCallback() { + DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); + assertThat( + client + .readWriteTransaction() + .run( + new TransactionCallable() { + @Override + public Long run(TransactionContext transaction) throws Exception { + transaction.readAsync("FOO", KeySet.all(), Arrays.asList("ID")); + return transaction.executeUpdate(UPDATE_STATEMENT); + } + })) + .isEqualTo(UPDATE_COUNT); + assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ReadRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(1L); + assertThat(countTransactionsStarted()).isEqualTo(1); + } + + @Test + public void query_ThenUpdate_ThenConsumeResultSet() + throws InterruptedException, TimeoutException { + DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); + assertThat( + client + .readWriteTransaction() + .run( + new TransactionCallable() { + @Override + public Long run(TransactionContext transaction) throws Exception { + ResultSet rs = transaction.executeQuery(SELECT1); + long updateCount = transaction.executeUpdate(UPDATE_STATEMENT); + // Consume the result set. + while (rs.next()) {} + return updateCount; + } + })) + .isEqualTo(UPDATE_COUNT); + // The update statement should start the transaction, and the query should use the transaction + // id returned by the update. + assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); + assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(2L); + assertThat(countTransactionsStarted()).isEqualTo(1); + List requests = mockSpanner.getRequests(); + requests = requests.subList(requests.size() - 3, requests.size()); + assertThat(requests.get(0)).isInstanceOf(ExecuteSqlRequest.class); + assertThat(((ExecuteSqlRequest) requests.get(0)).getSql()).isEqualTo(UPDATE_STATEMENT.getSql()); + assertThat(requests.get(1)).isInstanceOf(ExecuteSqlRequest.class); + assertThat(((ExecuteSqlRequest) requests.get(1)).getSql()).isEqualTo(SELECT1.getSql()); + assertThat(requests.get(2)).isInstanceOf(CommitRequest.class); + } + private int countRequests(Class requestType) { int count = 0; for (AbstractMessage msg : mockSpanner.getRequests()) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ReadFormatTestRunner.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ReadFormatTestRunner.java index 50cf96ff3c3..aa479f71d42 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ReadFormatTestRunner.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ReadFormatTestRunner.java @@ -117,9 +117,10 @@ public void cancel(@Nullable String message) {} @Override public void request(int numMessages) {} - }); + }, + false); consumer = stream.consumer(); - resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener(), false); + resultSet = new AbstractResultSet.GrpcResultSet(stream, new NoOpListener()); JSONArray chunks = testCase.getJSONArray("chunks"); JSONObject expectedResult = testCase.getJSONObject("result"); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ResumableStreamIteratorTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ResumableStreamIteratorTest.java index ef744d31a10..4f38aee940d 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ResumableStreamIteratorTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/ResumableStreamIteratorTest.java @@ -116,6 +116,11 @@ protected PartialResultSet computeNext() { public void close(@Nullable String message) { stream.close(); } + + @Override + public boolean isWithBeginTransaction() { + return false; + } } Starter starter = Mockito.mock(Starter.class); From 9e133a972f648ee804f324bbf55163849cb478b8 Mon Sep 17 00:00:00 2001 From: Thiago Nunes Date: Wed, 18 Nov 2020 11:17:02 +1100 Subject: [PATCH 05/10] fix: does not generate codeowners (#631) Prevents the re-generation of the github CODEOWNERS file. --- synth.py | 1 + 1 file changed, 1 insertion(+) diff --git a/synth.py b/synth.py index 4dbba62d79f..24d6b3074f4 100644 --- a/synth.py +++ b/synth.py @@ -88,4 +88,5 @@ 'samples/install-without-bom/pom.xml', 'samples/snapshot/pom.xml', 'samples/snippets/pom.xml', + '.github/CODEOWNERS', ]) From 9d6be15a76f41df039c4b2f9a700199105929ad9 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 18 Nov 2020 01:17:25 +0100 Subject: [PATCH 06/10] chore(deps): update dependency com.google.cloud:google-cloud-spanner to v3.0.4 (#636) --- samples/install-without-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index d3352892073..052db682fff 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 3.0.3 + 3.0.4 From 447a99b9a6ccdfd3855505fca13e849fb9513943 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 18 Nov 2020 01:18:54 +0100 Subject: [PATCH 07/10] deps: update dependency com.google.cloud:google-cloud-monitoring to v2.0.8 (#644) --- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 052db682fff..44e6071baeb 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -23,7 +23,7 @@ UTF-8 0.28.2 1.2.6 - 2.0.7 + 2.0.8
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 9ec2b1076c4..b3f1db1f3e6 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -23,7 +23,7 @@ UTF-8 0.28.2 1.2.6 - 2.0.7 + 2.0.8 From 0f9b7bdc81a4eeecf772022bcec585bd1630895b Mon Sep 17 00:00:00 2001 From: Yoshi Automation Bot Date: Tue, 17 Nov 2020 16:56:05 -0800 Subject: [PATCH 08/10] chore: regenerate README (#648) This PR was generated using Autosynth. :rainbow:
Log from Synthtool ``` 2020-11-18 00:20:16,991 synthtool [DEBUG] > Executing /root/.cache/synthtool/java-spanner/.github/readme/synth.py. On branch autosynth-readme nothing to commit, working directory clean 2020-11-18 00:20:17,985 synthtool [DEBUG] > Wrote metadata to .github/readme/synth.metadata/synth.metadata. ```
Full log will be available here: https://source.cloud.google.com/results/invocations/44f2d200-ccfc-470d-8d23-b1d174cc7c25/targets - [ ] To automatically regenerate this PR, check this box. --- .github/readme/synth.metadata/synth.metadata | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/readme/synth.metadata/synth.metadata b/.github/readme/synth.metadata/synth.metadata index 9789dbb73a6..2663e15314a 100644 --- a/.github/readme/synth.metadata/synth.metadata +++ b/.github/readme/synth.metadata/synth.metadata @@ -4,14 +4,14 @@ "git": { "name": ".", "remote": "https://github.com/googleapis/java-spanner.git", - "sha": "54de51438bac14c66e241fe68a341a47e641c5f2" + "sha": "447a99b9a6ccdfd3855505fca13e849fb9513943" } }, { "git": { "name": "synthtool", "remote": "https://github.com/googleapis/synthtool.git", - "sha": "d5fc0bcf9ea9789c5b0e3154a9e3b29e5cea6116" + "sha": "7fcc405a579d5d53a726ff3da1b7c8c08f0f2d58" } } ] diff --git a/README.md b/README.md index ca78e018dc5..ccc118663ee 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ If you are using Maven without BOM, add this to your dependencies: com.google.cloud google-cloud-spanner - 3.0.3 + 3.0.4 ``` From b791c866a5217b53824a2948a5ce51b7a8c56125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Thu, 19 Nov 2020 08:48:05 +0100 Subject: [PATCH 09/10] test: fix flaky InlineBeginTransactionTest (#664) The query_ThenUpdate_ThenConsumeResultSet did not take into account that the session pool initialization will execute 4 BatchCreateSessions requests. These will normally be executed before the test transaction, but sometimes at least one of those requests might arrive after the transaction has started. That could cause the last 3 requests on the mock server to be different from what the test expected. --- .../cloud/spanner/InlineBeginTransactionTest.java | 5 ++--- .../cloud/spanner/MockSpannerServiceImpl.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java index b7c7d917207..371fcd1aaab 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java @@ -1248,14 +1248,13 @@ public Long run(TransactionContext transaction) throws Exception { // id returned by the update. assertThat(mockSpanner.countRequestsOfType(BeginTransactionRequest.class)).isEqualTo(0L); assertThat(mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)).isEqualTo(2L); + assertThat(mockSpanner.countRequestsOfType(CommitRequest.class)).isEqualTo(1L); assertThat(countTransactionsStarted()).isEqualTo(1); - List requests = mockSpanner.getRequests(); - requests = requests.subList(requests.size() - 3, requests.size()); + List requests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class); assertThat(requests.get(0)).isInstanceOf(ExecuteSqlRequest.class); assertThat(((ExecuteSqlRequest) requests.get(0)).getSql()).isEqualTo(UPDATE_STATEMENT.getSql()); assertThat(requests.get(1)).isInstanceOf(ExecuteSqlRequest.class); assertThat(((ExecuteSqlRequest) requests.get(1)).getSql()).isEqualTo(SELECT1.getSql()); - assertThat(requests.get(2)).isInstanceOf(CommitRequest.class); } private int countRequests(Class requestType) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java index 8e4e5fe6124..ca91bc35f86 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java @@ -1905,6 +1905,20 @@ public List getRequests() { return new ArrayList<>(this.requests); } + public void clearRequests() { + this.requests.clear(); + } + + public List getRequestsOfType(Class type) { + List res = new ArrayList<>(); + for (AbstractMessage m : this.requests) { + if (m.getClass().equals(type)) { + res.add(m); + } + } + return res; + } + public Iterable> getRequestTypes() { List> res = new LinkedList<>(); for (AbstractMessage m : this.requests) { From c532ca842737f56f56d4117705ac38db6f3a3900 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 23 Nov 2020 11:10:39 +1100 Subject: [PATCH 10/10] chore: release 3.0.5 (#645) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ google-cloud-spanner-bom/pom.xml | 18 +++++++++--------- google-cloud-spanner/pom.xml | 4 ++-- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- grpc-google-cloud-spanner-v1/pom.xml | 4 ++-- pom.xml | 16 ++++++++-------- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- proto-google-cloud-spanner-v1/pom.xml | 4 ++-- samples/snapshot/pom.xml | 2 +- versions.txt | 14 +++++++------- 12 files changed, 53 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4c773cecdf..9ea09f7937c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +### [3.0.5](https://www.github.com/googleapis/java-spanner/compare/v3.0.4...v3.0.5) (2020-11-19) + + +### Bug Fixes + +* delete stale sample databases ([#622](https://www.github.com/googleapis/java-spanner/issues/622)) ([7584baa](https://www.github.com/googleapis/java-spanner/commit/7584baa8b7051764f1055ddb1616069e7d591b64)) +* does not generate codeowners ([#631](https://www.github.com/googleapis/java-spanner/issues/631)) ([9e133a9](https://www.github.com/googleapis/java-spanner/commit/9e133a972f648ee804f324bbf55163849cb478b8)) +* query could hang transaction if ResultSet#next() is not called ([#643](https://www.github.com/googleapis/java-spanner/issues/643)) ([48f92e3](https://www.github.com/googleapis/java-spanner/commit/48f92e3d1b26644bde62a8d864cec96c3c71687d)), closes [#641](https://www.github.com/googleapis/java-spanner/issues/641) + + +### Dependencies + +* update dependency com.google.cloud:google-cloud-monitoring to v2.0.8 ([#644](https://www.github.com/googleapis/java-spanner/issues/644)) ([447a99b](https://www.github.com/googleapis/java-spanner/commit/447a99b9a6ccdfd3855505fca13e849fb9513943)) + ### [3.0.4](https://www.github.com/googleapis/java-spanner/compare/v3.0.3...v3.0.4) (2020-11-17) diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index aecd0bc8d26..c08cc73360f 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner-bom - 3.0.5-SNAPSHOT + 3.0.5 pom com.google.cloud @@ -64,43 +64,43 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.cloud google-cloud-spanner - 3.0.5-SNAPSHOT + 3.0.5 com.google.cloud google-cloud-spanner test-jar - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5
diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 10e194c78a8..d77fe642bcb 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner - 3.0.5-SNAPSHOT + 3.0.5 jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 google-cloud-spanner diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml index 08d489acd0b..dd2f5472ce0 100644 --- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5 grpc-google-cloud-spanner-admin-database-v1 GRPC library for grpc-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index aa04f2c5d24..d06e3c802a6 100644 --- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 grpc-google-cloud-spanner-admin-instance-v1 GRPC library for grpc-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 845c5c38409..2e1f5ea4332 100644 --- a/grpc-google-cloud-spanner-v1/pom.xml +++ b/grpc-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/pom.xml b/pom.xml index 118e6c7bfb9..912e5549c40 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 3.0.5-SNAPSHOT + 3.0.5 Google Cloud Spanner Parent https://github.com/googleapis/java-spanner @@ -71,37 +71,37 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5 com.google.cloud google-cloud-spanner - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index be4bb23bd5e..4a6463225b3 100644 --- a/proto-google-cloud-spanner-admin-database-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 3.0.5-SNAPSHOT + 3.0.5 proto-google-cloud-spanner-admin-database-v1 PROTO library for proto-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index f728449cfc6..1262e22bdd6 100644 --- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 3.0.5-SNAPSHOT + 3.0.5 proto-google-cloud-spanner-admin-instance-v1 PROTO library for proto-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index b1ffb6dba2a..0bffdb49595 100644 --- a/proto-google-cloud-spanner-v1/pom.xml +++ b/proto-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 3.0.5-SNAPSHOT + 3.0.5 proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index b3f1db1f3e6..527bb342b2b 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -31,7 +31,7 @@ com.google.cloud google-cloud-spanner - 3.0.5-SNAPSHOT + 3.0.5 diff --git a/versions.txt b/versions.txt index 28128a6adcf..b32edd0f4f2 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -proto-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.5-SNAPSHOT -proto-google-cloud-spanner-v1:3.0.4:3.0.5-SNAPSHOT -proto-google-cloud-spanner-admin-database-v1:3.0.4:3.0.5-SNAPSHOT -grpc-google-cloud-spanner-v1:3.0.4:3.0.5-SNAPSHOT -grpc-google-cloud-spanner-admin-instance-v1:3.0.4:3.0.5-SNAPSHOT -grpc-google-cloud-spanner-admin-database-v1:3.0.4:3.0.5-SNAPSHOT -google-cloud-spanner:3.0.4:3.0.5-SNAPSHOT \ No newline at end of file +proto-google-cloud-spanner-admin-instance-v1:3.0.5:3.0.5 +proto-google-cloud-spanner-v1:3.0.5:3.0.5 +proto-google-cloud-spanner-admin-database-v1:3.0.5:3.0.5 +grpc-google-cloud-spanner-v1:3.0.5:3.0.5 +grpc-google-cloud-spanner-admin-instance-v1:3.0.5:3.0.5 +grpc-google-cloud-spanner-admin-database-v1:3.0.5:3.0.5 +google-cloud-spanner:3.0.5:3.0.5 \ No newline at end of file