Date: 2023-02-20

Tag: 2.10.5

## Overview

2.10.5 is the 6th [stable][release_policy] version of the 2.10 release
series. It introduces 5 improvements and resolves 44 bugs since
2.10.4.

The "stable" label means that we have all planned features implemented and we
see no high-impact issues. However, if you encounter an issue, feel free to
[report it][issues] on GitHub.

[release_policy]: https://www.tarantool.io/en/doc/latest/dev_guide/release_management/#release-policy
[issues]: https://github.com/tarantool/tarantool/issues

## Compatibility

Tarantool 2.x is backward compatible with Tarantool 1.10.x in the binary data
layout, client-server protocol, and replication protocol.

Please [upgrade][upgrade] using the `box.schema.upgrade()` procedure to unlock
all the new features of the 2.x series.

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

## Functionality added or changed

### Core

* Introduced the `_vspace_sequence` system space view of the `_space_sequence`
  system space (gh-7858).
* The log produced during `box.cfg{}` now contains the build target triplet
  (for example, `Linux-x86_64-RelWithDebInfo`).

### Build

* OpenSUSE 15.1 and 15.2 are no longer supported.
* Updated libcurl to version 7.87.0 (gh-8150).
* Alpine Linux 3.16 is now supported.

## Bugs fixed

### Core

* Fixed a bug in fiber switching that could lead to a segmentation fault error
  on AArch64 systems (gh-7523, gh-7985).
* Fixed wrong CPU architecture reported in `tarantool.build.target` on M1/M2
  Macs (gh-7495).
* Fixed a bug when fields could be removed from a table stored in a variable
  when a logging function was called on this variable (for example,
  `log.info(a)`) (gh-3853).

* Fixed a logging bug: when logging tables with fields that have reserved
  internal names (such as `pid`) in the plain log format, such fields weren't
  logged (gh-3853).

* Added the `message` field when logging tables without such field in the JSON
  log format (gh-3853).

* Fixed an assertion on malformed JSON message written to the log (gh-7955).
* Fixed the bug because of which `box.session.on_auth` triggers were not
  invoked if the authenticated user didn't exist (gh-8017).
* Eliminated the possibility of user enumeration by analyzing errors sent in
  reply to malformed authentication requests (ghs-21).
* Fixed a bug when Tarantool could execute random bytes as a Lua code after fork
  on systems with a glibc version earlier than 2.29 (gh-7886).
* A referenced space or a function being used in a constraint can now be dropped
 in the same transaction with the referencing constraint or space (gh-7339).
* Fixed Tarantool being stuck during a crash on macOS (gh-8023).

* Fixed a bug that prevented collection of crash reports (gh-8083).
* Fixed a crash in `net.box` that happened if the error message raised by
  the server contained `printf` formatting specifiers, such as `%d` or `%s`
  (gh-8043).
* Fixed read-only statements executing successfully in transactions
  that were aborted by yield or timeout. Now, read-only statements fail in this
  case, just like write statements (gh-8123).
* Fixed a transaction conflict reported mistakenly when a key was deleted twice
  with MVCC engine enabled (gh-8122).
* `net.box` connections now contain information about sequences used by
  remote spaces (gh-7858).
* Fixed a crash that happened if a transaction was aborted (for example,
  by fiber yield with MVCC off) while the space's `on_replace` or
  `before_replace` trigger was running (gh-8027).
* Fixed a possible crash when attempting to update the same field in
  `tuple/space/index:update()` more than once (gh-8216).
* Fixed empty BITSET indexes crashing on `len` calls (gh-5809).
* Fixed a crash when functional indexes were used with very specific chunk size (gh-6786).

### Memtx

* Fixed a possible repeatable read violation with reverse iterators (gh-7755).
* Fixed a crash on series of transactions in memtx (gh-7756).
* Fixed a phantom read that could happen after reads from different indexes
  followed by a rollback (gh-7828).
