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 extends AbstractMessage> 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 extends AbstractMessage> 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 extends AbstractMessage> 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