Date: 2022-05-22
Tag: 2.10.0

## Overview

2.10.0 is the first [stable][release_policy] version of the 2.10 release
series. It introduces 107 improvements and resolves 131 bugs since
2.8.1.

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/release/policy/
[issues]: https://github.com/tarantool/tarantool/issues

Notable changes are:

* HTTP client now supports HTTP/2
* Support of the new DATETIME type
* Improved type consistency in SQL
* Added transaction isolation levels
* Fencing and pre-voting in RAFT implemented
* Foreign keys and constraints are introduced

## 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.

Following is a list of changes that break backward compatibility:
* `fiber.wakeup()` in Lua and `fiber_wakeup()` in C became NOP
on the currently running fiber.
* `timeout()` method of `net.box` connection was dropped.
* net.box console support was dropped.
* lua: return value type for all time64 functions changed from
`uint64_t` to `int64_t`.

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

## Functionality added or changed

### Core

* Field type `UUID` is now a part of field type `SCALAR` (gh-6042).
* Field type `UUID` is now available in SQL, and a new `UUID` can be generated
  using the new SQL built-in `uuid()` function (gh-5886).

* **[Breaking change]** `timeout()` method of `net.box` connection, which was
  marked deprecated more than four years ago (in 1.7.4), was dropped, because
  it negatively affected the performance of hot `net.box` methods, like `call()`
  and `select()`, in case those were called without specifying a timeout
  (gh-6242).

* Improved `net.box` performance by up to 70% by rewriting hot code paths in C
  (gh-6241).
* Introduced compact tuples that allow saving 4 bytes per tuple in case of
  small user data (gh-5385).
* Streams and interactive transactions over streams are implemented
  in iproto. A stream is associated with its ID, which is unique within
  one connection. All requests with the same, not zero stream ID belong to
  the same stream. All requests in the stream are processed synchronously.
  The execution of the next request will not start until the previous one is
  completed. If a request has zero stream ID, it does not belong to a stream
  and is processed in the old way.

  In `net.box`, a stream is an object above the connection that has the same
  methods but allows to execute requests sequentially. ID is generated
  automatically on the client-side. If users write their own connector and
  want to use streams, they must transmit stream_id over the iproto protocol.
  The main purpose of streams is transactions via iproto.
  Each stream can start its own transaction, allowing multiplexing of several
  transactions over one connection. There are multiple ways to begin,
  commit and rollback a transaction: using appropriate stream methods, using
  `call` or `eval` methods or using `execute` method with SQL transaction
  syntax. Users can mix these methods, for example, start a transaction using
  `stream:begin()`, and commit a transaction using `stream:call('box.commit')`
  or `stream:execute('COMMIT')` (gh-5860).

  If any request fails during the transaction, it will not affect the other
  requests in the transaction. If a disconnect occurs when there is some active
  transaction in the stream, this transaction will be rolled back if it
  does not have time to commit before this moment.
* Added new `memtx_allocator` option to `box.cfg{}` that allows to select the
  appropriate allocator for memtx tuples if necessary. Possible values are
  `system` for malloc allocator and `small` for default small allocator.

  Implemented system allocator, based on malloc: a aslab allocator that is used for
  tuples allocation has a certain disadvantage-it tends to unresolvable
  fragmentation on certain workloads (size migration). In this case, a user
  should be able to choose another allocator. System allocator based on malloc
  function, but restricted by the same quota as slab allocator. The system
  allocator does not alloc all memory at the start. Instead, it allocates memory
  as needed, checking that quota is not exceeded (gh-5419).
* Added `box.stat.net.thread()` for reporting per thread net statistics
  (gh-6293).
* Added the new `STREAMS` metric to `box.stat.net` that contains statistics
  for iproto streams. `STREAMS` contains the same counters as `CONNECTIONS`
  metric in `box.stat.net`: current, RPS, and total (gh-6293).
* Extended the network protocol (IPROTO) with a new request type (`IPROTO_ID`)
  that is supposed to be used for exchanging sets of supported features between
  server and client (gh-6253).
* Added `required_protocol_version` and `required_protocol_features` to
  `net.box` connection options. The new options allow specifying the IPROTO
  protocol version and features that must be supported by the server for the
  connection to pass (gh-6253).
* **[Breaking change]** Added `msgpack.cfg.encode_error_as_ext` configuration
  option to enable/disable encoding errors as `MP_ERROR` MsgPack extension.
  The option is enabled by default (gh-6433).
* **[Breaking change]** Removed `box.session.setting.error_marshaling_enabled`.
  Error marshalling is now enabled automatically if the connector supports it
  (gh-6428).
* Added new metrics `REQUESTS_IN_PROGRESS` and `REQUESTS_IN_STREAM_QUEUE`
  to `box.stat.net` that contains detailed statistics for iproto requests.
  These metrics contain the same counters as other metrics in `box.stat.net`:
  current, RPS, and total (gh-6293).
* Implemented a timeout for `fiber:join` in Lua (gh-6203).
* Updated libev to version 4.33 (gh-4909).
* Added the new `box.txn_id()` function that returns the id of the current
  transaction if called within a transaction, nil otherwise.
