Date: 2022-08-08
Tag: 1.10.14

## Overview

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

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

This release introduces 10 improvements and resolves roughly 20
issues since the 1.10.13 version.

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

## Compatibility

Tarantool 1.10.x is backward compatible with Tarantool 1.9.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 1.10.x series.

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

## Functionality added or changed

### Build

* Fedora 35 is now supported (gh-6692).
* Updated OpenSSL used for static builds to version 1.1.1n. (gh-6947).
* Updated libcurl to version 7.83.0 (gh-6029).
* Fedora 36 is now supported.
* Ubuntu 22.04 (Jammy Jellyfish) is now supported.
* Fedora 30, 31,32, and 33 are no longer supported.
* Ubuntu 21.04 (Hirsute Hippo) is no longer supported.
* Updated libcurl to version 7.84.0.
* Updated OpenSSL used for static builds to version 1.1.1q.
* Updated libyaml to the version with fixed stack overflows.

## Bugs fixed

### Core

* Fixed a memory leak in the interactive console (gh-6817).
* Fixed an assertion fail when passing a tuple without the primary key fields
  to a `before_replace` trigger. Now the tuple format is checked before the execution 
  of `before_replace` triggers and after each of them (gh-6780).
* Now inserting a tuple with a wrong `id` field into the `\_priv` space returns
  the correct error (gh-6295).
* Fixed a bug that was making all fibers created with `fiber_attr_setstacksize()`
  leak until the thread exit. Their stacks also leaked except when
  `fiber_set_joinable(..., true)` was used.
* Fixed a crash that happened when Tarantool was launched with multiple `-e` or `-l` options
  without spaces between the options and their values (gh-5747).
* Fixed the usage of `box.session.peer()` in `box.session.on_disconnect()` triggers.
  Now it's safe to assume that `box.session.peer()` returns the address of the
  disconnected peer, not nil, as it used to (gh-7014).
* Fixed a bug in the sequence cache that could result in an error creating
  a new sequence (gh-5306).

### Vinyl

* Immediate removal of compacted run files created after the last checkpoint
  optimization now works for the initial JOIN stage of a replica (gh-6568).
* Fixed a crash during the recovery of a secondary index in case the primary index
  contains incompatible phantom tuples (gh-6778).
* Fixed a bug in the vinyl upsert squashing optimization that could lead to
  a segmentation fault error (gh-5080).
* Fixed a bug in the vinyl read iterator that could result in a significant
  performance degradation of range select requests in the presence of an intensive
  write workload (gh-5700).

### Replication

* Fixed replicas failing to bootstrap when the master has just restarted (gh-6966).

### LuaJIT

* Fixed the top part of Lua stack (red zone, free slots, top slot) unwinding in
  the `lj-stack` command.
* Added the value of `g->gc.mmudata` field to `lj-gc` output.
* Fixed a bug with `string.char()` builtin recording when no arguments are
  provided (gh-6371, gh-6548).
* Actually made JIT respect the `maxirconst` trace limit while recording (gh-6548).
* Backported patches from vanilla LuaJIT trunk (gh-6548, gh-7230). In the scope of this
 activity, the following issues have been resolved:

  * Fixed emitting for fuse load of constant in GC64 mode (gh-4095, gh-4199, gh-4614).
  * Now initialization of zero-filled struct is compiled (gh-4630, gh-5885).
  * Actually implemented `maxirconst` option for tuning JIT compiler.
  * Fixed JIT stack of Lua slots overflow during recording for metamethod calls.
  * Fixed bytecode dump unpatching for JLOOP in up-recursion compiled functions.
  * Fixed FOLD rule for strength reduction of widening in cdata indexing. 
  * Fixed `string.char()` recording without arguments.
  * Fixed `print()` behaviour with the reloaded default metatable for numbers.
  * `tonumber("-0")` now saves the sign of number for conversion.
  * `tonumber()` now give predictable results for negative non-base-10 numbers.
  * Fixed write barrier for `debug.setupvalue()` and `lua_setupvalue()`.
  * `jit.p` now flushes and closes output file after run, not at program exit.
  * Fixed `jit.p` profiler interaction with GC finalizers.
  * Fixed the case for partial recording of vararg function body with the fixed
    number of result values in with `LJ_GC64` (i.e. `LJ_FR2` enabled) (gh-7172).
  * Fixed handling of errors during trace snapshot restore.

### Box

* Added the check of the iterator type in the `select`, `count`, and `pairs` methods of
  the index object. Iterator can now be passed to these methods directly: `box.index.ALL`,
  `box.index.GT`, and so on (gh-6501).

### Recovery

* With the `force_recovery` cfg option, Tarantool is now able to boot from
  `snap`/`xlog` combinations where `xlog` covers changes committed both before
  and after the `snap` was created. For example, `0...0.xlog` that covers everything up
  to vclock `{1: 15}` and `0...09.snap` corresponding to `vclock `{1: 9}` (gh-6794).
