Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
354f72b
feat(storage): wire operation metrics in gRPC veneer [Generated-by: AI]
nidhiii-27 Oct 22, 2026
75b0a0a
Merge branch 'feat/storage-veneer-operation-metrics' into feat/storag…
nidhiii-27 Oct 22, 2026
93b51b5
fix(storage): address PR #14729 review comments on gRPC veneer metric…
nidhiii-27 Oct 22, 2026
230dc75
Merge branch 'feat/storage-veneer-operation-metrics' into feat/storag…
nidhiii-27 Oct 22, 2026
bb8cd41
fix(storage): refine gRPC veneer operation metrics and attempt tracking
nidhiii-27 Oct 22, 2026
7d02a9a
Merge branch 'feat/storage-veneer-operation-metrics' into feat/storag…
nidhiii-27 Oct 27, 2026
6b27e7f
refactor(storage): use StorageClientMetrics for context creation in g…
nidhiii-27 Oct 27, 2026
36fea56
fix(storage): address review feedback on gRPC veneer operation metric…
nidhiii-27 Oct 29, 2026
295833d
fix(storage): replace StorageStub mock with static TestStorageStub fo…
nidhiii-27 Oct 29, 2026
ac00bf4
fix(storage): mock UnaryCallable without annotations for Java 8 compa…
nidhiii-27 Oct 29, 2026
1244988
fix(storage): record NOT_FOUND on 404, suppress PCU sub-op metrics, a…
nidhiii-27 Nov 2, 2026
eaa05b9
fix(storage): record UpdateBucket and UpdateObject metrics on no-op g…
nidhiii-27 Nov 2, 2026
e51bd60
chore(storage): merge feat/storage-veneer-operation-metrics into feat…
nidhiii-27 Nov 12, 2026
558ee79
Merge branch 'feat/storage-veneer-operation-metrics' into feat/storag…
nidhiii-27 Nov 12, 2026
ab73edd
fix(storage): attach multiContext to write/query callables and drop r…
nidhiii-27 Nov 12, 2026
f1f55dc
Merge branch 'feat/storage-veneer-operation-metrics' into feat/storag…
nidhiii-27 Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@
import com.google.cloud.storage.Retrying.RetrierWithAlg;
import com.google.storage.v2.RewriteObjectRequest;
import com.google.storage.v2.RewriteResponse;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

