Thanks for the proposal. It's a nice feature to make retry more reliable
and efficient. Left some comments.

Yufei


On Mon, Sep 15, 2025 at 3:53 PM Kevin Liu <kevinjq...@apache.org> wrote:

>
> Thanks for writing up the proposal! Makes sense to add idempotency to
> mutation requests.
>
> It would be helpful to add this feature to both the catalog test framework
> and the iceberg-rest-fixture
> <https://github.com/apache/iceberg/blob/754679ddccdf81a97dc65d40f1a2a6fb9f6ee9b0/open-api/src/testFixtures/java/org/apache/iceberg/rest/RESTCatalogServer.java#L112>.
> The latter is used by the subprojects for testing and would come in handy
> when we want to test out the client implementation.
>
> For other reviewers, the Stripe documentation on idempotency was a helpful
> read, https://docs.stripe.com/api/idempotent_requests.
>
>
> Best,
> Kevin Liu
>
> On Mon, Sep 15, 2025 at 11:38 AM Szehon Ho <szehon.apa...@gmail.com>
> wrote:
>
>> Hi,
>>
>> Sounds like fairly standard practice and makes sense to me in the first
>> read.
>>
>> Thanks,
>> Szehon
>>
>> On Mon, Sep 15, 2025 at 10:09 AM Russell Spitzer <
>> russellspit...@apache.org> wrote:
>>
>>> I think based on the feedback on the proposal and in recent syncs we
>>> should probably move forward with the actual Spec Change PR so we can see
>>> what this looks like and move on to a discussion of how the Catalog test
>>> framework should test this.
>>>
>>> On 2025/08/22 18:26:23 huaxin gao wrote:
>>> > Hi all,
>>> >
>>> > I’d like to propose a change to Iceberg’s REST API to make mutation
>>> > requests safely retryable.
>>> >
>>> > *The Problem*
>>> > If a POST mutation (e.g., updateTable) succeeds in the catalog but the
>>> > client doesn’t receive the response (timeout, connection closed,
>>> etc.), a
>>> > second attempt can hit 409 Conflict. The client interprets the 409 as a
>>> > failed commit and deletes the associated metadata files, causing
>>> > catalog/storage inconsistency.
>>> >
>>> > *The Proposed Solution*
>>> > Introduces an optional Idempotency-Key HTTP header on REST mutation
>>> > endpoints and has the Iceberg client pass it through.
>>> >
>>> > *Semantics *(first processed request wins):
>>> >
>>> >    -
>>> >
>>> >    Same key + same canonical payload -> return the original result (no
>>> >    re-execution).
>>> >    -
>>> >
>>> >    Same key + different payload -> 422 (Unprocessable Content).
>>> >
>>> > *Capability discovery:* catalogs can advertise support and retention so
>>> > clients know when a retry is safe, e.g.
>>> >
>>> > {
>>> >   "idempotency-tokens-respected": true,
>>> >   "idempotency-token-lifetime": "30m" }
>>> >
>>> > *Scope in Iceberg:* update the OpenAPI to include the header, and add
>>> > client pass-through + honoring capability discovery. No server
>>> > implementation is mandated—catalogs (e.g., Polaris) can implement
>>> > storage/TTL/replay as they choose.
>>> >
>>> > *Standards alignment:* uses the industry-standard header name and
>>> matches
>>> > the IETF HTTPAPI Idempotency-Key draft
>>> > <
>>> https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key-header
>>> >
>>> > semantics.
>>> >
>>> > *Compatibility:* fully backward compatible. Servers that don’t support
>>> it
>>> > can ignore the header; clients can detect support via capability
>>> discovery.
>>> >
>>> > Here is the proposal
>>> > <
>>> https://docs.google.com/document/d/1WyiIk08JRe8AjWh63txIP4i2xcIUHYQWFrF_1CCS3uw/edit?tab=t.0
>>> >.
>>> > Looking forward to your thoughts.
>>> >
>>> > Thanks,
>>> >
>>> > Huaxin
>>> >
>>>
>>

Reply via email to