novadocs
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.

Records and appends

BoundDefaultSet byOn breach
One record's content bytes (body + every header name and value)1 MiBnovad --max-record-bytesInvalidArgument / 400; SDK ErrRecordTooLarge
One append batch's total content bytes100 MiBnovad --max-batch-bytesInvalidArgument / 400
Records per append batch65,536novad --max-batch-recordsInvalidArgument / 400
Headers per record100fixedInvalidArgument / 400
Header namenon-empty bytesfixedInvalidArgument / 400
Client timestamprequired under client-require, refused under arrivalstream timestamping modeInvalidArgument / 400
Fencing token≤ 36 UTF-8 bytesfixedrefused 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.

Reads and subscriptions

BoundDefaultSet byOn breach
Records per read page (limit clamps to it)8,192novad --max-read-recordsclamped silently
Bytes per read page (max_bytes clamps to it)8 MiBnovad --max-read-bytesclamped; at least one record always returns
SDK gRPC receive ceiling16 MiBfixednovad refuses to start with read limits that could exceed it
Read below the trim watermarkOutOfRange / 410; SDK ErrTrimmed (use clamp)
Subscriptions per star16,384fixedResourceExhausted / 429
SSE connections per host (bridge or Gateway)4,096fixed503 + Retry-After: 1
SSE heartbeat cadence15 sfixed
SSE progress deadline (a consumer not reading)60 sfixedthe connection is closed

Sessions and the fleet

BoundDefaultSet byOn breach
Producer sessions per star4,096novad --max-producer-sessionsResourceExhausted / 429
Fleet at its placement capacityResourceExhausted / 429; the SDK retries within its budget
Standard write-path admission buffer256 MiBnovad --s3-memory-buffer-mibproducers block (never an error)
Express fanout buffer32 MiBnovad --s3-express-memory-buffer-mibproducers block
Standard chain backlog1,024 flightsnovad --s3-chain-backlog-flightsappends block until the absorb catches up

Names and addresses

BoundRuleOn breach
Bucket name3 to 63 bytes of lowercase letters, digits, and interior hyphensInvalidArgument / 400
Stream key1 to 512 bytes of valid UTF-8 with no control characters; opaque, / includedInvalidArgument / 400
A stream's bucketmust exist; buckets are never implicitNotFound / 404
Delete a bucketonly when it holds no streamsFailedPrecondition / 503
Listing page (streams, buckets, credentials)limit clamps to 1,000clamped silently

Tokens and credentials

BoundDefaultSet byOn breach
nova: tokens per scope claim64fixedthe credential is refused: Unauthenticated / 401
Exchanged-token lifetime15 min; ttl_seconds clamps to 1 hfixedclamped silently
exp on any JWTrequiredfixedUnauthenticated / 401
Session or subscription past its token's expthe stream ends; SSE sends auth-expired
SDK api-key token cache64 asks, re-minted 30 s before expiryfixedoldest ask evicted
Gateway limits-as-claims (rps, connections, read_Bps, write_Bps)unlimited unless the token carries themtoken claim429; an SSE stream pauses instead
Gateway per-instance limiter population16,384 subsfixedoldest evicted (its burst resets)

Plans and the Gateway

BoundDefaultSet byNotes
Read-plan validity (presigned URL expiry; raw fetch bound)5 minnovad --readplan-ttlmust be at most half --auditor-read-grace (10 min default)
Gateway concurrent vended-fetch bytes64 MiBnovagateway --fetch-inflightresponses wait their turn
Gateway decoded-footer cache32 MiBnovagateway --footer-cache-bytesoldest evicted

SDK client bounds

BoundDefaultSet byOn breach
One dial attempt5 sOptions.DialTimeoutthe next address is tried
Transparent retry window (opens, reconnects, subscribe resumes)30 sOptions.RetryBudgetErrUnavailable
Remembered leaders (redirect cache)4,096fixedoldest evicted; costs one extra bounce
Connections per client128fixeda named refusal
Redirect follow attempts per call3fixedthe last answer surfaces
Producer session handshake attempt5 sfixedthe attempt rotates to the next address

Source documents

  • 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

On this page