Reference
Reference
Limits and defaults
Every cap and default a client meets, where it is set, and the error each breach returns
Every population, buffer, and payload in Nova has an explicit bound; reaching one applies backpressure or a named refusal, never unbounded growth. This page gathers the bounds a user meets, their defaults, the flag that moves them, and the error a breach returns on the wire and over HTTP.
| Bound | Default | Set by | On breach |
|---|
| One record's content bytes (body + every header name and value) | 1 MiB | novad --max-record-bytes | InvalidArgument / 400; SDK ErrRecordTooLarge |
| One append batch's total content bytes | 100 MiB | novad --max-batch-bytes | InvalidArgument / 400 |
| Records per append batch | 65,536 | novad --max-batch-records | InvalidArgument / 400 |
| Headers per record | 100 | fixed | InvalidArgument / 400 |
| Header name | non-empty bytes | fixed | InvalidArgument / 400 |
| Client timestamp | required under client-require, refused under arrival | stream timestamping mode | InvalidArgument / 400 |
| Fencing token | ≤ 36 UTF-8 bytes | fixed | refused at open, one-shot, or fence |
The SDK's producer cuts wire batches of at most 1 MiB and admits 1 MiB of staged appends behind a full window before Append blocks; WithBatchSize may lower the cut (≤ 1 MiB) and WithBatchLinger may wait up to 1 s. The star (a running novad) advertises the per-session in-flight window at the handshake (16 batches by default); a full window stops it reading frames, so backpressure reaches the client through gRPC flow control rather than an error.
| Bound | Default | Set by | On breach |
|---|
Records per read page (limit clamps to it) | 8,192 | novad --max-read-records | clamped silently |
Bytes per read page (max_bytes clamps to it) | 8 MiB | novad --max-read-bytes | clamped; at least one record always returns |
| SDK gRPC receive ceiling | 16 MiB | fixed | novad refuses to start with read limits that could exceed it |
| Read below the trim watermark | — | — | OutOfRange / 410; SDK ErrTrimmed (use clamp) |
| Subscriptions per star | 16,384 | fixed | ResourceExhausted / 429 |
| SSE connections per host (bridge or Gateway) | 4,096 | fixed | 503 + Retry-After: 1 |
| SSE heartbeat cadence | 15 s | fixed | — |
| SSE progress deadline (a consumer not reading) | 60 s | fixed | the connection is closed |
| Bound | Default | Set by | On breach |
|---|
| Producer sessions per star | 4,096 | novad --max-producer-sessions | ResourceExhausted / 429 |
| Fleet at its placement capacity | — | — | ResourceExhausted / 429; the SDK retries within its budget |
| Standard write-path admission buffer | 256 MiB | novad --s3-memory-buffer-mib | producers block (never an error) |
| Express fanout buffer | 32 MiB | novad --s3-express-memory-buffer-mib | producers block |
| Standard chain backlog | 1,024 flights | novad --s3-chain-backlog-flights | appends block until the absorb catches up |
| Bound | Rule | On breach |
|---|
| Bucket name | 3 to 63 bytes of lowercase letters, digits, and interior hyphens | InvalidArgument / 400 |
| Stream key | 1 to 512 bytes of valid UTF-8 with no control characters; opaque, / included | InvalidArgument / 400 |
| A stream's bucket | must exist; buckets are never implicit | NotFound / 404 |
| Delete a bucket | only when it holds no streams | FailedPrecondition / 503 |
| Listing page (streams, buckets, credentials) | limit clamps to 1,000 | clamped silently |
| Bound | Default | Set by | On breach |
|---|
nova: tokens per scope claim | 64 | fixed | the credential is refused: Unauthenticated / 401 |
| Exchanged-token lifetime | 15 min; ttl_seconds clamps to 1 h | fixed | clamped silently |
exp on any JWT | required | fixed | Unauthenticated / 401 |
Session or subscription past its token's exp | — | — | the stream ends; SSE sends auth-expired |
| SDK api-key token cache | 64 asks, re-minted 30 s before expiry | fixed | oldest ask evicted |
Gateway limits-as-claims (rps, connections, read_Bps, write_Bps) | unlimited unless the token carries them | token claim | 429; an SSE stream pauses instead |
| Gateway per-instance limiter population | 16,384 subs | fixed | oldest evicted (its burst resets) |
| Bound | Default | Set by | Notes |
|---|
| Read-plan validity (presigned URL expiry; raw fetch bound) | 5 min | novad --readplan-ttl | must be at most half --auditor-read-grace (10 min default) |
| Gateway concurrent vended-fetch bytes | 64 MiB | novagateway --fetch-inflight | responses wait their turn |
| Gateway decoded-footer cache | 32 MiB | novagateway --footer-cache-bytes | oldest evicted |
| Bound | Default | Set by | On breach |
|---|
| One dial attempt | 5 s | Options.DialTimeout | the next address is tried |
| Transparent retry window (opens, reconnects, subscribe resumes) | 30 s | Options.RetryBudget | ErrUnavailable |
| Remembered leaders (redirect cache) | 4,096 | fixed | oldest evicted; costs one extra bounce |
| Connections per client | 128 | fixed | a named refusal |
| Redirect follow attempts per call | 3 | fixed | the last answer surfaces |
| Producer session handshake attempt | 5 s | fixed | the attempt rotates to the next address |
go run ./cmd/novad --help, go run ./cmd/novagateway --help
proto/nova/v1/dataplane.proto
internal/transport/grpc/dataplane/server.go, internal/transport/http/dataplane/server.go
internal/stream/naming.go, internal/transport/auth/scope/scope.go
docs/design/021-http-surface.md