* Previously, if a yield occurs for a transaction that does not support it,
  we roll back all its statements but still process its new statements
  (they will roll back with each yield). Also, the transaction will be rolled
  back when a commit is attempted. Now we stop processing any new statements
  right after the first yield if a transaction doesn't support it.
* Implemented a timeout for transactions after which they are rolled back
  (gh-6177).

* Implemented new C API function `box_txn_set_timeout` to set
  a timeout for transactions.
* Implemented a timeout for iproto transactions after which they are rolled
  back (gh-6177).

* Implemented new `IPROTO_TIMEOUT 0x56` key, which is used to set
  a timeout for transactions over iproto streams. It is stored in the body of
  `IPROTO_BEGIN` request.
* Introduced `box.broadcast` and `box.watch` functions to signal/watch
  user-defined state changes (gh-6257).
* Added watchers support to the network protocol (gh-6257).
* Added watchers support to the `net.box` connector (gh-6257).
* Error objects with the code `box.error.READONLY` now have additional fields
  explaining why the error happened.

  Also, there is a new field `box.info.ro_reason`. It is `nil` on a writable
  instance, but reports a reason when `box.info.ro` is true (gh-5568).
* Implemented the ability to open several listening sockets. In addition to the
  ability to pass uri as a number or string added the ability to pass uri as
  a table of numbers or strings (gh-3554).

* **[Breaking change]** `net.box` console support, which was marked deprecated
  in 1.10, was dropped. Use `require('console').connect()` instead.

* Added `takes_raw_args` Lua function option for wrapping arguments in
  `msgpack.object` to skip decoding (gh-3349).
* Implemented the graceful shutdown protocol for IPROTO connections (gh-5924).
* Added `fetch_schema` flag to `netbox.connect` to control schema fetching
  from remote instance (gh-4789).
* Added linking type (dynamic or static) to Tarantool build info.
* Changed log level of some information messages from critical to info
  (gh-4675).
* Added predefined system events: `box.status`, `box.id`, `box.election`,
  and `box.schema` (gh-6260).
* Introduced transaction isolation levels in Lua and IPROTO (gh-6930).
* Added support for backtrace feature on AARCH64 architecture (gh-6060).
* Implemented collection of parent backtrace for the newly created fibers.
  To enable the feature, call `fiber.parent_backtrace_enable`. To disable it,
  call `fiber.parent_backtrace_disable`: disabled by default (gh-4302).

### Memtx

* Introduced memtx MVCC memory monitoring (gh-6150).

### Vinyl

* Disabled the deferred `DELETE` optimization in Vinyl to avoid possible
  performance degradation of secondary index reads. Now, to enable the
  optimization, one has to set the `defer_deletes` flag in space options
  (gh-4501).

### Replication

* Introduced `box.info.replication[n].downstream.lag` field to monitor
  state of replication. This member represents a lag between the main
  node writing a certain transaction to its own WAL and the moment it
  receives an ack for this transaction from a replica (gh-5447).
* Introduced on_election triggers. The triggers may be registered via
  `box.ctl.on_election()` interface and are run asynchronously each time
  `box.info.election` changes (gh-5819).
* It is now possible to decode incoming replication data in a separate thread.
  Added the `replication_threads` configuration option that controls how many
  threads may be spawned to do the task (default is 1) (gh-6329).

### Raft

* Added `term` field to `box.info.synchro.queue`. It contains a term of the
  last `PROMOTE`. It is usually equal to `box.info.election.term` but may be
  less than the election term when the new round of elections started, but no
  one promoted yet.
* Servers with elections enabled won't start new elections as long as at least
  one of their peers sees the current leader. They also won't start the
  elections when they don't have a quorum of connected peers. This should
  reduce cases when a server that has lost connectivity to the leader disrupts
  the whole cluster by starting new elections (gh-6654).

* Added the `leader_idle` field to `box.info.election` table. The value shows
  time in seconds since the last communication with a known leader (gh-6654).

### LuaJIT

* Introduced support for `LJ_DUALNUM` mode in luajit-gdb.py (gh-6224).
* Introduced preliminary support of GNU/Linux ARM64 and MacOS M1. In the scope
  of this activity, the following issues have been resolved:

  - Introduced support for a full 64-bit range of lightuserdata values (gh-2712).

  - Fixed memory remapping issue when the page leaves 47-bit segments.

  - Fixed M1 architecture detection (gh-6065).

  - Fixed variadic arguments handling in FFI on M1 (gh-6066).

  - Fixed `table.move` misbehavior when table reallocation occurs (gh-6084).

  - Fixed Lua stack inconsistency when xpcall is called with an invalid second
    argument on ARM64 (gh-6093).

  - Fixed `BC_USETS` bytecode semantics for closed upvalues and gray strings.

  - Fixed side exit jump target patching considering the range values of the
    particular instruction (gh-6098).

  - Fixed current Lua coroutine restoring on an exceptional path on ARM64 (gh-6189).
* Now memory profiler records allocations from traces grouping them by the
  trace number (gh-5814). The memory profiler parser can display the new type
  of allocation sources in the following format:

  ```
  | TRACE [<trace-no>] <trace-addr> started at @<sym-chunk>:<sym-line>
  ```