* Fixed an assert in the MVCC engine (gh-7945).
* Fixed an assertion failure in MVCC during statement preparation (gh-8104).
* Fixed possible loss of a committed tuple after rollback of a prepared
  transaction (gh-7930).

### Vinyl

* Fixed a bug that could result in `select()` skipping an existing tuple after
  a rolled back `delete()` (gh-7947).

### Replication

* Fixed local space writes failing with error "Found uncommitted sync
  transactions from other instance with id 1" when synchronous transaction queue
  belongs to another instance and isn't empty (gh-7592).
* Fixed an assertion failure on master when a replica resubscribes with a
  smaller vclock than previously seen (gh-5158).
* A warning is now raised when `replica_id` is changed by a `before_replace`
  trigger while adding a new replica. Previously, there was an assertion
  checking this (gh-7846).

* Fixed a segmentation fault that happened when a `before_replace` trigger set
  on space `_cluster` returned nil (gh-7846).
* Fixed possible transaction conflict errors on applying a replication stream
  (gh-8121).

### Raft

* Fixed an assertion failure in case when an election candidate is reconfigured
  to a voter during an ongoning WAL write (gh-8169).
* Fixed nodes configured with `election_mode = "manual"` sometimes increasing
  the election term excessively after their promotion (gh-8168).

### LuaJIT

Backported patches from vanilla LuaJIT trunk (gh-7230). In the scope of this
activity, the following issues have been resolved:

* Fix `io.close()` for already closed standard output.
* Fix trace execution and stitching inside vmevent handler (gh-6782).
* Fixed `emit_loadi()` on x86/x64 emitting xor between condition check
  and jump instructions.
* Fix stack top for error message when raising the OOM error (gh-3840).
* Enabled external unwinding on several LuaJIT platforms. Now it is possible to
  handle ABI exceptions from Lua code (gh-6096).
* Disabled math.modf compilation due to its rare usage and difficulties with
  proper implementation of the corresponding JIT machinery.
* Fixed inconsistent behaviour on signed zeros for JIT-compiled unary minus
  (gh-6976).
* Fixed `IR_HREF` hash calculations for non-string GC objects for GC64.
* Fixed assembling of type-check-only variant of `IR_SLOAD`.
* Enabled the platform profiler for Tarantool built with GC64 mode (gh-7919).
* Added full-range lightuserdata support to the `luajit-gdb.py` extension
  (gh-6481).

Backported patches from vanilla LuaJIT trunk (gh-8069). In the scope of this
activity, the following issues have been resolved:

* Fixed loop realigment for dual-number mode
* Fixed os.date() for wider libc strftime() compatibility.
* Fix interval parsing for sysprof for dual-number mode.

### Lua

* Fixed alias detection in the YAML serializer in case the input contains
  objects that implement the `__serialize` meta method (gh-8240).

### SQL

* Fixed a bug when collation could change the type of a built-in function
  argument (gh-7992).
* Fixed several bugs happening because of improper handling of `malloc()`
  failures. (ghs-65, 66, 67, 68).

### Box

* Fixed a possible error during rollback of read-only transaction
  statements (gh-5501).
* Fixed a bug in `space_object:create_index()` when `collation` option is not
  set. Now it is inherited from the space format (gh-5104).
* Eliminated a code injection vulnerability in the processing of the
  `replication_synchro_quorum` `box.cfg()` option (ghs-20, GHSA-74jr-2fq7-vp42).

### Datetime

* Fixed a segmentation fault that happened when the value passed to the ``%f``
  modifier of ``datetime_object:format()`` was too big (ghs-31).

### Fiber

* Fixed the assertion fail in `cord_on_yield` (gh-6647).

### Log

* Fixed an incorrect facility value in syslog on Alpine and OpenBSD (gh-8269).

### Build

* Fixed `-Werror` build fail on Clang 15 (gh-8110).
