Name | Modified | Size | Downloads / 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 withER_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()
forio
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
...
inselect()
. - 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"
.