* Now memory profiler reports allocations made by the JIT engine while
  compiling the trace as INTERNAL (gh-5679).
* Now the memory profiler emits events of the new type when a function or
  a trace is created. As a result, the memory profiler parser can enrich its
  symbol table with the new functions and traces (gh-5815).

  Furthermore, there are symbol generations introduced within the internal
  parser structure to handle possible collisions of function addresses and
  trace numbers.
* Now memory profiler dumps symbol table for C functions. As a result memory
  profiler parser can enrich its symbol table with C symbols (gh-5813).
  Furthermore, now memprof dumps special events for symbol table when it
  encounters a new C symbol, that hasn't been dumped yet.
* Introduced the LuaJIT platform profiler (gh-781) and the profile parser.
  This profiler is able to capture both host and VM stacks, so it can show the
  whole picture. Both C and Lua API's are available for the profiler.<br/>
  Profiler comes with the default parser, which produces output in a
  flamegraph.pl-suitable format.<br/>
  The following profiling modes are available:
    - Default: only virtual machine state counters
    - Leaf: shows the last frame on the stack
    - Callchain: performs a complete stack dump

### Lua

* Introduced method `table.equals`. It compares 2 tables by value and respects
  the `__eq` metamethod.
* Added support of console autocompletion for `net.box` objects `stream`
  and `future` (gh-6305).
* Added `box.runtime.info().tuple` metric to track the amount of memory
  occupied by tuples allocated on runtime arena (gh-5872).

  It does not count tuples that arrive from memtx or vinyl but counts tuples
  created on-the-fly: say, using `box.tuple.new(<...>)`.

#### Datetime

* Added a new built-in module `datetime.lua` that allows operating timestamps
  and intervals values (gh-5941).

* Added the method to allow converting string literals in extended iso-8601 or
  rfc3339 formats (gh-6731).

* Extended the range of supported years in all parsers to cover fully
  -5879610-06-22..5879611-07-11 (gh-6731).
* Datetime interval support has been reimplemented in C to make possible
  future Olson/tzdata and SQL extensions (gh-6923);

  Now all components of the interval values are kept and operated separately
  (i.e. years, months, weeks, days, hours, seconds, and nanoseconds). This
  allows to apply date/time arithmetic correctly when we add/subtract
  intervals to datetime values.
* Extended datetime literal parser with the ability to handle known timezone
  abbreviations (i.e. 'MSK', 'CET', etc.) which are deterministically
  translated to their offset (gh-5941, gh-6751);

  Timezone abbreviations can be used in addition to the timezone offset in
  the datetime literals, e.g. these literals produce equivalent datetime
  values:

  ```lua
  local date = require('datetime')
  local d1 = date.parse('2000-01-01T02:00:00+0300')
  local d2 = date.parse('2000-01-01T02:00:00 MSK')
  local d3 = date.parse('2000-01-01T02:00:00 MSK', {format = '%FT%T %Z'})
  ```

  Parser fails if one uses ambiguous names (e.g. 'AT') which could not be
  directly translated into timezone offsets.
* Enabled support for timezone names in the constructor and `date:set{}` modifier
  via `tz` attribute. Currently, only timezone name abbreviations
  are supported (gh-7076).

  Timezone abbreviations can be used in addition to the timezone offset.
  They can be used during constructing or modifying a date object, or while
  parsing datetime literals. Numeric time offsets and named abbreviations
  produce equivalent datetime values:

  ```lua
  local date = require('datetime')
  local d2 = date.parse('2000-01-01T02:00:00 MSK')

  local d1 = date.new{year = 1980, tz = 'MSK'}
  d2 = date.new{year = 1980, tzoffset = 180}
  d2:set{tz = 'MSK'}
  ```

  Note that the timezone name parser fails if one uses ambiguous names,
  which could not be translated into timezone offsets directly (for example, 'AT').

#### Digest

* Introduced new hash types in digest module-`xxhash32` and `xxhash64`
  (gh-2003).

#### Fiber

* Introduced `fiber_object:info()` to get `info` from fiber. Works as
  `require('fiber').info()` but only for one fiber.

* Introduced `fiber_object:csw()` to get `csw` from fiber (gh-5799).
* Changed `fiber.info()` to hide backtraces of idle fibers (gh-4235).
* Improved fiber `fiber.self()`, `fiber.id()` and `fiber.find()`
  performance by 2-3 times.

#### Log

* Implemented support of symbolic log levels representation in `log` module
  (gh-5882). Now it is possible to specify levels the same way as in
  `box.cfg{}` call. For example, instead of
  ``` Lua
  require('log').cfg{level = 6}
  ```
  one can use
  ``` Lua
  require('log').cfg{level = 'verbose'}
  ```

#### Msgpack

* Added `msgpack.object` container for marshaling arbitrary MsgPack data
  (gh-1629, gh-3349, gh-3909, gh-4861, gh-5316).

#### Netbox

* Added `return_raw` net.box option for returning `msgpack.object` instead of
  decoding the response (gh-4861).

#### Schema

* `is_multikey` option may now be passed to `box.schema.func.create` directly,
  without `opts` sub-table.

### SQL

* Descriptions of type mismatch error and inconsistent type error became more
  informative (gh-6176).
* Removed explicit cast from `BOOLEAN` to numeric types and vice versa
  (gh-4770).

* Removed explicit cast from `VARBINARY` to numeric types and vice versa
  (gh-4772, gh-5852).

* Fixed a bug due to which a string that is not `NULL` terminated could not be
  cast to `BOOLEAN`, even if the conversion should be successful according to
  the rules.
* Now, a numeric value can be cast to another numeric type only if the cast is
  precise. In addition, a `UUID` value cannot be implicitly cast to
  `STRING`/`VARBINARY`, and a `STRING`/`VARBINARY` value cannot be implicitly
  cast to a `UUID` (gh-4470).
* Now any number can be compared to any other number, and values of any scalar
  type can be compared to any other value of the same type. A value of a
  non-numeric scalar type cannot be compared with a value of any other scalar
  type (gh-4230).
* SQL built-in functions were removed from \_func system space (gh-6106).

* Functions are now looked up first in SQL built-in functions and then in
  user-defined functions.

* Fixed incorrect error message in case of misuse of the function used to set
  the default value.
* The `typeof()` function with `NULL` as an argument now returns `NULL`
  (gh-5956).
* The `SCALAR` and `NUMBER` types have been reworked in SQL. Now `SCALAR`
  values cannot be implicitly cast to any other scalar type, and `NUMBER`
  values cannot be implicitly cast to any other numeric type. This means that
  arithmetic and bitwise operations and concatenation are no longer allowed for
  `SCALAR` and `NUMBER` values. In addition, any `SCALAR` value can now be
  compared with values of any other scalar type using the `SCALAR` rules
  (gh-6221).
* Field type `DECIMAL` is now available in SQL. Decimal can be implicitly cast
  to and from `INTEGER` and `DOUBLE`, it can participate in arithmetic
  operations and comparison between `DECIMAL`, and all other numeric types are
  defined (gh-4415).
* The argument types of SQL built-in functions are now checked in most cases
  during parsing. In addition, the number of arguments is now always checked
  during parsing (gh-6105).
* `DECIMAL` values can now be bound in SQL (gh-4717).
* A value consisting of digits and a decimal point is now parsed as `DECIMAL`
  (gh-6456).
* Field type `ANY` is now available in SQL (gh-3174).
* Built-in SQL functions now work correctly with `DECIMAL` values (gh-6355).
* The default type is now defined in case the argument type of an SQL built-in
  function cannot be determined during parsing (gh-4415).
* Field type `ARRAY` is now available in SQL. The syntax has also been
  implemented to allow the creation of `ARRAY` values (gh-4762).
* User-defined aggregate functions are now available in SQL (gh-2579).
* Introduced SQL built-in functions `NOW()` and `DATE_PART()` (gh-6773).
* The left operand is now checked before the right operand in an arithmetic
  operation. (gh-6773).
* Field type ``INTERVAL`` is introduced to SQL (gh-6773).
* Bitwise operations can now only accept `UNSIGNED` and positive `INTEGER`
  values (gh-5364).
* Field type `MAP` is now available in SQL. Also, the syntax has been implemented
  to allow the creation of `MAP` values (gh-4763).
* Introduced `[]` operator for `MAP` and `ARRAY` values (gh-6251).

### Box

* Public role now has read, write access on `_session_settings` space
  (gh-6310).
* Field type `INTERVAL` is introduced to `BOX` (gh-6773).
* The behavior of empty or nil `select` calls on user spaces was changed.
  A critical log entry containing the current stack traceback is created upon
  such function calls. The user can explicitly request a full scan though by
  passing `fullscan=true` to `select`'s `options` table argument, in which case
  a log entry will not be created (gh-6539).
* Improved checking for dangerous `select` calls. The calls with
  `offset + limit <= 1000` are now considered safe, which means a warning is not
  issued. The 'ALL', 'GE', 'GT', 'LE', 'LT' iterators are now considered dangerous
  by default even with the key present (gh-7129).

### Datetime

* Allowed using human-readable timezone names (for example, 'Europe/Moscow')
  in datetime strings. Use IANA `tzdata` (Olson DB) for timezone-related
  operations, such as DST-based timezone offset calculations (gh-6751).

* The `isdst` field in the datetime object is now calculated correctly, according
  to the IANA `tzdata` (aka Olson DB) rules for the given date/time moment
  (gh-6751).

* The `datetime` module exports the bidirectional `TZ` array, which can be used
  to translate the timezone index (`tzindex`) into timezone names, and
  vice versa (gh-6751).

### Fiber

* Previously csw (Context SWitch) of a new fiber could be more than 0,
  now it is always 0 (gh-5799).

### Luarocks

* Set `FORCE_CONFIG=false` for luarocks config to allow loading project-side
  .rocks/config-5.1.lua.

### Xlog

* Reduced snapshot verbosity (gh-6620).

### Build

* Support fedora-34 build (gh-6074).

