Download Latest Version 2.11.7 source code.tar.gz (8.7 MB)
Email in envelope

Get an email when there's a new version of Tarantool

Home / 3.3.2
Name Modified Size InfoDownloads / Week
Parent folder
3.3.2 source code.tar.gz 2025-04-10 9.4 MB
3.3.2 source code.zip 2025-04-10 11.8 MB
README.md 2025-04-10 9.3 kB
Totals: 3 Items   21.2 MB 0

3.3.2

Date: 2025-04-10 Tag: 3.3.2

Overview

Tarantool 3.x is the recommended release series. Users of Tarantool 2.11 are encouraged to update to the latest 3.x release.

This release resolves 52 bugs since 3.3.1.

Announcement: double field type problems

Users who ever used the double field type in vinyl indexes might have their indexes broken. Regardless of this release. Preferably prior to the upgrade the users must get rid of the double indexed field type in vinyl. It must be drop-in replaceable by the number field type.

The reason is that the sorting of double fields would always compare the field values as C-language doubles, even when actual integers are stored. This works fine for small numbers, but starting from 2^53 the double-style comparison loses precision. For example, 18446744073709551615 and 18446744073709551614 would be considered the same values.

Besides, point-lookups in such index are going to be broken by design too - looking up by 18446744073709551615 can return 18446744073709551614 and many other integers around this point.

Unfortunately, even if the user doesn't have the double type in any vinyl indexes, but ever had it before, it is still unsafe. A double index altered to number or scalar would remain broken. It is very important that users rebuild all the vinyl indexes that have or ever had the double field type in them. What is worse, just an alter double -> number won't work. The old index must be dropped and a new one must be created. In any order. See also gh-9965 and gh-11017 for more details.

Please, consider the full list of user-visible changes below.

Compatibility

Tarantool 2.x and 3.x are compatible in the binary data layout, client-server protocol, and replication protocol. It means that an upgrade may be performed with zero downtime for read requests and the-order-of-network-lag downtime for write requests.

Please, follow the upgrade procedure to plan your update actions.

Users of Tarantool 2.x may be interested in the compat options that allow to imitate some 2.x behavior. This allows to perform application code update step-by-step, not all-at-once.

Bugs fixed

Core

  • Fixed a bug when the sequence:reset() call result was not recovered after the server restart (gh-9871).
  • Fixed log message being truncated to 1024 bytes with JSON logger (gh-10918).
  • Fixed several bugs related to numbers comparison and hashing in tuple keys. It allowed to insert the same key multiple times into a unique index, and sometimes wouldn't allow to find an existing key in an index. Could happen when numbers were encoded in MessagePack suboptimally and when the double field type was used (gh-9965).
  • Fixed the issue with hanging write operations forever triggered by heavy write load and WAL writing failures on cascade rollback (gh-11081).
  • Fixed a bug when cancelling a fiber waiting in WAL queue corrupted the the WAL (gh-11078).
  • Fixed a bug when the timestamps of snapshots created before the server restart were not taken into account with checkpoint_interval enabled (gh-9820).
  • Fixed a bug when the sizes of xlog files created before the server restart were not taken into account during the checkpoint_wal_threshold exceedance checks (gh-9811).
  • Fixed a bug when transactions in the WAL queue were not rolled back on WAL error (gh-11179).
  • Fixed a bug when the WAL queue was not flushed properly. In particular when building an index of a vinyl space. In the latter case it might make the new index miss data from transactions in the queue (gh-11118, gh-11119).
  • Fixed a bug when a record could be lost from the _gc_consumers space after receiving a promote request from another instance and restarting the current instance (gh-11053).
  • Fixed a bug when box.commit({wait = 'none'}) could yield (gh-11224).
  • Fixed use-after-free for a session created implicitly when using tnt_tx_push() to execute code making access checks (gh-11267).

