Thanks Huaxin for the proposal, and sorry for the late review - I had a bit
of a busy week.
I have one main question, which I have also added as a comment to the doc:
- Why do we try to compare the request contents when the Idempotency-Key is
the same for the requests? The comparison algorithm is a bit complicated,
and seems brittle to me. Consistent field ordering, maps, and maybe even
inconsistency in upper case/lower case letters might mean technically the
same request.

In my previous roles (admittedly more than 10 years ago) I was extensively
working on APIs like this, and we have never really succeeded in creating a
good enough "are these 2 requests are really the same semantically" checks.

I would simplify these requirements, unless there are serious arguments for
the existence of these checks:

   1. Either check for exact matches - without any magic - this could be
   used for detecting issues where the duplication happens on the network
   side, or
   2. Rely entirely on the clients to provide the correct Idempotency-Key.

I would prefer the 2nd.
Otherwise I agree with the contents of the proposal. It is nicely done!
(edited)

Yufei Gu <flyrain...@gmail.com> ezt írta (időpont: 2025. szept. 18., Cs,
2:54):

> 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