From 296c6eec27ce116815c3ef1d518fefad37d46a61 Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Tue, 27 Oct 2026 18:02:11 -0400 Subject: [PATCH] fix(bigtable): pass cell value size to RowBuilder.startCell in RowBuilderShim --- .../internal/compat/ops/RowBuilderShim.java | 2 +- .../bigtable/data/v2/models/RowAdapter.java | 8 ++++- .../compat/ops/RowBuilderShimTest.java | 31 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShim.java b/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShim.java index d360f8d09a41..adab5cdd00f8 100644 --- a/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShim.java +++ b/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShim.java @@ -77,7 +77,7 @@ static RowT buildRowFromProto(RowAdapter adapter, Row protoRow) { column.getQualifier(), cell.getTimestampMicros(), cell.getLabelsList(), - 0); + cell.getValue().size()); builder.cellValue(cell.getValue()); builder.finishCell(); } diff --git a/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowAdapter.java b/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowAdapter.java index 874529bbe1c6..c6eb320af6ac 100644 --- a/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowAdapter.java +++ b/java-bigtable/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowAdapter.java @@ -59,7 +59,13 @@ interface RowBuilder { /** Called to start a new row. This will be called once per row. */ void startRow(ByteString key); - /** Called to start a new cell in a row. */ + /** + * Called to start a new cell in a row. + * + *

Note: Unlike {@link com.google.bigtable.v2.ReadRowsResponse.CellChunk#getValueSize()}, + * which is {@code 0} when a cell is not split across chunks, {@code size} is always the total + * byte size of the cell value. + */ void startCell( String family, ByteString qualifier, long timestamp, List labels, long size); diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShimTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShimTest.java index d59390ff88d0..8b8f01157fe6 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShimTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/compat/ops/RowBuilderShimTest.java @@ -160,4 +160,35 @@ void buildRowFromProto_multipleFamiliesAndCells_roundTrips() { RowCell.create("f1", col, 1_000, ImmutableList.of("lbl"), val1), RowCell.create("f2", col, 2_000, ImmutableList.of("lbl"), val2)))); } + + @Test + void buildRowFromProto_passesCellValueSizeToStartCell() { + ByteString key = ByteString.copyFromUtf8("key"); + ByteString col = ByteString.copyFromUtf8("col"); + ByteString val = ByteString.copyFromUtf8("hello-world"); + + Row proto = + Row.newBuilder() + .setKey(key) + .addFamilies( + com.google.bigtable.v2.Family.newBuilder() + .setName("f1") + .addColumns( + com.google.bigtable.v2.Column.newBuilder() + .setQualifier(col) + .addCells( + com.google.bigtable.v2.Cell.newBuilder() + .setTimestampMicros(1_000) + .setValue(val) + .addLabels("lbl")))) + .build(); + + RowBuilderShim.buildRowFromProto(adapter, proto); + + verify(rowBuilder).startRow(key); + verify(rowBuilder).startCell("f1", col, 1_000L, ImmutableList.of("lbl"), val.size()); + verify(rowBuilder).cellValue(val); + verify(rowBuilder).finishCell(); + verify(rowBuilder).finishRow(); + } }