# 2.11.6

Date: 2025-02-24
Tag: 2.11.6

## Announcement: `double` field type problems

Users who ever used the `double` field type in vinyl indexes might have their
indexes broken. Regardless of this release. Preferably prior to the upgrade the
users must get rid of the `double` indexed field type in vinyl. It must be
drop-in replaceable by the `number` field type.

The reason is that the sorting of `double` fields would always compare the field
values as C-language doubles, even when actual integers are stored. This works
fine for small numbers, but starting from 2^53 the double-style comparison
loses precision. For example, 18446744073709551615 and 18446744073709551614
would be considered the same values.

Besides, point-lookups in such index are going to be broken by design too -
looking up by 18446744073709551615 can return 18446744073709551614 and many
other integers around this point.

Unfortunately, even if the user doesn't have the `double` type in any vinyl
indexes, but **ever had it before**, it is still unsafe. A `double` index
altered to `number` or `scalar` would remain broken. It is **very important that
users rebuild all the vinyl indexes that have or ever had the `double` field
type in them**. What is worse, just an alter `double` -> `number` **won't
work**. The old index must be dropped and a new one must be created. In any
order.

See more details in gh-9965 and [gh-11017][gh-11017].

[gh-11017]: https://github.com/orgs/tarantool/discussions/11017

## Overview

2.11.6 is the next stable release in the [long-term support (LTS)
version][release_policy] of the 2.11.x release series.

The label "stable" means there are 2.11.x-based applications running in
production for quite a while without known crashes, incorrect results or
other showstopper bugs.

This release resolves 32 issues since the 2.11.5 version.

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

## Compatibility

Tarantool 2.11.x is backward compatible with Tarantool 1.10.x in 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/

## Bugs fixed

### Core

* Fixed a bug when a server could crash if a client sent an IPROTO replication
  request without waiting for pending requests to complete (gh-10155).
* Fixed a bug when the `sequence:reset()` call result was not recovered
  after the server restart (gh-9871).
* Fixed several bugs in the numbers comparison and hashing in tuple keys. It
  allowed to insert the same key multiple times into a unique index, and
  sometimes wouldn't allow to find an existing key in an index. Could happen
  when numbers were encoded in MessagePack suboptimally and when the `double`
  field type was used (gh-9965).
* Fixed the issue with hanging write operations forever triggered by heavy
  write load and WAL writing failures on cascade rollback (gh-11081).

### Memtx

* Fixed a crash when memtx MVCC tried to abort an already committed
  non-memtx transaction if it used a system space view or tried to
  perform a DDL operation (gh-10715).
* Fixed a bug when Tarantool with memtx MVCC enabled was aborted on
  workload with many `index:get()` operations reading nothing (gh-11022).

### Vinyl

* Fixed a bug when a deleted tuple wasn't purged from a secondary index data
  stored on disk in case it was updated more than once in the same transaction.
  The bug couldn't result in inconsistent query results, but it could lead to
  performance degradation and increased disk usage (gh-10820, gh-10822).
* Fixed a bug when joining a new replica to a master instance that experiences
  a heavy write load severely degrades the master instance performance.
  The fix should also speed up long-running scan requests (gh-10846).
* Fixed a bug when a tuple could disappear from a multikey index in case it
  replaced a tuple with duplicate multikey array entries created in the same
  transaction. With the enabled `defer_deletes` space option, the bug could
  also trigger a crash (gh-10869, gh-10870).
* Fixed a bug when the tuple cache was not properly invalidated in case
  a WAL write error occurred while committing a `space.delete()` operation.
  The bug could lead to a crash or an invalid read query result (gh-10879).
* Fixed a bug when a deleted secondary index key wasn't purged on compaction
  of a space with the `defer_deletes` option enabled (gh-10895).
* Fixed a bug in the tuple cache when a transaction operating in a read view
  could skip a tuple deleted after the read view creation (gh-11079).
* Fixed a bug in the tuple cache when a tuple could become inaccessible via
  a secondary index after a transaction rollback caused by a WAL write error
  (gh-11140).

### Replication

* RAFT requests are now sent with 0 (not local) GROUP_ID (gh-10727).
* Fixed a bug when the RAFT state wasn't sent during the `META_JOIN` stage,
  which could lead to split-brain (gh-10089).
* Fixed a bug when anonymous replicas could participate in elections or even
  be chosen as a leader. It is now forbidden to configure a replica so
  that `replication_anon` is `true` and `election_mode` is not `off`
  (gh-10561).

### LuaJIT

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

* Fixed compilation of `getmetatable()` for `io` objects.
* Fixed dirty reads from recorded `IR_NOP`.
* Fixed fusing optimization across `table.clear()` or insertion of a new key.
* Disabled FMA optimization on aarch64 to avoid incorrect results in floating
  point arithmetics. Optimization may be enabled for the JIT engine via the
  command `jit.opt.start("+fma")`.
* Fixed machine code zone overflow for trace recording on x86/x64.
* Fixed possible infinite loop during recording a chunk that uses upvalues.
* Fixed recording of `bit.bor()`/`bit.bxor()`/`bit.band()` with string
  arguments.
* Fixed parsing of `for _ in` loop.

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

* Fixed compiler warning in `setfenv()` / `getfenv()` with negative levels as
  the argument.
* Fixed register allocation for stores into sunk values (gh-10746).
* Fixed a crash when using a Lua C function as a vmevent handler for trace
  events.
* Fixed the compilation of `...` in `select()`.

### `log`

* Fixed log message being truncated to 1024 bytes with JSON logger (gh-10918).

### `net.box`

* Fixed a bug when the request counter used by a `net.box` client to implement
  the graceful shutdown protocol could underflow while it was fetching the
  schema from the remote end. In case of a debug build, the bug would crash
  the client. In case of a release build, the bug would result in a timeout
  while executing the remote server shutdown (gh-11062).

### Build

* Ubuntu Noble (24.04) is now supported.