Memtx

  • Fixed a crash when memtx MVCC tried to abort an already committed non-memtx transaction if it used a system space view or tried to perform a DDL operation (gh-10715).
  • Fixed a bug when Tarantool with memtx MVCC enabled was aborted on workload with many index:get() operations reading nothing (gh-11022).
  • Fixed a crash on OOM on insertion in tree indexes of the memtx engine (gh-11326).
  • Tarantool allowed to create multikey and functional indexes with memtx MVCC enabled, but they were not supported. This led to a crash or a panic. Now Tarantool raises an error when one tries to create an index of the kind with memtx MVCC enabled (gh-6385, gh-11099).

Vinyl

  • Fixed a bug when aborting a transaction by timeout while it was executing a statement could trigger a crash (gh-11088).
  • Fixed a bug in the tuple cache when a transaction operating in a read view could skip a tuple deleted after the read view creation (gh-11079, gh-11294).
  • Fixed a bug in the tuple cache when a tuple could become inaccessible via a secondary index after a transaction rollback caused by a WAL write error (gh-11140).
  • Fixed a bug when the garbage collector purged run files left after a dropped space without waiting for compaction completion. The bug could result in a compaction failure with a "No such file or directory" error (gh-11163).
  • Fixed a bug when space:truncate() failed with ER_TRANSACTION_YIELD (gh-11249).

Replication

  • Fixed a crash which could happen while an instance was shut down having an unfinished synchronous transaction (gh-10766).
  • Fixed a bug when the synchronous queue size limit was not enabled after recovering from local snapshot-files, i.e. its size was not limited by replication_synchro_queue_max_size (gh-11091).
  • Fixed a crash which could happen during relay thread shut down (gh-9920).

LuaJIT

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

  • Fixed compilation of getmetatable() for io objects.
  • Fixed dirty reads from recorded IR_NOP.
  • Fixed fusing optimization across table.clear() or insertion of a new key.
  • Disabled FMA optimization on aarch64 to avoid incorrect results in floating point arithmetics. Optimization may be enabled for the JIT engine via the command jit.opt.start("+fma").
  • Fixed machine code zone overflow for trace recording on x86/x64.
  • Fixed possible infinite loop during recording a chunk that used upvalues.
  • Fixed recording of bit.bor()/bit.bxor()/bit.band() with string arguments.
  • Fixed parsing of for _ in loop.
  • Fixed compiler warning in setfenv() / getfenv() with negative levels as the argument.
  • Fixed register allocation for stores into sunk values (gh-10746).
  • Fixed a crash when using a Lua C function as a vmevent handler for trace events.
  • Fixed the compilation of ... in select().
  • Fixed closing the report file without samples for jit.p.
  • Fixed the OOM error handling during recording the __concat metamethod.
  • Fixed the second trace.flush() call for an already flushed trace.
  • Fixed bit op coercion for shifts in DUALNUM builds.
  • Fixed IR_ABC hoisting.
  • Returned the rehashing of the cdata finalizer table at the end of the GC cycle to avoid memory overgrowing for cdata-intensive workloads.

Lua

  • Fixed a bug when the request counter used by a net.box client to implement the graceful shutdown protocol could underflow while it was fetching the schema from the remote end. In case of a debug build, the bug would crash the client. In case of a release build, the bug would result in a timeout while executing a remote server shutdown (gh-11062).

SQL

  • Fixed undefined behavior of SQL when using positive MP_INT numbers in MessagePack anywhere (bound arguments, tuples, C functions) (gh-10132).

Config

  • Now the failover section can be defined only in the global configuration scope.
  • Now runtime lua_call privileges are also applied before the initial bootstrap, making it possible to permit some functions to be executed by the guest user before setting up the cluster.

Tools

Fixed a bunch of bugs in LuaJIT profilers: * misc.sysprof.stop() returns a correct error message if the profiler is not running. * misc.sysprof.start() now raises an error if an argument has an incorrect type.

Made LuaJIT profilers more user-friendly: * misc.memprof.start() without arguments writes a dump into a default file named memprof.bin instead of raising an error. * misc.sysprof.start() provides more verbose errors in case of profiler misuse. * If the profiler is disabled for the target platform, it is now mentioned in the error message explicitly. * misc.sysprof.start() without arguments starts the profiler in the default mode "D".

Source: README.md, updated 2025-04-10