Skip to content

AIMD retries broken for multipart uploads (Missing Part error) #7956

Description

@westonpace

Description

If there are 1 or 2 errors then object_store will retry the request and it will be fine. If there are 3 errors then object_store kicks the failure to the AIMD layer which cuts the rate and retries the request. If this second case happens the final write will fail.

When object_store handles retries we are fine. When AIMD kicks off a retry we are not. The object_store layer will see it as a new call to put_part and will assign it a new part number. The old part number will be a gap. When you try and complete the write you will get:

OSError: LanceError(IO): failed to shutdown object writer ... Generic Parts error: Missing part

There is no easy fix for this at the moment. I don't see any mechanism to tell object_store this is a retried request and should re-use the part (but maybe Claude can reverse engineer something). We also can't increase the object_store retries just for put_part. If we increase the retries globally then we hurt the AIMD sensitivity for the read path.

Steps to reproduce

There is a complete reproducer here: https://github.com/lance-format/lance/compare/claude/lance-multipart-upload-error-q09m9u

Expected behavior

No response

Lance version

9.0.0-rc.2

Language binding

Rust

Environment

All

Logs / traceback

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions