Top.Mail.Ru
Tarantool Releases in August 2021 | Tarantool
Release notes / Tarantool Releases in August 2021
Release notes / Tarantool Releases in August 2021

Tarantool Releases in August 2021

Tarantool Releases in August 2021

Date: 2021-08-19

Meet the new Tarantool releases of August 2021: v. 2.8.2, v. 2.7.3, v. 1.10.11.

The Raft-based failover algorithm is now a part of Tarantool, available out of the box. Use it to improve data safety and reliability of Tarantool applications.

Write applications with interactive transactions in the programming language of your choice.

Interactive transactions are now part of iproto and can be used by applications in any programming language.

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

Upgrade using the box.schema.upgrade() procedure to unlock all the new features of the 2.x series.

Some changes are labeled as [Breaking change]. It means that the old behavior was considered error-prone and therefore changed to protect users from unintended mistakes. However, there is a small probability that someone can rely on the old behavior, and this label is to bring attention to the things that have been changed.

  • The information about the state of synchronous replication is now available via the box.info.synchro interface (v. 2.7.3, gh-5191).

  • Introduce the new method table.equals. It compares two tables by value with respect to the __eq metamethod (v. 2.8.2, v. 2.7.3).

  • The log module now supports symbolic representation of log levels. Now it is possible to specify levels the same way as in the box.cfg{} call (v. 2.8.2, gh-5882).

    For example, instead of

    require('log').cfg{level = 6}
    

    it is possible to use

    require('log').cfg{level = 'verbose'}
    

  • Descriptions of type mismatch error and inconsistent type error have become more informative (v. 2.8.2, v. 2.7.3, gh-6176).
  • Removed explicit cast from BOOLEAN to numeric types and vice versa (v. 2.8.2, v. 2.7.3, gh-4770).
  • Removed explicit cast from VARBINARY to numeric types and vice versa (v. 2.8.2, v. 2.7.3, gh-4772, gh-5852).
  • Fixed a bug where a string that is not NULL-terminated could not be cast to BOOLEAN, even if the conversion would be successful according to the rules (v. 2.8.2, v. 2.7.3).

  • Fedora 34 builds are now supported (v. 2.8.2, gh-6074).
  • Fedora 28 and 29 builds are no longer supported.

  • [Breaking change] fiber.wakeup() in Lua and fiber_wakeup() in C became NOP on the currently running fiber. Previously they allowed “ignoring” the next yield or sleep, which resulted in unexpected erroneous wake-ups. Calling these functions right before fiber.create() in Lua or fiber_start() in C could lead to a crash (in debug build) or undefined behaviour (in release build) (gh-6043).

    There was a single use case for the previous behaviour: rescheduling in the same event loop iteration, which is not the same as fiber.sleep(0) in Lua and fiber_sleep(0) in C. It could be done in the following way:

    in C:

    fiber_wakeup(fiber_self());
    fiber_yield();
    

    and in Lua:

    fiber.self():wakeup()
    fiber.yield()
    

    To get the same effect in C, one can now use fiber_reschedule(). In Lua, it is now impossible to reschedule the current fiber directly in the same event loop iteration. One can reschedule self through a second fiber, but it is strongly discouraged:

    -- do not use this code
    local self = fiber.self()
    fiber.new(function() self:wakeup() end)
    fiber.sleep(0)
    
  • Fixed memory leak on box.on_commit() and box.on_rollback() (gh-6025).

  • fiber_join() now checks if the argument is a joinable fiber. The absence of this check could lead to unpredictable results. Note that the change affects the C level only; in the Lua interface, fiber:join() protection is already enabled (v. 2.8.2, v. 2.7.3).

  • Now Tarantool yields when it scans .xlog files for the latest applied vclock and finds the right place to start recovering from. It means that the instance becomes responsive right after the box.cfg call even if an empty .xlog was not created on the previous exit.

    This fix also prevents the relay from timing out when a freshly subscribed replica needs rows from the end of a relatively long (hundreds of MBs) .xlog file (v. 2.8.2, v. 2.7.3, gh-5979).

  • The counter in N rows processed log messages no longer resets on each newly recovered xlog (v. 2.8.2, v. 2.7.3).

  • Fixed a crash in JSON update on tuple/space, where the update included two or more operations that accessed fields in reversed order and these fields didn’t exist. Example: box.tuple.new({1}):update({{'=', 4, 4}, {'=', 3, 3}}) (v. 2.8.2, gh-6069).

  • Fixed invalid results of the json module’s encode function when it was used from the Lua garbage collector. For example, this could happen in functions used as ffi.gc() (gh-6050).

  • Added a check for user input of the number of iproto threads: value must be greater than zero and less than or equal to 1000 (v. 2.8.2, gh-6005).

  • Changing a listed address can no longer cause iproto threads to close the same socket several times (v. 2.8.2).

  • Tarantool now always removes the Unix socket correctly when it exits (v. 2.8.2).

  • Simultaneously updating a key in different transactions does not longer result in a MVCC crash (v. 2.8.2, v. 2.7.3, gh-6131).

  • Fixed a bug where memtx MVCC crashed during reading uncommitted DDL (v. 2.8.2, v. 2.7.3, gh-5515).

  • Fixed a bug where memtx MVCC crashed if an index was created in the transaction thread (v. 2.8.2, v. 2.7.3, gh-6137).

  • Fixed a MVCC segmentation fault that arose when updating the entire space concurrently (v. 2.8.2, v. 2.7.3, gh-5892).

  • Fixed a bug with failed assertion after a stress update of the same key (v. 2.8.2, v. 2.7.3, gh-6193).

  • Fixed a crash where box.snapshot could be called during an incomplete transaction (v. 2.8.2, v. 2.7.3, gh-6229).

  • Fixed console client connection failure in case of request timeout (gh-6249).

  • Added a missing broadcast to net.box.future:discard() so that now fibers waiting for a request result wake up when the request is discarded (gh-6250).

  • box.info.uuid, box.info.cluster.uuid, and tostring(decimal) with any decimal number in Lua could sometimes return garbage if there were __gc handlers in the user’s code (v. 2.8.2, v. 2.7.3, gh-6259).

  • Fixed an error message that appeared in a particular case during MVCC operation (gh-6247).

  • Fixed a repeatable read violation after delete (v. 2.8.2, v. 2.7.3, gh-6206).

  • Fixed a bug where the MVCC engine didn’t track the select{} hash (v. 2.8.2, v. 2.7.3, gh-6040).

  • Fixed a crash in MVCC after a drop of space with several indexes (v. 2.8.2, v. 2.7.3, gh-6274).

  • Fixed a bug where the GC could leave tuples in secondary indexes (v. 2.8.2, v. 2.7.3, gh-6234).

  • Disallow yields after DDL operations in MVCC mode. It fixes a crash that took place when several transactions referred to system spaces (v. 2.8.2, v. 2.7.3, gh-5998).

  • Fixed a bug in MVCC that happened on rollback after a DDL operation (v. 2.8.2, v. 2.7.3, gh-5998).

  • Fixed a bug where rollback resulted in unserializable behavior (v. 2.8.2, v. 2.7.3, gh-6325).

  • Fixed possible keys divergence during secondary index build, which might lead to missing tuples (v. 2.8.2, v. 2.7.3, gh-6045).
  • Fixed the race between Vinyl garbage collection and compaction that resulted in a broken vylog and recovery failure (v. 2.8.2, v. 2.7.3, gh-5436).

  • Fixed the use after free in the relay thread when using elections (v. 2.8.2, v. 2.7.3, gh-6031).
  • Fixed a possible crash when a synchronous transaction was followed by an asynchronous transaction right when its confirmation was being written (v. 2.8.2, v. 2.7.3, gh-6057).
  • Fixed an error where a replica, while attempting to subscribe to a foreign cluster with a different replicaset UUID, didn’t notice it is impossible and instead became stuck in an infinite retry loop printing a TOO_EARLY_SUBSCRIBE error (v. 2.8.2, v. 2.7.3, gh-6094).
  • Fixed an error where a replica, while attempting to join a cluster with exclusively read-only replicas available, just booted its own replicaset, instead of failing or retrying. Now it fails with an error about the other nodes being read-only so they can’t register the new replica (v. 2.8.2, v. 2.7.3, gh-5613).
  • Fixed error reporting associated with transactions received from remote instances via replication. Any error raised while such a transaction was being applied 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 (v. 2.8.2, v. 2.7.3, gh-6027).
  • Fixed replication occasionally stopping with ER_INVALID_MSGPACK when the replica is under high load (gh-4040).
  • Fixed a cluster sometimes being unable to bootstrap if it contains nodes with election_mode set to manual or voter (v. 2.8.2, v. 2.7.3, gh-6018).
  • Fixed a possible crash when box.ctl.promote() was called in a cluster with more than three instances. The crash happened in the debug build. In the release build, it could lead to undefined behaviour. It was likely to happen if a new node was added shortly before the promotion (v. 2.8.2, v. 2.7.3, gh-5430).
  • Fixed a rare error appearing when MVCC (box.cfg.memtx_use_mvcc_engine) was enabled and more than one replica joined the 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 more than three nodes (v. 2.8.2, v. 2.7.3, gh-5601).

  • Fixed a rare crash with leader election enabled (any mode except off), which could happen if a leader resigned from its role while another node was writing something elections-related to WAL. The crash was in the debug build, and in the release build it would lead to undefined behaviour (v. 2.8.2, v. 2.7.3, gh-6129).
  • Fixed an error where a new replica in a Raft cluster tried to join from a follower instead of a leader and failed with the error ER_READONLY (v. 2.8.2, v. 2.7.3, gh-6127).

  • Fixed optimization for single-char strings in the IR_BUFPUT assembly routine.
  • Fixed slots alignment in the lj-stack command output when LJ_GC64 is enabled (gh-5876).
  • Fixed dummy frame unwinding in the lj-stack command.
  • Fixed detection of inconsistent renames even in the presence of sunk values (gh-4252, gh-5049, gh-5118).
  • Fixed the VM register allocation order provided by LuaJIT frontend in case of BC_ISGE and BC_ISGT (gh-6227).

  • When an error occurs during encoding call results, the auxiliary lightuserdata value is not removed from the main Lua coroutine stack. Before the fix, it led to undefined behaviour during the next usage of this Lua coroutine (gh-4617).
  • Fixed a Lua C API misuse when the error is raised during call results encoding in an unprotected coroutine and expected to be caught in a different, protected coroutine (gh-6248).

  • Fixed a possible crash in case trigger removes itself. Fixed a possible crash in case someone destroys a trigger when it yields (gh-6266).

  • Fixed MVCC interaction with ephemeral spaces: TX manager now ignores them (v. 2.8.2, gh-6095).
  • Fixed loss of tuples after a conflict exception (v. 2.8.2, gh-6132).
  • Fixed a segfault during update/delete of the same tuple (v. 2.8.2, gh-6021).