Date: 2023-12-07
Tag: 2.11.2

## Overview

2.11.2 is the 3rd [stable][release_policy] version of the 2.11 release
series. It resolves 38 bugs since 2.11.1.

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/

## Bugs fixed

### Core

* Fixed a crash that could happen when inserting an index definition with an
  empty parts list directly into `box.space._index` (gh-8688).
* Fixed the memory leak on unpacking an invalid MsgPack error extension
  (gh-8921).
* Fixed a use-after-free bug in fiber recycling code (gh-9020).
* Fixed a use-after-free bug in iproto server code (gh-9037).
* Fixed a heap-buffer-overflow bug in fiber creation code (gh-9026).
* Eliminated implicit conversion of unprintable utf-8 strings to binary blobs
  when encoded in YAML. Now unprintable characters are encoded as escaped utf-8
  code points, for example, `\x80` or `\u200B` (gh-8756).
* An error is no longer raised on an attempt to print a dead fiber (gh-4265).
* Fixed a possible out-of-bound write in debug build on unpacking a MsgPack
  error extension (gh-9098).
* Fixed a bug that caused a replication error after calling
  `box.schema.downgrade` (gh-9049).
* Fixed a possible crash when unpacking an invalid MsgPack error extension
  (gh-9136).
* Fixed a wrong assertion in index comparators when comparing decimals with
  floats greater than `1e38`. The error was present only in the debug build.
  Despite the failing assertion, the behavior after the assertion was correct
  (gh-8472).
* Fixed a bug that could result in the incorrect `space:bsize()` when altering
  a primary index concurrently with DML operations (gh-9247).
* Fixed a crash that happened while printing the stack trace on a stack
  overflow bug (gh-9222).
* Fixed the behavior of `log.cfg{modules = ...}`. Now, instead of merging the
  new log modules configuration with the old one, it completely overwrites the
  current configuration, which is consistent with `box.cfg{log_modules = ...}`
  (gh-7962).
* Fixed a bug in the network buffer that could result in a crash when there are
  a lot of pending requests (gh-9218)
* Fixed a potential data corruption when the number of tuples in a hash index
  is more than 2147483648 (gh-3594).
* Fixed graceful shutdown break on init script exit (gh-9411).
* Fixed potential use-after-free on Tarantool shutdown with lingering
  fiber join (gh-9406).
* Fixed incorrect calculation of requests in progress in case of iproto
  override fallback (gh-9345).

### Replication

* Fixed a false-positive split-brain in a replica set on the first
  promotion after an upgrade from versions before 2.10.1 (gh-8996).
* Fixed replicas writing corrupted xlogs when appending data to a local space
  from an `on_replace` or `before_replace` trigger on a global replicated space.
  Such xlogs were unrecoverable and caused other nodes to break replication with
  the replica (gh-8746, gh-8958).
* Fixed a false-positive split-brain error when an old synchronous transaction
  queue owner confirmed the same transactions which were already confirmed by
  the new queue owner, or rolled back the same transactions which were rolled
  back by the new queue owner (gh-9138).

### LuaJIT

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

* Prevent integer overflow while parsing long strings.
* Fixed various `^` operator and `math.pow()` function inconsistencies.
* Fixed parsing with predicting `next()` and `pairs()`.
* Fixed binary number literal parsing. Parsing of binary number with a zero
  fractional part raises error too now.
* Fixed load forwarding optimization applied after table rehashing.
* Fixed recording of the `BC_TSETM`.
* Fixed the panic routine when `mprotect` fails to change flags for mcode area.
* Fixed handling of instable types in TNEW/TDUP load forwarding.
* Handled table unsinking in the presence of `IRFL_TAB_NOMM`.
* Fixed a bug when an error could be raised on the non-currently executed
  coroutine (gh-6323).
Backported patches from the vanilla LuaJIT trunk (gh-9145). The following issues
were fixed as part of this activity:

* Fixed error handling after return from a child coroutine.
* Fixed clashing of addresses in the `__call` metamethod return dispatch (again).
* Fixed the assembling for the head of the side trace (gh-8767).
* Prevented compilation of `__concat` methamethod with tailcall to fast
  function.
* Fixed buffer overflow in parsing the `#pragma` directive via FFI (gh-9339).
  Now the error is thrown when more than 6 alignment settings are pushed on the
  internal stack.
* Fixed incorrect fold rule for `x - (-0)` on trace (for `x = -0` the result
  should be `0`).
* Fixed output for `IR_CONV` in `jit.dump()`.
* Fixed `math.min()`/`math.max()` inconsistencies for x86/x86_64 architectures
  when called with a NaN argument or `-0` and `0`.
* Fixed `math.ceil(x)` result sign for -1 < x < 0.5.
* Errors from gc finalizers are now printed instead of being rethrown.
* Fixed `lua_concat()`.
* Fixed possible storing of NaN keys to table on trace.
* Fixed ABC FOLD optimization with constants.
* Marked `CONV` as non-weak, to prevent invalid control flow path choice.
* Fixed sysprof crash during stack unwinding for FFUNC (gh-8594).

### Lua

* An error from a serializer function for cdata and userdata is not ignored now
  (gh-9396).

#### Http client

* Fixed a streaming connection stuck if etcd is stopped
  unexpectedly (gh-9086).

### SQL

* Fixed a memory leak in a parser for a column's default rule (gh-9159).
* Fixed assertion in a debug build when a collation was added after an index
  with more than one field (gh-9229).
* Fixed a bug that in some cases would not assign collations to an index created
  during `CREATE TABLE` (gh-9229).
* The `EXISTS` predicate no longer requires `LIMIT 1` to work correctly if more
  than one row is returned in the subselect (gh-8676).

### Box

* The maximum length of `box.cfg{}` string parameters is now 512 to support a
  lengthy args, such as list of audit events (ghe-523).
* Fixed crashes if `box.info.memory()`, `box.info.gc()`, `box.info.vinyl()`,
  and `box.info.sql()` are called before `box.cfg{}` (gh-9173).
* Added a `c_func_iproto_multireturn` option to the `compat` module. The new
  behavior drops an additional array that wraps multiple results returned via
  iproto (gh-4799).
* Fixed a bug that allows downgrading from a schema version more recent than
  a Tarantool version (gh-9182).
* Fixed a bug when `on_shutdown` triggers weren't run if `os.exit()` was
  called from `-e` command-line option (gh-9266).

### Net.box

* It is now possible to call stored Lua functions and C module functions with
  `require('net.box').self:call()` (gh-9131).

### Misc

* Updated luarocks version to 3.9.2 to address rockspec security issues (gh-6587).

## Testing

* Added a new flag `tarantool.build.asan` that shows whether build
  flag `ENABLE_ASAN` is set. The flag is intended to ease tests
  backporting from the master branch.

## Tools

### Debugger

* Introduced readline support to tarantool debugger (gh-7738).
