Skip to main content
Version: v0.1.0

Limits and ceilings

Every bound below exists so that failure degrades to unknown instead of to unbounded memory, an unbounded page, or a wrong answer. They are enforced in code and asserted by tests; this page collects them in one place.

Store requests

BoundValueEffect when exceeded
objects per list page1,000request rejected as invalid
object key length16 KiBrequest rejected as invalid
provider cursor length16 KiBrequest rejected as invalid
bounded get/open sizeper call, always setread stops; evidence becomes unknown
per-operation timeoutSTORE_REQUEST_TIMEOUT, 1 s – 5 mintimeout failure category
concurrent provider operationsSCAN_CONCURRENCY, 1 – 64queued

Scan

BoundValueEffect when exceeded
objects per scanMAX_OBJECTS_PER_SCAN, 1,000 – 10,000,000scan incomplete; totals unknown
retained recent objectsbounded index, 200 per scopeolder entries dropped from the list, never from the totals
compact WAL ranges10,000 per Barman serverWAL continuity becomes unknown
retained WAL diagnostics200 rows per serverdiagnostics truncated, which forces unknown
configured scopesbounded setconfiguration rejected
timeline history entriesbounded per history filemalformed timeline history → unknown
decompressed history bytesbounded per filehistory rejected → unknown

A truncated diagnostic set forces unknown even when every visible complete segment is contiguous. Contiguity you cannot see all of is not contiguity you can claim.

WAL arithmetic

BoundValue
supported segment sizepower of two, 1 MiB through 1 GiB
segment position formulalog * (2^32 / segment_size) + segment
segments per log ID2^32 / segment_size (at most 4,096 for a 1 MiB segment)
WAL nameexactly 24 hex digits
PostgreSQL version floor9.3 (90300) for arithmetic context

There is no 16 MiB default. Missing or conflicting version/segment-size context makes continuity unknown rather than calculated.

HTTP server (standalone)

BoundValue
read-header timeout5 s
read timeout15 s
write timeout30 s
idle timeout60 s
maximum header bytes16 KiB
graceful-shutdown deadline15 s
WAL browser rows per pageWAL_PAGE_SIZE, 1 – 1,000 (default 200)

Evidence API (sidecar)

BoundValueEffect when exceeded
handler deadline5 s, every routerequest fails; no partial body
snapshot response256 KiB413 response-limit
collection response1 MiB413 response-limit
items per pagedefault 100, maximum 200400 invalid-request
concurrent API requests16429 busy with bounded retry guidance
cursor length4,096 bytes400 invalid-request
bearer token file128 bytes, exactly 43 encoded charactersstartup refuses
message strings256 bytes, no control charactersvalidation failure
reason code64 bytes, lower-kebab-casevalidation failure
assumption codes per path32, each ≤ 64 bytesvalidation failure

A safety-limit failure never returns a truncated success page. It returns a typed error, and the affected collection becomes unknown.

Deployment budget

ResourceValue
CPU request / limit25m / 500m
memory request / limit64 MiB / 256 MiB
/tmp volume16 MiB

Recorded scale acceptance: a synthetic 1,000,000-object scan (999,998 contiguous WAL segments) completes within a 128 MiB heap and 256 MiB RSS budget, retains a single WAL range, and keeps at most 200 recent objects. A cached summary page performs zero provider operations and renders within 200 ms in the reference environment.

Raising MAX_OBJECTS_PER_SCAN or SCAN_CONCURRENCY raises what one scan can hold and do. Raise the pod limits with them.

Configuration bounds

VariableRange
CATALOG_REFRESH_INTERVAL30 s – 24 h
STORE_REQUEST_TIMEOUT1 s – 5 min
SCAN_CONCURRENCY1 – 64
MAX_OBJECTS_PER_SCAN1,000 – 10,000,000
WAL_PAGE_SIZE1 – 1,000
EXPECTED_RETENTION_POLICY≤ 256 characters, no control characters
EXPECTED_MINIMUM_REDUNDANCY0 – 100,000
scope name≤ 128 bytes, no separators or control characters
ENDPOINT_CA_FILE≤ 1 MiB, ≥ 1 PEM certificate
PGBACKREST_CIPHER_PASS_FILE≤ 64 KiB
CNPG_CLUSTER_NAMESPACE≤ 63 bytes
CNPG_CLUSTER_UID≤ 128 bytes
CNPG_CLUSTER_NAME≤ 253 bytes
AWS_REGION≤ 128 bytes
AZURE_STORAGE_ACCOUNT≤ 256 bytes