Release notes | Tarantool
Release notes
Release notes

Release notes

Release notes

The Release Notes are summaries of significant changes introduced in Tarantool 2.2.1, 2.1.2, 2.1.1, 2.0.4, 1.10.4, 1.10.3, 1.10.2, 1.9.0, 1.8.1, 1.7.6, 1.7.5, 1.7.4, 1.7.3, 1.7.2, 1.7.1, 1.6.9, 1.6.8, and 1.6.6.

For smaller feature changes and bug fixes, see closed milestones at GitHub.

Tarantool 2.x is backward compatible with Tarantool 1.10.x in binary data layout, client-server protocol and replication protocol. You can upgrade using the box.schema.upgrade() procedure.

Release 2.4.1


  • (SQL) SESSION will be a reserved word so objects named SESSION will be illegal. Part of issue 4711.
  • In box.session.push() the use of the sync parameter will cause a warning in version 2.4.1 and will cause an error in later versions. Part of issue 4689.

Release 2.2.1

Release type: beta. Release date: 2019-08-02.


This is a beta version of the 2.2 series. The label “beta” means we have no critical issues and all planned features are there.

The goal of this release is to introduce new indexing features, extend SQL feature set, and improve integration with the core.

Functionality added or changed:

  • (SQL) ALTER now allows to add a constraint:

  • (SQL) CHECK constraints are validated during DML operations performed from the Lua land:

    s ='withdata')
    pk = s:create_index('pk')
    s:format({{'idx', 'number'}})
    s:create_check_constraint('le10', '"idx" < 10')
    tarantool> s:insert({11})
    - error: 'Check constraint failed ''le10'': "idx" < 10'
  • (SQL) New SQL types introduced: VARBINARY, UNSIGNED, and BOOLEAN.

  • (SQL) CREATE TABLE statement (and all other data definition statements) are now truly transactional.

  • (SQL) SQL now uses Tarantool diagnostics API to set errors, so error reporting now provides an error code in addition to error message.

  • (SQL) Multiple improvements to the type system to make it more consistent.

  • (SQL) Added aliases for LENGTH() from ANSI SQL: CHAR_LENGTH() and CHARACTER_LENGTH().

  • (SQL) It is possible to use HAVING without GROUP BY.

  • (Server) New fixed point type (DECIMAL) introduced to Tarantool:

    decimal = require('decimal')
    tarantool> a ='123.456789')
    tarantool> decimal.precision(a)
    - 9
    tarantool> decimal.scale(a)
    - 6
    tarantool> decimal.round(a, 4)
    - '123.4568'
  • (Server) Multikey index support:

    -- Multikey indexes (for memtx tree & vinyl);
    -- cannot be primary; may be non-unique
    s ='clients', {engine = 'vinyl'})
    pk = s:create_index('pk')
    phone_type = s:create_index('phone_type', {
        unique = false,
        parts = {{'[3][*].type', 'str'}}})
    s:insert({1, 'James',
             {{type = 'home', number = '999'},
              {type = 'work', number = '777'}
    s:insert({2, 'Bob',
              {{type = 'work', number = '888'}}})
    s:insert({3, 'Alice', {{type = 'home', number = '333'}}})
    tarantool> phone_type:select('work')
    - - [1, 'James', [{'type': 'home', 'number': '999'},
                      {'type': 'work', 'number': '777'}]]
      - [2, 'Bob', [{'type': 'work', 'number': '888'}]]
  • (Server) Now it is possible to make functions persistent:

                          {body = [[function(a,b) return a+b end]],
                          is_deterministic = true})
    tarantool> box.func.summarize
    - aggregate: none
      returns: any
        lua: true
        sql: false
      id: 66
      is_sandboxed: false
      setuid: false
      is_multikey: false
      is_deterministic: true
      body: function(a,b) return a+b end
      name: summarize
      language: LUA
    tarantool> box.func.summarize:call({1, 2})
    - 3
  • (Server) Functional indexes implemented:

    -- Functional multikey indexes: define is_multikey = true
    -- in function definition and return a table of keys from function
    lua_code = [[function(tuple)
                    local address = string.split(tuple[2])
                    local ret = {}
                    for _, v in pairs(address) do table.insert(ret, {utf8.upper(v)}) end
                    return ret
    box.schema.func.create('addr_extractor', {body = lua_code,
                                              is_deterministic = true,
                                              is_sandboxed = true,
                                              opts = {is_multikey = true}})
    s ='withdata')
    pk = s:create_index('name', {parts = {1, 'string'}})
    idx = s:create_index('addr', {unique = false, func =, parts = {{1, 'string', collation = 'unicode_ci'}}})
    s:insert({"James", "SIS Building Lambeth London UK"})
    s:insert({"Sherlock", "221B Baker St Marylebone London NW1 6XE UK"})
    tarantool>  idx:select('Sis')
    - - ['James', 'SIS Building Lambeth London UK']
  • Partial core dumps, which are now on by default. It is now possible to avoid dumping tuples at all during core dump.

  • Data definition statements, such as create or alter index, which do not yield, can now be used in a transaction. This in practice includes all statements except creating an index on a non-empty space, or changing a format on a non-empty space.

  • It is now possible to set a sequence not only for the first part of the index:{sequence = {field = 2}}
  • Allow to call box.session.exists() and box.session.fd() without any arguments.

  • New function introduced to get an index key from a tuple:

    s ='withdata')
    pk = s:create_index('pk')
    sk = s:create_index('sk', {parts = {
          {2, 'number', path = 'a'},
          {2, 'number', path = 'b'}}})
    s:insert{1, {a = 1, b = 1}}
    s:insert{2, {a = 1, b = 2}}
    s:insert{3, {a = 3, b = 3}}
    key_def_lib = require('key_def')
    key_def =
    for _, tuple in sk:pairs({1}) do
        local key = key_def:extract_key(tuple)
  • (Engines) New protocol (called SWIM) implemented to keep a table of cluster members.

  • (Engines) Removed yields from Vinyl DDL on commit triggers.

  • (Engines) Improved performance of SELECT-s on memtx spaces. The drawback is that now every memtx-tree tuple consumes extra 8 bytes for a search hint.

  • (Engines) Indexes of memtx spaces are now built in background fibers. This means that we do not block the event loop during index build anymore.

  • Replication applier now can apply transactions which were concurrent on the master concurrently on replica. This dramatically improves replication peak performance, from ~50K writes per second to 200K writes per second and higher on a single instance.

  • Transaction boundaries introduced to replication protocol. This means that Tarantool replication is now transaction-safe, and also reduces load on replica write ahead log in case the master uses a lot of multi-statement transactions.

  • Tuple access by field name for

    box.cfg{listen = 3302}
    box.schema.user.grant('guest','read, write, execute', 'space')
    box.schema.user.grant('guest', 'create', 'space')
    box.schema.create_space("named", {format = {{name = "id"}}})'id', {parts = {{1, 'unsigned'}}}){1})
    require('').connect('localhost', 3302).space.named:get(1).id
  • Cluster id check is now the slave’s responsibility.

  • It is now possible to set the output format to Lua instead of YAML in the interactive console.

  • Multiple new collations added. New collations follow this naming pattern:


    Three strengths are used:

    • Primary - “s1”
    • Secondary - “s2”
    • Tertiary - “s3”

    The following list contains so-called “stable” collations - the ones whose sort order doesn’t depend on the ICU version:

  • New function utime() introduced to the fio module.

  • Merger for tuples streams added.

Release 2.1.2

Release type: stable. Release date: 2019-04-05.


This is the first stable release in the 2.x series.

The goal of this release is to significantly extend SQL support and increase stability.

