# 3.5.0

Date: 2025-08-27
Tag: 3.5.0

## Overview

Tarantool 3.x is the recommended release series. Users of Tarantool 2.11 are
encouraged to update to the latest 3.x release.

This release introduces 17 improvements and resolves 6 bugs since 3.4.1.

Please consider the full list of user-visible changes below.

## Compatibility

Tarantool 2.x and 3.x are compatible in the binary data layout, client-server
protocol, and replication protocol. It means upgrade may be performed
with zero downtime for read requests and the order-of-network-lag downtime for
write requests.

Please follow the [upgrade procedure][upgrade] to plan your update actions.

Users of Tarantool 2.x may be interested in the [compat][compat] options that
allow to imitate some 2.x behavior. This allows to perform application code
update step-by-step, not all-at-once.

[compat]: https://www.tarantool.io/en/doc/latest/reference/configuration/configuration_reference/#compat

[upgrade]: https://www.tarantool.io/en/doc/latest/book/admin/upgrades/

## Functionality added or changed

### Core

* Added support for fixed point decimal types `decimal32`, `decimal64`,
  `decimal128` and `decimal256`.
* Populated `box.tuple.format` objects with a new method `validate` (gh-9979).
* Populated space objects with a new field `format_object` (gh-9979).
* A new `box_status` function is now available in the C API. It is accessible
  in the TX thread without `box.info.status` Lua calls.
* Introduced a new C API function, `box_tuple_data()`, for inspecting
  the MsgPack tuple data without making copies (gh-11478).

### App

* Decimal support is changed to fit new fixed point decimal types.
  Limit on exponent is removed, precision is increased to 76 decimal digits
  and printing is done in scientific notation.
* Increased verbosity of logging system errors (gh-10116).
* Added conversion functions between `box_decimal_t` and scaled integers
  to C box API.
* Changed Lua `error.tostring()` to print error stack from effect to cause.
  The `Caused by: ` prefix for cause frames is added when the compat option
  `box_error_serialize_verbose` is set to `new`.
* Added a new method, `is_closed()`, to popen handle to check if the handle
  has been closed (gh-11492).

### Memtx

* Now it is possible to sort secondary keys with a new O(n) sorting
  algorithm that uses additional data written into the snapshot. The
  feature can be enabled with a new `memtx_use_sort_data` option in
  `box.cfg` (gh-10847).

### Config

* Introduced a `fail_if` tag for roles and scripts (gh-10987).
* `SIGUSR2` now can be used to trigger YAML configuration reload (gh-11585).
* Introduced a new `include` field for configuration files (gh-11510).

### Connpool

* `experimental.connpool` now automatically closes unused connections opened by
  `connpool.call()` and `connpool.filter()` upon the timeout configured using
  the `connpool.set_idle_timeout()` method or the `connpool.idle_timeout`
  configuration option.
* The `experimental.connpool` methods now try to reconnect to recently accessed
  instances when they become unavailable. Reconnect attempts happen after a
  constant interval and are stopped if the instance is no longer needed.
* `experimental.connpool` methods `call()` and `filter()` became faster. They do
  not wait for unavailable instances if it is known they have been inaccessible
  recently.

## Bugs fixed

### Core

* Fixed the creation of broken snapshots, which could contain outdated entries
  also applied in the following xlog files. This could happen if the
  transactions would pile up and fill the whole WAL queue
  (`box.cfg.wal_queue_max_size` was reached), and a snapshot was created at this
  moment (gh-11180).
* Fixed key corruption when pagination by tuple was used (gh-11221).
* Fixed a bug of missed setting box error name in some cases (gh-10708).

### Replication

* Disabled informational log messages that were printed while sending WAL logs
  to subscribed replicas (gh-11752).
* Fixed inconsistent data which could appear when the synchro queue was full
  (`box.cfg.replication_synchro_queue_max_size` was reached) and the
  transactions blocked on that queue were woken up or cancelled spuriously (for
  example, manually via `fiber:wakeup()` or `fiber:cancel()`). Specifically,
  transactions could get committed in a wrong order or newly joined replicas
  could have data not present on the master (gh-11180).

### Config

* Evaluate configurations for other cluster members lazily to speed up startup
  and reload of large configurations (500 instances or more).