* Stopped support fedora-28 and fedora-29.
* Stopped support of Ubuntu Trusty (14.04) (gh-6502).
* Bumped Debian package compatibility level to 10 (gh-5429).

* Bumped minimal required debhelper to version 10 (except for Ubuntu Xenial).
* Removed Windows binaries from Debian source packages (gh-6390).

* Bumped Debian control Standards-Version to 4.5.1 (gh-6390).
* Added bundling of libnghttp2 for bundled libcurl to support HTTP/2
  for http client. The CMake version requirement is updated from 3.2 to 3.3.
* Support fedora-35 build (gh-6692).
* Added bundling of _GNU libunwind_ to support backtrace feature on _AARCH64_
  architecture and distributives that don't provide _libunwind_ package.

* Re-enabled backtrace feature for all _RHEL_ distributions by default, except
  for _AARCH64_ architecture and ancient _GCC_ versions, which lack compiler
  features required for backtrace (gh-4611).
* Updated `libicu` version to 71.1 for static build.
* Bumped OpenSSL from 1.1.1f to 1.1.1n for static build (gh-6947).
* Updated libcurl to version 7.83.0 (gh-6029).
* Support Fedora-36 build.
* Support Ubuntu Jammy (22.04) build.

## Bugs fixed

### Core

* **[Breaking change]** `fiber.wakeup()` in Lua and `fiber_wakeup()` in C
  became NOP on the currently running fiber.

  Previously, they were allowed to "ignore" the next yield or sleep, leading to
  unexpected spurious wake-ups. This could lead to a crash (in debug build) or
  undefined behavior (in release build) if called right before `fiber.create()`
  in Lua or `fiber_start()` in C (gh-6043).

  There was a single use case for that-reschedule in the same event loop
  iteration which is not the same as `fiber.sleep(0)` in Lua and
  `fiber_sleep(0)` in C. Could be done in C like that:
  ```C
  fiber_wakeup(fiber_self());
  fiber_yield();
  ```
  and in Lua like that:
  ```Lua
  fiber.self():wakeup()
  fiber.yield()
  ```
  Now, to get the same effect in C, use `fiber_reschedule()`. In Lua, it is now
  simply impossible to reschedule the current fiber in the same event loop
  iteration directly. But still it can reschedule itself through the second
  fiber like this (**do not use it, please**):
  ```Lua
  local self = fiber.self()
  fiber.new(function() self:wakeup() end)
  fiber.sleep(0)
  ```

* Fixed memory leak on each `box.on_commit()` and `box.on_rollback()` (gh-6025).
* Fixed the lack of testing for non-joinable fibers in `fiber_join()` call.
  This could lead to unpredictable results. Note the issue affects the C
  level only, in Lua interface `fiber:join()` the protection is
  turned on already.
* Now Tarantool yields when scanning `.xlog` files for the latest applied
  vclock and when finding the right place in `.xlog`s to start recovering.
  This means that the instance is responsive right after `box.cfg` call even
  when an empty `.xlog` was not created on the previous exit. Also, this
  prevents the relay from timing out when a freshly subscribed replica
  needs rows from the end of a relatively long (hundreds of MBs) `.xlog`
  (gh-5979).

* The counter in `x.yM rows processed` log messages does not reset on each new
  recovered `xlog` anymore.
* Fixed the wrong type specification when printing fiber state change which led
  to negative fiber's ID logging (gh-5846). For example

  ```
  main/-244760339/cartridge.failover.task I> Instance state changed
  ```
  instead of proper
  ```
  main/4050206957/cartridge.failover.task I> Instance state changed
  ```
* Fiber IDs were switched to monotonically increasing unsigned 8-byte
  integers so that there wouldn't be IDs wrapping anymore. This allows
  to detect fiber's precedence by their IDs if needed (gh-5846).
* Fixed a crash in JSON update on tuple/space when it had more than one
  operation, they accessed fields in reversed order, and these fields didn't
  exist. Example: `box.tuple.new({1}):update({{'=', 4, 4}, {'=', 3, 3}})`
  (gh-6069).
* Fixed invalid results produced by the `json` module's `encode` function when
  it was used from Lua's garbage collector. For instance, in functions used as
  `ffi.gc()` (gh-6050).
* Added check for user input of the number of iproto threads-value
  must be > 0 and less than or equal to 1000 (gh-6005).
* Fixed error related to the fact that if a user changed the listen address,
  all iproto threads closed the same socket multiple times.

* Fixed error related to Tarantool not deleting the unix socket path when
  finishing work.
* Fixed a crash in MVCC during simultaneous update of a key in different
  transactions (gh-6131).
* Fixed a bug when memtx MVCC crashed during reading uncommitted DDL (gh-5515).
* Fixed a bug when memtx MVCC crashed if an index was created in the
  transaction (gh-6137).
* Fixed segmentation fault with MVCC when an entire space was updated
  concurrently (gh-5892).
* Fixed a bug with failed assertion after stress update of the same key
  (gh-6193).
* Fixed a crash that happened when a user called `box.snapshot` during
  an incomplete transaction (gh-6229).
* Fixed console client connection breakage if request times out (gh-6249).
* Added missing broadcast to `net.box.future:discard()` so that now fibers
  waiting for a request result are woken up when the request is discarded
  (gh-6250).