Functionality added or changed:

  • (SQL) box.sql.execute() replaced with box.execute(). It now works just like netbox.execute(): returns result set metadata, row count, etc. E.g.:

    box.execute("CREATE TABLE person(id INTEGER PRIMARY KEY, birth_year INT)")
    - row_count: 1
    box.execute("SELECT birth_year FROM person")
    - metadata:
      - name: birth_year
        type: INTEGER
      - [1983]
      - [1984]
  • (SQL) Type system was significantly refactored.

  • (SQL) There are cases in SQL when it is possible to do Tarantool’s update operation for UPDATE statement, instead of doing delete + insert. However, there are cases where SQL semantics is too complex. E.g.:

    CREATE TABLE file (id INT PRIMARY KEY, checksum INT);
    INSERT INTO stock VALUES (1, 3),(2, 4),(3,5);
    CREATE UNIQUE INDEX i ON file (checksum);
    SELECT * FROM file;
    -- [1, 3], [2, 4], [3, 5]
    UPDATE OR REPLACE file SET checksum = checksum + 1;
    SELECT * FROM stock;
    -- [1, 4], [3, 6]

    I.e. [1, 3] tuple is updated as [1, 4] and have replaced tuple [2, 4]. This logic is implemented by preventive tuple deletion from all corresponding indexes in SQL.

  • (SQL) Now SQL’s integer type is stored as integer in space’s format. It was stored as scalar before, which made comparisons slow.

  • (SQL) It is now possible to define a constraint within column definition. E.g.:

    CREATE TABLE person (id INT PRIMARY KEY, age INT, CHECK (age > 10));
  • (SQL) Syntax for the pragma pragma index_info is now unified with table_info. E.g. to get information on index age_index of table person you can write:

    pragma index_info(person.age_index);
  • (Server) It is now possible to index a field specified using JSON. E.g.:

    person = box.schema.create_space("person")
    name_idx = person:create_index('name', {parts = {{'[2]fname', 'str'}, {'[2]sname', 'str'}}})
    person:insert({1, {fname='James', sname='Bond'}, {town='London', country='GB', organization='MI6'}})
  • (Server) In case of out of space event, Tarantool is now allowed to delete backup WAL files not needed for recovery from the last checkpoint.

  • (Server) Add support for tarantoolctl rocks pack / unpack subcommands. The subcommands are used to create / deploy binary rock distributions.

  • (Server) string.rstrip and string.lstrip should accept symbols to strip. Add optional ‘chars’ parameter for specifying the unwanted characters. E.g.:

    local chars = "#\0"
    str = "##Hello world!#"
    print(string.strip(str, chars)) -- "Hello world!"
  • (Server) on_shutdown trigger added. It may be set in a way similar to space:on_replace triggers:

    box.ctl.on_shutdown(new_trigger, old_trigger)
  • (Server) on_schema_init trigger added. It may be set before the first call to box.cfg() and is fired during box.cfg() before user data recovery start. To set the trigger, say:

    box.ctl.on_schema_init(new_trig, old_trig)
  • (Server) A new option for the snapshot daemon, box.cfg.checkpoint_wal_threshold, allows to limit the maximum disk size of maintained WALs. Once the configured threshold is exceeded, the WAL thread notifies the checkpoint daemon that it’s time to make a new checkpoint and delete old WAL files.

  • (Server) New types of privileges – to create, alter and drop space – were introduced. In order to create, drop or alter space or index, you should have a corresponding privilege. E.g.:

    box.schema.user.create("optimizer", { password  = 'secret' })
    box.schema.user.grant("optimizer", "alter", "space")
    person ="person")"optimizer")
    i = s:create_index("primary") -- success
    s:insert{1} -- fail
    s:select{} -- fail
    s:drop() -- fail

    Notice the incompatible change: Tarantool 1.10 requires read/write/execute privileges on an object to allow create, drop or alter. These privileges are no longer sufficient in 2.1. To remedy the problem, Tarantool 2.1 automatically grants create/drop/alter privileges on an object if a user has read/write/execute privileges on it during schema upgrade. But old scripts may stop working if read/write/execute is granted after schema upgrade.

    Additionally, create/drop/alter privileges are already supported in 1.10, which also supports the old semantics of read/write/execute. You are encouraged to grant new privileges in 1.10 before upgrade and modify your scripts.

Release 2.1.1

Release type: beta. Release date: 2018-11-14.


This release resolves all major bugs since 2.0.4 alpha and extends Tarantool’s SQL feature set.

Release 2.0.4

Release type: alpha. Release date: 2018-02-15.


This is a successor of the 1.8.x releases. It improves the overall stability of the SQL engine and has some new features.

Functionality added or changed:

  • Added support for SQL collations by incorporating libICU character set and collation library.
  • IPROTO interface was extended to support SQL queries.
  • subsystem was extended to support SQL queries.
  • Enabled ANALYZE statement to produce correct results, necessary for efficient query plans.
  • Enabled savepoints functionality. SAVEPOINT statement works w/o issues.
  • Enabled ALTER TABLE ... RENAME statement.
  • Improved rules for identifier names: now fully consistent with Lua frontend.
  • Enabled support for triggers; trigger bodies now persist in Tarantool snapshots and survive server restart.
  • Significant performance improvements.

Release 1.10.4

Release type: stable (lts). Release date: 2019-09-26. Tag: 1-10-4.



1.10.4 is the next stable (lts) release in the 1.10 series. The label ‘stable’ means we have had systems running in production without known crashes, bad results or other showstopper bugs for quite a while now.

This release resolves about 50 issues since 1.10.3.


Tarantool 1.10.x is backward compatible with Tarantool 1.9.x in binary data layout, client-server protocol and replication protocol. Please upgrade using the box.schema.upgrade() procedure to unlock all the new features of the 1.10.x series when migrating from 1.9 version.

