googleapis / googleapis/google-cloud-cpp

Support idempotency token for Storage client

Open
#12,294 4 comments 0 reactions 0 assignees View on GitHub
api: storage external type: feature request
Dominant language
C++
Stars
659
Forks
462
Avg merge
1d 2h
Merged PRs (30d)
89

Description

The GCS API supports (or soon will support) an idempotency token header. The header allows GCS to detect if a request is a duplicate, and returns the same value for duplicate requests.

To implement this we need to:

- Create the unique id in the `RetryClient`
- The decorators below `RetryClient` need to accept a new "context" field on each function
- The gRPC and REST-based implementations need to consume this field and send it to the service as a header.

It is time to split the `RawClient` stack in two, like we do for all the other libraries. The `*Connection` stack will be used for mocks and to implement the retry loop. The typical function will look like so:

```cc
virtual StatusOr GetBucketMetadata(
GetBucketMetadataRequest const& request) = 0;
```

The `*Stub` will implement logging, tracing, and actually sending the data to the service, the typical function will look like so:

```cc
virtual StatusOr GetBucketMetadata(
rest_internal::RestContext& context,
Options const& options,
GetBucketMetadataRequest const& request) = 0;
```

Note how the options are passed explicitly and not tunneled via `CurrentOptions`. Also note that the "context" object is REST-based. We can change both over time, as the classes in the `*Stub` hierarchy are not needed for mocking.

----

Java implemented this in:

https://github.com/googleapis/java-storage/pull/2027

Internally, the design doc is [go/gcs-client-idem-token](http://goto.google.com/gcs-client-idem-token)

Contributor guide

Open the contributing guide

Research direction

Start by tracing the RetryClient, RawClient, and the gRPC and REST implementations mentioned in the issue. Review how the *Connection and *Stub stacks are separated, including context and explicit Options flow. Done means the token is created, propagated through both implementations, and sent as a service header while preserving mocking and retry behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, gcp, grpc
Domain
api, backend-api-design, cloud
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.