* `box.info.uuid`, `box.info.cluster.uuid`, and `tostring(decimal)` with any
  decimal number in Lua sometimes could return garbage if `__gc` handlers were
  used in the user's code (gh-6259).
* Fixed the error message that happened in a very specific case during MVCC
  operation (gh-6247).
* Fixed a repeatable read violation after delete (gh-6206).
* Fixed a bug when hash select{} was not tracked by MVCC engine (gh-6040).
* Fixed a crash in MVCC after the drop of a space with several indexes
  (gh-6274).
* Fixed a bug when GC at some state could leave tuples in secondary indexes
  (gh-6234).
* Disallowed yields after DDL operations in MVCC mode. It fixes a crash which
  takes place in case several transactions refer to system spaces (gh-5998).
* Fixed a bug in MVCC connected which happened on a rollback after
  DDL operation (gh-5998).
* Fixed a bug when rollback resulted in unserializable behaviour (gh-6325).
* At the moment, when a `net.box` connection is closed, all requests that have
  not been sent will be discarded. This patch fixes this behavior: all requests
  queued for sending before the connection is closed are guaranteed to be sent
  (gh-6338).
* Fixed a crash during replace of malformed tuple into _schema system space
  (gh-6332).
* Fixed dropping incoming messages when the connection is closed or `SHUT_RDWR`
  received and `net_msg_max` or readahead limit is reached (gh-6292).
* Fixed memory leak in case of replace during background alter of the primary
  index (gh-6290).
* Fixed a bug when rolled back changes appear in the built-in-background index
  (gh-5958).
* Fixed a crash while encoding an error object in the MsgPack format (gh-6431).
* Fixed a bug when an index was inconsistent after background build in case
  the primary index was hash (gh-5977).
* Now inserting a tuple with the wrong "id" field into the `\_priv` space
  returns the correct error (gh-6295).
* Fixed dirty read in MVCC after space alter (gh-6263, gh-6318).
* Fixed a crash in case the fiber changing `box.cfg.listen` is woken up
  (gh-6480).
* Fixed `box.cfg.listen` not reverted to the old address in case the new one
  is invalid (gh-6092).
* Fixed a crash caused by a race between `box.session.push()` and closing
  connection (gh-6520).
* Fixed a bug because of which the garbage collector could remove an xlog file
  that was still in use (gh-6554).
* Fixed crash during granting privileges from guest (gh-5389).
* Fixed an error in listening when the user passed uri in numerical form
  after listening unix socket (gh-6535).
* Fixed a crash that could happen in case a tuple is deleted from a functional
  index while there is an iterator pointing to it (gh-6786).
* Fixed memory leak in interactive console (gh-6817).
* Fixed an assertion fail when passing a tuple without primary key fields
  to `before_replace` trigger. Now tuple format is checked before execution
  of `before_replace` triggers and after each one (gh-6780).
* Banned DDL operations in space `on_replace` triggers, since they could lead
  to a crash (gh-6920).
* Implemented constraints and foreign keys. Now users can create function
  constraints and foreign key relations (gh-6436).
* Fixed a bug due to which all fibers created with `fiber_attr_setstacksize()`
  leaked until the thread exit. Their stacks also leaked except when
  `fiber_set_joinable(..., true)` was used.
* Fixed a crash in MVCC related to a secondary index conflict (gh-6452).
* Fixed a bug which resulted in wrong space count (gh-6421).
* `SELECT` in RO transaction now reads confirmed data, like a standalone
  (autocommit) `SELECT` does (gh-6452).
* Fixed a crash when Tarantool is launched with multiple `-e` or `-l` options
  without a space between the option and the value (gh-5747).
* Fixed effective session and user not propagated to `box.on_commit` and
  `box.on_rollback` trigger callbacks (gh-7005).
* Fixed usage of `box.session.peer()` in `box.session.on_disconnect()` trigger.
  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 creation of a space with a foreign key pointing to the same space
  (gh-6961).
* Fixed a bug when MVCC failed to track nothing-found range `select` (gh-7025).
* Allowed complex foreign keys with null fields (gh-7046).
* Added decoding of election messages: `RAFT` and `PROMOTE` to
  `xlog` Lua module (gh-6088). Otherwise `tarantoolctl` shows
  plain number in `type`
  ```yaml
  HEADER:
    lsn: 1
    replica_id: 4
    type: 31
    timestamp: 1621541912.4592
  ```
  instead of symbolic representation
  ```yaml
  HEADER:
    lsn: 1
    replica_id: 4
    type: PROMOTE
    timestamp: 1621541912.4592
  ```

* **[Breaking change]** Return value signedness of 64-bit time functions in
  `clock` and `fiber` was changed from `uint64_t` to `int64_t` both in Lua
  and C (gh-5989).

* Fixed reversed iterators gap tracking. Instead of tracking gaps for
  the successors of keys, gaps for tuples shifted by one to the left of
  the successor were tracked (gh-7113).

### Memtx

* Now memtx will raise an error if "clear" dictionary was passed to
  `s:select()` (gh-6167).
