Repository navigation
2026.10.48
Pre-releaseBreaking
-
Performance hardening — UUIDv7 keys, partitioned history, bounded jobs, connections and streams, external PostgreSQL, load test (#236) (73e3b437)
-
docs(openspec): design and tasks for 19-performance-hardening
-
docs(openspec): external PostgreSQL support in 19-performance-hardening
-
perf(ui): scan a table's rows for column widths once per page of data
Sizing a table's columns read every row of the page for its longest values on each
change of columns. The longest values are now kept per page of data and per column,
so a change of density or of shown columns no longer costs more as the list grows.- feat(ui): find in large tables
The browser's find cannot see the rows a large table has not drawn. Ctrl+F (Cmd+F on a
Mac) in a table now opens its own find, which searches every row, says how many
matches there are, and moves between them with Enter and Shift+Enter, scrolling to and
marking the row. Escape closes it and returns focus to the matched row.- perf(ui): list a user's sessions in the table
An account's sessions are not limited and were drawn as a plain list, so a very long
list drew every row. They are now a table that draws only the rows in view.- perf(db): bound database connections in count and time
The connection pool now has 16 connections per replica (ARTEMIS_STUDIO_DB_POOL_SIZE) and a request
that waits more than 5 s for one fails instead of queueing. Every connection starts with a 30 s
statement timeout, a 5 s lock timeout and a 60 s idle-in-transaction timeout, and the driver sets a
5 s connect timeout, a 15 min socket timeout and TCP keep-alive, so a stuck query or a partitioned
network no longer holds a thread without end. The limits are set per connection, not on the server,
so they hold on any PostgreSQL and through a session-mode pooler. Plugin pools take the same limits.
The plugin connection budget counts Studio's 16 connections instead of 10.The unused spring.task.scheduling setting is removed.
- perf(db): raise the statement timeout for long work inside its own transaction
The audit export, the lifecycle preview and the partition maintenance of the metric and message
index tables run with a statement timeout of up to ten minutes (SET LOCAL), in a transaction of their
own, so the 30 s limit on every other connection stays. The message index purge now detaches and
drops a partition in one transaction.- perf(db)!: ship one PostgreSQL configuration for the bundled database
The production, HA and development compose files mount deploy/postgres/postgresql.conf read-only
instead of each carrying its own list of server flags. It adds statement statistics
(pg_stat_statements with compute_query_id, created on first start), lock-wait logging, an explicit
io_method=worker, autovacuum logging, max_connections=150 and a five-minute idle-in-transaction
backstop to the earlier tuning. deploy/postgres/postgresql.tuning.conf is removed. -
Changed
-
Performance hardening — UUIDv7 keys, partitioned history, bounded jobs, connections and streams, external PostgreSQL, load test (#236) (73e3b437)
-
docs(openspec): design and tasks for 19-performance-hardening
-
docs(openspec): external PostgreSQL support in 19-performance-hardening
-
perf(ui): scan a table's rows for column widths once per page of data
Sizing a table's columns read every row of the page for its longest values on each
change of columns. The longest values are now kept per page of data and per column,
so a change of density or of shown columns no longer costs more as the list grows.- feat(ui): find in large tables
The browser's find cannot see the rows a large table has not drawn. Ctrl+F (Cmd+F on a
Mac) in a table now opens its own find, which searches every row, says how many
matches there are, and moves between them with Enter and Shift+Enter, scrolling to and
marking the row. Escape closes it and returns focus to the matched row.- perf(ui): list a user's sessions in the table
An account's sessions are not limited and were drawn as a plain list, so a very long
list drew every row. They are now a table that draws only the rows in view.- perf(db): bound database connections in count and time
The connection pool now has 16 connections per replica (ARTEMIS_STUDIO_DB_POOL_SIZE) and a request
that waits more than 5 s for one fails instead of queueing. Every connection starts with a 30 s
statement timeout, a 5 s lock timeout and a 60 s idle-in-transaction timeout, and the driver sets a
5 s connect timeout, a 15 min socket timeout and TCP keep-alive, so a stuck query or a partitioned
network no longer holds a thread without end. The limits are set per connection, not on the server,
so they hold on any PostgreSQL and through a session-mode pooler. Plugin pools take the same limits.
The plugin connection budget counts Studio's 16 connections instead of 10.The unused spring.task.scheduling setting is removed.
- perf(db): raise the statement timeout for long work inside its own transaction
The audit export, the lifecycle preview and the partition maintenance of the metric and message
index tables run with a statement timeout of up to ten minutes (SET LOCAL), in a transaction of their
own, so the 30 s limit on every other connection stays. The message index purge now detaches and
drops a partition in one transaction.- perf(db)!: ship one PostgreSQL configuration for the bundled database
The production, HA and development compose files mount deploy/postgres/postgresql.conf read-only
instead of each carrying its own list of server flags. It adds statement statistics
(pg_stat_statements with compute_query_id, created on first start), lock-wait logging, an explicit
io_method=worker, autovacuum logging, max_connections=150 and a five-minute idle-in-transaction
backstop to the earlier tuning. deploy/postgres/postgresql.tuning.conf is removed. -