> ## Documentation Index
> Fetch the complete documentation index at: https://docs.restate.dev/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.restate.dev/feedback

```json
{
  "path": "/references/server-config",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Restate Server Configuration

> Reference of the configuration options for Restate Server.

## Default configuration

The following is the default configuration. It does not include all possible configuration options, since some can be conflicting. Take a look at the configuration reference below for a full list of options.

Note that configuration defaults might change across server releases, if you want to make sure you use stable values, use an explicit configuration file and pass the path via `--config-path=<PATH>` as described above.

**Important changes in recent versions:**

* Restate now listens on both TCP and Unix sockets by default (`listen-mode = "all"`). Unix sockets are created under `restate-data/*.sock`.
* Advertised addresses are automatically detected based on your network configuration. You no longer need to explicitly set `advertised-address` for most deployments.
* The `metadata-client.addresses` field is now optional for single-node setups.

```toml restate.toml expandable {"CODE_LOAD::../docs/schemas/restate.toml"}  theme={null}
roles = [
    "http-ingress",
    "admin",
    "worker",
    "log-server",
    "metadata-server",
]
cluster-name = "localcluster"
auto-provision = true
default-num-partitions = 24
default-replication = 1
shutdown-timeout = "1m"
tracing-filter = "info"
log-filter = "warn,restate=info"
log-format = "pretty"
log-disable-ansi-codes = false
connect-timeout = "10s"
request-compression-threshold = "4.0 MiB"
disable-prometheus = false
rocksdb-total-memory-size = "2.0 GiB"
rocksdb-total-memtables-ratio = 0.85
rocksdb-high-priority-bg-threads = 2
rocksdb-perf-level = "enable-count"
metadata-update-interval = "10s"
metadata-fetch-from-peer-timeout = "3s"
initialization-timeout = "5m"
disable-telemetry = false
gossip-tick-interval = "100ms"
gossip-failure-threshold = 10
gossip-num-peers = 2
gossip-fd-stability-threshold = 3
gossip-suspect-interval = "5s"
gossip-loneliness-threshold = 30
gossip-extras-exchange-frequency = 10
gossip-time-skew-threshold = "1s"
hlc-max-drift = "5s"
experimental-kafka-batch-ingestion = false
experimental-shuffler-batch-ingestion = false
default-journal-retention = "1d"

[metadata-client]
type = "replicated"
addresses = []
connect-timeout = "3s"
keep-alive-interval = "5s"
keep-alive-timeout = "5s"

[metadata-client.backoff-policy]
type = "exponential"
initial-interval = "100ms"
factor = 1.4
max-attempts = 10
max-interval = "1s"

[http-keep-alive-options]
interval = "40s"
timeout = "20s"

[network-error-retry-policy]
type = "exponential"
initial-interval = "10ms"
factor = 2.0
max-attempts = 15
max-interval = "5s"

[default-retry-policy]
initial-interval = "500ms"
exponentiation-factor = 2.0
max-attempts = 70
on-max-attempts = "pause"
max-interval = "1m"

[worker]
internal-queue-length = 1000
cleanup-interval = "1h"
max-command-batch-size = 32
trim-delay-interval = "10m"

[worker.storage]
rocksdb-disable-wal = true
rocksdb-memory-ratio = 0.49

[worker.invoker]
inactivity-timeout = "1m"
abort-timeout = "10m"
message-size-warning = "10.0 MiB"
in-memory-queue-length-limit = 66049
concurrent-invocations-limit = 1000

[worker.snapshots]
enable-cleanup = true

[worker.snapshots.object-store-retry-policy]
type = "exponential"
initial-interval = "100ms"
factor = 2.0
max-attempts = 10
max-interval = "10s"

[worker.shuffle]
inflight-memory-budget = "10.0 MiB"
request-batch-size = "50.0 KiB"

[worker.shuffle.connection-retry-policy]
type = "exponential"
initial-interval = "10ms"
factor = 2.0
max-interval = "1s"

[admin]
heartbeat-interval = "1s 500ms"
disable-web-ui = false
disable-cluster-controller = false

[admin.query-engine]
memory-size = "1.0 GiB"

[ingress]
kafka-clusters = []

[ingress.ingestion]
inflight-memory-budget = "1.0 MiB"
request-batch-size = "50.0 KiB"

[ingress.ingestion.connection-retry-policy]
type = "exponential"
initial-interval = "10ms"
factor = 2.0
max-interval = "2s"

[bifrost]
default-provider = "replicated"
seal-retry-interval = "2s"
auto-recovery-interval = "15s"
append-retry-min-interval = "10ms"
append-retry-max-interval = "1s"
record-cache-memory-size = "250.0 MiB"
disable-auto-improvement = false

[bifrost.local]
rocksdb-disable-wal = false
rocksdb-memory-ratio = 0.5
rocksdb-disable-wal-fsync = false
writer-batch-commit-count = 5000
writer-batch-commit-duration = "0s"

[bifrost.replicated-loglet]
maximum-inflight-records = 1000
sequencer-inactivity-timeout = "15s"
log-server-rpc-timeout = "2s"
readahead-records = 20
read-batch-size = "32.0 KiB"
readahead-trigger-ratio = 0.5

[bifrost.replicated-loglet.sequencer-retry-policy]
type = "exponential"
initial-interval = "250ms"
factor = 2.0
max-interval = "5s"

[bifrost.replicated-loglet.log-server-retry-policy]
type = "exponential"
initial-interval = "250ms"
factor = 2.0
max-attempts = 3
max-interval = "2s"

[bifrost.read-retry-policy]
type = "exponential"
initial-interval = "50ms"
factor = 2.0
max-attempts = 50
max-interval = "1s"

[metadata-server]
request-queue-length = 32
rocksdb-memory-ratio = 0.01
rocksdb-disable-wal = false
raft-election-tick = 10
raft-heartbeat-tick = 2
raft-tick-interval = "100ms"
status-update-interval = "5s"
log-trim-threshold = 1000
auto-join = true

[networking]
connect-timeout = "3s"
handshake-timeout = "3s"
http2-keep-alive-interval = "1s"
http2-keep-alive-timeout = "3s"
http2-adaptive-window = true
disable-compression = false
data-stream-window-size = "2.0 MiB"

[networking.connect-retry-policy]
type = "exponential"
initial-interval = "250ms"
factor = 2.0
max-attempts = 10
max-interval = "3s"

[log-server]
rocksdb-disable-wal = false
rocksdb-memory-ratio = 0.5
rocksdb-disable-wal-fsync = false
rocksdb-max-sub-compactions = 0
writer-batch-commit-count = 5000
incoming-network-queue-length = 1000
```

## Configuration Reference

<ResponseField name="additional-request-headers" type="object | null" post={[]}>
  Additional request headers: Headers that should be applied to all outgoing requests (HTTP and Lambda).
  Defaults to `x-restate-cluster-name: &lt;cluster name&gt;`.

  Proxy type to implement HashMap\<HeaderName, HeaderValue> ser/de
  Use it directly or with `#[serde(with = \"serde_with::As::&lt;serde_with::FromInto&lt;restate_serde_util::SerdeableHeaderMap&gt;&gt;\")]`.
</ResponseField>

<ResponseField name="admin" type="object" post={[]}>
  Admin server options:

  <Expandable title="Properties">
    <ResponseField name="advertised-address" type="string | null" post={[]}>
      Address that other nodes will use to connect to this service.

      The full prefix that will be used to advertise this service publicly.
      For example, if this is set to `https://my-host` then others will use this
      as base URL to connect to this service.

      If unset, the advertised address will be inferred from public address of this node
      or it'll use the value supplied in `advertised-host` if set.

      advertised address: An externally accessible URI address for admin-api-server. This can be set to unix:restate-data/admin.sock to advertise the automatically created unix-socket instead of using tcp if needed

      Examples:
      "http//127.0.0.1:9070/" or "[https://my-host/](https://my-host/)" or "unix:/data/restate-data/admin.sock"
    </ResponseField>

    <ResponseField name="advertised-admin-endpoint" type="string | null" post={[]}>
      Advertised Admin endpoint: Optional advertised Admin API endpoint.
      \[Deprecated] Use `advertised-address` instead.

      advertised address: An externally accessible URI address for admin-api-server. This can be set to unix:restate-data/admin.sock to advertise the automatically created unix-socket instead of using tcp if needed

      Examples:
      "http//127.0.0.1:9070/" or "[https://my-host/](https://my-host/)" or "unix:/data/restate-data/admin.sock"
    </ResponseField>

    <ResponseField name="advertised-host" type="string | null" post={[]}>
      Hostname to advertise for this service
    </ResponseField>

    <ResponseField name="bind-address" type="string | null" post={[]}>
      The combination of `bind-ip` and `bind-port` that will be used to bind

      This has precedence over `bind-ip` and `bind-port`

      Bind address: The local network address to bind on for admin-api-server. This service uses default port 9070 and will create a unix-socket file at the data directory under the name `admin.sock`

      Examples:
      "0.0.0.0:9070" or "127.0.0.1:9070"
    </ResponseField>

    <ResponseField name="bind-ip" type="string | null" post={['format: ip']}>
      Local interface IP address to listen on
    </ResponseField>

    <ResponseField name="bind-port" type="integer | null" post={['format: uint16','maximum: 65535']}>
      Network port to listen on
    </ResponseField>

    <ResponseField name="concurrent-api-requests-limit" type="integer | null" post={['default=null','format: uint','minimum: 1']}>
      Concurrency limit for the Admin APIs. Default is unlimited.
    </ResponseField>

    <ResponseField name="deployment-routing-headers" type="array" post={[]}>
      Deployment routing headers: List of header names considered routing headers.

      These will be used during deployment creation to distinguish between an already existing deployment and a new deployment.

      <Expandable title="Array Items">
        <ResponseField name="item" type="string" post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="disable-cluster-controller" type="boolean" post={['default=false']} />

    <ResponseField name="disable-web-ui" type="boolean" post={['default=false']}>
      Disable serving the Restate Web UI on the admin port. Default is `false`.
    </ResponseField>

    <ResponseField name="heartbeat-interval" type="string" post={['default="1s 500ms"','minLength: 1']}>
      Controller heartbeats: Controls the interval at which cluster controller polls nodes of the cluster.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="listen-mode" type="oneOf | null" post={[]}>
      Listen on unix-sockets, TCP sockets, or both.

      The default is to listen on both.

      * `"unix"` : Exclusively listen on unix domain sockets

      If set, all services will listen exclusively on unix sockets, each service
      will create a socket file under the data directory.

      * `"tcp"` : Exclusively listen on TCP sockets
      * `"all"` : \[default] Listen on both Unix and TCP sockets
    </ResponseField>

    <ResponseField name="query-engine" type="object" post={[]}>
      Storage query engine options:

      <Expandable title="Properties">
        <ResponseField name="memory-size" type="string" post={['default="1.0 GiB"','minLength: 1']}>
          Memory size limit: The total memory in bytes that can be used to preform sql queries
        </ResponseField>

        <ResponseField name="query-parallelism" type="integer | null" post={['default=null','format: uint','minimum: 1']}>
          Default query parallelism: The degree of parallelism to use for query execution (Defaults to the number of available cores).
        </ResponseField>

        <ResponseField name="tmp-dir" type="string | null" post={['default=null']}>
          Temp folder to use for spill: The path to spill to
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="use-random-ports" type="boolean | null" post={[]}>
      Use random ports instead of the default port
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="advertised-address" type="string | null" post={[]}>
  Address that other nodes will use to connect to this service.

  The full prefix that will be used to advertise this service publicly.
  For example, if this is set to `https://my-host` then others will use this
  as base URL to connect to this service.

  If unset, the advertised address will be inferred from public address of this node
  or it'll use the value supplied in `advertised-host` if set.

  advertised address: An externally accessible URI address for tokio-console-server. This can be set to unix:restate-data/tokio.sock to advertise the automatically created unix-socket instead of using tcp if needed

  Examples:
  "http//127.0.0.1:6669/" or "[https://my-host/](https://my-host/)" or "unix:/data/restate-data/tokio.sock"
</ResponseField>

<ResponseField name="advertised-host" type="string | null" post={[]}>
  Hostname to advertise for this service
</ResponseField>

<ResponseField name="auto-provision" type="boolean" post={['default=true']}>
  Auto cluster provisioning: If true, then this node is allowed to automatically provision as a new cluster.
  This node *must* have an admin role and a new nodes configuration will be created that includes this node.

  auto-provision is allowed by default in development mode and is disabled if restate-server runs with `--production` flag
  to prevent cluster nodes from forming their own clusters, rather than forming a single cluster.

  Use `restatectl` to provision the cluster/node if automatic provisioning is disabled.

  This can also be explicitly disabled by setting this value to false.

  Default: true
</ResponseField>

<ResponseField name="aws-assume-role-external-id" type="string | null" post={['default=null']}>
  AssumeRole external ID: An external ID to apply to any AssumeRole operations taken by this client.
  [https://docs.aws.amazon.com/IAM/latest/UserGuide/id\_roles\_create\_for-user\_externalid.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)
  Can be overridden by the `AWS_EXTERNAL_ID` environment variable.
</ResponseField>

<ResponseField name="aws-profile" type="string | null" post={['default=null']}>
  AWS Profile: Name of the AWS profile to select. Defaults to 'AWS\_PROFILE' env var, or otherwise
  the `default` profile.
</ResponseField>

<ResponseField name="base-dir" type="string | null" post={['default=null']}>
  The working directory which this Restate node should use for relative paths. The default is
  `restate-data` under the current working directory.
</ResponseField>

<ResponseField name="bifrost" type="object" post={[]}>
  Bifrost options:

  <Expandable title="Properties">
    <ResponseField name="append-retry-max-interval" type="string" post={['default="1s"','minLength: 1']}>
      Append retry maximum interval: Maximum retry duration used by the exponential backoff mechanism for bifrost appends.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="append-retry-min-interval" type="string" post={['default="10ms"','minLength: 1']}>
      Append retry minimum interval: Minimum retry duration used by the exponential backoff mechanism for bifrost appends.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="auto-recovery-interval" type="string" post={['default="15s"','minLength: 1']}>
      Auto recovery threshold: Time interval after which bifrost's auto-recovery mechanism will kick in. This
      is triggered in scenarios where the control plane took too long to complete loglet
      reconfigurations.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="default-provider" post={['default="replicated"']}>
      The default kind of loglet to be used: Default: Replicated

      * `"local"` : A local rocksdb-backed loglet.
      * `"replicated"` : Replicated loglets are restate's native log replication system. This requires
        `log-server` role to run on enough nodes in the cluster.
    </ResponseField>

    <ResponseField name="disable-auto-improvement" type="string" post={['default=false']}>
      Disable Automatic Improvement: When enabled, automatic improvement periodically checks with the loglet provider
      if the loglet configuration can be improved by performing a reconfiguration.

      This allows the log to pick up replication property changes, apply better placement
      of replicas, or for other reasons.
    </ResponseField>

    <ResponseField name="local" type="string" post={[]}>
      Configuration of local loglet provider
    </ResponseField>

    <ResponseField name="read-retry-policy" post={[]}>
      Read retry policy: Retry policy to use when bifrost waits for reconfiguration to complete during
      read operations

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="record-cache-memory-size" type="string" post={['default="250.0 MiB"','minLength: 1']}>
      In-memory RecordCache memory limit: Optional size of record cache in bytes.
      If set to 0, record cache will be disabled.
      Defaults: 250MB
    </ResponseField>

    <ResponseField name="replicated-loglet" type="object" post={[]}>
      Configuration of replicated loglet provider

      <Expandable title="Properties">
        <ResponseField name="log-server-retry-policy" post={[]}>
          Log Server RPC retry policy

          Retry policy for log server RPCs

          <Expandable title="Option 1: None">
            No retry strategy.

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 2: Fixed delay">
            Retry with a fixed delay strategy.

            <ResponseField name="interval" type="string" required post={['minLength: 1']}>
              Interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 3: Exponential">
            Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

            <ResponseField name="factor" type="number" required post={['format: float']}>
              Factor: The factor to use to compute the next retry attempt.
            </ResponseField>

            <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
              Initial Interval: Initial interval for the first retry attempt.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="max-interval" type="string | null" post={[]}>
              Max interval: Maximum interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>
        </ResponseField>

        <ResponseField name="log-server-rpc-timeout" type="string" post={['default="2s"','minLength: 1']}>
          Non-zero human-readable duration: Log Server RPC timeout

          Timeout waiting on log server response

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
        </ResponseField>

        <ResponseField name="maximum-inflight-records" type="integer" post={['default=1000','format: uint','minimum: 1']}>
          Maximum number of inflight records sequencer can accept

          Once this maximum is hit, sequencer will induce back pressure
          on clients. This controls the total number of records regardless of how many batches.

          Note that this will be increased to fit the biggest batch of records being enqueued.
        </ResponseField>

        <ResponseField name="read-batch-size" type="string" post={['default="32.0 KiB"','minLength: 1']}>
          Limits memory per remote batch read: When reading from a log-server, the server stops reading if the next record will tip over the
          total number of bytes allowed in this configuration option.

          Note the limit is not strict and the server will always allow at least a single record to be
          read even if that record exceeds the stated budget.
        </ResponseField>

        <ResponseField name="readahead-records" type="integer" post={['default=20','format: uint16','minimum: 1','maximum: 65535']}>
          Maximum number of records to prefetch from log servers

          The number of records bifrost will attempt to prefetch from replicated loglet's log-servers
          for every loglet reader (e.g. partition processor). Note that this mainly impacts readers
          that are not co-located with the loglet sequencer (i.e. partition processor followers).
        </ResponseField>

        <ResponseField name="readahead-trigger-ratio" type="number" post={['default=0.5','format: float']}>
          Trigger to prefetch more records

          When read-ahead is used (readahead-records), this value (percentage in float) will determine when
          readers should trigger a prefetch for another batch to fill up the buffer. For instance, if
          this value is 0.3, then bifrost will trigger a prefetch when 30% or more of the read-ahead
          slots become available (e.g. partition processor consumed records and freed up enough slots).

          The higher the value is, the longer bifrost will wait before it triggers the next fetch, potentially
          fetching more records as a result.

          To illustrate, if readahead-records is set to 100 and readahead-trigger-ratio is 1.0. Then
          bifrost will prefetch up to 100 records from log-servers and will not trigger the next
          prefetch unless the consumer consumes 100% of this buffer. This means that bifrost will
          read in batches but will not do while the consumer is still reading the previous batch.

          Value must be between 0 and 1. It will be clamped at `1.0`.
        </ResponseField>

        <ResponseField name="sequencer-inactivity-timeout" type="string" post={['default="15s"','minLength: 1']}>
          Non-zero human-readable duration: Sequencer inactivity timeout

          The sequencer is allowed to consider itself quiescent if it did not commit records for this period of time.
          It may use this to sends pre-emptive release/seal check requests to log-servers.

          The sequencer is also allowed to use this value as interval to send seal/release checks even if it's not quiescent.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
        </ResponseField>

        <ResponseField name="sequencer-retry-policy" post={[]}>
          Retry policy: Sequencer retry policy

          Backoff introduced when sequencer fail to find a suitable spread of log servers

          <Expandable title="Option 1: None">
            No retry strategy.

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 2: Fixed delay">
            Retry with a fixed delay strategy.

            <ResponseField name="interval" type="string" required post={['minLength: 1']}>
              Interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 3: Exponential">
            Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

            <ResponseField name="factor" type="number" required post={['format: float']}>
              Factor: The factor to use to compute the next retry attempt.
            </ResponseField>

            <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
              Initial Interval: Initial interval for the first retry attempt.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="max-interval" type="string | null" post={[]}>
              Max interval: Maximum interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="seal-retry-interval" type="string" post={['default="2s"','minLength: 1']}>
      Seal retry interval: Interval to wait between retries of loglet seal failures

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="bind-address" type="string | null" post={[]}>
  The combination of `bind-ip` and `bind-port` that will be used to bind

  This has precedence over `bind-ip` and `bind-port`

  Bind address: The local network address to bind on for tokio-console-server. This service uses default port 6669 and will create a unix-socket file at the data directory under the name `tokio.sock`

  Examples:
  "0.0.0.0:6669" or "127.0.0.1:6669"
</ResponseField>

<ResponseField name="bind-ip" type="string | null" post={['format: ip']}>
  Local interface IP address to listen on
</ResponseField>

<ResponseField name="bind-port" type="integer | null" post={['format: uint16','maximum: 65535']}>
  Network port to listen on
</ResponseField>

<ResponseField name="cluster-name" type="string" post={['default="localcluster"']}>
  Cluster name: A unique identifier for the cluster. All nodes in the same cluster should
  have the same.
</ResponseField>

<ResponseField name="connect-timeout" type="string" post={['default="10s"','minLength: 1']}>
  Connect timeout: How long to wait for a TCP connection to be established before considering
  it a failed attempt.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="default-journal-retention" type="string" post={['minLength: 1']}>
  Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
</ResponseField>

<ResponseField name="default-num-partitions" type="integer" post={['default=24','format: uint16','maximum: 65535']}>
  Partitions: Number of partitions that will be provisioned during initial cluster provisioning.
  partitions are the logical shards used to process messages.

  Cannot be higher than `65535` (You should almost never need as many partitions anyway)

  NOTE 1: This config entry only impacts the initial number of partitions, the
  value of this entry is ignored for provisioned nodes/clusters.

  NOTE 2: This will be renamed to `default-num-partitions` by default as of v1.3+

  Default: 24
</ResponseField>

<ResponseField name="default-replication" type="string" post={['default=1']}>
  Default replication factor: Configures the global default replication factor to be used by the the system.

  Note that this value only impacts the cluster initial provisioning and will not be respected after
  the cluster has been provisioned.

  To update existing clusters use the `restatectl` utility.
</ResponseField>

<ResponseField name="default-retry-policy" type="object" post={[]}>
  Default retry policy: The default retry policy to use for invocations.

  The retry policy can be customized on a service/handler basis, using the respective SDK APIs.
  Check [https://docs.restate.dev/services/configuration#retries](https://docs.restate.dev/services/configuration#retries) for more details.

  <Expandable title="Properties">
    <ResponseField name="exponentiation-factor" type="number" post={['default=2','format: float']}>
      Factor: The factor to use to compute the next retry attempt. Default: `2.0`.
    </ResponseField>

    <ResponseField name="initial-interval" type="string" post={['default="500ms"','minLength: 1']}>
      Initial Interval: Initial interval for the first retry attempt.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="max-attempts" type="anyOf" post={['default=70']}>
      Max attempts: Number of maximum attempts (including the initial) before giving up.
      No retries if set to 1.

      * `"unlimited"` : Unlimited retries.
      * `Option 2: Bounded number of retries.` : Bounded number of retries.
    </ResponseField>

    <ResponseField name="max-interval" type="string" post={['default="1m"','minLength: 1']}>
      Max interval: Maximum interval between retries.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="on-max-attempts" post={['default="pause"']}>
      On max attempts: Behavior when max attempts are reached.

      Set to `pause` to pause invocations when max attempts are reached.
      Set to `kill` to kill the invocation when max attempts are reached.

      For more details about the invocation lifecycle, check [https://docs.restate.dev/services/invocation/managing-invocations](https://docs.restate.dev/services/invocation/managing-invocations)

      * `"pause"` : Pause the invocation when max attempts are reached.
      * `"kill"` : Kill the invocation when max attempts are reached.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="default-thread-pool-size" type="integer | null" post={['default=null','format: uint']}>
  Default async runtime thread pool: Size of the default thread pool used to perform internal tasks.
  If not set, it defaults to the number of CPU cores.
</ResponseField>

<ResponseField name="disable-prometheus" type="boolean" post={['default=false']}>
  Disable prometheus metric recording and reporting. Default is `false`.
</ResponseField>

<ResponseField name="disable-telemetry" type="boolean" post={['default=false']}>
  Disable telemetry: Restate uses Scarf to collect anonymous usage data to help us understand how the software is being used.
  You can set this flag to true to disable this collection. It can also be set with the environment variable DO\_NOT\_TRACK=1.
</ResponseField>

<ResponseField name="experimental-kafka-batch-ingestion" type="boolean" post={['default=false']}>
  Experimental Kafka batch ingestion: Use the new experimental kafka ingestion path which leverages batching
  for a faster kafka ingestion.

  Set to `true` to enable the experimental ingestion mechanism.

  The legacy path will be removed in v1.7.

  Defaults to `false` in v1.6.
</ResponseField>

<ResponseField name="experimental-shuffler-batch-ingestion" type="boolean" post={['default=false']}>
  Experimental Shuffler batch ingestion: Use the new experimental batch ingestion path.

  Set to `true` to enable the experimental ingestion mechanism.

  The legacy path will be removed in v1.7.

  Defaults to `false` in v1.6.
</ResponseField>

<ResponseField name="force-node-id" type="integer | null" post={['default=null','format: uint32']}>
  If set, the node insists on acquiring this node ID.
</ResponseField>

<ResponseField name="gossip-extras-exchange-frequency" type="integer" post={['default=10','format: uint32','minimum: 1']}>
  Gossip extras exchange frequency: In addition to basic health/liveness information, the gossip protocol is used to exchange
  extra information about the roles hosted by this node. For instance, which partitions are
  currently running, their configuration versions, and the durable LSN of the corresponding
  partition databases. This information is sent every Nth gossip message. This setting
  controls the frequency of this exchange. For instance, `10` means that every 10th gossip
  message will contain the extra information about.
</ResponseField>

<ResponseField name="gossip-failure-threshold" type="integer" post={['default=10','format: uint32','minimum: 1']}>
  Gossip failure threshold: Specifies how many gossip intervals of inactivity need to pass before
  considering a node as dead.
</ResponseField>

<ResponseField name="gossip-fd-stability-threshold" type="integer" post={['default=3','format: uint32','minimum: 1']}>
  Gossips before failure detector is stable:
</ResponseField>

<ResponseField name="gossip-loneliness-threshold" type="integer" post={['default=30','format: uint32','minimum: 1']}>
  Gossip loneliness threshold: How many intervals need to pass without receiving any gossip messages before considering
  this node as potentially isolated/dead. This threshold is used in the case where the node
  can still send gossip messages but did not receive any. This can rarely happen in
  asymmetric network partitions.

  In this case, the node will advertise itself as dead in the gossip messages it sends out.

  Note: this threshold does not apply to a cluster that's configured with a single node.
</ResponseField>

<ResponseField name="gossip-num-peers" type="integer" post={['default=2','format: uint32','minimum: 1']}>
  Number of peers to gossip: On every gossip interval, how many peers each node attempts to gossip with. The default is
  optimized for small clusters (less than 5 nodes). On larger clusters, if gossip overhead is noticeable,
  consider reducing this value to 1.
</ResponseField>

<ResponseField name="gossip-suspect-interval" type="string" post={['default="5s"','minLength: 1']}>
  Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
</ResponseField>

<ResponseField name="gossip-tick-interval" type="string" post={['default="100ms"','minLength: 1']}>
  Gossip tick interval: The interval at which the failure detector will tick. Decrease this value for faster reaction
  to node failures. Note, that every tick comes with an overhead.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="gossip-time-skew-threshold" type="string" post={['default="1s"','minLength: 1']}>
  Gossips time skew threshold: The time skew is the maximum acceptable time difference between the local node and the time
  reported by peers via gossip messages. The time skew is also used to ignore gossip messages
  that are too old.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="hlc-max-drift" type="string" post={['default="0s"','minLength: 1']}>
  Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
</ResponseField>

<ResponseField name="http-keep-alive-options" type="object" post={[]}>
  HTTP/2 Keep-alive: Configuration for the HTTP/2 keep-alive mechanism, using PING frames.
  If unset, HTTP/2 keep-alive are disabled.

  <Expandable title="Properties">
    <ResponseField name="interval" type="string" post={['default="40s"','minLength: 1']}>
      HTTP/2 Keep-alive interval: Sets an interval for HTTP/2 PING frames should be sent to keep a
      connection alive.

      You should set this timeout with a value lower than the `abort_timeout`.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="timeout" type="string" post={['default="20s"','minLength: 1']}>
      Timeout: Sets a timeout for receiving an acknowledgement of the keep-alive ping.

      If the ping is not acknowledged within the timeout, the connection will
      be closed.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="http-proxy" type="string | null" post={['default=null']}>
  Proxy URI: A URI, such as `http://127.0.0.1:10001`, of a server to which all invocations should be sent, with the `Host` header set to the deployment URI.
  HTTPS proxy URIs are supported, but only HTTP endpoint traffic will be proxied currently.
  Can be overridden by the `HTTP_PROXY` environment variable.
</ResponseField>

<ResponseField name="ingress" type="object" post={[]}>
  Ingress options:

  <Expandable title="Properties">
    <ResponseField name="advertised-address" type="string | null" post={[]}>
      Address that other nodes will use to connect to this service.

      The full prefix that will be used to advertise this service publicly.
      For example, if this is set to `https://my-host` then others will use this
      as base URL to connect to this service.

      If unset, the advertised address will be inferred from public address of this node
      or it'll use the value supplied in `advertised-host` if set.

      advertised address: An externally accessible URI address for http-ingress-server. This can be set to unix:restate-data/ingress.sock to advertise the automatically created unix-socket instead of using tcp if needed

      Examples:
      "http//127.0.0.1:8080/" or "[https://my-host/](https://my-host/)" or "unix:/data/restate-data/ingress.sock"
    </ResponseField>

    <ResponseField name="advertised-host" type="string | null" post={[]}>
      Hostname to advertise for this service
    </ResponseField>

    <ResponseField name="advertised-ingress-endpoint" type="string | null" post={[]}>
      \[Deprecated] Use `advertised-address` instead.
      Ingress endpoint that the Web UI should use to interact with.

      advertised address: An externally accessible URI address for http-ingress-server. This can be set to unix:restate-data/ingress.sock to advertise the automatically created unix-socket instead of using tcp if needed

      Examples:
      "http//127.0.0.1:8080/" or "[https://my-host/](https://my-host/)" or "unix:/data/restate-data/ingress.sock"
    </ResponseField>

    <ResponseField name="bind-address" type="string | null" post={[]}>
      The combination of `bind-ip` and `bind-port` that will be used to bind

      This has precedence over `bind-ip` and `bind-port`

      Bind address: The local network address to bind on for http-ingress-server. This service uses default port 8080 and will create a unix-socket file at the data directory under the name `ingress.sock`

      Examples:
      "0.0.0.0:8080" or "127.0.0.1:8080"
    </ResponseField>

    <ResponseField name="bind-ip" type="string | null" post={['format: ip']}>
      Local interface IP address to listen on
    </ResponseField>

    <ResponseField name="bind-port" type="integer | null" post={['format: uint16','maximum: 65535']}>
      Network port to listen on
    </ResponseField>

    <ResponseField name="concurrent-api-requests-limit" type="integer | null" post={['default=null','format: uint','minimum: 1']}>
      Concurrency limit: Local concurrency limit to use to limit the amount of concurrent requests. If exceeded,
      the ingress will reply immediately with an appropriate status code. Default is unlimited.
    </ResponseField>

    <ResponseField name="ingestion" type="object" post={[]}>
      Ingestion Options: Settings for the ingestion client
      Currently only used by the Kafka ingress and the admin API.

      <Expandable title="Properties">
        <ResponseField name="connection-retry-policy" required post={[]}>
          Connection retry policy: Retry policy for the ingestion client. It must allow unlimited
          retries; if configured with a cap, the client falls back to
          retrying every 2 seconds.

          <Expandable title="Option 1: None">
            No retry strategy.

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 2: Fixed delay">
            Retry with a fixed delay strategy.

            <ResponseField name="interval" type="string" required post={['minLength: 1']}>
              Interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 3: Exponential">
            Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

            <ResponseField name="factor" type="number" required post={['format: float']}>
              Factor: The factor to use to compute the next retry attempt.
            </ResponseField>

            <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
              Initial Interval: Initial interval for the first retry attempt.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="max-interval" type="string | null" post={[]}>
              Max interval: Maximum interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>
        </ResponseField>

        <ResponseField name="inflight-memory-budget" type="string" required post={['minLength: 1']}>
          Inflight Memory Budget: Maximum total size of in-flight ingestion requests in bytes.
          Tune this to your workload so there are enough unpersisted
          requests for efficient batching without exhausting memory.

          Defaults to 1 MiB.
        </ResponseField>

        <ResponseField name="request-batch-size" type="string" required post={['minLength: 1']}>
          Request Batch Size: Maximum size of a single ingestion request batch.
          Tune to keep enough requests per batch for
          throughput; overly large batches can increase tail latency.

          Defaults to 50 KiB.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="kafka-clusters" type="array" post={['default=[]']}>
      <Expandable title="Array Items">
        <ResponseField name="item" type="object" post={[]}>
          Kafka cluster options: Configuration options to connect to a Kafka cluster.

          <Expandable title="Properties">
            <ResponseField name="brokers" type="array" required post={[]}>
              Servers: Initial list of brokers (host or host:port).

              <Expandable title="Array Items">
                <ResponseField name="item" type="string" post={[]} />
              </Expandable>
            </ResponseField>

            <ResponseField name="name" type="string" required post={[]}>
              Cluster name (Used to identify subscriptions).
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="listen-mode" type="oneOf | null" post={[]}>
      Listen on unix-sockets, TCP sockets, or both.

      The default is to listen on both.

      * `"unix"` : Exclusively listen on unix domain sockets

      If set, all services will listen exclusively on unix sockets, each service
      will create a socket file under the data directory.

      * `"tcp"` : Exclusively listen on TCP sockets
      * `"all"` : \[default] Listen on both Unix and TCP sockets
    </ResponseField>

    <ResponseField name="use-random-ports" type="boolean | null" post={[]}>
      Use random ports instead of the default port
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="initial-max-send-streams" type="integer | null" post={['default=null','format: uint']}>
  Initial Max Send Streams: Sets the initial maximum of locally initiated (send) streams.

  This value will be overwritten by the value included in the initial
  SETTINGS frame received from the peer as part of a \[connection preface].

  Default: None

  **NOTE**: Setting this value to None (default) users the default
  recommended value from HTTP2 specs
</ResponseField>

<ResponseField name="initialization-timeout" type="string" post={['default="5m"','minLength: 1']}>
  Initialization timeout: The timeout until the node gives up joining a cluster and initializing itself.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="listen-mode" type="oneOf | null" post={[]}>
  Listen on unix-sockets, TCP sockets, or both.

  The default is to listen on both.

  * `"unix"` : Exclusively listen on unix domain sockets

  If set, all services will listen exclusively on unix sockets, each service
  will create a socket file under the data directory.

  * `"tcp"` : Exclusively listen on TCP sockets
  * `"all"` : \[default] Listen on both Unix and TCP sockets
</ResponseField>

<ResponseField name="location" type="string" post={[]}>
  Node Location: Setting the location allows Restate to form a tree-like cluster topology.
  The value is written in the format of "region\[.zone]" to assign this node
  to a specific region, or to a zone within a region.

  The value of region and zone is arbitrary but whitespace and `.` are disallowed.

  NOTE: It's *strongly* recommended to not change the node's location string after
  its initial registration. Changing the location may result in data loss or data
  inconsistency if `log-server` is enabled on this node.

  When this value is not set, the node is considered to be in the *default* location.
  The *default* location means that the node is not assigned to any specific region or zone.

  Examples

  * `us-west` -- the node is in the `us-west` region.
  * `us-west.a1` -- the node is in the `us-west` region and in the `a1` zone.
  * \`\` -- \[default] the node is in the default location
</ResponseField>

<ResponseField name="log-disable-ansi-codes" type="boolean" post={['default=false']}>
  Disable ANSI in log output: Disable ANSI terminal codes for logs. This is useful when the log collector doesn't support processing ANSI terminal codes.
</ResponseField>

<ResponseField name="log-filter" type="string" post={['default="warn,restate=info"']}>
  Logging Filter: Log filter configuration. Can be overridden by the `RUST_LOG` environment variable.
  Check the [`RUST_LOG` documentation](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html) for more details how to configure it.
</ResponseField>

<ResponseField name="log-format" post={['default="pretty"']}>
  Logging format: Format to use when logging.

  * `Option 1: Pretty` : Enables verbose logging. Not recommended in production.
  * `Option 2: Compact` : Enables compact logging.
  * `Option 3: Json` : Enables json logging. You can use a json log collector to ingest these logs and further process them.
</ResponseField>

<ResponseField name="log-server" type="object" post={[]}>
  Log server options: Configuration is only used on nodes running with `log-server` role.

  <Expandable title="Properties">
    <ResponseField name="incoming-network-queue-length" type="integer" post={['default=1000','format: uint','minimum: 1']}>
      The number of messages that can queue up on input network stream while request processor is busy.
    </ResponseField>

    <ResponseField name="rocksdb-block-size" type="string | null" post={[]}>
      RocksDB block size: Uncompressed block size

      Default: 64KiB

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-compaction-readahead-size" type="string | null" post={[]}>
      RocksDB compaction readahead size in bytes: If non-zero, we perform bigger reads when doing compaction. If you're
      running RocksDB on spinning disks, you should set this to at least 2MB.
      That way RocksDB's compaction is doing sequential instead of random reads.

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-disable-direct-io-for-flush-and-compactions" type="boolean | null" post={[]}>
      Disable Direct IO for flush and compactions: Use O\_DIRECT for writes in background flush and compactions.
    </ResponseField>

    <ResponseField name="rocksdb-disable-direct-io-for-reads" type="boolean | null" post={[]}>
      Disable Direct IO for reads: Files will be opened in "direct I/O" mode
      which means that data r/w from the disk will not be cached or
      buffered. The hardware buffer of the devices may however still
      be used. Memory mapped files are not impacted by these parameters.
    </ResponseField>

    <ResponseField name="rocksdb-disable-statistics" type="boolean | null" post={[]}>
      Disable rocksdb statistics collection

      Default: False (statistics enabled)
    </ResponseField>

    <ResponseField name="rocksdb-disable-wal" type="boolean | null" post={[]}>
      Disable WAL: The default depends on the different rocksdb use-cases at Restate.

      Supports hot-reloading (Partial / Bifrost only)
    </ResponseField>

    <ResponseField name="rocksdb-disable-wal-fsync" type="boolean" post={['default=false']}>
      Disable fsync of WAL on every batch
    </ResponseField>

    <ResponseField name="rocksdb-log-keep-file-num" type="integer | null" post={['default=null','format: uint']}>
      RocksDB log keep file num: Number of info LOG files to keep

      Default: 1
    </ResponseField>

    <ResponseField name="rocksdb-log-level" type="string | null" post={['default=null']}>
      RocksDB log level: Verbosity of the LOG.

      Default: "error"

      Verbosity of the LOG.
    </ResponseField>

    <ResponseField name="rocksdb-log-max-file-size" type="string | null" post={['default=null']}>
      RocksDB log max file size: Max size of info LOG file

      Default: 64MB

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-max-background-jobs" type="integer | null" post={['format: uint32','minimum: 1']}>
      RocksDB max background jobs (flushes and compactions): Default: the number of CPU cores on this node.
    </ResponseField>

    <ResponseField name="rocksdb-max-sub-compactions" type="integer" post={['default=0','format: uint32']}>
      The maximum number of subcompactions to run in parallel.

      Setting this to 1 means no sub-compactions are allowed (i.e. only 1 thread will do the compaction).

      Default is 0 which maps to floor(number of CPU cores / 2)
    </ResponseField>

    <ResponseField name="rocksdb-max-wal-size" type="string" post={['minLength: 1']}>
      Human-readable bytes: The size limit of all WAL files

      Use this to limit the size of WAL files. If the size of all WAL files exceeds this limit,
      the oldest WAL file will be deleted and if needed, memtable flush will be triggered.

      Note: RocksDB internally counts the uncompressed bytes to determine the WAL size, and since the WAL
      is compressed, the actual size on disk will be significantly smaller than this value (\~1/4
      depending on the compression ratio). For instance, if this is set to "1 MiB", then rocksdb
      might decide to flush if the total WAL (on disk) reached \~260 KiB (compressed).

      Default is `0` which translates into 6 times the memory allocated for membtables for this
      database.
    </ResponseField>

    <ResponseField name="rocksdb-memory-budget" type="string | null" post={[]}>
      The memory budget for rocksdb memtables in bytes

      If this value is set, it overrides the ratio defined in `rocksdb-memory-ratio`.

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-memory-ratio" type="number" post={['default=0.5','format: float']}>
      The memory budget for rocksdb memtables as ratio

      This defines the total memory for rocksdb as a ratio of all memory available to the
      log-server.

      (See `rocksdb-total-memtables-ratio` in common).
    </ResponseField>

    <ResponseField name="rocksdb-statistics-level" type="oneOf | null" post={[]}>
      RocksDB statistics level: StatsLevel can be used to reduce statistics overhead by skipping certain
      types of stats in the stats collection process.

      Default: "except-detailed-timers"

      * `"disable-all"` : Disable all metrics
      * `"except-histogram-or-timers"` : Disable timer stats, and skip histogram stats
      * `"except-timers"` : Skip timer stats
      * `"except-detailed-timers"` : Collect all stats except time inside mutex lock AND time spent on
        compression.
      * `"except-time-for-mutex"` : Collect all stats except the counters requiring to get time inside the
        mutex lock.
      * `"all"` : Collect all stats, including measuring duration of mutex operations.
        If getting time is expensive on the platform to run, it can
        reduce scalability to more threads, especially for writes.
    </ResponseField>

    <ResponseField name="writer-batch-commit-count" type="integer" post={['default=5000','format: uint']}>
      Trigger a commit when the batch size exceeds this threshold.

      Set to 0 or 1 to commit the write batch on every command.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="max-journal-retention" type="string | null" post={[]}>
  Maximum journal retention duration that can be configured.
  When discovering a service deployment, or when modifying the journal retention using the Admin API, the given value will be clamped.

  Unset means no limit.

  Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
</ResponseField>

<ResponseField name="max-retry-policy-max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
  Max configurable value for retry policy max attempts: Maximum max attempts configurable in an invocation retry policy.
  When discovering a service deployment with configured retry policies, or when modifying the invocation retry policy using the Admin API, the given value will be clamped.

  `None` means no limit, that is infinite retries is enabled.
</ResponseField>

<ResponseField name="metadata-client" type="object" post={[]}>
  Metadata client options: The metadata client type to store metadata

  <Expandable title="Option 1: Store metadata on the replicated metadata store that runs on nodes with the metadata-server role.">
    <ResponseField name="addresses" type="array" post={[]}>
      Restate metadata server address list:

      <Expandable title="Array Items">
        <ResponseField name="item" type="string" post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="type" type="string" post={[]} />

    <ResponseField name="backoff-policy" post={[]}>
      Backoff policy used by the metadata client when it encounters concurrent modifications.

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="connect-timeout" type="string" post={['default="3s"','minLength: 1']}>
      Connect timeout: TCP connection timeout for connecting to the metadata store.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-interval" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Interval: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-timeout" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Timeout: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="message-size-limit" type="string | null" post={[]}>
      Metadata Network Message Size: Maximum size of network messages that metadata client can receive from a metadata server.

      If unset, defaults to `networking.message-size-limit`. If set, it will be clamped at
      the value of `networking.message-size-limit` since larger messages cannot be transmitted
      over the cluster internal network.

      Non-zero human-readable bytes
    </ResponseField>
  </Expandable>

  <Expandable
    title="Option 2: Store metadata on an external etcd cluster.

The addresses are formatted as `host:port`"
  >
    <ResponseField name="addresses" type="string" post={[]}>
      Etcd cluster node address list:
    </ResponseField>

    <ResponseField name="type" type="string" post={[]} />

    <ResponseField name="backoff-policy" post={[]}>
      Backoff policy used by the metadata client when it encounters concurrent modifications.

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="connect-timeout" type="string" post={['default="3s"','minLength: 1']}>
      Connect timeout: TCP connection timeout for connecting to the metadata store.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-interval" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Interval: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-timeout" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Timeout: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="message-size-limit" type="string | null" post={[]}>
      Metadata Network Message Size: Maximum size of network messages that metadata client can receive from a metadata server.

      If unset, defaults to `networking.message-size-limit`. If set, it will be clamped at
      the value of `networking.message-size-limit` since larger messages cannot be transmitted
      over the cluster internal network.

      Non-zero human-readable bytes
    </ResponseField>
  </Expandable>

  <Expandable title="Option 3: Store metadata on an external object store.">
    <ResponseField name="aws-access-key-id" type="string | null" post={[]}>
      AWS access key: Username for Minio, or consult the service documentation for other S3-compatible stores.
    </ResponseField>

    <ResponseField name="aws-allow-http" type="boolean | null" post={[]}>
      Allow insecure HTTP: Allow plain HTTP to be used with the object store endpoint. Required when the endpoint URL
      that isn't using HTTPS.
    </ResponseField>

    <ResponseField name="aws-endpoint-url" type="string | null" post={[]}>
      Object store API endpoint URL override: When you use Amazon S3, this is typically inferred from the region and there is no need to
      set it. With other object stores, you will have to provide an appropriate HTTP(S) endpoint.
      If *not* using HTTPS, also set `aws-allow-http` to `true`.
    </ResponseField>

    <ResponseField name="aws-profile" type="string | null" post={[]}>
      AWS profile: The AWS configuration profile to use for S3 object store destinations. If you use
      named profiles in your AWS configuration, you can replace all the other settings with
      a single profile reference. See the \[AWS documentation on profiles]
      ([https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)) for more.
    </ResponseField>

    <ResponseField name="aws-region" type="string | null" post={[]}>
      AWS region to use with S3 object store destinations. This may be inferred from the
      environment, for example the current region when running in EC2. Because of the
      request signing algorithm this must have a value. For Minio, you can generally
      set this to any string, such as `us-east-1`.
    </ResponseField>

    <ResponseField name="aws-secret-access-key" type="string | null" post={[]}>
      AWS secret key: Password for Minio, or consult the service documentation for other S3-compatible stores.
    </ResponseField>

    <ResponseField name="aws-session-token" type="string | null" post={[]}>
      AWS session token: This is only needed with short-term STS session credentials.
    </ResponseField>

    <ResponseField name="object-store-retry-policy" post={[]}>
      Error retry policy: Definition of a retry policy

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="path" type="string" post={[]}>
      Object store path for metadata storage: This location will be used to persist cluster metadata. Takes the form of a URL
      with `s3://` as the protocol and bucket name as the authority, plus an optional
      prefix specified as the path component.

      Example: `s3://bucket/prefix`
    </ResponseField>

    <ResponseField name="type" type="string" post={[]} />

    <ResponseField name="backoff-policy" post={[]}>
      Backoff policy used by the metadata client when it encounters concurrent modifications.

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="connect-timeout" type="string" post={['default="3s"','minLength: 1']}>
      Connect timeout: TCP connection timeout for connecting to the metadata store.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-interval" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Interval: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="keep-alive-timeout" type="string" post={['default="5s"','minLength: 1']}>
      Metadata Store Keep Alive Timeout: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="message-size-limit" type="string | null" post={[]}>
      Metadata Network Message Size: Maximum size of network messages that metadata client can receive from a metadata server.

      If unset, defaults to `networking.message-size-limit`. If set, it will be clamped at
      the value of `networking.message-size-limit` since larger messages cannot be transmitted
      over the cluster internal network.

      Non-zero human-readable bytes
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="metadata-fetch-from-peer-timeout" type="string" post={['default="3s"','minLength: 1']}>
  Timeout for metadata peer-to-peer fetching: When a node detects that a new metadata version exists, it'll attempt to fetch it from
  its peers. After this timeout duration has passed, the node will attempt to fetch the
  metadata from metadata store as well. This is to ensure that the nodes converge quickly
  while reducing the load on the metadata store.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="metadata-server" type="object" post={[]}>
  Metadata store options:

  <Expandable title="Properties">
    <ResponseField name="auto-join" type="boolean" post={['default=true']}>
      Auto join the metadata cluster when being started

      Defines whether this node should auto join the metadata store cluster when being started
      for the first time.
    </ResponseField>

    <ResponseField name="log-trim-threshold" type="integer | null" post={['default=1000','format: uint64']}>
      The raft log trim threshold: The threshold for trimming the raft log. The log will be trimmed if the number of apply entries
      exceeds this threshold. The default value is `1000`.
    </ResponseField>

    <ResponseField name="raft-election-tick" type="integer" post={['default=10','format: uint','minimum: 1']}>
      The number of ticks before triggering an election

      The number of ticks before triggering an election. The value must be larger than
      `raft_heartbeat_tick`. It's recommended to set `raft_election_tick = 10 * raft_heartbeat_tick`.
      Decrease this value if you want to react faster to failed leaders. Note, decreasing this
      value too much can lead to cluster instabilities due to falsely detecting dead leaders.
    </ResponseField>

    <ResponseField name="raft-heartbeat-tick" type="integer" post={['default=2','format: uint','minimum: 1']}>
      The number of ticks before sending a heartbeat

      A leader sends heartbeat messages to maintain its leadership every heartbeat ticks.
      Decrease this value to send heartbeats more often.
    </ResponseField>

    <ResponseField name="raft-tick-interval" type="string" post={['default="100ms"','minLength: 1']}>
      Non-zero human-readable duration: The raft tick interval

      The interval at which the raft node will tick. Decrease this value in order to let the Raft
      node react more quickly to changes. Note, that every tick comes with an overhead. Moreover,
      the tick interval directly affects the election timeout. If the election timeout becomes too
      small, then this can cause cluster instabilities due to frequent leader changes.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="request-queue-length" type="integer" post={['default=32','format: uint','minimum: 1']}>
      Limit number of in-flight requests

      Number of in-flight metadata store requests.
    </ResponseField>

    <ResponseField name="rocksdb-block-size" type="string | null" post={[]}>
      RocksDB block size: Uncompressed block size

      Default: 64KiB

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-compaction-readahead-size" type="string | null" post={[]}>
      RocksDB compaction readahead size in bytes: If non-zero, we perform bigger reads when doing compaction. If you're
      running RocksDB on spinning disks, you should set this to at least 2MB.
      That way RocksDB's compaction is doing sequential instead of random reads.

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-disable-direct-io-for-flush-and-compactions" type="boolean | null" post={[]}>
      Disable Direct IO for flush and compactions: Use O\_DIRECT for writes in background flush and compactions.
    </ResponseField>

    <ResponseField name="rocksdb-disable-direct-io-for-reads" type="boolean | null" post={[]}>
      Disable Direct IO for reads: Files will be opened in "direct I/O" mode
      which means that data r/w from the disk will not be cached or
      buffered. The hardware buffer of the devices may however still
      be used. Memory mapped files are not impacted by these parameters.
    </ResponseField>

    <ResponseField name="rocksdb-disable-statistics" type="boolean | null" post={[]}>
      Disable rocksdb statistics collection

      Default: False (statistics enabled)
    </ResponseField>

    <ResponseField name="rocksdb-disable-wal" type="boolean | null" post={[]}>
      Disable WAL: The default depends on the different rocksdb use-cases at Restate.

      Supports hot-reloading (Partial / Bifrost only)
    </ResponseField>

    <ResponseField name="rocksdb-log-keep-file-num" type="integer | null" post={['default=null','format: uint']}>
      RocksDB log keep file num: Number of info LOG files to keep

      Default: 1
    </ResponseField>

    <ResponseField name="rocksdb-log-level" type="string | null" post={['default=null']}>
      RocksDB log level: Verbosity of the LOG.

      Default: "error"

      Verbosity of the LOG.
    </ResponseField>

    <ResponseField name="rocksdb-log-max-file-size" type="string | null" post={['default=null']}>
      RocksDB log max file size: Max size of info LOG file

      Default: 64MB

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-max-background-jobs" type="integer | null" post={['format: uint32','minimum: 1']}>
      RocksDB max background jobs (flushes and compactions): Default: the number of CPU cores on this node.
    </ResponseField>

    <ResponseField name="rocksdb-memory-budget" type="string | null" post={[]}>
      The memory budget for rocksdb memtables in bytes

      If this value is set, it overrides the ratio defined in `rocksdb-memory-ratio`.

      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="rocksdb-memory-ratio" type="number" post={['default=0.009999999776482582','format: float']}>
      The memory budget for rocksdb memtables as ratio

      This defines the total memory for rocksdb as a ratio of all memory available to memtables
      (See `rocksdb-total-memtables-ratio` in common).
    </ResponseField>

    <ResponseField name="rocksdb-statistics-level" type="oneOf | null" post={[]}>
      RocksDB statistics level: StatsLevel can be used to reduce statistics overhead by skipping certain
      types of stats in the stats collection process.

      Default: "except-detailed-timers"

      * `"disable-all"` : Disable all metrics
      * `"except-histogram-or-timers"` : Disable timer stats, and skip histogram stats
      * `"except-timers"` : Skip timer stats
      * `"except-detailed-timers"` : Collect all stats except time inside mutex lock AND time spent on
        compression.
      * `"except-time-for-mutex"` : Collect all stats except the counters requiring to get time inside the
        mutex lock.
      * `"all"` : Collect all stats, including measuring duration of mutex operations.
        If getting time is expensive on the platform to run, it can
        reduce scalability to more threads, especially for writes.
    </ResponseField>

    <ResponseField name="status-update-interval" type="string" post={['default="5s"','minLength: 1']}>
      Non-zero human-readable duration: The status update interval

      The interval at which the raft node will update its status. Decrease this value in order to
      see more recent status updates.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="metadata-update-interval" type="string" post={['default="10s"','minLength: 1']}>
  Metadata update interval: The idle time after which the node will check for metadata updates from metadata store.
  This helps the node detect if it has been operating with stale metadata for extended period
  of time, primarily because it didn't interact with other peers in the cluster during that
  period.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="network-error-retry-policy" post={[]}>
  Network error retry policy: The retry policy for network related errors

  <Expandable title="Option 1: None">
    No retry strategy.

    <ResponseField name="type" type="string" required post={[]} />
  </Expandable>

  <Expandable title="Option 2: Fixed delay">
    Retry with a fixed delay strategy.

    <ResponseField name="interval" type="string" required post={['minLength: 1']}>
      Interval between retries.

      Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
    </ResponseField>

    <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
      Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
    </ResponseField>

    <ResponseField name="type" type="string" required post={[]} />
  </Expandable>

  <Expandable title="Option 3: Exponential">
    Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

    <ResponseField name="factor" type="number" required post={['format: float']}>
      Factor: The factor to use to compute the next retry attempt.
    </ResponseField>

    <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
      Initial Interval: Initial interval for the first retry attempt.

      Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
    </ResponseField>

    <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
      Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
    </ResponseField>

    <ResponseField name="max-interval" type="string | null" post={[]}>
      Max interval: Maximum interval between retries.

      Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

      Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
    </ResponseField>

    <ResponseField name="type" type="string" required post={[]} />
  </Expandable>
</ResponseField>

<ResponseField name="networking" type="object" post={[]}>
  Networking options: Common network configuration options for communicating with Restate cluster nodes. Note that
  similar keys are present in other config sections, such as in Service Client options.

  <Expandable title="Properties">
    <ResponseField name="connect-retry-policy" post={[]}>
      Connect retry policy: Retry policy to use for internal node-to-node networking.

      <Expandable title="Option 1: None">
        No retry strategy.

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 2: Fixed delay">
        Retry with a fixed delay strategy.

        <ResponseField name="interval" type="string" required post={['minLength: 1']}>
          Interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>

      <Expandable title="Option 3: Exponential">
        Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

        <ResponseField name="factor" type="number" required post={['format: float']}>
          Factor: The factor to use to compute the next retry attempt.
        </ResponseField>

        <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
          Initial Interval: Initial interval for the first retry attempt.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
          Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
        </ResponseField>

        <ResponseField name="max-interval" type="string | null" post={[]}>
          Max interval: Maximum interval between retries.

          Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="type" type="string" required post={[]} />
      </Expandable>
    </ResponseField>

    <ResponseField name="connect-timeout" type="string" post={['default="3s"','minLength: 1']}>
      Connect timeout: TCP connection timeout for Restate cluster node-to-node network connections.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="data-stream-window-size" type="string" post={['default="2.0 MiB"','minLength: 1']}>
      Non-zero human-readable bytes
    </ResponseField>

    <ResponseField name="disable-compression" type="boolean" post={['default=false']}>
      Disable Compression: Disables Zstd compression for internal gRPC network connections
    </ResponseField>

    <ResponseField name="handshake-timeout" type="string" post={['default="3s"','minLength: 1']}>
      Handshake timeout: Timeout for receiving a handshake response from Restate cluster peers.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="http2-adaptive-window" type="boolean" post={['default=true']}>
      HTTP/2 Adaptive Window:
    </ResponseField>

    <ResponseField name="http2-keep-alive-interval" type="string" post={['default="1s"','minLength: 1']}>
      HTTP/2 Keep Alive Interval: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="http2-keep-alive-timeout" type="string" post={['default="3s"','minLength: 1']}>
      HTTP/2 Keep Alive Timeout: Non-zero duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="message-size-limit" type="string" post={['minLength: 1']}>
      Non-zero human-readable bytes
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="no-proxy" type="string | null" post={['default=null']}>
  No proxy: IP subnets, addresses, and domain names eg `localhost,restate.dev,127.0.0.1,::1,192.168.1.0/24` that should not be proxied by the http\_proxy.
  IP addresses must not have ports, and IPv6 addresses must not be wrapped in '\[]'.
  Subdomains are also matched. An entry “\*” matches all hostnames.
  Can be overridden by the `NO_PROXY` environment variable, which supports comma separated values.
</ResponseField>

<ResponseField name="node-name" type="string | null" post={['default=null']}>
  Node Name: Unique name for this node in the cluster. The node must not change unless
  it's started with empty local store. It defaults to the node's hostname.
</ResponseField>

<ResponseField name="request-compression-threshold" type="string | null" post={['default="4.0 MiB"']}>
  Request Compression threshold: Request minimum size to enable compression.
  The request size includes the total of the journal replay and its framing using Restate service protocol, without accounting for the json envelope and the base 64 encoding.

  Default: 4MB (The default AWS Lambda Limit is 6MB, 4MB roughly accounts for +33% of Base64 and the json envelope).

  Human-readable bytes
</ResponseField>

<ResponseField name="request-identity-private-key-pem-file" type="string | null" post={['default=null']}>
  Request identity private key PEM file: A path to a file, such as "/var/secrets/key.pem", which contains exactly one ed25519 private
  key in PEM format. Such a file can be generated with `openssl genpkey -algorithm ed25519`.
  If provided, this key will be used to attach JWTs to requests from this client which
  SDKs may optionally verify, proving that the caller is a particular Restate instance.

  This file is currently only read on client creation, but this may change in future.
  Parsed public keys will be logged at INFO level in the same format that SDKs expect.
</ResponseField>

<ResponseField name="rocksdb-bg-threads" type="integer | null" post={['format: uint32','minimum: 1']}>
  Rocksdb Background Threads: The number of threads to reserve to Rocksdb background tasks. Defaults to the number of
  cores on the machine.
</ResponseField>

<ResponseField name="rocksdb-block-size" type="string | null" post={[]}>
  RocksDB block size: Uncompressed block size

  Default: 64KiB

  Non-zero human-readable bytes
</ResponseField>

<ResponseField name="rocksdb-compaction-readahead-size" type="string | null" post={[]}>
  RocksDB compaction readahead size in bytes: If non-zero, we perform bigger reads when doing compaction. If you're
  running RocksDB on spinning disks, you should set this to at least 2MB.
  That way RocksDB's compaction is doing sequential instead of random reads.

  Non-zero human-readable bytes
</ResponseField>

<ResponseField name="rocksdb-disable-direct-io-for-flush-and-compactions" type="boolean | null" post={[]}>
  Disable Direct IO for flush and compactions: Use O\_DIRECT for writes in background flush and compactions.
</ResponseField>

<ResponseField name="rocksdb-disable-direct-io-for-reads" type="boolean | null" post={[]}>
  Disable Direct IO for reads: Files will be opened in "direct I/O" mode
  which means that data r/w from the disk will not be cached or
  buffered. The hardware buffer of the devices may however still
  be used. Memory mapped files are not impacted by these parameters.
</ResponseField>

<ResponseField name="rocksdb-disable-statistics" type="boolean | null" post={[]}>
  Disable rocksdb statistics collection

  Default: False (statistics enabled)
</ResponseField>

<ResponseField name="rocksdb-disable-wal" type="boolean | null" post={[]}>
  Disable WAL: The default depends on the different rocksdb use-cases at Restate.

  Supports hot-reloading (Partial / Bifrost only)
</ResponseField>

<ResponseField name="rocksdb-high-priority-bg-threads" type="integer" post={['default=2','format: uint32','minimum: 1']}>
  Rocksdb High Priority Background Threads: The number of threads to reserve to high priority Rocksdb background tasks.
</ResponseField>

<ResponseField name="rocksdb-log-keep-file-num" type="integer | null" post={['default=null','format: uint']}>
  RocksDB log keep file num: Number of info LOG files to keep

  Default: 1
</ResponseField>

<ResponseField name="rocksdb-log-level" type="string | null" post={['default=null']}>
  RocksDB log level: Verbosity of the LOG.

  Default: "error"

  Verbosity of the LOG.
</ResponseField>

<ResponseField name="rocksdb-log-max-file-size" type="string | null" post={['default=null']}>
  RocksDB log max file size: Max size of info LOG file

  Default: 64MB

  Non-zero human-readable bytes
</ResponseField>

<ResponseField name="rocksdb-max-background-jobs" type="integer | null" post={['format: uint32','minimum: 1']}>
  RocksDB max background jobs (flushes and compactions): Default: the number of CPU cores on this node.
</ResponseField>

<ResponseField name="rocksdb-perf-level" post={['default="enable-count"']}>
  Rocksdb performance statistics level: Defines the level of PerfContext used internally by rocksdb. Default is `enable-count`
  which should be sufficient for most users. Note that higher levels incur a CPU cost and
  might slow down the critical path.

  * `"disable"` : Disable perf stats
  * `"enable-count"` : Enables only count stats
  * `"enable-time-except-for-mutex"` : Count stats and enable time stats except for mutexes
  * `"enable-time-and-c-p-u-time-except-for-mutex"` : Other than time, also measure CPU time counters. Still don't measure
    time (neither wall time nor CPU time) for mutexes
  * `"enable-time"` : Enables count and time stats
</ResponseField>

<ResponseField name="rocksdb-statistics-level" type="oneOf | null" post={[]}>
  RocksDB statistics level: StatsLevel can be used to reduce statistics overhead by skipping certain
  types of stats in the stats collection process.

  Default: "except-detailed-timers"

  * `"disable-all"` : Disable all metrics
  * `"except-histogram-or-timers"` : Disable timer stats, and skip histogram stats
  * `"except-timers"` : Skip timer stats
  * `"except-detailed-timers"` : Collect all stats except time inside mutex lock AND time spent on
    compression.
  * `"except-time-for-mutex"` : Collect all stats except the counters requiring to get time inside the
    mutex lock.
  * `"all"` : Collect all stats, including measuring duration of mutex operations.
    If getting time is expensive on the platform to run, it can
    reduce scalability to more threads, especially for writes.
</ResponseField>

<ResponseField name="rocksdb-total-memory-size" type="string" post={['default="2.0 GiB"','minLength: 1']}>
  Non-zero human-readable bytes
</ResponseField>

<ResponseField name="rocksdb-total-memtables-ratio" type="number" post={['default=0.8500000238418579','format: float']}>
  Rocksdb total memtable size ratio: The memory size used across all memtables (ratio between 0 to 1.0). This
  limits how much memory memtables can eat up from the value in rocksdb-total-memory-limit.
  When set to 0, memtables can take all available memory up to the value specified
  in rocksdb-total-memory-limit. This value will be sanitized to 1.0 if outside the valid bounds.
</ResponseField>

<ResponseField name="roles" type="array" post={['default=["http-ingress","admin","worker","log-server","metadata-server"]']}>
  Defines the roles which this Restate node should run, by default the node
  starts with all roles.

  <Expandable title="Array Items">
    <ResponseField name="item" post={[]}>
      * `"http-ingress"` : Serves HTTP ingress requests
      * `"admin"` : Admin runs cluster controller and user-facing admin APIs
      * `"worker"` : A worker runs partition processor (journal, state, and drives invocations)
      * `"log-server"` : Serves a log-server for replicated loglets
      * `"metadata-server"` : Serves the metadata store
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="shutdown-timeout" type="string" post={['default="1m"','minLength: 1']}>
  Shutdown grace timeout: This timeout is used when shutting down the various Restate components to drain all the internal queues.

  Examples:
  "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
</ResponseField>

<ResponseField name="storage-high-priority-bg-threads" type="integer | null" post={['format: uint','minimum: 1']}>
  Storage high priority thread pool

  This configures the restate-managed storage thread pool for performing
  high-priority or latency-sensitive storage tasks when the IO operation cannot
  be performed on in-memory caches.
</ResponseField>

<ResponseField name="storage-low-priority-bg-threads" type="integer | null" post={['format: uint','minimum: 1']}>
  Storage low priority thread pool

  This configures the restate-managed storage thread pool for performing
  low-priority or latency-insensitive storage tasks.
</ResponseField>

<ResponseField name="tokio-console-bind-address" type="string" post={[]}>
  Address to bind for the tokio-console tracing subscriber. If unset and restate-server is
  built with tokio-console support, it'll listen on `0.0.0.0:6669`.
</ResponseField>

<ResponseField name="tracing-endpoint" type="string | null" post={[]}>
  Tracing Endpoint: This is a shortcut to set both \[`Self::tracing_runtime_endpoint`], and \[`Self::tracing_services_endpoint`].

  Specify the tracing endpoint to send runtime traces to.
  Traces will be exported using [OTLP gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc)
  through [opentelemetry\_otlp](https://docs.rs/opentelemetry-otlp/0.12.0/opentelemetry_otlp/).

  To configure the sampling, please refer to the [opentelemetry autoconfigure docs](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/autoconfigure/README.md#sampler).
</ResponseField>

<ResponseField name="tracing-filter" type="string" required post={[]}>
  Tracing Filter: Distributed tracing exporter filter.
  Check the [`RUST_LOG` documentation](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html) for more details how to configure it.
</ResponseField>

<ResponseField name="tracing-headers" type="object" post={[]}>
  Additional tracing headers: Proxy type to implement HashMap\<HeaderName, HeaderValue> ser/de
  Use it directly or with `#[serde(with = \"serde_with::As::&lt;serde_with::FromInto&lt;restate_serde_util::SerdeableHeaderMap&gt;&gt;\")]`.
</ResponseField>

<ResponseField name="tracing-json-path" type="string | null" post={[]}>
  Distributed Tracing JSON Export Path: If set, an exporter will be configured to write traces to files using the Jaeger JSON format.
  Each trace file will start with the `trace` prefix.

  If unset, no traces will be written to file.

  It can be used to export traces in a structured format without configuring a Jaeger agent.

  To inspect the traces, open the Jaeger UI and use the Upload JSON feature to load and inspect them.
</ResponseField>

<ResponseField name="tracing-runtime-endpoint" type="string | null" post={[]}>
  Runtime Tracing Endpoint: Overrides \[`Self::tracing_endpoint`] for runtime traces

  Specify the tracing endpoint to send runtime traces to.
  Traces will be exported using [OTLP gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc)
  through [opentelemetry\_otlp](https://docs.rs/opentelemetry-otlp/0.12.0/opentelemetry_otlp/).

  To configure the sampling, please refer to the [opentelemetry autoconfigure docs](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/autoconfigure/README.md#sampler).
</ResponseField>

<ResponseField name="tracing-services-endpoint" type="string | null" post={[]}>
  Services Tracing Endpoint: Overrides \[`Self::tracing_endpoint`] for services traces

  Specify the tracing endpoint to send services traces to.
  Traces will be exported using [OTLP gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc)
  through [opentelemetry\_otlp](https://docs.rs/opentelemetry-otlp/0.12.0/opentelemetry_otlp/).

  To configure the sampling, please refer to the [opentelemetry autoconfigure docs](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/autoconfigure/README.md#sampler).
</ResponseField>

<ResponseField name="use-random-ports" type="boolean | null" post={[]}>
  Use random ports instead of the default port
</ResponseField>

<ResponseField name="worker" type="object" post={[]}>
  Worker options:

  <Expandable title="Properties">
    <ResponseField name="cleanup-interval" type="string" post={['default="1h"','minLength: 1']}>
      Cleanup interval: In order to clean up completed invocations, that is invocations invoked with an idempotency id, or workflows,
      Restate periodically scans among the completed invocations to check whether they need to be removed or not.
      This interval sets the scan interval of the cleanup procedure. Default: 1 hour.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D"
    </ResponseField>

    <ResponseField name="durability-mode" type="oneOf | null" post={[]}>
      Durability mode: Every partition store is backed up by a durable log that is used to recover the state of
      the partition on restart or failover. The durability mode defines the criteria used
      to determine whether a partition is considered fully durable or not at a given point in the
      log history. Once a partition is fully durable, its backing log is allowed to be trimmed to
      the durability point.

      This helps keeping the log's disk usage under control but it forces nodes that need to restore
      the state of the partition to fetch a snapshot of that partition that covers the changes up to
      and including the "durability point".

      Since v1.4.2 (not compatible with earlier versions)

      * `"none"` : This disables durability tracking and trimming completely.

      Trims and snapshots are still possible if performed manually or by an external
      component.

      * `"snapshot-and-replica-set"` : In this mode, a partition is considered durable when its state can be restored from
        any of members of the replica-set as well as the latest snapshot.

      In other words, do not trim unless **all** replicas cover this Lsn, **and** the snapshot.

      \[requires snapshot repository]
      DurabilityPoint = Min(Min(ReplicaSetDurablePoints), SnapshotDurablePoint)

      * `"balanced"` : In this mode, a partition is considered durable when its state can be restored from
        the snapshot and at least a single replica.

      Do not trim unless the Lsn is covered (durably) by *any* of the replicas **and** by
      the snapshot. Gives weight to snapshots over the durability of the replica-set but
      without ignoring the replica-set completely.

      In practice, this means that after a snapshot has been created on the leader, the
      system will wait for the nearest memtable flush that cover this Lsn before considering
      this Lsn for trimming. If the leader crashes before the memtable flush, we are confident
      that the leader will be able to replay the log without any trim-gaps. This is under the
      condition that the leader didn't move to another node. In the latter case, the system will
      fetch the snapshot as usual.

      \[requires snapshot repository]
      \[default] if snapshot repository configured
      DurabilityPoint = Min(Max(ReplicaSetDurablePoints), SnapshotDurablePoint)

      * `"replica-set-only"` : A partition is considered durable once all nodes in the replica-set are durable, regardless
        of the state of snapshots.

      Do not trim unless all replicas durably include this Lsn.

      default in standalone-mode with no snapshot repository configured

      \[default] if snapshot repository is not configured
      DurabilityPoint = Min(ReplicaSetDurablePoints)

      * `"snapshot-only"` : A partition is durable ONLY after a snapshot has been created.
        \[requires snapshot repository]

      Do not trim unless the Lsn is covered by the snapshot with no regard to the
      state of durability of the replica-set members.

      DurabilityPoint = SnapshotDurablePoint
    </ResponseField>

    <ResponseField name="internal-queue-length" type="integer" post={['default=1000','format: uint','minimum: 1']}>
      Internal queue for partition processor communication:
    </ResponseField>

    <ResponseField name="invoker" type="object" post={[]}>
      Invoker options:

      <Expandable title="Properties">
        <ResponseField name="abort-timeout" type="string" post={['default="10m"','minLength: 1']}>
          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="action-throttling" type="object | null" post={['default=null']}>
          Action throttling: Configures rate limiting for service actions at the node level.
          This throttling mechanism uses a token bucket algorithm to control the rate
          at which actions can be processed, helping to prevent resource exhaustion
          and maintain system stability under high load.

          The throttling limit is shared across all partitions running on this node,
          providing a global rate limit for the entire node rather than per-partition limits.
          When `unset`, no throttling is applied and actions are processed
          without throttling.

          Throttling options per invoker.

          <Expandable title="Properties">
            <ResponseField name="capacity" type="integer | null" post={['format: uint32','minimum: 1']}>
              Burst capacity: The maximum number of tokens the bucket can hold.
              Default to the rate value if not specified.
            </ResponseField>

            <ResponseField name="rate" type="string" required post={[]}>
              Refill rate: The rate at which the tokens are replenished.

              Syntax: `&lt;rate&gt;/&lt;unit&gt;` where `&lt;unit&gt;` is `s|sec|second`, `m|min|minute`, or `h|hr|hour`.
              unit defaults to per second if not specified.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="concurrent-invocations-limit" type="integer | null" post={['default=1000','format: uint','minimum: 1']}>
          Limit number of concurrent invocations from this node: Number of concurrent invocations that can be processed by the invoker.
        </ResponseField>

        <ResponseField name="in-memory-queue-length-limit" type="integer" post={['default=66049','format: uint','minimum: 1']}>
          Spill invocations to disk: Defines the threshold after which queues invocations will spill to disk at
          the path defined in `tmp-dir`. In other words, this is the number of invocations
          that can be kept in memory before spilling to disk. This is a per-partition limit.
        </ResponseField>

        <ResponseField name="inactivity-timeout" type="string" post={['default="1m"','minLength: 1']}>
          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="invocation-throttling" type="object | null" post={['default=null']}>
          Invocation throttling: Configures throttling for service invocations at the node level.
          This throttling mechanism uses a token bucket algorithm to control the rate
          at which invocations can be processed, helping to prevent resource exhaustion
          and maintain system stability under high load.

          The throttling limit is shared across all partitions running on this node,
          providing a global rate limit for the entire node rather than per-partition limits.
          When `unset`, no throttling is applied and invocations are processed
          without throttling.

          Throttling options per invoker.

          <Expandable title="Properties">
            <ResponseField name="capacity" type="integer | null" post={['format: uint32','minimum: 1']}>
              Burst capacity: The maximum number of tokens the bucket can hold.
              Default to the rate value if not specified.
            </ResponseField>

            <ResponseField name="rate" type="string" required post={[]}>
              Refill rate: The rate at which the tokens are replenished.

              Syntax: `&lt;rate&gt;/&lt;unit&gt;` where `&lt;unit&gt;` is `s|sec|second`, `m|min|minute`, or `h|hr|hour`.
              unit defaults to per second if not specified.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="message-size-limit" type="string | null" post={[]}>
          Message size limit: Maximum size of journal messages that can be received from a service. If a service sends a message
          larger than this limit, the invocation will fail.

          If unset, defaults to `networking.message-size-limit`. If set, it will be clamped at
          the value of `networking.message-size-limit` since larger messages cannot be transmitted
          over the cluster internal network.

          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="message-size-warning" type="string" post={['default="10.0 MiB"','minLength: 1']}>
          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="tmp-dir" type="string | null" post={['default=null']}>
          Temporary directory to use for the invoker temporary files.
          If empty, the system temporary directory will be used instead.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="max-command-batch-size" type="integer" post={['default=32','format: uint','minimum: 1']}>
      Maximum command batch size for partition processors: The maximum number of commands a partition processor will apply in a batch. The larger this
      value is, the higher the throughput and latency are.
    </ResponseField>

    <ResponseField name="num-timers-in-memory-limit" type="integer | null" post={['default=null','format: uint','minimum: 1']}>
      Num timers in memory limit: The number of timers in memory limit is used to bound the amount of timers loaded in memory. If this limit is set, when exceeding it, the timers farther in the future will be spilled to disk.
    </ResponseField>

    <ResponseField name="shuffle" type="object" post={[]}>
      Worker Shuffle Options: Settings for the shared ingestion client used by all workers to
      manage record ingestion across partitions (shuffle).

      <Expandable title="Properties">
        <ResponseField name="connection-retry-policy" required post={[]}>
          Connection retry policy: Retry policy for the ingestion client. It must allow unlimited
          retries; if configured with a cap, the client falls back to
          retrying every 2 seconds.

          <Expandable title="Option 1: None">
            No retry strategy.

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 2: Fixed delay">
            Retry with a fixed delay strategy.

            <ResponseField name="interval" type="string" required post={['minLength: 1']}>
              Interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 3: Exponential">
            Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

            <ResponseField name="factor" type="number" required post={['format: float']}>
              Factor: The factor to use to compute the next retry attempt.
            </ResponseField>

            <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
              Initial Interval: Initial interval for the first retry attempt.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="max-interval" type="string | null" post={[]}>
              Max interval: Maximum interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>
        </ResponseField>

        <ResponseField name="inflight-memory-budget" type="string" required post={['minLength: 1']}>
          Inflight Memory Budget: Maximum total size of in-flight ingestion requests in bytes.
          Tune this to your workload so there are enough unpersisted
          requests for efficient batching without exhausting memory.

          Defaults to 1 MiB.
        </ResponseField>

        <ResponseField name="request-batch-size" type="string" required post={['minLength: 1']}>
          Request Batch Size: Maximum size of a single ingestion request batch.
          Tune to keep enough requests per batch for
          throughput; overly large batches can increase tail latency.

          Defaults to 50 KiB.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="snapshots" type="object" post={[]}>
      Snapshots provide a mechanism for safely trimming the log and efficient bootstrapping of new
      worker nodes.

      <Expandable title="Properties">
        <ResponseField name="aws-access-key-id" type="string | null" post={[]}>
          AWS access key: Username for Minio, or consult the service documentation for other S3-compatible stores.
        </ResponseField>

        <ResponseField name="aws-allow-http" type="boolean | null" post={[]}>
          Allow insecure HTTP: Allow plain HTTP to be used with the object store endpoint. Required when the endpoint URL
          that isn't using HTTPS.
        </ResponseField>

        <ResponseField name="aws-endpoint-url" type="string | null" post={[]}>
          Object store API endpoint URL override: When you use Amazon S3, this is typically inferred from the region and there is no need to
          set it. With other object stores, you will have to provide an appropriate HTTP(S) endpoint.
          If *not* using HTTPS, also set `aws-allow-http` to `true`.
        </ResponseField>

        <ResponseField name="aws-profile" type="string | null" post={[]}>
          AWS profile: The AWS configuration profile to use for S3 object store destinations. If you use
          named profiles in your AWS configuration, you can replace all the other settings with
          a single profile reference. See the \[AWS documentation on profiles]
          ([https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)) for more.
        </ResponseField>

        <ResponseField name="aws-region" type="string | null" post={[]}>
          AWS region to use with S3 object store destinations. This may be inferred from the
          environment, for example the current region when running in EC2. Because of the
          request signing algorithm this must have a value. For Minio, you can generally
          set this to any string, such as `us-east-1`.
        </ResponseField>

        <ResponseField name="aws-secret-access-key" type="string | null" post={[]}>
          AWS secret key: Password for Minio, or consult the service documentation for other S3-compatible stores.
        </ResponseField>

        <ResponseField name="aws-session-token" type="string | null" post={[]}>
          AWS session token: This is only needed with short-term STS session credentials.
        </ResponseField>

        <ResponseField name="destination" type="string | null" post={['default=null']}>
          Snapshot destination URL: Base URL for cluster snapshots. Currently only supports the `s3://` protocol scheme.
          S3-compatible object stores must support ETag-based conditional writes.

          Default: `None`
        </ResponseField>

        <ResponseField name="enable-cleanup" type="boolean" post={['default=true']} />

        <ResponseField name="object-store-retry-policy" post={[]}>
          Error retry policy: A retry policy for dealing with retryable object store errors.

          <Expandable title="Option 1: None">
            No retry strategy.

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 2: Fixed delay">
            Retry with a fixed delay strategy.

            <ResponseField name="interval" type="string" required post={['minLength: 1']}>
              Interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>

          <Expandable title="Option 3: Exponential">
            Retry with an exponential strategy. The next retry is computed as `min(last_retry_interval * factor, max_interval)`.

            <ResponseField name="factor" type="number" required post={['format: float']}>
              Factor: The factor to use to compute the next retry attempt.
            </ResponseField>

            <ResponseField name="initial-interval" type="string" required post={['minLength: 1']}>
              Initial Interval: Initial interval for the first retry attempt.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="max-attempts" type="integer | null" post={['format: uint','minimum: 1']}>
              Max attempts: Number of maximum attempts before giving up. Infinite retries if unset.
            </ResponseField>

            <ResponseField name="max-interval" type="string | null" post={[]}>
              Max interval: Maximum interval between retries.

              Can be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.

              Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

              Examples:
              "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
            </ResponseField>

            <ResponseField name="type" type="string" required post={[]} />
          </Expandable>
        </ResponseField>

        <ResponseField name="snapshot-interval" type="string | null" post={[]}>
          Automatic snapshot time interval: A time interval at which partition snapshots will be created. If
          `snapshot-interval-num-records` is also set, it will be treated as an additional requirement
          before a snapshot is taken. Use both time-based and record-based intervals to reduce the
          number of snapshots created during times of low activity.

          Snapshot intervals are calculated based on the wall clock timestamps reported by cluster
          nodes, assuming a basic level of clock synchronization within the cluster.

          This setting does not influence explicitly requested snapshots triggered using `restatectl`.

          Default: `None` - automatic snapshots are disabled

          Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

          Examples:
          "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
        </ResponseField>

        <ResponseField name="snapshot-interval-num-records" type="integer | null" post={['default=null','format: uint64','minimum: 1']}>
          Automatic snapshot minimum records: Number of log records that trigger a snapshot to be created.

          As snapshots are created asynchronously, the actual number of new records that will trigger
          a snapshot will vary. The counter for the subsequent snapshot begins from the LSN at which
          the previous snapshot export was initiated.

          This setting does not influence explicitly requested snapshots triggered using `restatectl`.

          Default: `None` - automatic snapshots are disabled
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="storage" type="object" post={[]}>
      Storage options:

      <Expandable title="Properties">
        <ResponseField name="rocksdb-block-size" type="string | null" post={[]}>
          RocksDB block size: Uncompressed block size

          Default: 64KiB

          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="rocksdb-compaction-readahead-size" type="string | null" post={[]}>
          RocksDB compaction readahead size in bytes: If non-zero, we perform bigger reads when doing compaction. If you're
          running RocksDB on spinning disks, you should set this to at least 2MB.
          That way RocksDB's compaction is doing sequential instead of random reads.

          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="rocksdb-disable-compact-on-deletion" type="boolean" post={[]}>
          Disable compact-on-deletion collector: When set to `true`, disables RocksDB's CompactOnDeletionCollector for partition stores.
          The collector automatically triggers compaction when SST files accumulate a high density
          of tombstones (deletion markers), helping reclaim disk space after bulk deletions.

          This helps control space amplification when invocation journal retention expires and
          the cleaner purges completed invocations.

          Consider disabling this if you observe frequent unnecessary compactions triggered by
          the collector causing performance issues.
        </ResponseField>

        <ResponseField name="rocksdb-disable-direct-io-for-flush-and-compactions" type="boolean | null" post={[]}>
          Disable Direct IO for flush and compactions: Use O\_DIRECT for writes in background flush and compactions.
        </ResponseField>

        <ResponseField name="rocksdb-disable-direct-io-for-reads" type="boolean | null" post={[]}>
          Disable Direct IO for reads: Files will be opened in "direct I/O" mode
          which means that data r/w from the disk will not be cached or
          buffered. The hardware buffer of the devices may however still
          be used. Memory mapped files are not impacted by these parameters.
        </ResponseField>

        <ResponseField name="rocksdb-disable-statistics" type="boolean | null" post={[]}>
          Disable rocksdb statistics collection

          Default: False (statistics enabled)
        </ResponseField>

        <ResponseField name="rocksdb-disable-wal" type="boolean | null" post={[]}>
          Disable WAL: The default depends on the different rocksdb use-cases at Restate.

          Supports hot-reloading (Partial / Bifrost only)
        </ResponseField>

        <ResponseField name="rocksdb-log-keep-file-num" type="integer | null" post={['default=null','format: uint']}>
          RocksDB log keep file num: Number of info LOG files to keep

          Default: 1
        </ResponseField>

        <ResponseField name="rocksdb-log-level" type="string | null" post={['default=null']}>
          RocksDB log level: Verbosity of the LOG.

          Default: "error"

          Verbosity of the LOG.
        </ResponseField>

        <ResponseField name="rocksdb-log-max-file-size" type="string | null" post={['default=null']}>
          RocksDB log max file size: Max size of info LOG file

          Default: 64MB

          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="rocksdb-max-background-jobs" type="integer | null" post={['format: uint32','minimum: 1']}>
          RocksDB max background jobs (flushes and compactions): Default: the number of CPU cores on this node.
        </ResponseField>

        <ResponseField name="rocksdb-memory-budget" type="string | null" post={[]}>
          The memory budget for rocksdb memtables in bytes

          The total is divided evenly across partitions. The server will rebalance the memory budget
          periodically depending on the number of running partitions on this node.

          If this value is set, it overrides the ratio defined in `rocksdb-memory-ratio`.

          Non-zero human-readable bytes
        </ResponseField>

        <ResponseField name="rocksdb-memory-ratio" type="number" post={['default=0.49000000953674316','format: float']}>
          The memory budget for rocksdb memtables as ratio

          This defines the total memory for rocksdb as a ratio of all memory available to memtables
          (See `rocksdb-total-memtables-ratio` in common). The budget is then divided evenly across
          partitions.
        </ResponseField>

        <ResponseField name="rocksdb-statistics-level" type="oneOf | null" post={[]}>
          RocksDB statistics level: StatsLevel can be used to reduce statistics overhead by skipping certain
          types of stats in the stats collection process.

          Default: "except-detailed-timers"

          * `"disable-all"` : Disable all metrics
          * `"except-histogram-or-timers"` : Disable timer stats, and skip histogram stats
          * `"except-timers"` : Skip timer stats
          * `"except-detailed-timers"` : Collect all stats except time inside mutex lock AND time spent on
            compression.
          * `"except-time-for-mutex"` : Collect all stats except the counters requiring to get time inside the
            mutex lock.
          * `"all"` : Collect all stats, including measuring duration of mutex operations.
            If getting time is expensive on the platform to run, it can
            reduce scalability to more threads, especially for writes.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="trim-delay-interval" type="string" post={['minLength: 1']}>
      Human-readable duration: Duration string in either jiff human friendly or ISO8601 format. Check [https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing](https://docs.rs/jiff/latest/jiff/struct.Span.html#parsing-and-printing) for more details.

      Examples:
      "10 hours" or "5 days" or "5d" or "1h 4m" or "P40D" or "0"
    </ResponseField>
  </Expandable>
</ResponseField>