@NullMarked
final class GapicCopyWriter extends CopyWriter {

// needed for #getResult
Expand All @@ -32,27 +35,45 @@ final class GapicCopyWriter extends CopyWriter {
private final RetrierWithAlg retrier;
private final RewriteObjectRequest originalRequest;
private final RewriteResponse initialResponse;
@Nullable private final StorageMetricsContext metricsContext;
Comment thread
nidhiii-27 marked this conversation as resolved.
Resolved

private RewriteResponse mostRecentResponse;
private boolean operationRecorded;

GapicCopyWriter(
GrpcStorageImpl storage,
UnaryCallable<RewriteObjectRequest, RewriteResponse> callable,
RetrierWithAlg retrier,
RewriteObjectRequest originalRequest,
RewriteResponse initialResponse) {
RewriteResponse initialResponse,
@Nullable StorageMetricsContext metricsContext) {
this.storage = storage;
this.callable = callable;
this.retrier = retrier;
this.initialResponse = initialResponse;
this.mostRecentResponse = initialResponse;
this.originalRequest = originalRequest;
this.metricsContext = metricsContext;
this.operationRecorded = initialResponse.getDone();
}

private void recordOperation(@Nullable Throwable error) {
if (metricsContext != null && !operationRecorded) {
metricsContext.recordOperation(storage.getOptions().getStorageClientMetrics(), error);
operationRecorded = true;
}
}

@Override
public Blob getResult() {
while (!isDone()) {
copyChunk();
try {
while (!isDone()) {
copyChunk();
}
recordOperation(null);
} catch (Throwable t) {
recordOperation(t);
throw t;
}
BlobInfo info = Conversions.grpc().blobInfo().decode(mostRecentResponse.getResource());
return info.asBlob(storage);
Expand All @@ -76,10 +97,25 @@ public long getTotalBytesCopied() {
@Override
public void copyChunk() {
if (!isDone()) {
RewriteObjectRequest req =
originalRequest.toBuilder().setRewriteToken(mostRecentResponse.getRewriteToken()).build();
GrpcCallContext retryContext = Retrying.newCallContext();
mostRecentResponse = retrier.run(() -> callable.call(req, retryContext), Decoder.identity());
try {
RewriteObjectRequest req =
originalRequest.toBuilder()
.setRewriteToken(mostRecentResponse.getRewriteToken())
.build();
StorageMetricsContext chunkContext = metricsContext;
GrpcCallContext retryContext = Retrying.newCallContext(chunkContext);
RewriteResponse resp =
retrier.run(() -> callable.call(req, retryContext), Decoder.identity(), chunkContext);
if (resp != null) {
mostRecentResponse = resp;
}
if (isDone()) {
recordOperation(null);
}
} catch (Throwable t) {
recordOperation(t);
throw t;
}
}
}
Comment thread
nidhiii-27 marked this conversation as resolved.
Resolved

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.google.storage.v2.ReadObjectRequest;
import com.google.storage.v2.ReadObjectResponse;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jspecify.annotations.Nullable;

final class GrpcBlobReadChannel extends BaseStorageReadChannel<Object> {

Expand All @@ -41,7 +42,18 @@ final class GrpcBlobReadChannel extends BaseStorageReadChannel<Object> {
ResultRetryAlgorithm<?> resultRetryAlgorithm,
ReadObjectRequest request,
boolean autoGzipDecompression) {
super(Conversions.grpc().blobInfo());
this(read, retrier, resultRetryAlgorithm, request, autoGzipDecompression, null, null);
}

GrpcBlobReadChannel(
ZeroCopyServerStreamingCallable<ReadObjectRequest, ReadObjectResponse> read,
Retrier retrier,
ResultRetryAlgorithm<?> resultRetryAlgorithm,
ReadObjectRequest request,
boolean autoGzipDecompression,
@Nullable StorageMetricsContext metricsContext,
@Nullable StorageClientMetrics storageClientMetrics) {
super(Conversions.grpc().blobInfo(), metricsContext, storageClientMetrics);
this.read = read;
this.retrier = retrier;
this.resultRetryAlgorithm = resultRetryAlgorithm;
Expand All @@ -61,7 +73,8 @@ protected LazyReadChannel<?, Object> newLazyReadChannel() {
ReadableByteChannelSessionBuilder b =
ResumableMedia.gapic()
.read()
.byteChannel(read, retrier, resultRetryAlgorithm)
.byteChannel(
read, retrier.withMetricsContext(getMetricsContext()), resultRetryAlgorithm)
.setHasher(Hasher.readHasher())
.setAutoGzipDecompression(autoGzipDecompression);
BufferHandle bufferHandle = getBufferHandle();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.google.storage.v2.WriteObjectRequest;
import com.google.storage.v2.WriteObjectResponse;
import java.util.function.Supplier;
import org.jspecify.annotations.Nullable;

final class GrpcBlobWriteChannel extends BaseStorageWriteChannel<WriteObjectResponse> {

Expand All @@ -37,7 +38,20 @@ final class GrpcBlobWriteChannel extends BaseStorageWriteChannel<WriteObjectResp
RetrierWithAlg retrier,
Supplier<ApiFuture<ResumableWrite>> start,
Hasher hasher) {
super(Conversions.grpc().blobInfo().compose(WriteObjectResponse::getResource));
this(write, retrier, start, hasher, null, null);
}

GrpcBlobWriteChannel(
ClientStreamingCallable<WriteObjectRequest, WriteObjectResponse> write,
RetrierWithAlg retrier,
Supplier<ApiFuture<ResumableWrite>> start,
Hasher hasher,
@Nullable StorageMetricsContext metricsContext,
@Nullable StorageClientMetrics storageClientMetrics) {
super(
Conversions.grpc().blobInfo().compose(WriteObjectResponse::getResource),
metricsContext,
storageClientMetrics);
this.write = write;
this.retrier = retrier;
this.start = start;
Expand Down
Loading
Loading