* Fixed MVCC transaction manager story garbage collection breaking memtx TREE
  index iterator (gh-6344).

### Vinyl

* Fixed possible keys divergence during secondary index build that might
  lead to missing tuples in it (gh-6045).
* Fixed the race between Vinyl garbage collection and compaction resulting in
  broken vylog and recovery (gh-5436).
* Immediate removal of compacted run files created after the last checkpoint
  optimization now works for replica's initial JOIN stage (gh-6568).
* Fixed crash during recovery of a secondary index in case the primary index
  contains incompatible phantom tuples (gh-6778).

### Replication

* Fixed use after free in relay thread when using elections (gh-6031).
* Fixed a possible crash when a synchronous transaction was followed by an
  asynchronous transaction right when its confirmation was being written
  (gh-6057).
* Fixed an error when a replica, in an attempt to subscribe to a foreign
  cluster (with different replica set UUID), didn't notice it is not possible,
  and instead was stuck in an infinite retry loop printing an error about "too
  early subscribe" (gh-6094).
* Fixed an error when a replica, in an attempt to join a cluster with
  exclusively read-only replicas available, instead of failing or retrying
  just decided to boot its own replica set. Now it fails with an error about
  the other nodes being read-only, so they can't register it (gh-5613).
* When an error happened during the appliance of a transaction received from a
  remote instance via replication, it was always reported as "Failed to write
  to disk" regardless of what really happened. Now the correct error is shown.
  For example, "Out of memory", or "Transaction has been aborted by conflict",
  and so on (gh-6027).
* Fixed replication stopping occasionally with `ER_INVALID_MSGPACK` when
  replica is under high load (gh-4040).
* Fixed a cluster that sometimes could not bootstrap if it contained nodes with
  `election_mode` `manual` or `voter` (gh-6018).
* Fixed a possible crash when `box.ctl.promote()` was called in a cluster
  with >= 3 instances, happened in debug build. In release build, it could lead
  to undefined behavior. It was likely to happen if a new node was added
  shortly before the promotion (gh-5430).
* Fixed a rare error appearing when MVCC (`box.cfg.memtx_use_mvcc_engine`) was
  enabled and more than one replica was joined to a cluster. The join could
  fail with the error `"ER_TUPLE_FOUND: Duplicate key exists in unique index
  'primary' in space '_cluster'"`. The same could happen at the bootstrap of a
  cluster having >= 3 nodes (gh-5601).
* Fixed replica reconnecting to a living master on any
  `box.cfg{replication=...}` change. Such reconnects could lead to replica
  failing to restore connection for `replication_timeout` seconds (gh-4669).
* Fixed potential obsolete data write in synchronous replication
  due to race in accessing terms while a disk write operation is in
  progress and not yet completed.
* Fixed replicas failing to bootstrap when the master has just restarted
  (gh-6966).
* Fixed a bug when replication was broken on the master side with
  `ER_INVALID_MSGPACK` (gh-7089).

### Raft

* Fixed `box.ctl.promote()` entering an infinite election loop when a node
  doesn't have enough peers to win the elections (gh-6654).
* Servers with elections enabled will resign the leadership and become
  read-only when the number of connected replicas becomes less than a quorum.
  This should prevent split-brain in some situations (gh-6661).
* Fixed a rare crash with the leader election enabled (any mode except `off`),
  which could happen if a leader resigned from its role at the same time as
  some other node was writing something related to the elections to WAL.
  The crash was in debug build, and in the release build, it would lead to
  undefined behavior (gh-6129).
* Fixed an error when a new replica in a Raft cluster could try to join from a
  follower instead of a leader and failed with an error `ER_READONLY`
  (gh-6127).
* Reconfiguration of `box.cfg.election_timeout` could lead to a crash or
  undefined behavior if done during an ongoing election with a special WAL
  write in progress.
* Fixed several crashes and/or undefined behaviors (assertions in debug build)
  which could appear when new synchronous transactions were made during ongoing
  elections (gh-6842).

### LuaJIT

* Fixed optimization for single-char strings in the `IR_BUFPUT` assembly
  routine.
* Fixed slots alignment in `lj-stack` command output when `LJ_GC64` is enabled
  (gh-5876).

* Fixed dummy frame unwinding in `lj-stack` command.

* Fixed top part of Lua stack (red zone, free slots, top slot) unwinding in
  `lj-stack` command.

* Added the value of `g->gc.mmudata` field to `lj-gc` output.
* Fixed detection of inconsistent renames even in the presence of sunk values
  (gh-4252, gh-5049, gh-5118).
* Fixed the order VM registers are allocated by LuaJIT frontend in case of
  `BC_ISGE` and `BC_ISGT` (gh-6227).
* Fixed inconsistency while searching for an error function when unwinding
  a C-protected frame to handle a runtime error (e.g. an error in __gc handler).
* `string.char()` built-in recording is fixed in a case when no arguments are
  given (gh-6371, gh-6548).
* Actually made JIT respect `maxirconst` trace limit while recording (gh-6548).

### Lua

