[25.4.1] - 2025-10-02
Features
- Support unique indexes with non-sharded columns on sharded tables, with sharding key prefix provided
- Introduce the governor script to add `is_default` column to the `_pico_tier` table
- Pgproto now reports more verbose TLS error messages
- Validate cluster UUID during IPROTO handshake and propagate `cluster_uuid` via IPROTO_ID. Connections with a mismatching `cluster_uuid` are rejected, ensuring cross-cluster isolation.
- Instance's which loose ability to apply raft log updates will automatically
become Offline. (See also https://git.picodata.io/core/picodata/-/issues/2238).
- Support TLS in IPROTO for intra-cluster communication and CLI.
- Configure via new config section: `instance.iproto_tls`;
- Run CLI with new arguments: `--tls-cert`, `--tls-key`, `--tls-ca`.
- Support TLS certificate authentication
- Use the certificate's Common Name (CN) field as the username;
- For example, use `CN=dbuser@company.com` or `CN=dbuser` in the certificate to authenticate the user "dbuser";
- This method takes precedence over other authentication mechanisms.
- New ALTER SYSTEM parameter `plugin_check_migration_hash` (default: true)
allows disabling plugin migration file checksum validation. This allows plugin
authors to more easily fix mistakes in migration files.
- It is now possible to use `scram-sha256` auth method for old and new users.
Currently, the method is only compatible with pgproto, which means it
won't be available for picodata plugins or iproto connections.
Observability
- `instance_name` is now the primary label for Prometheus metrics.
- Added the metric `pico_info_uptime{instance_name, instance_dir_name, replicaset, tier, cluster_name}`.
- Updated Grafana dashboard: legends now use `{{instance_name}}`.
SQL
- SQL supports scalar function `abs()`.
- Multiple `OPTIONS` specified in an SQL query no longer result in an error.
Instead, the rightmost option takes precedence.
- SQL now supports the `AUDIT POLICY` operation to enable or disable audit logging of DML operations for specific users.
- Use cases:
- `AUDIT POLICY dml_default BY dbuser` - enables audit logging of DML operations for user "dbuser"
- `AUDIT POLICY dml_default EXCEPT dbuser` - disables audit logging of DML operations for user "dbuser"
- Currently, only one policy named `dml_default` is supported.
- Maximum value for `Integer` and `Unsigned` type is ***9223372036854775807***.
Fixes
- Fixed "instance is already joined" error if picodata crashes during reboostrap
(see also https://git.picodata.io/core/picodata/-/issues/2077).
- Supported detecting and fixing broken replication.
- Remove unnecessary timeout on local Unix domain sockets in `picodata admin` command.
Unlike network sockets, local sockets don't silently hang - a server crash
immediately breaks the connection, making timeouts redundant. This fixes an issue
where long-running plugin commands could be incorrectly aborted due to the
artificial timeout.
- Supported backoff strategies when configuring vshard from the governor.
- Fixed restart the whole cluster at once taking too long.
- Fixed an issue where `cluster.shredding` option does not get applied on instance restart.
- `EXPLAIN` queries now support `OPTION` (e.g. `EXPLAIN SELECT 1 OPTION (SQL_VDBE_OPCODE_MAX = 6)`)
- Fixed joining a replica after expel with the same instance name as the
expelled one (see also https://git.picodata.io/core/picodata/-/issues/2173).
- Fixed an out-of-memory crash when using Response::encode_rmp with large
collections in plugin API (see also https://git.picodata.io/core/picodata/-/issues/2028).
- Upgraded luajit to fix several issues.
See https://git.picodata.io/core/tarantool/-/merge_requests/282 for details.
- Fixed bizarre row order produced by ORDER BY <uuid>.
- Fixed restarting the cluster without some of the voters
(see also https://git.picodata.io/core/picodata/-/issues/2202).
- Fixed potential undefined behavior in plugin RPC handler arguments.
- Picodata now loads all certificates from `ca.crt`, not just the first one.
- Fixed a possible state corruption in case picodata crashes after receiving a
raft snapshot with a stale schema version.
- Fixed TRUNCATE operation for global tables.
CLI
- Authentication method flags now use automatic recognition system, instead
of relying on default values, delivering less error-prone and complex user
experience.
See <https://git.picodata.io/core/picodata/-/issues/1973>.
- `picodata status` and `picodata plugin configure` now support execution with
custom user, determining authentication method automatically on it's own.
WARNING: If you do not specify an authentication method, it will be found
out by brute force, which may lead to the user being blocked if the number of
authorization attempts exceeds the limits.
See <https://git.picodata.io/core/picodata/issues/1734>.
- `picodata plugin configure` now prints a message on success for better UX.
See <https://git.picodata.io/core/picodata/-/issues/1904>.
- `picodata plugin configure` now returns a success code, instead of non-zero
when trying to change plugin service parameters with the same values.
See <https://git.picodata.io/core/picodata/-/issues/2222>.
Plugin API
- `internal::authenticate` is now deprecated, and is a re-export of the
same auth function in a separate module `authentication::authenticate`.
See <https://git.picodata.io/core/picodata/-/issues/2007>.
WebUI
- display expelled state