Skip to content

docs: add adr 325 for partial (batched) scene deployments - #325

Open
LautaroPetaccio wants to merge 10 commits into
mainfrom
feat/adr-partial-deployments
Open

LautaroPetaccio wants to merge 10 commits into
mainfrom
feat/adr-partial-deployments

Conversation

@LautaroPetaccio

Copy link
Copy Markdown
Contributor

What

Adds ADR-325, a Standards Track draft specifying how clients deploy a scene too large for one request by splitting it across several POST /entities requests with partial=true. The protocol is shared by Catalyst and the Worlds content server.

Summary

  • The signed entity ID identifies the upload; there is no session or commit endpoint.
  • 202 { missing } acknowledges storage only; the request that completes the content set validates and publishes, answering 200.
  • Uploads on overlapping parcels coexist. Publication follows entity timestamp order, so an older entity never overwrites a newer one.
  • Covers response semantics and client actions, lifecycle (admission, replay, fixed expiry), quotas, visibility to sync, a reference client algorithm and compatibility with servers that predate the protocol.

Open points for review

  • Throttling is specified as 429 with Retry-After. The Worlds server currently answers byte rate and budget rejections with 400 and would need to change.
  • The 202 missing list is authoritative; /available-content is only for planning the first batch.
  • Feature detection still relies on an unsupporting server's 400; an /about field is proposed as a follow-up.

Implementations: decentraland/worlds-content-server#504, decentraland/catalyst#1949, decentraland/catalyst-client#491.

Specifies the consumer-facing protocol for deploying a scene across
several POST /entities requests with partial=true, shared by Catalyst
and the Worlds content server: the signed entity id identifies the
upload, 202 { missing } acknowledges storage, and the completing request
publishes. Overlapping uploads coexist and publication follows entity
timestamp order. Also covers response semantics, quotas, expiry,
visibility to sync, the reference client algorithm and compatibility
with servers that predate the protocol.
@LautaroPetaccio
LautaroPetaccio requested a review from a team as a code owner September 23, 2026 19:37
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Deploying adr with  Cloudflare Pages  Cloudflare Pages

Latest commit: dadcb88
Status: ✅  Deploy successful!
Preview URL: https://1a171a06.adr-cvq.pages.dev
Branch Preview URL: https://feat-adr-partial-deployments.adr-cvq.pages.dev

View logs

Quota rejections (upload count, staged bytes, byte rate) are 400 on
both servers, and 429 with Retry-After is limited to Catalyst's
per-pointer rate limit and concurrent-pointer conflicts. Both servers
share the quota defaults, with expired uploads still counting until
cleanup. Replay is guaranteed to the original signer only, and the
open question now covers moving quota rejections to 429 together.
Both servers now reject batches from another signer for a live upload,
since its reservations are charged to its creator.
Batches may also declare partial=true in the URL so a server can tell a
batch from a regular deployment before reading the body. Clients should
send both; a query flag without the matching form field is a 400. The
form field alone stays accepted.

Also clarify that the replay guarantee covers the entity's latest
publication.
An upload's lifetime and its freshness check now start when the first
batch arrives, before its body is read, and servers must not store or
publish after expiry even for a batch that arrived in time. Servers may
bound uploads in progress per client and answer 429 when exceeded.
Servers may abort a batch whose body is not received in time or arrives below a minimum receive rate, answering 408.
A batch over a quota is now rejected with 429 and a Retry-After of the earliest time a retry can succeed: the end of the byte-rate window, or no earlier than the oldest charged upload's expiry. Clients stop and surface the error when Retry-After exceeds what they will wait. Resolves the open question about quota status codes.
Servers bound batch bodies with an overall upload timeout; no server enforces a minimum receive rate, since both sit behind proxies that buffer request bodies.
Any batch for an entity that is currently published now answers 200 with its creationTimestamp on both servers, since the entity id pins the exact entity. Uploads expire 1 hour after their first batch by default, and servers should reclaim expired uploads within minutes.
Size and count limit violations answer 413 and clients stop on them. A batch or upload that alone exceeds a quota answers 400. Only content an upload stores counts against its staging quotas, and already-stored files sent in a batch are dropped.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant