> future : futures) {
+ rows.addAll(future.get());
+ }
+
+ System.out.printf("Successfully fetched %s rows\n", rows.size());
+ for (Row row : rows) {
+ System.out.printf("Successfully read row %s\n", row.getKey().toStringUtf8());
+ }
+ }
+
+ /**
+ * Generates a salted version of the row key.
+ *
+ * Some Bigtable schema designs will always have hot spots, and a salted row key breaks up
+ * individual rows and groups of rows that are hot. Row keys are stored in sorted order, so
+ * prepending a numeric prefix allows those hot rows to be stored in different locations.
+ *
+ *
The salted row key is created by hashing the existing row key and taking a modulo of how
+ * large a prefix range you want to create; then prepending the existing row key with that result.
+ * This produces a deterministic output, so each row key will always produce the same salted key.
+ */
+ public static String getSaltedRowKey(String rowKey, int saltRange) {
+ int prefix = rowKey.hashCode() % saltRange;
+ return prefix + "-" + rowKey;
+ }
+}
diff --git a/samples/snippets/src/test/java/com/example/bigtable/KeySaltingTest.java b/samples/snippets/src/test/java/com/example/bigtable/KeySaltingTest.java
new file mode 100644
index 0000000000..085d992cea
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/bigtable/KeySaltingTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigtable;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class KeySaltingTest extends MobileTimeSeriesBaseTest {
+ public static final String ROW_KEY = "phone#4c410523#20190501";
+
+ @BeforeClass
+ public static void beforeClass() throws IOException {
+ initializeVariables();
+ createTable();
+ }
+
+ @AfterClass
+ public static void afterClass() throws IOException {
+ cleanupTable();
+ }
+
+ @Test
+ public void testWriteAndRead() throws IOException {
+ KeySalting.writeSaltedRow(projectId, instanceId, TABLE_ID, ROW_KEY);
+ KeySalting.readSaltedRow(projectId, instanceId, TABLE_ID, ROW_KEY);
+
+ String output = bout.toString();
+ assertEquals(
+ "Successfully wrote row phone#4c410523#20190501 as 0-phone#4c410523#20190501\n"
+ + "Successfully read row 0-phone#4c410523#20190501\n",
+ output);
+ }
+
+ @Test
+ public void testScans() throws IOException, ExecutionException, InterruptedException {
+ String prefix = "abc-";
+ for (int i = 0; i < 8; i++) {
+ KeySalting.writeSaltedRow(projectId, instanceId, TABLE_ID, prefix + i);
+ }
+ bout.reset();
+
+ KeySalting.scanSaltedRows(projectId, instanceId, TABLE_ID, prefix);
+
+ String output = bout.toString();
+ assertEquals(
+ "Successfully fetched 8 rows\n"
+ + "Successfully read row 0-abc-3\n"
+ + "Successfully read row 0-abc-7\n"
+ + "Successfully read row 1-abc-0\n"
+ + "Successfully read row 1-abc-4\n"
+ + "Successfully read row 2-abc-1\n"
+ + "Successfully read row 2-abc-5\n"
+ + "Successfully read row 3-abc-2\n"
+ + "Successfully read row 3-abc-6\n",
+ output);
+ }
+
+ @Test
+ public void testKeySalting() {
+ Map exampleKeys = new HashMap();
+ exampleKeys.put("abc-1", "2-abc-1");
+ exampleKeys.put("abc-2", "3-abc-2");
+ exampleKeys.put("abc-3", "0-abc-3");
+ exampleKeys.put("abc-4", "1-abc-4");
+
+ exampleKeys.forEach((k, v) -> assertEquals(v, KeySalting.getSaltedRowKey(k, 4)));
+ }
+}
From e62e91ba5bb82262d811e193e6131cd96d36cc45 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Fri, 7 Oct 2022 17:10:13 +0200
Subject: [PATCH 04/24] chore(deps): update dependency
com.google.cloud:libraries-bom to v26.1.3 (#1456)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.cloud:libraries-bom](https://cloud.google.com/java/docs/bom) ([source](https://togithub.com/googleapis/java-cloud-bom)) | `26.1.2` -> `26.1.3` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
â™» **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found.
🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.
---
- [ ] If you want to rebase/retry this PR, click this checkbox. âš **Warning**: custom changes will be lost.
---
This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/java-bigtable).
---
README.md | 4 ++--
samples/native-image-sample/pom.xml | 2 +-
samples/snippets/pom.xml | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 3e35b92e4d..de9341d00a 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
com.google.cloud
libraries-bom
- 26.1.2
+ 26.1.3
pom
import
@@ -49,7 +49,7 @@ If you are using Maven without BOM, add this to your dependencies:
If you are using Gradle 5.x or later, add this to your dependencies:
```Groovy
-implementation platform('com.google.cloud:libraries-bom:26.1.2')
+implementation platform('com.google.cloud:libraries-bom:26.1.3')
implementation 'com.google.cloud:google-cloud-bigtable'
```
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index cdda421cd4..9078eb279e 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -29,7 +29,7 @@
com.google.cloud
libraries-bom
- 26.1.2
+ 26.1.3
pom
import
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 77a1725039..0facce3f6e 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -30,7 +30,7 @@
com.google.cloud
libraries-bom
- 26.1.2
+ 26.1.3
pom
import
From c03b8a4245beab7258b8ed8ec76153e6a0275211 Mon Sep 17 00:00:00 2001
From: Mattie Fu
Date: Fri, 7 Oct 2022 12:59:46 -0400
Subject: [PATCH 05/24] fix: catch all throwables so version mismatch won't
hang the client (#1402)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix: catch all throwables so version mismatch won't hang the client
* create a SafeResponseObserver
* format
* extend SafeResponseObserver
* catch stream cancellation
* update error log
* update
* throw on onStart
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* fix version
Co-authored-by: Owl Bot
---
.../clirr-ignored-differences.xml | 7 +-
.../v2/stub/ConvertExceptionCallable.java | 11 +-
.../data/v2/stub/SafeResponseObserver.java | 123 ++++++++++++++++++
.../BigtableTracerStreamingCallable.java | 17 ++-
.../readrows/FilterMarkerRowsCallable.java | 12 +-
.../reframing/ReframingResponseObserver.java | 6 +-
6 files changed, 157 insertions(+), 19 deletions(-)
create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/SafeResponseObserver.java
diff --git a/google-cloud-bigtable/clirr-ignored-differences.xml b/google-cloud-bigtable/clirr-ignored-differences.xml
index 8a3edd69c0..2f7631c873 100644
--- a/google-cloud-bigtable/clirr-ignored-differences.xml
+++ b/google-cloud-bigtable/clirr-ignored-differences.xml
@@ -49,7 +49,7 @@
8001
com/google/cloud/bigtable/data/v2/stub/metrics/HeaderTracer$Builder
- change method args is ok because HeaderTracerStreamingCallable is InternalApi
+
7004
com/google/cloud/bigtable/data/v2/stub/metrics/HeaderTracerStreamingCallable
@@ -76,4 +76,9 @@
8001
com/google/cloud/bigtable/data/v2/stub/readrows/ReadRowsConvertExceptionCallable
+
+ 5001
+ com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserver
+ com/google/api/gax/rpc/StateCheckingResponseObserver
+
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/ConvertExceptionCallable.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/ConvertExceptionCallable.java
index ed50532fae..d3ff88af7e 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/ConvertExceptionCallable.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/ConvertExceptionCallable.java
@@ -42,31 +42,32 @@ public void call(
innerCallable.call(request, observer, context);
}
- private class ReadRowsConvertExceptionResponseObserver implements ResponseObserver {
+ private class ReadRowsConvertExceptionResponseObserver extends SafeResponseObserver {
private final ResponseObserver outerObserver;
ReadRowsConvertExceptionResponseObserver(ResponseObserver outerObserver) {
+ super(outerObserver);
this.outerObserver = outerObserver;
}
@Override
- public void onStart(StreamController controller) {
+ protected void onStartImpl(StreamController controller) {
outerObserver.onStart(controller);
}
@Override
- public void onResponse(RowT response) {
+ protected void onResponseImpl(RowT response) {
outerObserver.onResponse(response);
}
@Override
- public void onError(Throwable t) {
+ protected void onErrorImpl(Throwable t) {
outerObserver.onError(convertException(t));
}
@Override
- public void onComplete() {
+ protected void onCompleteImpl() {
outerObserver.onComplete();
}
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/SafeResponseObserver.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/SafeResponseObserver.java
new file mode 100644
index 0000000000..7c65bdf95a
--- /dev/null
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/SafeResponseObserver.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.cloud.bigtable.data.v2.stub;
+
+import com.google.api.core.InternalApi;
+import com.google.api.gax.rpc.ResponseObserver;
+import com.google.api.gax.rpc.StreamController;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Base implementation of {@link ResponseObserver} that checks the state and catches all the
+ * throwables.
+ */
+@InternalApi
+public abstract class SafeResponseObserver implements ResponseObserver {
+
+ private static final Logger LOGGER = Logger.getLogger(SafeResponseObserver.class.getName());
+ private AtomicBoolean isStarted = new AtomicBoolean(false);
+ private AtomicBoolean isClosed = new AtomicBoolean(false);
+ private StreamController streamController;
+ private ResponseObserver outerObserver;
+
+ public SafeResponseObserver(ResponseObserver outerObserver) {
+ this.outerObserver = outerObserver;
+ }
+
+ @Override
+ public final void onStart(StreamController streamController) {
+ if (!isStarted.compareAndSet(false, true)) {
+ throw new IllegalStateException("A stream is already started");
+ }
+
+ this.streamController = streamController;
+ try {
+ onStartImpl(streamController);
+ } catch (Throwable t) {
+ if (!isClosed.compareAndSet(false, true)) {
+ logException("Tried to cancel a closed stream");
+ return;
+ }
+ streamController.cancel();
+ outerObserver.onError(t);
+ }
+ }
+
+ @Override
+ public final void onResponse(ResponseT response) {
+ if (isClosed.get()) {
+ logException("Received a response after the stream is closed");
+ return;
+ }
+ try {
+ onResponseImpl(response);
+ } catch (Throwable t1) {
+ try {
+ if (!isClosed.compareAndSet(false, true)) {
+ logException("Tried to cancel a closed stream");
+ return;
+ }
+ streamController.cancel();
+ } catch (Throwable t2) {
+ t1.addSuppressed(t2);
+ }
+ outerObserver.onError(t1);
+ }
+ }
+
+ @Override
+ public final void onError(Throwable throwable) {
+ if (!isClosed.compareAndSet(false, true)) {
+ logException("Received error after the stream is closed");
+ return;
+ }
+
+ try {
+ onErrorImpl(throwable);
+ } catch (Throwable t) {
+ throwable.addSuppressed(t);
+ outerObserver.onError(throwable);
+ }
+ }
+
+ @Override
+ public final void onComplete() {
+ if (!isClosed.compareAndSet(false, true)) {
+ logException("Tried to double close the stream");
+ return;
+ }
+
+ try {
+ onCompleteImpl();
+ } catch (Throwable t) {
+ outerObserver.onError(t);
+ }
+ }
+
+ private void logException(String message) {
+ LOGGER.log(Level.WARNING, message, new IllegalStateException(message));
+ }
+
+ protected abstract void onStartImpl(StreamController streamController);
+
+ protected abstract void onResponseImpl(ResponseT response);
+
+ protected abstract void onErrorImpl(Throwable throwable);
+
+ protected abstract void onCompleteImpl();
+}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
index c7f09c4db1..5ec4c726e4 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
@@ -22,6 +22,7 @@
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.StreamController;
import com.google.bigtable.v2.ResponseParams;
+import com.google.cloud.bigtable.data.v2.stub.SafeResponseObserver;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -68,7 +69,7 @@ public void call(
}
}
- private class BigtableTracerResponseObserver implements ResponseObserver {
+ private class BigtableTracerResponseObserver extends SafeResponseObserver {
private final BigtableTracer tracer;
private final ResponseObserver outerObserver;
@@ -78,26 +79,28 @@ private class BigtableTracerResponseObserver implements ResponseObser
ResponseObserver observer,
BigtableTracer tracer,
GrpcResponseMetadata metadata) {
+ super(observer);
+
this.tracer = tracer;
this.outerObserver = observer;
this.responseMetadata = metadata;
}
@Override
- public void onStart(final StreamController controller) {
+ protected void onStartImpl(final StreamController controller) {
TracedStreamController tracedController = new TracedStreamController(controller, tracer);
outerObserver.onStart(tracedController);
}
@Override
- public void onResponse(ResponseT response) {
+ protected void onResponseImpl(ResponseT response) {
Stopwatch stopwatch = Stopwatch.createStarted();
outerObserver.onResponse(response);
tracer.afterResponse(stopwatch.elapsed(TimeUnit.MILLISECONDS));
}
@Override
- public void onError(Throwable t) {
+ protected void onErrorImpl(Throwable t) {
// server-timing metric will be added through GrpcResponseMetadata#onHeaders(Metadata),
// so it's not checking trailing metadata here.
Metadata metadata = responseMetadata.getMetadata();
@@ -122,13 +125,14 @@ public void onError(Throwable t) {
}
}
} catch (InvalidProtocolBufferException e) {
+ t.addSuppressed(t);
}
outerObserver.onError(t);
}
@Override
- public void onComplete() {
+ protected void onCompleteImpl() {
Metadata metadata = responseMetadata.getMetadata();
Long latency = Util.getGfeLatency(metadata);
tracer.recordGfeMetadata(latency, null);
@@ -151,6 +155,9 @@ public void onComplete() {
}
}
} catch (InvalidProtocolBufferException e) {
+ // InvalidProtocolBufferException will only throw if something changed on
+ // the server side. Location info won't be populated as a result. Ignore
+ // this error and don't bubble it up to user.
}
outerObserver.onComplete();
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/readrows/FilterMarkerRowsCallable.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/readrows/FilterMarkerRowsCallable.java
index 57f987fb7c..181006b6c3 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/readrows/FilterMarkerRowsCallable.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/readrows/FilterMarkerRowsCallable.java
@@ -22,6 +22,7 @@
import com.google.api.gax.rpc.StreamController;
import com.google.bigtable.v2.ReadRowsRequest;
import com.google.cloud.bigtable.data.v2.models.RowAdapter;
+import com.google.cloud.bigtable.data.v2.stub.SafeResponseObserver;
/**
* Remove the special marker rows generated by {@link RowMergingCallable}.
@@ -47,17 +48,18 @@ public void call(
innerCallable.call(request, innerObserver, context);
}
- private class FilteringResponseObserver implements ResponseObserver {
+ private class FilteringResponseObserver extends SafeResponseObserver {
private final ResponseObserver outerObserver;
private StreamController innerController;
private boolean autoFlowControl = true;
FilteringResponseObserver(ResponseObserver outerObserver) {
+ super(outerObserver);
this.outerObserver = outerObserver;
}
@Override
- public void onStart(final StreamController controller) {
+ protected void onStartImpl(final StreamController controller) {
innerController = controller;
outerObserver.onStart(
@@ -81,7 +83,7 @@ public void request(int count) {
}
@Override
- public void onResponse(RowT response) {
+ protected void onResponseImpl(RowT response) {
if (rowAdapter.isScanMarkerRow(response)) {
if (!autoFlowControl) {
innerController.request(1);
@@ -92,12 +94,12 @@ public void onResponse(RowT response) {
}
@Override
- public void onError(Throwable t) {
+ protected void onErrorImpl(Throwable t) {
outerObserver.onError(t);
}
@Override
- public void onComplete() {
+ protected void onCompleteImpl() {
outerObserver.onComplete();
}
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserver.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserver.java
index c46eb55ff9..6f2440fff7 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserver.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserver.java
@@ -17,8 +17,8 @@
import com.google.api.core.InternalApi;
import com.google.api.gax.rpc.ResponseObserver;
-import com.google.api.gax.rpc.StateCheckingResponseObserver;
import com.google.api.gax.rpc.StreamController;
+import com.google.cloud.bigtable.data.v2.stub.SafeResponseObserver;
import com.google.common.base.Preconditions;
import com.google.common.math.IntMath;
import java.util.concurrent.CancellationException;
@@ -56,8 +56,7 @@
* }
*/
@InternalApi
-public class ReframingResponseObserver
- extends StateCheckingResponseObserver {
+public class ReframingResponseObserver extends SafeResponseObserver {
// Used as a nonblocking mutex for deliver().
// 0 means unlocked
// 1 means locked without contention
@@ -97,6 +96,7 @@ public class ReframingResponseObserver
public ReframingResponseObserver(
ResponseObserver observer, Reframer reframer) {
+ super(observer);
this.outerResponseObserver = observer;
this.reframer = reframer;
}
From a86934f4f70e1998e7368688df8695a4bac7006e Mon Sep 17 00:00:00 2001
From: Mattie Fu
Date: Tue, 11 Oct 2022 16:18:21 -0400
Subject: [PATCH 06/24] feat: add apis for Mutation and RowMutationEntry
(#1454)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: add apis for Mutation and RowMutationEntry
* use iterable instead of iterator
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot
---
.../cloud/bigtable/data/v2/models/Mutation.java | 13 +++++++++++++
.../bigtable/data/v2/models/RowMutationEntry.java | 8 ++++++++
2 files changed, 21 insertions(+)
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java
index 326d78cfe0..6c1402685d 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java
@@ -87,6 +87,19 @@ public static Mutation fromProtoUnsafe(List pro
return mutation;
}
+ /**
+ * Wraps the List of protobuf {@link com.google.bigtable.v2.Mutation}. This methods, like {@link
+ * #createUnsafe()}, allows setCell operation to use server side timestamp. This is dangerous
+ * because mutations will no longer be idempotent, which might cause multiple duplicate values to
+ * be stored in Bigtable. This option should only be used for advanced usecases with extreme care.
+ */
+ @BetaApi
+ public static Mutation fromProtoUnsafe(Iterable protos) {
+ Mutation mutation = new Mutation(true);
+ mutation.mutations.addAll(protos);
+ return mutation;
+ }
+
/**
* Constructs a row mutation from an existing protobuf object.
*
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutationEntry.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutationEntry.java
index 9239b30497..63ffe708a5 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutationEntry.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutationEntry.java
@@ -15,6 +15,7 @@
*/
package com.google.cloud.bigtable.data.v2.models;
+import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import com.google.bigtable.v2.MutateRowsRequest;
import com.google.common.base.Preconditions;
@@ -54,6 +55,13 @@ public static RowMutationEntry create(@Nonnull ByteString key) {
return new RowMutationEntry(key, Mutation.create());
}
+ /** Creates a new instance from existing mutation. */
+ @BetaApi
+ public static RowMutationEntry createFromMutationUnsafe(
+ @Nonnull ByteString key, @Nonnull Mutation mutation) {
+ return new RowMutationEntry(key, mutation);
+ }
+
/**
* Creates new instance of mutation builder which allows server timestamp for setCell operations.
*
From 8c5ff0b54c7ab9365a0f078da6f9fd64167377c7 Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Mon, 17 Oct 2022 13:20:05 -0400
Subject: [PATCH 07/24] chore: [java] generation with shared deps 3.0.4 (#1641)
(#1451)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* chore: [java] generation with shared deps 3.0.4 (#1641)
* chore: [java] generation with shared deps 3.0.4
* fix for tests
Source-Link: https://github.com/googleapis/synthtool/commit/c3ad3cc9d876a3dd897cc511cf5ef921784851ae
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:5643a4e1b729803e67ddceee450e87052527b37cac394bf900b4f8e3d1bb3e9b
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot
---
.github/.OwlBot.lock.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 42327db5e2..a4f31d13f7 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -13,4 +13,4 @@
# limitations under the License.
docker:
image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest
- digest: sha256:f14e3fefe8e361e85752bd9890c8e56f2fe25f1e89cbb9597e4e3c7a429203a3
+ digest: sha256:5643a4e1b729803e67ddceee450e87052527b37cac394bf900b4f8e3d1bb3e9b
From a6612f90cd4a0ec9589ca797ff3a42d23478a6e6 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Mon, 17 Oct 2022 19:20:27 +0200
Subject: [PATCH 08/24] deps: update dependency
org.graalvm.buildtools:native-maven-plugin to v0.9.15 (#1463)
---
samples/native-image-sample/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 9078eb279e..d1355e0cfc 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -99,7 +99,7 @@
org.graalvm.buildtools
native-maven-plugin
- 0.9.14
+ 0.9.15
true
com.example.bigtable.NativeImageBigtableSample
From 69540cb2df25d5fb716e81e7513930b01c310b72 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Mon, 17 Oct 2022 19:20:45 +0200
Subject: [PATCH 09/24] deps: update dependency
org.graalvm.buildtools:junit-platform-native to v0.9.15 (#1462)
---
samples/native-image-sample/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index d1355e0cfc..1454621693 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -89,7 +89,7 @@
org.graalvm.buildtools
junit-platform-native
- 0.9.14
+ 0.9.15
test
From d8e58a5d88de7ea249d7bc141f1ac65592088da6 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Tue, 18 Oct 2022 16:54:30 +0200
Subject: [PATCH 10/24] deps: update dependency
com.google.cloud:google-cloud-monitoring-bom to v3.5.0 (#1464)
---
google-cloud-bigtable-deps-bom/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml
index d9d519846a..1b5f256e91 100644
--- a/google-cloud-bigtable-deps-bom/pom.xml
+++ b/google-cloud-bigtable-deps-bom/pom.xml
@@ -73,7 +73,7 @@
com.google.cloud
google-cloud-monitoring-bom
- 3.4.6
+ 3.5.0
pom
import
From 01f9981be37a50dd055073e6f0c52a2355484fac Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Fri, 21 Oct 2022 17:09:07 +0200
Subject: [PATCH 11/24] build(deps): update dependency
com.google.cloud:google-cloud-shared-config to v1.5.4 (#1469)
---
google-cloud-bigtable-bom/pom.xml | 2 +-
google-cloud-bigtable-deps-bom/pom.xml | 2 +-
pom.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/google-cloud-bigtable-bom/pom.xml b/google-cloud-bigtable-bom/pom.xml
index 190687edaa..93928735c6 100644
--- a/google-cloud-bigtable-bom/pom.xml
+++ b/google-cloud-bigtable-bom/pom.xml
@@ -8,7 +8,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.1
+ 1.5.4
diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml
index 1b5f256e91..4fab3fc7f4 100644
--- a/google-cloud-bigtable-deps-bom/pom.xml
+++ b/google-cloud-bigtable-deps-bom/pom.xml
@@ -7,7 +7,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.1
+ 1.5.4
diff --git a/pom.xml b/pom.xml
index f363e167bc..f36bbbf76f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.3
+ 1.5.4
From 53599caa0f92bad1365adbc4b58a1dcb1e8a393e Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Fri, 21 Oct 2022 17:09:42 +0200
Subject: [PATCH 12/24] deps: update dependency
org.graalvm.buildtools:junit-platform-native to v0.9.16 (#1467)
---
samples/native-image-sample/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 1454621693..46acb70c74 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -89,7 +89,7 @@
org.graalvm.buildtools
junit-platform-native
- 0.9.15
+ 0.9.16
test
From 557a4fbed77157c3ccfc3e84a0c952b647844f9b Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Fri, 21 Oct 2022 20:34:12 +0200
Subject: [PATCH 13/24] deps: update dependency
com.google.cloud:google-cloud-shared-dependencies to v3.0.5 (#1470)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.cloud:google-cloud-shared-dependencies](https://togithub.com/googleapis/java-shared-dependencies) | `3.0.4` -> `3.0.5` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Release Notes
googleapis/java-shared-dependencies
### [`v3.0.5`](https://togithub.com/googleapis/java-shared-dependencies/blob/HEAD/CHANGELOG.md#305-httpsgithubcomgoogleapisjava-shared-dependenciescomparev304v305-2022-10-20)
[Compare Source](https://togithub.com/googleapis/java-shared-dependencies/compare/v3.0.4...v3.0.5)
##### Dependencies
- Update dependency com.fasterxml.jackson:jackson-bom to v2.13.4.20221013 ([#868](https://togithub.com/googleapis/java-shared-dependencies/issues/868)) ([ffa7272](https://togithub.com/googleapis/java-shared-dependencies/commit/ffa7272e6d4775905e64173b3617555ee355019d))
- Update dependency com.google.auth:google-auth-library-bom to v1.12.0 ([#870](https://togithub.com/googleapis/java-shared-dependencies/issues/870)) ([6e76f19](https://togithub.com/googleapis/java-shared-dependencies/commit/6e76f19133515b755b78185ce0135943e878a368))
- Update dependency com.google.auth:google-auth-library-bom to v1.12.1 ([#871](https://togithub.com/googleapis/java-shared-dependencies/issues/871)) ([f7f5dc2](https://togithub.com/googleapis/java-shared-dependencies/commit/f7f5dc26dd54f33954bdf5d43314020de58e055b))
- Update dependency com.google.cloud:grpc-gcp to v1.3.0 ([#867](https://togithub.com/googleapis/java-shared-dependencies/issues/867)) ([1927a92](https://togithub.com/googleapis/java-shared-dependencies/commit/1927a926c615eabbf0e7377c65232e0e5268220e))
- Update dependency com.google.errorprone:error_prone_annotations to v2.16 ([#865](https://togithub.com/googleapis/java-shared-dependencies/issues/865)) ([b1734ec](https://togithub.com/googleapis/java-shared-dependencies/commit/b1734ec1c20e7bdf2582b31fde4648aa9f8de2fe))
- Update dependency com.google.protobuf:protobuf-bom to v3.21.8 ([#872](https://togithub.com/googleapis/java-shared-dependencies/issues/872)) ([1c303f2](https://togithub.com/googleapis/java-shared-dependencies/commit/1c303f2aa5145da4c93605a2d1088e8a3884de81))
- Update dependency gcp-releasetool to v1.8.10 ([#853](https://togithub.com/googleapis/java-shared-dependencies/issues/853)) ([c815a59](https://togithub.com/googleapis/java-shared-dependencies/commit/c815a5996d28676de015d5dd41e2b0405f4bb9dc))
- Update dependency google-api-core to v2.10.2 ([#858](https://togithub.com/googleapis/java-shared-dependencies/issues/858)) ([387a156](https://togithub.com/googleapis/java-shared-dependencies/commit/387a15662db0b20e72fe5bf961c02eb2bc4e75d9))
- Update dependency io.grpc:grpc-bom to v1.50.0 ([#866](https://togithub.com/googleapis/java-shared-dependencies/issues/866)) ([3d3d443](https://togithub.com/googleapis/java-shared-dependencies/commit/3d3d4434636e605f47082641e8e495bbce8f9515))
- Update dependency io.grpc:grpc-bom to v1.50.1 ([#873](https://togithub.com/googleapis/java-shared-dependencies/issues/873)) ([956309d](https://togithub.com/googleapis/java-shared-dependencies/commit/956309d76c9de46885711a77afbfce0d28971096))
- Update dependency org.checkerframework:checker-qual to v3.26.0 ([#852](https://togithub.com/googleapis/java-shared-dependencies/issues/852)) ([6926b33](https://togithub.com/googleapis/java-shared-dependencies/commit/6926b33b83d1aa63e0c78b7b8c72cd1d80e28ef3))
- Update dependency org.threeten:threetenbp to v1.6.3 ([#869](https://togithub.com/googleapis/java-shared-dependencies/issues/869)) ([fa4999b](https://togithub.com/googleapis/java-shared-dependencies/commit/fa4999b6310940e62456e83dad3ec76a7406a218))
- Update dependency typing-extensions to v4.4.0 ([#854](https://togithub.com/googleapis/java-shared-dependencies/issues/854)) ([43bd31b](https://togithub.com/googleapis/java-shared-dependencies/commit/43bd31b66eef50d82ecf8a692053f10eb385d5c1))
- Update dependency zipp to v3.9.0 ([#859](https://togithub.com/googleapis/java-shared-dependencies/issues/859)) ([a070ad0](https://togithub.com/googleapis/java-shared-dependencies/commit/a070ad04ef1bab5690487ba13dd4060827851edf))
- Update gax.version to v2.19.4 ([#875](https://togithub.com/googleapis/java-shared-dependencies/issues/875)) ([227bdd8](https://togithub.com/googleapis/java-shared-dependencies/commit/227bdd86f368b89309814c615828544c29871a5d))
- Update google.core.version to v2.8.21 ([#861](https://togithub.com/googleapis/java-shared-dependencies/issues/861)) ([8b502bd](https://togithub.com/googleapis/java-shared-dependencies/commit/8b502bd43760a2e52cf107567011d9c5132e74bd))
- Update google.core.version to v2.8.22 ([#879](https://togithub.com/googleapis/java-shared-dependencies/issues/879)) ([0360e93](https://togithub.com/googleapis/java-shared-dependencies/commit/0360e931dc45034d3c3c554f2c29ad7ea4a0a9bb))
- Update iam.version to v1.6.3 ([#857](https://togithub.com/googleapis/java-shared-dependencies/issues/857)) ([b39e683](https://togithub.com/googleapis/java-shared-dependencies/commit/b39e6838c3f3f6ef2b350efe8aec1b622893421a))
- Update iam.version to v1.6.4 ([#862](https://togithub.com/googleapis/java-shared-dependencies/issues/862)) ([85c9794](https://togithub.com/googleapis/java-shared-dependencies/commit/85c979401c34454b2d5681eed9d8b3b3679413be))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
â™» **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, click this checkbox.
---
This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/java-bigtable).
---
google-cloud-bigtable-deps-bom/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml
index 4fab3fc7f4..eb8664229b 100644
--- a/google-cloud-bigtable-deps-bom/pom.xml
+++ b/google-cloud-bigtable-deps-bom/pom.xml
@@ -66,7 +66,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.0.4
+ 3.0.5
pom
import
From 84f5ad52e4f025a80a32b752a585cf300b293979 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Fri, 21 Oct 2022 20:58:13 +0200
Subject: [PATCH 14/24] test(deps): update dependency org.mockito:mockito-core
to v4.8.1 (#1471)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [org.mockito:mockito-core](https://togithub.com/mockito/mockito) | `4.8.0` -> `4.8.1` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Release Notes
mockito/mockito
### [`v4.8.1`](https://togithub.com/mockito/mockito/releases/tag/v4.8.1)
[Compare Source](https://togithub.com/mockito/mockito/compare/v4.8.0...v4.8.1)
*Changelog generated by [Shipkit Changelog Gradle Plugin](https://togithub.com/shipkit/shipkit-changelog)*
##### 4.8.1
- 2022-10-17 - [6 commit(s)](https://togithub.com/mockito/mockito/compare/v4.8.0...v4.8.1) by andrepaschoal, dependabot\[bot]
- Possible fix [#2765](https://togithub.com/mockito/mockito/issues/2765): Add task to download package-list file from java as element-list [(#2766)](https://togithub.com/mockito/mockito/pull/2766)
- JavaDoc warning is blocking all pull requests [(#2765)](https://togithub.com/mockito/mockito/issues/2765)
- Bump versions.junitJupiter from 5.9.0 to 5.9.1 [(#2758)](https://togithub.com/mockito/mockito/pull/2758)
- Bump groovy from 3.0.12 to 3.0.13 [(#2756)](https://togithub.com/mockito/mockito/pull/2756)
- Bump com.diffplug.spotless from 6.10.0 to 6.11.0 [(#2753)](https://togithub.com/mockito/mockito/pull/2753)
- Bump org.eclipse.osgi from 3.18.0 to 3.18.100 [(#2751)](https://togithub.com/mockito/mockito/pull/2751)
- Bump versions.bytebuddy from 1.12.14 to 1.12.16 [(#2747)](https://togithub.com/mockito/mockito/pull/2747)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
â™» **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, click this checkbox.
---
This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/java-bigtable).
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index f36bbbf76f..4f9de728a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -207,7 +207,7 @@
org.mockito
mockito-core
- 4.8.0
+ 4.8.1