Functionality added or changed

  • (Engines) Improve dump start/stop logging. When initiating memory dump, print how much memory is going to be dumped, expected dump rate, ETA, and the recent write rate. Upon dump completion, print observed dump rate in addition to dump size and duration.

  • (Engines) Look up key in reader thread. If a key isn’t found in the tuple cache, we fetch it from a run file. In this case disk read and page decompression is done by a reader thread, however key lookup in the fetched page is still performed by the TX thread. Since pages are immutable, this could as well be done by the reader thread, which would allow us to save some precious CPU cycles for TX. Issue 4257.

  • (Core) Improve Issue 4150.

  • (Core) Add idle to downstream status in When a relay sends a row it updates last_row_time value with the current time. When is called, idle is set to current_time - last_row_time.

  • (Replication) Print corrupted rows on decoding error. Improve row printing to log. Print the header row by row, 16 bytes in a row, and format output to match xxd output:

    [001] 2019-04-05 18:22:46.679 [11859] iproto V> Got a corrupted row:
    [001] 2019-04-05 18:22:46.679 [11859] iproto V> 00000000: A3 02 D6 5A E4 D9 E7 68 A1 53 8D 53 60 5F 20 3F
    [001] 2019-04-05 18:22:46.679 [11859] iproto V> 00000010: D8 E2 D6 E2 A3 02 D6 5A E4 D9 E7 68 A1 53 8D 53
  • (Lua) Add type of operation to space trigger parameters. For example, a trigger function may now look like this:

    function before_replace_trig(old, new, space_name, op_type)
        if op_type == 'INSERT' then
            return old
            return new

    Issue 4099.

  • (Lua) Add debug.sourcefile() and debug.sourcedir() helpers (and debug.__file__ and debug.__dir__ shortcuts) to determine the location of a current Lua source file. Part of issue 4193.

  • (HTTP client) Add max_total_connections option in addition to max_connections to allow more fine-grained tuning of libcurl connection cache. Don’t restrict the total connections` with a constant value by default, but use libcurl’s default, which scales the threshold according to easy handles count. Issue 3945.

Bugs fixed

  • (Vinyl) Fix assertion failure in vy_tx_handle_deferred_delete. Issue 4294.
  • (Vinyl) Don’t purge deleted runs from vylog on compaction. Cherry-picked from issue 4218.
  • (Vinyl) Don’t throttle DDL. Issue 4238.
  • (Vinyl) Fix deferred DELETE statement lost on commit. Issue 4248.
  • (Vinyl) Fix assertion while recovering dumped statement. Issue 4222.
  • (Vinyl) Reset dump watermark after updating memory limit. Issue 3864.
  • (Vinyl) Be pessimistic about write rate when setting dump watermark. Issue 4166.
  • (Vinyl) Fix crash if space is dropped while space.get is reading from it. Issue 4109.
  • (Vinyl) Fix crash during index build. Issue 4152.
  • (Vinyl) Don’t compress L1 runs. Issue 2389.
  • (Vinyl) Account statements skipped on read.
  • (Vinyl) Take into account primary key lookup in latency accounting.
  • (Vinyl) Fix vy_range_update_compaction_priority hang.
  • (Vinyl) Free region on vylog commit instead of resetting it and clean up region after allocating surrogate statement.
  • (Vinyl) Increase even more the open file limit in systemd unit file.
  • (Vinyl) Increment min range size to 128MB
  • (Memtx) Cancel checkpoint thread at exit. Issue 4170.
  • (Core) Fix crash for update with empty tuple. Issue 4041.
  • (Core) Fix use-after-free in space_truncate. Issue 4093.
  • (Core) Fix error while altering index with sequence. Issue 4214.
  • (Core) Detect a new invalid json path case. Issue 4419.
  • (Core) Fix empty password authentication. Issue 4327.
  • (Core) Fix txn::sub_stmt_begin array size.
  • (Core) Account index.pairs in box.stat.SELECT().
  • (Replication) Disallow bootstrap of read-only masters. Issue 4321.
  • (Replication) Enter orphan mode on manual replication configuration change. Issue 4424.
  • (Replication) Set last_row_time to now in relay_new and relay_start. PR 4431.
  • (Replication) Stop relay on subscribe error. Issue 4399.
  • (Replication) Init coio watcher before join/subscribe. Issue 4110.
  • (Replication) Allow to change instance id during join. Issue 4107.
  • (Replication) Fix garbage collection logic.
  • (Replication) Revert packet boundary checking for iproto.
  • (Replication) Do not abort replication on ER_UNKNOWN_REPLICA.
  • (Replication) Reduce effects of input buffer fragmentation on large cfg.readahead.
  • (Replication) Fix upgrade from 1.7 (it doesn’t recognize IPROTO_VOTE request type).
  • (Replication) Fix memory leak in call / eval in the case when a transaction is not committed. Issue 4388.
  • (Lua) Fix fio.mktree() error reporting. Issue 4044.
  • (Lua) Fix segfault on ffi.C_say() without filename. Issue 4336.
  • (Lua) Fix segfault on json.encode() on a recursive table. Issue 4366.
  • (Lua) Fix pwd.getpwall() and pwd.getgrall() hang on CentOS 6 and FreeBSD 12. Issues 4447, 4428.
  • (Lua) Fix a segfault during initialization of a cipher from crypto module. Issue 4223.
  • (HTTP client) Reduce stack consumption during waiting for a DNS resolving result. Issue 4179.
  • (HTTP client) Increase max outgoing header size to 8 KiB. Issue 3959.
  • (HTTP client) Verify “headers” option stronger. Issues 4281, 3679.
  • (HTTP client) Use bundled libcurl rather than system-wide by default. Issues 4318, 4180, 4288, 4389, 4397.
  • (HTTP client) This closes several known problems that were fixed in recent libcurl versions, including segfaults, hangs, memory leaks and performance problems.
  • (LuaJIT) Fix overflow of snapshot map offset. Part of issue 4171.
  • (LuaJIT) Fix rechaining of pseudo-resurrected string keys. Part of issue 4171.
  • (LuaJIT) Fix fold machinery misbehaves. Issue 4376.
  • (LuaJIT) Fix for debug.getinfo(1,’>S’). Issue 3833.
  • (LuaJIT) Fix string.find recording. Issue 4476.
  • (LuaJIT) Fixed a segfault when unsinking 64-bit pointers.
  • (Misc) Increase even more the open file limit in systemd unit file.
  • (Misc) Raise error in tarantoolctl when box.cfg() isn’t called. Issue 3953.
  • (Misc) Support systemd’s NOTIFY_SOCKET on OS X. Issue 4436.
  • (Misc) Fix coio_getaddrinfo() when 0 timeout is passed (affects netbox’s connect_timeout). Issue 4209.
  • (Misc) Fix coio_do_copyfile() to perform truncate of destination (affects fio.copyfile()). Issue 4181.
  • (Misc) Make hints in coio_getaddrinfo() optional.
  • (Misc) Validate msgpack.decode() cdata size argument. Issue 4224.
  • (Misc) Fix linking with static openssl library. Issue 4437.


  • (Core) Deprecate rows_per_wal in favor of wal_max_size. Part of issue 3762.

Release 1.10.3

Release type: stable (lts). Release date: 2019-04-01. Tag: 1-10-3.



1.10.3 is the next stable (lts) release in the 1.10 series. The label ‘stable’ means we have had systems running in production without known crashes, bad results or other showstopper bugs for quite a while now.

This release resolves 69 issues since 1.10.2.


Tarantool 1.10.x is backward compatible with Tarantool 1.9.x in binary data layout, client-server protocol and replication protocol. Please upgrade using the box.schema.upgrade() procedure to unlock all the new features of the 1.10.x series when migrating from 1.9 version.

Functionality added or changed

  • (Engines) Randomize vinyl index compaction Issue 3944.
  • (Engines) Throttle tx thread if compaction doesn’t keep up with dumps Issue 3721.
  • (Engines) Do not apply run_count_per_level to the last level Issue 3657.
  • (Server) Report the number of active iproto connections Issue 3905.
  • (Replication) Never keep a dead replica around if running out of disk space Issue 3397.
  • (Replication) Report join progress to the replica log Issue 3165.
  • (Lua) Expose snapshot status in Issue 3935.
  • (Lua) Show names of Lua functions in backtraces in Issue 3538.
  • (Lua) Check if transaction opened Issue 3518.

Bugs fixed

  • (Engines) Tarantool crashes if DML races with DDL Issue 3420.
  • (Engines) Recovery error if DDL is aborted Issue 4066.
  • (Engines) Tarantool could commit in the read-only mode Issue 4016.
  • (Engines) Vinyl iterator crashes if used throughout DDL Issue 4000.
  • (Engines) Vinyl doesn’t exit until dump/compaction is complete Issue 3949.
  • (Engines) After re-creating secondary index no data is visible Issue 3903.
  • (Engines) underflow Issue 3897.
  • (Engines) Vinyl stalls on intensive random insertion Issue 3603.
  • (Server) Newer version of libcurl explodes fiber stack Issue 3569.
  • (Server) SIGHUP crashes tarantool Issue 4063.
  • (Server) checkpoint_daemon.lua:49: bad argument #2 to ‘format’ Issue 4030.
  • (Server) fiber:name() show only part of name Issue 4011.
  • (Server) Second hot standby switch may fail Issue 3967.
  • (Server) Updating box.cfg.readahead doesn’t affect existing connections Issue 3958.
  • (Server) fiber.join() blocks in ‘suspended’ if fiber has cancelled Issue 3948.
  • (Server) Tarantool can be crashed by sending gibberish to a binary socket Issue 3900.
  • (Server) Stored procedure to produce push-messages never breaks on client disconnect Issue 3859.
  • (Server) Tarantool crashed in lj_vm_return Issue 3840.
  • (Server) Fiber executing box.cfg() may process messages from iproto Issue 3779.
  • (Server) Possible regression on nosqlbench Issue 3747.
  • (Server) Assertion after improper index creation Issue 3744.
  • (Server) Tarantool crashes on vshard startup (lj_gc_step) Issue 3725.
  • (Server) Do not restart replication on box.cfg if the configuration didn’t change Issue 3711.
  • (Replication) Applier times out too fast when reading large tuples Issue 4042.
  • (Replication) Vinyl replica join fails Issue 3968.
  • (Replication) Error during replication Issue 3910.
  • (Replication) Downstream status doesn’t show up in unless the channel is broken Issue 3904.
  • (Replication) replication fails: tx checksum mismatch Issue 3993.
  • (Replication) Rebootstrap crashes if master has replica’s rows Issue 3740.
  • (Replication) After restart tuples revert back to their old state which was before replica sync Issue 3722.
  • (Replication) Add vclock for safer hot standby switch Issue 3002.
  • (Replication) Master row is skipped forever in case of wal write failure Issue 2283.
  • (Lua) space:frommap():tomap() conversion fail Issue 4045.
  • (Lua) Non-informative message when trying to read a negative count of bytes from socket Issue 3979.
  • (Lua) space:frommap raise “tuple field does not match…” even for nullable field Issue 3883.
  • (Lua) Tarantool crashes on after some uptime with vshard internal fiber Issue 3751.
  • (Lua) Heap use after free in lbox_error Issue 1955.
  • (Misc) http.client doesn’t honour ‘connection: keep-alive’ Issue 3955.
  • (Misc) wait_connected is broken Issue 3856.
  • (Misc) Mac build fails on Mojave Issue 3797.
  • (Misc) FreeBSD build error: no SSL support Issue 3750.
  • (Misc) ‘http.client’ sets invalid (?) reason Issue 3681.
  • (Misc) Http client silently modifies headers when value is not a “string” or a “number” Issue 3679.
  • (Misc) yaml.encode uses multiline format for ‘false’ and ‘true’ Issue 3662.
  • (Misc) yaml.encode encodes ‘null’ incorrectly Issue 3583.
  • (Misc) Error object message is empty Issue 3604.
  • (Misc) Log can be flooded by warning messages Issue 2218.


Release 1.10.2

Release type: stable (lts). Release date: 2018-10-13. Tag: 1-10-2.


This is the first stable (lts) release in the 1.10 series. Also, Tarantool 1.10.2 is a major release that deprecates Tarantool 1.9.2. It resolves 95 issues since 1.9.2.

Tarantool 1.10.x is backward compatible with Tarantool 1.9.x in binary data layout, client-server protocol and replication protocol. You can upgrade using the box.schema.upgrade() procedure.

The goal of this release is to significantly increase vinyl stability and introduce automatic rebootstrap of a Tarantool replica set.

Functionality added or changed:

  • (Engines) support ALTER for non-empty vinyl spaces. Issue 1653.
  • (Engines) tuples stored in the vinyl cache are not shared among the indexes of the same space. Issue 3478.
  • (Engines) keep a stack of UPSERTS in vy_read_iterator. Issue 1833.
  • (Engines) box.ctl.reset_stat(), a function to reset vinyl statistics. Issue 3198.
  • (Server) configurable syslog destination. Issue 3487.
  • (Server) allow different nullability in indexes and format. Issue 3430.
  • (Server) allow to back up any checkpoint, not just the last one. Issue 3410.
  • (Server) a way to detect that a Tarantool process was started / restarted by tarantoolctl (TARANTOOLCTL and TARANTOOL_RESTARTED env vars). Issues 3384, 3215.
  • (Server) net_msg_max configuration parameter to restrict the number of allocated fibers. Issue 3320.
  • (Replication) display the connection status if the downstream gets disconnected from the upstream ( = disconnected). Issue 3365.
  • (Replication) replica-local spaces Issue 3443.
  • (Replication) replication_skip_conflict, a new option in box.cfg{} to skip conflicting rows in replication. Issue 3270.
  • (Replication) remove old snapshots which are not needed by replicas. Issue 3444.
  • (Replication) log records which tried to commit twice. Issue 3105.
  • (Lua) new function fiber.join(). Issue 1397.
  • (Lua) new option names_only to tuple:tomap(). Issue 3280.
  • (Lua) support custom rock servers (server and only-server options for tarantoolctl rocks command). Issue 2640.
  • (Lua) expose on_commit/on_rollback triggers to Lua; Issue 857.
  • (Lua) new function box.is_in_txn() to check if a transaction is open; Issue 3518.
  • (Lua) tuple field access via a json path (by number, name, and path); Issue 1285.
  • (Lua) new function space:frommap(); Issue 3282.
  • (Lua) new module utf8 that implements libicu’s bindings for use in Lua; Issues 3290, 3385.

Release 1.9.0

Release type: stable. Release date: 2018-02-26. Tag: 1.9.0-4-g195d446.


This is the successor of the 1.7.6 stable release. The goal of this release is increased maturity of vinyl and master-master replication, and it contributes a number of features to this cause. Please follow the download instructions at to download and install a package for your operating system.

Functionality added or changed:

  • (Security) it is now possible to block/unblock users. Issue 2898.
  • (Security) new function box.session.euid() to return effective user. Effective user can be different from authenticated user in case of setuid functions or Issue 2994.
  • (Security) new super role, with superuser access. Grant ‘super’ to guest to disable access control. Issue 3022.
  • (Security) on_auth trigger is now fired in case of both successful and failed authentication. Issue 3039.
  • (Replication/recovery) new replication configuration algorithm: if replication doesn’t connect to replication_quorum peers in replication_connect_timeout seconds, the server start continues but the server enters the new orphan status, which is basically read-only, until the replicas connect to each other. Issues 3151 and 2958.
  • (Replication/recovery) after replication connect at startup, the server does not start processing write requests before syncing up syncing up with all connected peers.
  • (Replication/recovery) it is now possible to explicitly set instance_uuid and replica set uuid as configuration parameters. Issue 2967.
  • (Replication/recovery) box.once() no longer fails on a read-only replica but waits. Issue 2537.
  • (Replication/recovery) force_recovery can now skip a corrupted xlog file. Issue 3076.
  • (Replication/recovery) improved replication monitoring: shows peer ip:port and correct replication lag even for idle peers. Issues 2753 and 2689.
  • (Application server) new before triggers which can be used for conflict resolution in master-master replication. Issue 2993.
  • (Application server) http client now correctly parses cookies and supports http+unix:// paths. Issues 3040 and 2801.
  • (Application server) fio rock now supports file_exists(), rename() works across filesystems, and read() without arguments reads the whole file. Issues 2924, 2751 and 2925.
  • (Application server) fio rock errors now follow Tarantool function call conventions and always return an error message in addition to the error flag.
  • (Application server) digest rock now supports pbkdf2 password hashing algorithm, useful in PCI/DSS compliant applications. Issue 2874.
  • (Application server) provides a high-level overview of server memory usage, including networking, Lua, transaction and index memory. Issue 934.
  • (Database) it is now possible to add missing tuple fields to an index, which is very useful when adding an index along with the evolution of the database schema. Issue 2988.
  • (Database) lots of improvements in field type support when creating or altering spaces and indexes. Issues 2893, 3011 and 3008.
  • (Database) it is now possible to turn on is_nullable property on a field even if the space is not empty, the change is instantaneous. Issue 2973.
  • (Database) logging has been improved in many respects: individual messages (issues 1972, 2743, 2900), more logging in cases when it was useful (issues 3096, 2871).
  • (Vinyl storage engine) it is now possible to make a unique vinyl index non-unique without index rebuild. Issue 2449.
  • (Vinyl storage engine) improved UPDATE, REPLACE and recovery performance in presence of secondary keys. Issues 2289, 2875 and 3154.
  • (Vinyl storage engine) space:len() and space:bsize() now work for vinyl (although they are still not exact). Issue 3056.
  • (Vinyl storage engine) recovery speed has improved in presence of secondary keys. Issue 2099.
  • (Builds) Alpine Linux support. Issue 3067.

Release 1.8.1

Release type: alpha. Release date: 2017-05-17. Tag: 1.8.1.


This is an alpha release which delivers support for a substantial subset of the ISO/IEC 9075:2011 SQL standard, including joins, subqueries and views. SQL is a major feature of the 1.8 release series, in which we plan to add support for ODBC and JDBC connectors, SQL triggers, prepared statements, security and roles, and generally ensure SQL is a first class query language in Tarantool.

Functionality added or changed:

  • A new function box.sql.execute() (later changed to box.execute in Tarantool 2.1) was added to query Tarantool databases using SQL statements, e.g.:

    tarantool> box.sql.execute([[SELECT * FROM _schema]]);
  • SQL and Lua are fully interoperable.

  • New meta-commands introduced to Tarantool’s console.

    You can now set input language to either SQL or Lua, e.g.:

    tarantool> \set language sql
    tarantool> SELECT * FROM _schema;
    tarantool> \set language lua
    tarantool> print("Hello, world!")
  • Most SQL statements are supported:


      tarantool> CREATE TABLE table1 (column1 INTEGER PRIMARY KEY, column2 VARCHAR(100));
    • INSERT/UPDATE/DELETE statements e.g.:

      tarantool> INSERT INTO table1 VALUES (1, 'A');
      tarantool> UPDATE table1 SET column2 = 'B';
    • SELECT statements, including complex complicated variants which include multiple JOINs, nested SELECTs etc. e.g.:

      tarantool> SELECT sum(column1) FROM table1 WHERE column2 LIKE '_B' GROUP BY column2;
    • WITH statements e.g.

      tarantool> WITH cte AS ( SELECT SUBSTR(column2,1,2), column1 FROM table1 WHERE column1 >= 0) SELECT * FROM cte;
    • SQL schema is persistent, so it is able to survive snapshot()/restore() sequence.

    • SQL features are described in a tutorial.

Release 1.7.6

Release type: stable. Release date: 2017-11-07. Tag: 1.7.6-0-g7b2945d6c.


This is the next stable release in the 1.7 series. It resolves more than 75 issues since 1.7.5.

What’s new in Tarantool 1.7.6?

  • In addition to rollback of a transaction, there is now rollback to a defined point within a transaction – savepoint support.
  • There is a new object type: sequences. The older option, auto-increment, will be deprecated.
  • String indexes can have collations.

New options are available for:

Incompatible changes:

  • Layout of has been extended to support is_nullable and collation features. All new indexes created on columns with is_nullable or collation properties will have the new definition format. Please update your client libraries if you plan to use these new features. Issue 2802
  • fiber_name() now raises an exception instead of truncating long fiber names. We found that some Lua modules such as expirationd use as a key to identify background tasks. If a name is truncated, this fact was silently missed. The new behavior allows to detect bugs caused by truncation. Please use, { truncate = true }) to emulate the old behavior. Issue 2622
  • space:format() is now validated on DML operations. Previously space:format() was only used by client libraries, but starting from Tarantool 1.7.6, field types in space:format() are validated on the server side on every DML operation, and field names can be used in indexes and Lua code. If you used space:format() in a non-standard way, please update layout and type names according to the official documentation for space formats.

Functionality added or changed:

  • Hybrid schema-less + schemaful data model. Earlier Tarantool versions allowed to store arbitrary MessagePack documents in spaces. Starting from Tarantool 1.7.6, you can use space:format() to define schema restrictions and constraints for tuples in spaces. Defined field types are automatically validated on every DML operation, and defined field names can be used instead of field numbers in Lua code. A new function tuple:tomap() was added to convert a tuple into a key-value Lua dictionary.
  • Collation and Unicode support. By default, when Tarantool compares strings, it takes into consideration only the numeric value of each byte in the string. To allow the ordering that you see in phone books and dictionaries, Tarantool 1.7.6 introduces support for collations based on the Default Unicode Collation Element Table (DUCET) and the rules described in Unicode® Technical Standard #10 Unicode Collation Algorithm (UTS #10 UCA) See collations.
  • NULL values in unique and non-unique indexes. By default, all fields in Tarantool are “NOT NULL”. Starting from Tarantool 1.7.6, you can use is_nullable option in space:format() or inside an index part definition to allow storing NULL in indexes. Tarantool partially implements three-valued logic from the SQL standard and allows storing multiple NULL values in unique indexes. Issue 1557.
  • Sequences and a new implementation of auto_increment(). Tarantool 1.7.6 introduces new sequence number generators (like CREATE SEQUENCE in SQL). This feature is used to implement new persistent auto increment in spaces. Issue 389.
  • Vinyl: introduced gap locks in Vinyl transaction manager. The new locking mechanism in Vinyl TX manager reduces the number of conflicts in transactions. Issue 2671.
  • on_connect and on_disconnect triggers. Issue 2858.
  • Structured logging in JSON format. Issue 2795.
  • (Lua) Lua: string.strip() Issue 2785.
  • (Lua) added base64_urlsafe_encode() to digest module. Issue 2777.
  • Log conflicted keys in master-master replication. Issue 2779.
  • Allow to disable backtrace in Issue 2878.
  • Implemented tarantoolctl rocks make *.spec. Issue 2846.
  • Extended the default loader to look for .rocks in the parent dir hierarchy. Issue 2676.
  • SOL_TCP options support in socket:setsockopt(). Issue 598.
  • Partial emulation of LuaSocket on top of Tarantool Socket. Issue 2727.

Developer tools:

  • Integration with IntelliJ IDEA with debugging support. Now you can use IntelliJ IDEA as an IDE to develop and debug Lua applications for Tarantool. See Using IDE.
  • Integration with MobDebug remote Lua debugger. Issue 2728.
  • Configured /usr/bin/tarantool as an alternative Lua interpreter on Debian/Ubuntu. Issue 2730.

New rocks:

Release 1.7.5

Release type: stable. Release date: 2017-08-22. Tag: 1.7.5.


This is a stable release in the 1.7 series. This release resolves more than 160 issues since 1.7.4.

Functionality added or changed:

  • (Vinyl) a new force_recovery mode to recover broken disk files. Use box.cfg{force_recovery=true} to recover corrupted data files after hardware issues or power outages. Issue 2253.
  • (Vinyl) index options can be changed on the fly without rebuild. Now page_size, run_size_ratio, run_count_per_level and bloom_fpr index options can be dynamically changed via index:alter(). The changes take effect in newly created data files only. Issue 2109.
  • (Vinyl) improve and index:info() output. Issue 1662.
  • (Vinyl) introduce box.cfg.vinyl_timeout option to control quota throttling. Issue 2014.
  • Memtx: stable index:pairs() iterators for the TREE index. TREE iterators are automatically restored to a proper position after index’s modifications. Issue 1796.
  • (Memtx) predictable order for non-unique TREE indexes. Non-unique TREE indexes preserve the sort order for duplicate entries. Issue 2476.
  • (Memtx+Vinyl) dynamic configuration of max tuple size. Now box.cfg.memtx_max_tuple_size and box.cfg.vinyl_max_tuple_size configuration options can be changed on the fly without need to restart the server. Issue 2667.
  • (Memtx+Vinyl) new implementation. Space truncation doesn’t cause re-creation of all indexes any more. Issue 618.
  • Extended the maximal length of all identifiers from 32 to 65k characters. Space, user and function names are not limited by 32 characters anymore. Issue 944.
  • Heartbeat messages for replication. Replication client now sends the selective acknowledgments for processed records and automatically re-establish stalled connections. This feature also changes[replica_id].vclock. to display committed vclock of remote replica. Issue 2484.
  • Keep track of remote replicas during WAL maintenance. Replication master now automatically preserves xlogs needed for remote replicas. Issue 748.
  • Enabled to work without box.cfg(). Issue 2047.
  • box.atomic(fun, …) wrapper to execute function in a transaction. Issue 818.
  • box.session.type() helper to determine session type. Issue 2642.
  • Hot code reload for stored C stored procedures. Use box.schema.func.reload('modulename.function') to reload dynamic shared libraries on the fly. Issue 910.
  • string.hex() and str:hex() Lua API. Issue 2522.
  • Package manager based on LuaRocks. Use tarantoolctl rocks install MODULENAME to install MODULENAME Lua module from Issue 2067.
  • Lua 5.1 command line options. Tarantool binary now supports ‘-i’, ‘-e’, ‘-m’ and ‘-l’ command line options. Issue 1265.
  • Experimental GC64 mode for LuaJIT. GC64 mode allow to operate the full address space on 64-bit hosts. Enable via -DLUAJIT_ENABLE_GC64=ON compile-time configuration option. Issue 2643.
  • Syslog logger now support non-blocking mode. box.cfg{log_nonblock=true} now also works for syslog logger. Issue 2466.
  • Added a VERBOSE log level beyond INFO. Issue 2467.
  • Tarantool now automatically makes snapshots every hour. Please set box.cfg{checkpoint_interval=0 to restore pre-1.7.5 behaviour. Issue 2496.
  • Increase precision for percentage ratios provided by Issue 2082.
  • Stack traces now contain symbols names on all supported platforms. Previous versions of Tarantool didn’t display meaningful function names in on non-x86 platforms. Issue 2103.
  • Allowed to create fiber with custom stack size from C API. Issue 2438.
  • Added ipc_cond to public C API. Issue 1451.

New rocks:

  • http.client (built-in) - libcurl-based HTTP client with SSL/TLS support. Issue 2083.
  • iconv (built-in) - bindings for iconv. Issue 2587.
  • authman - API for user registration and login in your site using email and social networks.
  • document - store nested documents in Tarantool.
  • synchronized - critical sections for Lua.

Release 1.7.4

Release type: release candidate. Release date: 2017-05-12. Release tag: Tag: 1.7.4.

Announcement: or!topic/tarantool/3x88ATX9YbY

This is a release candidate in the 1.7 series. Vinyl Engine, the flagship feature of 1.7.x, is now feature complete.

Incompatible changes

  • box.cfg() options were changed to add Vinyl support:

    • snap_dir renamed to memtx_dir
    • slab_alloc_arena (gigabytes) renamed to memtx_memory (bytes), default value changed from 1Gb to 256MB
    • slab_alloc_minimal renamed to memtx_min_tuple_size
    • slab_alloc_maximal renamed to memtx_max_tuple_size
    • slab_alloc_factor is deprecated, not relevant in 1.7.x
    • snapshot_count renamed to checkpoint_count
    • snapshot_period renamed to checkpoint_interval
    • logger renamed to log
    • logger_nonblock renamed to log_nonblock
    • logger_level renamed to log_level
    • replication_source renamed to replication
    • panic_on_snap_error = true and panic_on_wal_error = true superseded by force_recovery = false

    Until Tarantool 1.8, you can use deprecated parameters for both initial and runtime configuration, but such usage will print a warning in the server log. Issues 1927 and 2042.

  • Hot standy mode is now off by default. Tarantool automatically detects another running instance in the same wal_dir and refuses to start. Use box.cfg {hot_standby = true} to enable the hot standby mode. Issue 775.

  • UPSERT via a secondary key was banned to avoid unclear semantics. Issue 2226.

  • and format was changed to display information about upstream and downstream connections (Issue 723):

    • Added[instance_id].downstream.vclock to display the last sent row to remote replica.
    • Added[instance_id].id.
    • Added[instance_id].lsn.
    • Moved[instance_id].{vclock,status,error} to[instance_id].upstream.{vclock,status,error}.
    • All registered replicas from are included to output.
    • renamed
    • renamed
    • renamed
    • renamed to
    • and now return nil instead of -1 during initial cluster bootstrap.
  • added per-request options to all requests:

    •, arg1, arg2,...) changed to, {arg1, arg2, ...}, opts)
    • conn.eval(func_name, arg1, arg2,...) changed to conn.eval(func_name, {arg1, arg2, ...}, opts)
  • All requests now support timeout = <seconds>, buffer = <ibuf> options.

  • Added connect_timeout option to netbox.connect().

  • netbox:timeout() and conn:timeout() are now deprecated. Use netbox.connect(host, port, { call_16 = true }) for 1.6.x-compatible behavior. Issue 2195.

  • systemd configuration changed to support Type=Notify / sd_notify(). Now systemctl start tarantool@INSTANCE will wait until Tarantool has started and recovered from xlogs. The recovery status is reported to systemctl status tarantool@INSTANCE. Issue 1923.

  • log module now doesn’t prefix all messages with the full path to tarantool binary when used without box.cfg(). Issue 1876.

  • require('log').logger_pid() was renamed to require('log').pid(). Issue 2917.

  • Removed Lua 5.0 compatible defines and functions (Issue 2396):

    • luaL_reg removed in favor of luaL_Reg
    • luaL_getn(L, i) removed in favor of lua_objlen(L, i)
    • luaL_setn(L, i, j) removed (was no-op)
    • lua_ref(L, lock) removed in favor of luaL_ref(L, lock)
    • lua_getref(L,ref) removed in favor of lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
    • lua_unref(L, ref) removed in favor of luaL_unref(L, ref)
    • math.mod() removed in favor of math.fmod()
    • string.gfind() removed in favor of string.gmatch()

Functionality added or changed:

  • (Vinyl) multi-level compaction. The compaction scheduler now groups runs of the same range into levels to reduce the write amplification during compaction. This design allows Vinyl to support 1:100+ ram:disk use-cases. Issue 1821.

  • (Vinyl) bloom filters for sorted runs. Bloom filter is a probabilistic data structure which can be used to test whether a requested key is present in a run file without reading the actual file from the disk. Bloom filter may have false-positive matches but false-negative matches are impossible. This feature reduces the number of seeks needed for random lookups and speeds up REPLACE/DELETE with enabled secondary keys. Issue 1919.

  • (Vinyl) key-level cache for point lookups and range queries. Vinyl storage engine caches selected keys and key ranges instead of entire disk pages like in traditional databases. This approach is more efficient because the cache is not polluted with raw disk data. Issue 1692.

  • (Vinyl) implemented the common memory level for in-memory indexes. Now all in-memory indexes of a space store pointers to the same tuples instead of cached secondary key index data. This feature significantly reduces the memory footprint in case of secondary keys. Issue 1908.

  • (Vinyl) new implementation of initial state transfer of JOIN command in replication protocol. New replication protocol fixes problems with consistency and secondary keys. We implemented a special kind of low-cost database-wide read-view to avoid dirty reads in JOIN procedure. This trick wasn’t not possible in traditional B-Tree based databases. Issue 2001.

  • (Vinyl) index-wide mems/runs. Removed ranges from in-memory and and the stop layer of LSM tree on disk. Issue 2209.

  • (Vinyl) coalesce small ranges. Before dumping or compacting a range, consider coalescing it with its neighbors. Issue 1735.

  • (Vinyl) implemented transnational journal for metadata. Now information about all Vinyl files is logged in a special .vylog file. Issue 1967.

  • (Vinyl) implemented consistent secondary keys. Issue 2410.

  • (Memtx+Vinyl) implemented low-level Lua API to create consistent backups. of Memtx + Vinyl data. The new feature provides box.backup.start()/stop() functions to create backups of all spaces. box.backup.start() pauses the Tarantool garbage collector and returns the list of files to copy. These files then can be copied be any third-party tool, like cp, ln, tar, rsync, etc. box.backup.stop() lets the garbage collector continue. Created backups can be restored instantly by copying into a new directory and starting a new Tarantool instance. No special preparation, conversion or unpacking is needed. Issue 1916.

  • (Vinyl) added statistics for background workers to Issue 2005.

  • (Memtx+Vinyl) reduced the memory footprint for indexes which keys are sequential and start from the first field. This optimization was necessary for secondary keys in Vinyl, but we optimized Memtx as well. Issue 2046.

  • LuaJIT was rebased on the latest 2.1.0b3 with out patches (Issue 2396):

    • Added JIT compiler backend for ARM64
    • Added JIT compiler backend and interpreter for MIPS64
    • Added some more Lua 5.2 and Lua 5.3 extensions
    • Fixed several bugs
    • Removed Lua 5.0 legacy (see incompatible changes above).
  • Enabled a new smart string hashing algorithm in LuaJIT to avoid significant slowdown when a lot of collisions are generated. Contributed by Yury Sokolov (@funny-falcon) and Nick Zavaritsky (@mejedi). See

  • box.snapshot() now updates mtime of a snapshot file if there were no changes to the database since the last snapshot. Issue 2045.

  • Implemented space:bsize() to return the memory size utilized by all tuples of the space. Contributed by Roman Tokarev (@rtokarev). Issue 2043.

  • Exported new Lua/C functions to public API:

    • luaT_pushtuple, luaT_istuple (issue 1878)
    • luaT_error, luaT_call, luaT_cpcall (issue 2291)
    • luaT_state (issue 2416)
  • Exported new Box/C functions to public API: box_key_def, box_tuple_format, tuple_compare(), tuple_compare_with_key(). Issue 2225.

  • xlogs now can be rotated based on size (wal_max_size) as well as the number of written rows (rows_per_wal). Issue 173.

  • Added string.split(), string.startswith(), string.endswith(), string.ljust(), string.rjust(), API. Issues 2211, 2214, 2415.

  • Added table.copy() and table.deepcopy() functions. Issue 2212.

  • Added pwd module to work with UNIX users and groups. Issue 2213.

  • Removed noisy “client unix/: connected” messages from logs. Use box.session.on_connect()/on_disconnect() triggers instead. Issue 1938.

    box.session.on_connect()/on_disconnect()/on_auth() triggers now also fired for admin console connections.

  • tarantoolctl: eval, enter, connect commands now support UNIX pipes. Issue 672.

  • tarantoolctl: improved error messages and added a new man page. Issue 1488.

  • tarantoolctl: added filter by replica_id to cat and play commands. Issue 2301.

  • tarantoolctl: start, stop and restart commands now redirect to systemctl start/stop/restart when systemd is enabled. Issue 2254.

  • added buffer = <buffer> per-request option to store raw MessagePack responses into a C buffer. Issue 2195.

  • added connect_timeout option. Issue 2054.

  • added on_schema_reload() hook. Issue 2021.

  • exposed conn.schema_version and space.connection to API. Issue 2412.

  • log: debug()/info()/warn()/error() now doesn’t fail on formatting errors. Issue 889.

  • crypto: added HMAC support. Contributed by Andrey Kulikov (@amdei). Issue 725.

Release 1.7.3

Release type: beta. Release date: 2016-12-24. Release tag: Tag: 1.7.3-0-gf0c92aa.


This is the second beta release in the 1.7 series.

Incompatible changes:

  • Broken coredump() Lua function was removed. Use gdb -batch -ex "generate-core-file" -p $PID instead. Issue 1886.
  • Vinyl disk layout was changed since 1.7.2 to add ZStandard compression and improve the performance of secondary keys. Use the replication mechanism to upgrade from 1.7.2 beta. Issue 1656.

Functionality added or changed:

  • Substantial progress on stabilizing the Vinyl storage engine:
    • Fix most known crashes and bugs with bad results.
    • Switch to use XLOG/SNAP format for all data files.
    • Enable ZStandard compression for all data files.
    • Squash UPSERT operations on the fly and merge hot keys using a background fiber.
    • Significantly improve the performance of index:pairs() and index:count().
    • Remove unnecessary conflicts from transactions.
    • In-memory level was mostly replaced by memtx data structures.
    • Specialized allocators are used in most places.
  • We’re still actively working on Vinyl and plan to add multi-level compaction and improve the performance of secondary keys in 1.7.4. This implies a data format change.
  • Support for DML requests for space:on_replace() triggers. Issue 587.
  • UPSERT can be used with the empty list of operations. Issue 1854.
  • Lua functions to manipulate environment variables. Issue 1718.
  • Lua library to read Tarantool snapshots and xlogs. Issue 1782.
  • New play and cat commands in tarantoolctl. Issue 1861.
  • Improve support for the large number of active network clients. Issue#5#1892.
  • Support for space:pairs(key, iterator-type) syntax. Issue 1875.
  • Automatic cluster bootstrap now also works without authorization. Issue 1589.
  • Replication retries to connect to master indefinitely. Issue 1511.
  • Temporary spaces now work with box.cfg { read_only = true }. Issue 1378.
  • The maximum length of space names increased to 64 bytes (was 32). Issue 2008.

Release 1.7.2

Release type: beta. Release date: 2016-09-29. Release tag: Tag: 1.7.2-1-g92ed6c4.


This is a release in the 1.7 series.

Incompatible changes:

  • A new binary protocol command for CALL, which no more restricts a function to returning an array of tuples and allows returning an arbitrary MsgPack/JSON result, including scalars, nil and void (nothing). The old CALL is left intact for backward compatibility. It will be removed in the next major release. All programming language drivers will be gradually changed to use the new CALL. Issue 1296.

Functionality added or changed:

  • Vinyl storage engine finally reached the beta stage. This release fixes more than 90 bugs in Vinyl, in particular, removing unpredictable latency spikes, all known crashes and bad/lost result bugs.
    • new cooperative multitasking based architecture to eliminate latency spikes,
    • support for non-sequential multi-part keys,
    • support for secondary keys,
    • support for auto_increment(),
    • number, integer, scalar field types in indexes,
    • INSERT, REPLACE and UPDATE return new tuple, like in memtx.
  • We’re still actively working on Vinyl and plan to add zstd compression and a new memory allocator for Vinyl in-memory index in 1.7.3. This implies a data format change which we plan to implement before 1.7 becomes generally available.
  • Tab-based autocompletion in the interactive console, require('console').connect(), tarantoolctl enter and tarantoolctl connect commands. Issues 86 and 1790. Use the TAB key to auto complete the names of Lua variables, functions and meta-methods.
  • A new implementation of improving performance and solving problems when the Lua garbage collector handles dead connections. Issues 799, 800, 1138 and 1750.
  • memtx snapshots and xlog files are now compressed on the fly using the fast ZStandard compression algorithm. Compression options are configured automatically to get an optimal trade-off between CPU utilization and disk throughput.
  • fiber.cond() - a new synchronization mechanism for cooperative multitasking. Issue 1731.
  • Tarantool can now be installed using universal Snappy packages ( with snap install tarantool --channel=beta.

New rocks and packages:

  • curl - non-blocking bindings for libcurl
  • prometheus - Prometheus metric collector for Tarantool
  • gis - a full-featured geospatial extension for Tarantool
  • mqtt - an MQTT protocol client for Tarantool
  • luaossl - the most comprehensive OpenSSL module in the Lua universe

Deprecated, removed features and minor incompatibilities:

  • num and str fields type names are deprecated, use unsigned and string instead. Issue 1534.

  • space:inc() and space:dec() were removed (deprecated in 1.6.x) Issue 1289.

  • fiber:cancel() is now asynchronous and doesn’t wait for the fiber to end. Issue 1732.

  • Implicit error-prone tostring() was removed from digest API. Issue 1591.

  • Support for SHA-0 (digest.sha()) was removed due to OpenSSL upgrade.

  • now uses one-based indexes for[x].parts. Issue 1729.

  • Tarantool binary now dynamically links with during compile time instead of loading it at the run time.

  • Debian and Ubuntu packages switched to use native systemd configuration alongside with old-fashioned sysvinit scripts.

    systemd provides its own facilities for multi-instance management. To upgrade, perform the following steps:

    1. Install new 1.7.2 packages.
    2. Ensure that INSTANCENAME.lua file is present in /etc/tarantool/instace.enabled.
    3. Stop INSTANCENAME using tarantoolctl stop INSTANCENAME.
    4. Start INSTANCENAME using systemctl start tarantool@INSTANCENAME.
    5. Enable INSTANCENAME during system boot using systemctl enable trantool@INTANCENAME.
    6. Say systemctl disable tarantool; update-rc.d tarantool remove to disable sysvinit-compatible wrappers.

    Refer to issue 1291 comment and the administration chapter for additional information.

  • Debian and Ubuntu packages start a ready-to-use example.lua instance on a clean installation of the package. The default instance grants universe permissions for guest user and listens on “locahost:3313”.

  • Fedora 22 packages were deprecated (EOL).

Release 1.7.1

Release type: alpha. Release date: 2016-07-11.


This is the first alpha in the 1.7 series. The main feature of this release is a new storage engine, called “vinyl”. Vinyl is a write optimized storage engine, allowing the amount of data stored exceed the amount of available RAM 10-100x times. Vinyl is a continuation of the Sophia engine from 1.6, and effectively a fork and a distant relative of Dmitry Simonenko’s Sophia. Sophia is superseded and replaced by Vinyl. Internally it is organized as a log structured merge tree. However, it takes a serious effort to improve on the traditional deficiencies of log structured storage, such as poor read performance and unpredictable write latency. A single index is range partitioned among many LSM data structures, each having its own in-memory buffers of adjustable size. Range partitioning allows merges of LSM levels to be more granular, as well as to prioritize hot ranges over cold ones in access to resources, such as RAM and I/O. The merge scheduler is designed to minimize write latency while ensuring read performance stays within acceptable limits. Vinyl today only supports a primary key index. The index can consist of up to 256 parts, like in MemTX, up from 8 in Sophia. Partial key reads are supported. Support of non-sequential multi part keys, as well as secondary keys is on the short term todo. Our intent is to remove all limitations currently present in Vinyl, making it a first class citizen in Tarantool.

Functionality added or changed:

  • The disk-based storage engine, which was called sophia or phia in earlier versions, is superseded by the vinyl storage engine.
  • There are new types for indexed fields.
  • The LuaJIT version is updated.
  • Automatic replica set bootstrap (for easier configuration of a new replica set) is supported.
  • The space_object:inc() function is removed.
  • The space_object:dec() function is removed.
  • The space_object:bsize() function is added.
  • The box.coredump() function is removed, for an alternative see Core dumps.
  • The hot_standby configuration option is added.
  • Configuration parameters revised or renamed:
    • slab_alloc_arena (in gigabytes) to memtx_memory (in bytes),
    • slab_alloc_minimal to memtx_min_tuple_size,
    • slab_alloc_maximal to memtx_max_tuple_size,
    • replication_source to replication,
    • snap_dir to memtx_dir,
    • logger to log,
    • logger_nonblock to log_nonblock,
    • snapshot_count to checkpoint_count,
    • snapshot_period to checkpoint_interval,
    • panic_on_wal_error and panic_on_snap_error united under force_recovery.
  • Until Tarantool 1.8, you can use deprecated parameters for both initial and runtime configuration, but Tarantool will display a warning. Also, you can specify both deprecated and up-to-date parameters, provided that their values are harmonized. If not, Tarantool will display an error.
  • Automatic replication cluster bootstrap; it’s now much easier to configure a new replication cluster.
  • New indexable data types: INTEGER and SCALAR.
  • Code refactoring and performance improvements.
  • Updated LuaJIT to 2.1-beta116.

Release 1.6.9

Release type: maintenance. Release date: 2016-09-27. Release tag: 1.6.9-4-gcc9ddd7.

Since February 15, 2017, due to Tarantool issue#2040 Remove sophia engine from 1.6 there no longer is a storage engine named sophia. It will be superseded in version 1.7 by the vinyl storage engine.

Incompatible changes:

  • Support for SHA-0 (digest.sha()) was removed due to OpenSSL upgrade.
  • Tarantool binary now dynamically links with during compile time instead of loading it at the run time.
  • Fedora 22 packages were deprecated (EOL).

Functionality added or changed:

  • Tab-based autocompletion in the interactive console. Issue 86
  • LUA_PATH and LUA_CPATH environment variables taken into account, like in PUC-RIO Lua. Issue 1428
  • Search for .dylib as well as for .so libraries in OS X. Issue 810.
  • A new box.cfg { read_only = true } option to emulate master-slave behavior. Issue 246
  • if_not_exists = true option added to box.schema.user.grant. Issue 1683
  • clock_realtime()/monotonic() functions added to the public C API. Issue 1455
  • space:count(key, opts) introduced as an alias for space.index.primary:count(key, opts). Issue 1391
  • Upgrade script for 1.6.4 -> 1.6.8 -> 1.6.9. Issue 1281
  • Support for OpenSSL 1.1. Issue 1722

New rocks and packages:

  • curl - non-blocking bindings for libcurl
  • prometheus - Prometheus metric collector for Tarantool
  • gis - full-featured geospatial extension for Tarantool.
  • mqtt - MQTT protocol client for Tarantool
  • luaossl - the most comprehensive OpenSSL module in the Lua universe

Release 1.6.8

Release type: maintenance. Release date: 2016-02-25. Release tag: 1.6.8-525-ga571ac0.

Incompatible changes:

  • RPM packages for CentOS 7 / RHEL 7 and Fedora 22+ now use native systemd configuration without legacy sysvinit shell scripts. Systemd provides its own facilities for multi-instance management. To upgrade, perform the following steps:

    1. Ensure that INSTANCENAME.lua file is present in /etc/tarantool/instace.available.
    2. Stop INSTANCENAME using tarantoolctl stop INSTANCENAME.
    3. Start INSTANCENAME using systemctl start tarantool@INSTANCENAME.
    4. Enable INSTANCENAME during system boot using systemctl enable trantool@INTANCENAME.

    /etc/tarantool/instance.enabled directory is now deprecated for systemd-enabled platforms.

    See the administration chapter for additional information.

  • Sophia was upgraded to v2.1 to fix upsert, memory corruption and other bugs. Sophia v2.1 doesn’t support old v1.1 data format. Please use Tarantool replication to upgrade. Issue 1222

  • Ubuntu Vivid, Fedora 20, Fedora 21 were deprecated due to EOL.

  • i686 packages were deprecated. Please use our RPM and DEB specs to build these on your own infrastructure.

  • Please update your yum.repos.d and/or apt sources.list.d according to instructions at

Functionality added or changed:

  • Tarantool 1.6.8 fully supports ARMv7 and ARMv8 (aarch64) processors. Now it is possible to use Tarantool on a wide range of consumer devices, starting from popular Raspberry PI 2 to coin-size embedded boards and no-name mini-micro-nano-PCs. Issue 1153. (Also qemu works well, but we don’t have real hardware to check.)

  • Tuple comparator functions were optimized, providing up to 30% performance boost when an index key consists of 2, 3 or more parts. Issue 969.

  • Tuple allocator changes give another 15% performance improvement. Issue 1298

  • Replication relay performance was improved by reducing the amount of data directory re-scans. Issue 11150

  • A random delay was introduced into snapshot daemon, reducing the chance that multiple instances take a snapshot at the same time. Issue 732.

  • Sophia storage engine was upgraded to v2.1:

    • serializable Snapshot Isolation (SSI),
    • RAM storage mode,
    • anti-cache storage mode,
    • persistent caching storage mode,
    • implemented AMQ Filter,
    • LRU mode,
    • separate compression for hot and cold data,
    • snapshot implementation for Faster Recovery,
    • upsert reorganizations and fixes,
    • new performance metrics.

    Please note “Incompatible changes” above.

  • Allow to remove servers with non-zero LSN from _cluster space. Issue 1219.

  • now automatically reloads space and index definitions. Issue 1183.

  • The maximal number of indexes in space was increased to 128. Issue 1311.

  • New native systemd configuration with support of instance management and daemon supervision (CentOS 7 and Fedora 22+ only). Please note “Incompatible changes” above. Issue 1264.

  • Tarantool package was accepted to the official Fedora repositories (

  • Tarantool brew formula (OS X) was accepted to the official Homebrew repository (

  • Clang compiler support was added on FreeBSD. Issue 786.

  • Support for musl libc, used by Alpine Linux and Docker images, was added. Issue 1249.

  • Added support for GCC 6.0.

  • Ubuntu Wily, Xenial and Fedora 22, 23 and 24 are now supported distributions for which we build official packages.

  • can be used to retrieve cluster UUID. Issue 1117.

  • Numerous improvements in the documentation, added documentation for syslog, clock, packages, updated the built-in tutorial.

New rocks and packages:

Release 1.6.7

Release type: maintenance. Release date: 2015-11-17.

Incompatible changes:

  • The syntax of upsert command has been changed and an extra key argument was removed from it. The primary key for look up is now always taken from the tuple, which is the second argument of upsert. upsert() was added fairly late at a release cycle and the design had an obvious bug which we had to fix. Sorry for this.
  • was removed since it wasn’t used by anyone and didn’t work properly.
  • tarantoolctl reload command renamed to eval.

Functionality added or changed:

  • logger option now accepts a syntax for syslog output. Use uri-style syntax for file, pipe or syslog log destination.
  • replication_source now accepts an array of URIs, so each replica can have up to 30 peers.
  • RTREE index now accept two types of distance functions: euclid and manhattan.
  • fio.abspath() - a new function in fio rock to convert a relative path to absolute.
  • The process title now can be set with an on-board title rock.
  • This release uses LuaJIT 2.1.

New rocks:

  • memcached - makes Tarantool understand Memcached binary protocol. Text protocol support is in progress and will be added to the rock itself, without changes to the server core.

Release 1.6.6

Release type: maintenance. Release date: 2015-08-28.

Tarantool 1.6 is no longer getting major new features, although it will be maintained. The developers are concentrating on Tarantool version 1.9.

Incompatible changes:

  • A new schema of _index system space which accommodates multi-dimensional RTREE indexes. Tarantool 1.6.6 works fine with an old snapshot and system spaces, but you will not be able to start Tarantool 1.6.5 with a data directory created by Tarantool 1.6.6, neither will you be able to query Tarantool 1.6.6 schema with 1.6.5
  • is renamed to

Functionality added or changed:

  • Threaded architecture for network. Network I/O has finally been moved to a separate thread, increasing single instance performance by up to 50%.
  • Threaded architecture for checkpointing. Tarantool no longer forks to create a snapshot, but uses a separate thread, accessing data via a consistent read view. This eliminates all known latency spikes caused by snapshotting.
  • Stored procedures in C/C++. Stored procedures in C/C++ provide speed (3-4 times, compared to a Lua version in our measurements), as well as unlimited extensibility power. Since C/C++ procedures run in the same memory space as the database, they are also an easy tool to corrupt database memory. See The C API description.
  • Multidimensional RTREE index. RTREE index type now support a large (up to 32) number of dimensions. RTREE data structure has been optimized to actually use R*-TREE. We’re working on further improvements of the index, in particular, configurable distance function. See
  • Sophia 2.1.1, with support of compression and multipart primary keys. See!topic/sophia-database/GfcbEC7ksRg
  • New upsert command available in the binary protocol and in stored functions. The key advantage of upsert is that it’s much faster with write-optimized storage (sophia storage engine), but some caveats exists as well. See Issue 905 for details. Even though upsert performance advantage is most prominent with sophia engine, it works with all storage engines.
  • Better memory diagnostics information for fibers, tuple and index arena Try a new command box.slab.stats(), for detailed information about tuple/index slabs, now displays information about memory used by the fiber.
  • Update and delete now work using a secondary index, if the index is unique.
  • Authentication triggers. Set box.session.on_auth triggers to catch authentication events. Trigger API is improved to display all defined triggers, easily remove old triggers.
  • Manifold performance improvements of built-in package.
  • Performance optimizations of BITSET index.
  • panic_on_wal_error is a dynamic configuration option now.
  • iproto sync field is available in Lua as session.sync().
  • box.once() - a new method to invoke code once in an instance and replica set lifetime. Use once() to set up spaces and uses, as well as do schema upgrade in production.
  • box.error.last() to return the last error in a session.

New rocks:

  • jit.*, jit.dump, jit.util, jit.vmdef modules of LuaJIT 2.0 are now available as built-ins. See
  • strict built-in package, banning use of undeclared variables in Lua. Strict mode is on when Tarantool is compiled with debug. Turn on/off with require('strict').on()/require('strict').off().
  • pg and mysql rocks, available at - working with MySQL and PostgreSQL from Tarantool.
  • gperftools rock, available at - getting performance data using Google’s gperf from Tarantool.
  • csv built-in rock, to parse and load CSV (comma-separated values) data.

New supported platforms:

  • Fedora 22, Ubuntu Vivid