The sizes and limits an operator needs to know: key and value sizes, queue lengths, time limits, default ports and default paths. By default LuraDB listens on port 3000 for HTTP, 3443 for HTTPS and 3100 for MCP.
A limit that a setting controls is listed with its setting and its default; the setting’s entry in the configuration reference says more. A limit marked fixed is part of the server and cannot be changed. Several fixed limits were settings until 0.5.1 and are listed with the setting they used to be; a luradb.toml that still sets one starts normally and the value is ignored.
All TCP listeners bind to one address. With authentication off, only a loopback address is accepted. The HTTPS port must differ from the HTTP port, and the MCP port from both of them.
Relative paths resolve against the working directory of the server, which is /var/lib/luradb under the package. Without --config, the server reads ./luradb.toml, else /etc/luradb/luradb.toml, else it runs with the built-in defaults.
| What |
Built-in default |
Packaged file |
| Configuration |
./luradb.toml, then /etc/luradb/luradb.toml |
/etc/luradb/luradb.toml |
storage.db_path |
luradb.db |
/var/lib/luradb/luradb.db |
storage.wal_path (a directory of segments) |
luradb.wal |
/var/lib/luradb/luradb.wal |
storage.vlog_path |
luradb.vlog |
/var/lib/luradb/luradb.vlog |
storage.sstable_dir |
luradb_sstables |
/var/lib/luradb/sstables |
storage.system_dir |
luradb_sys |
/var/lib/luradb/luradb_sys |
JSON engine: json.wal_path, json.vlog_path, json.sstable_dir |
luradb_json.wal, luradb_json.vlog, luradb_json_sstables |
the same, relative |
Relational engine: rel.wal_path, rel.vlog_path, rel.sstable_dir |
luradb_rel.wal, luradb_rel.vlog, luradb_rel_sstables |
the same, relative |
backup.dir |
luradb_backups |
the same, relative |
log.path |
not set: the log goes to standard output |
not set: journald |
server.tls_cert_path, server.tls_key_path |
/etc/luradb/tls/server.crt, /etc/luradb/tls/server.key |
the same |
Beside each configured data path, the files of data shard k live in a directory shard_<k>/; the write-ahead logs stay at their configured paths. No two data paths may resolve to the same location, symbolic links included.
| Limit |
Value |
| Request body of most endpoints: a key value, a document, a SQL request, a user or permission call |
2 MiB, fixed. A larger body answers 413 with Failed to buffer the request body: length limit exceeded. A body of exactly 2 MiB is accepted. |
| Body of a JSON bulk load |
json.bulk_body_limit_bytes, 64 MiB. The whole body is held in memory. |
| Body of a table import |
rel.import_body_limit_bytes, 64 MiB. |
| Body of a backup upload |
Not limited by the 2 MiB rule; the archive is streamed to disk. An archive of 12 MB was accepted. |
| Response of a relational query |
32 MiB, fixed (was rel.max_response_bytesremoved). A larger answer is 413. |
| One line of a backup archive |
64 MiB, fixed. |
| Largest single field the recovery of the write-ahead log reads |
96 MiB, fixed. The size limits of the engines must not exceed it, or the start is refused. |
| Log API |
100 lines by default, 1000 at most; the server reads at most 4 MiB of a file per call. |
| MCP |
A request of up to 4 MiB; an answer of up to 1 MiB. |
| Limit |
Value |
| Key-value key |
domains.max_user_key_length, 256 bytes. The engine stores it with a prefix of 19 bytes and has its own limit, lsm.max_key_length (256), which the two entries explain together. |
| Key-value value |
lsm.max_value_size is 512 KiB by default. In v0.5.1 a single PUT is limited by the 2 MiB request body instead, see the entry. |
| JSON document key |
At most 256 bytes, fixed (was json.max_document_key_lengthremoved), and json.lsm.max_key_length leaves 21 bytes less: 235 with its default. |
| JSON document |
json.lsm.max_value_size, 512 KiB. |
| JSON index field path |
128 characters, fixed. |
| Relational row |
rel.max_row_size, 512 KiB. |
| Relational primary-key and index values |
rel.lsm.max_key_length, 256 bytes. |
Relational text, KVREF and JSONREF value |
64 KiB, fixed (was rel.max_text_lenremoved). |
| Domain name |
50 characters of a-z, A-Z, 0-9, _ and -. Fixed for JSON and relational domains; for key-value domains it is domains.max_name_length, 50. |
| User name, backup schedule name |
1 to 50 characters of the same set. |
| Table, column, view and index name |
1 to 50 characters. |
| Value-log threshold |
lsm.vlog_inline_threshold: from 1024 bytes a value goes to the value log. |
| Limit |
Value |
Key listing (GET …/keys) |
limit 1000 by default, 10000 at most; a larger value is reduced to 10000. |
| JSON search |
limit 50 by default, 1000 at most; a larger value is reduced to 1000. |
| Bulk delete by prefix |
domains.max_bulk_delete_keys, 10000 keys. More answers 413 and nothing is deleted. |
| Rows of a relational query |
1000 without a LIMIT (fixed, was rel.default_limitremoved); no more than rel.max_limit (10000) with one. |
Rows an ORDER BY sorts or an unindexed join scans |
rel.max_sort_rows, 100000. |
| SQL statement |
64 KiB, fixed (was rel.max_statement_lenremoved). A longer one answers 400: statement length 65549 exceeds maximum of 65536 bytes. |
| Columns per table |
128, fixed (was rel.max_columnsremoved). The 129th answers 400: limit exceeded: max_columns (max 128). |
| Indexes per table |
16, fixed (was rel.max_indexes_per_tableremoved). |
| Tables per relational domain |
rel.max_tables_per_domain, 256. |
LEFT JOIN stages plus expand columns in one statement |
8, fixed (was rel.max_join_depthremoved). |
| Nesting of views |
3 levels, fixed. |
| Nesting of an expression |
100 levels, fixed. |
| Documents per atomic step of a JSON bulk load |
100, fixed (was json.bulk_batch_sizeremoved). |
| Documents per step of a re-index |
500, with a pause of 10 ms between steps, fixed (was json.reindex_batch_sizeremoved). |
| Limit |
Value |
| Writes waiting for the storage thread |
storage.wal_queue_capacity, 1024; 1 to 65536. |
| Requests one data shard takes at once |
multicore.shard_queue_capacity, 1024. The next one answers 503. |
| Read requests waiting for a reader thread |
multicore.reader_queue_capacity, 4096. |
| Requests per connection |
One at a time, HTTP/2 included. Open several connections for parallelism. |
| Open files of the service |
65536 (LimitNOFILE of the unit). |
| Reads and writes per second of a key-value or relational domain |
rate_limit.default_read_iops 1000, rate_limit.default_write_iops 500. More answers 429. |
| Backup or restore jobs |
One at a time. |
| Restore statuses kept |
The last 20 finished ones, in memory. |
| Errors listed in one restore status |
100. |
| Events buffered per consumer of the event stream |
events.channel_capacity, 256; the replay ring holds events.replay_buffer_size, 1024. |
| Change events buffered per watch stream of a key-value domain |
lsm.wal_event_channel_capacity, 256; the replay ring holds lsm.watch_replay_buffer_size, 1024. |
| Size of a write-ahead log segment |
64 MiB, fixed. The cap on all segments of an engine is storage.wal_max_size, 256 MiB. |
| Metrics window |
60 seconds, fixed. |
| Limit |
Value |
| A data shard that does not answer a health ping |
timeout after 250 ms, and /health answers 503. |
Retry-After |
1 second for 429 and a full queue; 5 seconds for 507. |
| Disk and memory watch |
Once a second. A write is accepted again after two readings in a row. |
| TLS handshake |
10 seconds, then the connection is dropped. |
| Stopping |
Open connections get 5 seconds to finish. |
| Segment of the write-ahead log with records in it |
Closed after 5 minutes, even if it is not full. |
| Backup scheduler |
Looks at the clock at every full minute; cron time is UTC; a schedule must fire within 4 years. |
Wait for the purge of a domain during mode: replace |
10 minutes. |
| Sweep that clears links to a deleted domain |
Every 10 seconds, 100 cells per column (was rel.cross_engine_sweep_interval_secsremoved and rel.cross_engine_sweep_batch_sizeremoved). |
| Cleanup of old log files |
Once for every 24 hours of uptime. |
| MCP sign-in |
An authorization code lives 60 seconds, an access token 1 hour, a refresh token 30 days; a client registration that was never used to sign in, 24 hours. Five failed sign-ins from one address within 15 minutes (an IPv6 /64 counts as one address) block further sign-ins from it; ten registrations per address and hour. |