# 3.5.2

Date: 2026-05-25
Tag: 3.5.2

## 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 resolves 49 bugs since 3.5.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/

## Tools

Introduced the `misc.memprof.available` and `misc.sysprof.available` flags to
determine whether the corresponding profiler is available for the current
Tarantool build (gh-12215).

## Bugs fixed

### Core

* Tarantool does not rename user threads anymore (gh-12175).
* Fixed a crash that could happen if two DDL operations (index build or space
  format change) were executed on the same space and a WAL write error occurred
  (gh-11833).
* Fixed a bug when function IDs grew monotonously, resulting in an overflow
  after some amount of function modifications, even if the total number of
  functions was constant (gh-11849, gh-11851).
* Fixed performance degradation when updating space format or dropping a
  space due to inefficient tuple dictionary cleanup (gh-12115).
* Fixed a crash with transactional trigger on the `_space` space (gh-11766).
* Fixed a bug where `box.ctl.promote()` returned before the instance became
  writable (gh-10040).
* Fixed a bug where `.xlog.inprogress` files were not automatically deleted
  during server startup if the `wal_dir` value was not the default (gh-12081).
* Fixed a bug where a local space could not be truncated when the `_truncate`
  space was synchronous (gh-12585).


### Vinyl

* Fixed a bug when the dump task scheduler was not unthrottled by
  `box.snapshot()` (gh-12342).
* Fixed a bug when Tarantool crashed instead of raising an error in case it
  failed to apply an upsert statement
  ([ghs-158](https://github.com/tarantool/security/issues/158)).

### Replication

* Fixed two related bugs when concurrent `box.ctl.promote` invocations with
  `box.cfg.election_mode = 'manual'` would crash during (gh-11703) or after
  (gh-11708) server configuration via `box.cfg`.
* Fixed a bug where a replica on subscribe could get stuck in the `sync` state
  for the duration of `replication.timeout`. This issue was observable in
  `box.info.replication[...].upstream` and could lead to temporary
  inconveniences, such as the inability to run `box.ctl.promote()` (when
  `election_mode` was not `off`) (gh-12025).
* Fixed a bug where the replication could get stuck upon receipt
  of a 'promote' entry from a newly elected leader. This was
  likely to happen when the receiver itself had been a leader not
  long ago and still had some transactions in the synchro queue
  not yet written to the journal (gh-12205).

### LuaJIT

Backported patches from the vanilla LuaJIT trunk (gh-11691, gh-12134).
The following issues were fixed as part of this activity:

* Fixed incorrect emitting for `IR_TBAR` on aarch64.
* Fixed stack overflow handling for the trace exit.
* Fixed dangling `CType` references.
* Fixed closing VM state after early OOM.
* Fixed emitting for `IR_MUL` on x86/x64.
* Fixed incorrect `stp`/`ldp` instructions fusion on aarch64.
* Fixed SCEV entry invalidation when returning to a lower frame.
* Fixed macOS 15 / Clang 16 build.
* Fixed emitting for `IR_HREFK` on aarch64.
* Added `ffi.abi("dualnum")`.
* Fixed stack checks in varargs calls in the GC64 build.
* Fixed stack checks in `pcall()`/`xpcall()` in the GC64 build.
* Fixed the allocation limit for the no-JIT build.
* Fixed handling of OOM errors on stack resizing in `coroutine.resume()` and
  `lua_checkstack()`.
* Fixed recording of loops with a `-0` `step` value or `NaN` control values.
* Fixed error reporting when an error occurs during error handling.
* Fixed a dangling reference for FFI callbacks.
* Fixed `BC_UNM` for a `-0` argument in the dual-number mode.
* Fixed narrowing of unary minus in the dual-number mode.
* Fixed recording of `string.byte()`, `string.sub()`, and `string.find()`.
* Fixed missing type conversion for `BC_FORI` slots in the dual-number mode.
* Fixed various corner cases in VM events.
* Fixed constructor index resolution recording in the JIT compiler.
* Fixed a UBSan warning in `unpack()`.
* Fixed snapshot purge while recording a function header.

### SQL

* Fixed an issue where no error message would appear when creating
  a view with duplicate column names (gh-4545).

### Config

* Fixed a startup failure when a Tarantool 3.x instance configured via
  the declarative config joined a 2.x replica set, where the master had
  no instance or replica set names stored in its snapshot (gh-10426).
* Fixed a bug in the supervised bootstrap strategy when a replica could hang on
  startup while joining an already bootstrapped replica set (gh-11318).

### Datetime

* Fixed an assertion failure on an ambiguous case where day of year (`yday`,
  which defines calendar month and month day implicitly) and calendar month
  (without a month day) were both defined in the date text. Now such case is
  detected and an error is thrown (gh-11347).
* Fixed `tzoffset` calculations for cases like `new({timestamp=x, tz='Zone'})`
  (gh-12412).
* Fixed inconsistency between dates produced by `new({tzoffset=x})`
  and `d:set({tzoffset=x})` where `d.tz ~= ''` comes before `set()`
  (gh-7680, gh-12416).
* Now `datetime.new()` and `datetime_object:set()`
  check the timestamp value to be in the valid range (gh-12147).
* Fixed timestamp type checking in `set()`.
  For backward compatibility the `compat.datetime_setfn_timestamp_type_check`
  option has been introduced. It's disabled by default for now ('old' behavior),
  which means no type check is performed. The 'new' behavior (with type check)
  is planned to be set as the default in version 4.x (gh-12411).
* Fixed corruption of a datetime object by the `set()` function
  when an error occurs (gh-12171).

### Election

* Fixed a bug where a newly elected leader could become writable (`box.info.ro`
  is `false`) immediately after `box.info.election.state == 'leader'` but before
  it claimed the synchronous transactions queue (`box.info.synchro.queue.owner`
  is not this node). This could occur only when the synchronous queue was
  previously unclaimed, which typically happens on cluster startup (gh-12333).
* Fixed a bug where a replica could crash or exhibit undefined behavior when
  the election leader sent this replica a synchronous replication control
  command (promotion or demotion), but the replica received it just before
  performing a cascading journal rollback. This could happen if the
  `wal.queue_max_size` setting was reached (gh-12557).
