Skip to content

Copy a provider's produced files into Otari's store on every data plane #1747

Open

Description

@peteski22

Problem

A file a provider's code produces is copied into Otari's store before the response or the event mentioning it is forwarded. That path is built on local repositories, so it does not run on a data plane that holds no database.

The copy also races the provider. A container expires roughly twenty minutes after its last use and its data goes with it, so a copy that is not made promptly cannot be made at all.

Proposal

Extend the existing copy path to both bindings, per #1606, using the credentials of the attempt that produced the output rather than an unrelated default.

Reserve output capacity before dispatch, so a tenant limit refuses admission rather than being discovered after a model has run. Once inference has run, a storage failure must not discard the answer.

Honor the cumulative count, byte and deadline caps that bound the attempt, and release unused reservations when it completes.

A failed copy is a Cancel, not a silent gap. #1569 covers telling the caller, and this issue must not make that harder by leaving the outcome unrecorded.

Done when

  • Produced files are stored and readable after the provider's container is gone, on every data plane.
  • A storage failure preserves the model answer and releases its reservation.
  • A quota refusal happens before dispatch, not after.

Activity

  1. self-assigned this
    on Sep 25, 2026
  2. peteski22 commented on Sep 29, 2026

    @peteski22
    ContributorAuthor

    The #1740 stack (#1758) changes the copy path this issue extends, so start from it.

    Already true after #1757 and #1788:

    • A provider copy resolves the filename before the read, reserves its row, then streams the bytes. It writes through FileService.store_produced, not a path of its own.
    • A copy that fails, or arrives empty, gives its row back. So a file refused once, or skipped for budget, can be copied by a later request. Under the old order it was blocked by its own leftover row.
    • The bytes go to a blob keyed on a fresh ID, never on the provider's file ID, so two copies of one provider file never share a blob.

    Still open, and still this issue:

    Please extend store_produced rather than adding a second copy path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area/backendBackend service implementation

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions