questdb/questdb · error · ServerConfigurationException

${PropertyKey.QWP_MAX_UNCOMMITTED_ROWS.propertyPath} must be

Error message

${PropertyKey.QWP_MAX_UNCOMMITTED_ROWS.propertyPath} must be at least 1

What it means

Validates qwp.max.uncommitted.rows (PropertyKey.QWP_MAX_UNCOMMITTED_ROWS, default QwpConstants.DEFAULT_MAX_UNCOMMITTED_ROWS), the global uncommitted-row budget for QWP ingestion. Values below 1 (0 or negative) are rejected: a non-positive commit threshold would never trigger commits and could grow memory without bound, so the server refuses to start.

Source

Thrown at core/src/main/java/io/questdb/PropServerConfiguration.java:2017

            }
            this.qwpMaxRowsPerTable = getInt(properties, env, PropertyKey.QWP_MAX_ROWS_PER_TABLE, QwpConstants.DEFAULT_MAX_ROWS_PER_TABLE);
            if (qwpMaxRowsPerTable < 1 || qwpMaxRowsPerTable > QwpConstants.DEFAULT_MAX_ROWS_PER_TABLE) {
                throw new ServerConfigurationException(
                        PropertyKey.QWP_MAX_ROWS_PER_TABLE.getPropertyPath()
                                + " must be between 1 and "
                                + QwpConstants.DEFAULT_MAX_ROWS_PER_TABLE
                );
            }
            this.qwpMaxTablesPerConnection = getInt(properties, env, PropertyKey.QWP_MAX_TABLES_PER_CONNECTION, QwpConstants.DEFAULT_MAX_TABLES_PER_CONNECTION);
            if (qwpMaxTablesPerConnection < 1) {
                throw new ServerConfigurationException(
                        PropertyKey.QWP_MAX_TABLES_PER_CONNECTION.getPropertyPath()
                                + " must be at least 1"
                );
            }
            this.qwpMaxUncommittedRows = getLong(properties, env, PropertyKey.QWP_MAX_UNCOMMITTED_ROWS, QwpConstants.DEFAULT_MAX_UNCOMMITTED_ROWS);
            if (qwpMaxUncommittedRows < 1) {
                throw new ServerConfigurationException(
                        PropertyKey.QWP_MAX_UNCOMMITTED_ROWS.getPropertyPath()
                                + " must be at least 1"
                );
            }
            long qwpUdpCommitInterval = getMillis(properties, env, PropertyKey.QWP_UDP_COMMIT_INTERVAL, COMMIT_INTERVAL_DEFAULT);
            if (qwpUdpCommitInterval < 1L) {
                throw new ServerConfigurationException(
                        PropertyKey.QWP_UDP_COMMIT_INTERVAL.getPropertyPath()
                                + " must be at least 1ms"
                );
            }
            this.qwpUdpCommitInterval = qwpUdpCommitInterval;
            int qwpUdpMaxUncommittedDatagrams = getInt(properties, env, PropertyKey.QWP_UDP_MAX_UNCOMMITTED_DATAGRAMS, 1_048_576);
            if (qwpUdpMaxUncommittedDatagrams < 1) {
                throw new ServerConfigurationException(
                        PropertyKey.QWP_UDP_MAX_UNCOMMITTED_DATAGRAMS.getPropertyPath()
                                + " must be at least 1"
                );

View on GitHub (pinned to 6610ab113b)

Solutions

  1. Set qwp.max.uncommitted.rows to a positive value, e.g. 500000
  2. If you want commits driven mainly by the interval, set a large row budget rather than 0
  3. Leave the key unset for the default

Example fix

# before
qwp.max.uncommitted.rows=0

# after
qwp.max.uncommitted.rows=500000
Defensive patterns

Strategy: validation

Validate before calling

long rows = Long.parseLong(firstNonBlank(props.get("qwp.max.uncommitted.rows"), String.valueOf(DEFAULT)));
if (rows < 1) {
    throw new IllegalStateException("qwp.max.uncommitted.rows must be >= 1, got " + rows);
}

Prevention

When it happens

Trigger: Setting qwp.max.uncommitted.rows=0 or a negative long in server.conf / env. Read with getLong() and checked with '< 1' immediately after, before the UDP commit interval parsing that follows.

Common situations: Trying to switch to time-based-only commits by zeroing the row threshold (use a large value instead); copy-paste from an example config with a placeholder 0; environment templating emitting 0 for unset variables.

Related errors


AI-assisted analysis of questdb/questdb@6610ab113b (2026-08-14). Data as JSON: /api/errors/8eff07230dbe2303. Report an issue: GitHub.