* Fixed a bug when multibyte characters broke `space:fselect()` output.
* When an error is raised during encoding call results, the auxiliary
  lightuserdata value is not removed from the main Lua coroutine stack. Prior
  to the fix, it leads to undefined behavior during the next usage of this Lua
  coroutine (gh-4617).
* Fixed Lua C API misuse, when the error is raised during call results encoding
  on unprotected coroutine and expected to be caught on the different one that
  is protected (gh-6248).
* Fixed `net.box` error in case connections are frequently opened and closed
  (gh-6217).
* Fixed incorrect handling of variable number of arguments in `box.func:call()`
  (gh-6405).
* Fixed ``table.equals`` result when booleans compared (gh-6386).
* Tap subtests inherit strict mode from the parent (gh-6868).
* Fixed the behavior of the Tarantool console on SIGINT. Now Ctrl+C discards
  the current input and prints the new prompt (gh-2717).

#### Triggers

* Fixed the possibility of a crash in the case when a trigger removes itself.

* Fixed the possibility of a crash in case someone destroys a trigger
  when it's yielding (gh-6266).

### SQL

* User-defined functions can now return `VARBINARY` to SQL as a result
  (gh-6024).
* Fixed assert on a cast of `DOUBLE` value greater than -1.0 and less than 0.0
  to `INTEGER` and `UNSIGNED` (gh-6255).
* Removed spontaneous conversion from `INTEGER` to `DOUBLE` in a field of type
  `NUMBER` (gh-5335).
* All arithmetic operations can now only accept numeric values (gh-5756).
* Now function `quote()` will return an argument in case the argument is
  `DOUBLE`. The same for all other numeric types. For types other than numeric,
  `STRING` will be returned (gh-6239).
* The `TRIM()` function now does not lose collation when executed with the
  keywords `BOTH`, `LEADING`, or `TRAILING` (gh-6299).
* Now getting unsupported msgpack extension in SQL throws the correct
  error (gh-6375).
* Now, when copying an empty string, an error will not be set unnecessarily
  (gh-6157, gh-6399).
* Fixed wrong comparison between `DECIMAL` and large `DOUBLE` values (gh-6376).
* Fixed truncation of `DECIMAL` during implicit cast to `INTEGER` in `LIMIT`
  and `OFFSET`.

* Fixed truncation of `DECIMAL` during implicit cast to `INTEGER` when value is
  used in an index.

* Fixed assert on a cast of `DECIMAL` value that is greater than -1.0 and less
  than 0.0 to `INTEGER` (gh-6485).
* The `HEX()` SQL built-in function no longer throws an assert when its
  argument consists of zero-bytes (gh-6113).
* `LIMIT` is now allowed in `ORDER BY` where sort order is in both directions
  (gh-6664).
* Fixed a memory leak in SQL during a call of user-defined function (gh-6789).
* Fixed assertion or segfault when `MP_EXT` received via `net.box` (gh-6766).
* Now the `ROUND()` function properly supports `INTEGER` and `DECIMAL` as the
  first argument (gh-6988).
* Fixed a crash when a table inserted data into itself with an incorrect
  number of columns (gh-7132).

### Box

* Fixed `log.cfg` getting updated on `box.cfg` error (gh-6086).
* Fixed the error message in an attempt to insert into a tuple the size of
  which equals to `box.schema.FIELD_MAX` (gh-6198).
* We now check that all privileges passed to `box.schema.grant` are resolved
  (gh-6199).
* Added iterator type checking and allow passing iterator as
  a `box.index.{ALL,GT,...}` directly (gh-6501).

### Datetime

* Intervals received after datetime arithmetic operations may be improperly
   normalized if the result was negative

   ```lua
      tarantool> date.now() - date.now()
   ---
   - -1.000026000 seconds
   ...
   ```
   i.e. 2 immediately called `date.now()` produce very close values, which
   difference should be close to 0, not 1 second (gh-6882).
* Fixed a bug in datetime module when `date:set{tzoffset=XXX}` did not
  produce the same result with `date.new{tzoffset=XXX}` for the same
  set of attributes passed (gh-6793).

### HTTP client

* Fixed invalid headers after redirect (gh-6101).

### Mvcc

* Fixed MVCC interaction with ephemeral spaces: TX manager now ignores such
  spaces (gh-6095).
* Fixed a loss of tuple after a conflict exception (gh-6132).

* Fixed a segfault in update/delete of the same tuple (gh-6021).

### Net.box

* Changed the type of the error returned by `net.box` on timeout
  from ClientError to TimedOut (gh-6144).

### Recovery

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

### Tarantoolctl

* Fixed the missing `rocks` keyword in `tarantoolctl rocks` help messages.

### Build

* Bumped Debian packages tarantool-common dependency to use luarocks 3 (gh-5429).

* Fixed an error when it was possible to have a new Tarantool package
  (version >= 2.2.1) installed with pre-luarocks 3 tarantool-common package
  (version << 2.2.1), which caused rocks install to fail.
* The Debian package does not depend on Binutils anymore (gh-6699).
* Fixed build errors with glibc-2.34 (gh-6686).

* Changed size of alt. signal stack for ASAN needs.
* Fixed build errors on arm64 with `CMAKE_BUILD_TYPE=Debug`.
