Get your data in RAM. Get compute close to data. Enjoy the performance.
Date: 2024-04-17 Tag: 2.11.3
2.11.3 is the next stable release in the long-term support (LTS) versionrelease_policy 2.11.x release series.
The label "stable" means there are 1.10.x-based applications running in production for quite a while without known crashes, incorrect results or other showstopper bugs.
This release resolves roughly 54 issues since the 2.11.2 version.
Tarantool 2.11.x is backward compatible with Tarantool 1.10.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 2.11.x series.
box_wait_limbo_acked
would fail. The
assertion is that the lsn of the last entry in limbo is always positive after
wal_sync
. Before the patch, if the replication_synchro_quorum
was set too
high on the replica, it would never be reached. After the timeout was
triggered, the user received a TimedOut
error. If the quorum was greater
than or equal to the number of instances in the replica set, the program
immediately stopped with a segmentation fault (gh-9235).box_promote_qsync
would fail in the
debug build mode. The assertion is that at the moment when box_promote_qsync
is called, no other promote is being executed. It turned out that this
assertion is basically incorrect. In the release build mode, this incorrect
assumption could potentially lead to writing 2 PROMOTE entries in the same
term (gh-9263).exclude_null
part were used (gh-9954).box.cfg()
correctly interprets the TT_LISTEN
and TT_REPLICATION
environment variables with query parameters (gh-9539).exclude_null
option is now supported by functional indexes (gh-9732).ER_PROTOCOL
when transactions ended
with a local space operation (gh-9491).box_collect_confirmed_vclock
stack after return (gh-9505).Backported patches from the vanilla LuaJIT trunk (gh-9145, gh-9595). The following issues were fixed as part of this activity:
REF_BASE
operand across IR_RETF
.BUFHDR APPEND
.table.clear()
.BC_JLOOP
that was a BC_RET*
.ffi.typeinfo()
.2^20
.IR_NEWREF
when restoring sunk values for side
trace (gh-7937).IR_HREFK
optimization for huge tables.__concat
metamethod.jit.off()
.TNEW
with a huge array
part.string.format()
with %g
modifier and
length modifier.setmetatable()
with nil
as the second argument.select()
in case with negative first argument.cc
file type for saving bytecode.jit.bcsave
.__concat
metamethod for vararg or protected frames.debug.setmetatable()
and lua_setmetatable()
with enabled
jit.dump()
.error_object:set_prev()
(gh-9694).wait_connected = false
option of
net_box.connect
to yield, despite being required to be fully asynchronous
(gh-9489).net.box
when a connection with asynchronous requests could
get garbage collected (gh-9629).on_disconnect
trigger behavior
of net.box
connections when an error is thrown and the actual behavior
(gh-9717).on_disconnect
trigger of net.box
connections that
caused Tarantool server to hang indefinitely when an error was thrown from the
trigger (gh-9797).on_schema_reload
trigger behavior of net.box
connections when an
error is thrown is now consistent with the behavior of the on_disconnect
trigger (gh-9679).net.box
connection remained active after being closed
from the connection's on_connect
trigger (gh-9827).SELECT
with a GROUP BY
expression (gh-8535, ghs-125).strptime
when the assertion was triggered (gh-8525).metrics
submodule to commit 3370f85
to fix compatibility with
luatest
commit d985997
.--human-readable
option for the misc.memprof
parser to print
sizes like 1KiB, 234MiB, 2GiB, etc.
Made the errors from the profilers more user-friendly (gh-9217).Date: 2024-04-16 Tag: 3.0.2
3.0.2 is the third stable version of the 3.0 release series. It resolves 31 bugs since 3.0.1.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 3.x is backward compatible with Tarantool 2.11.x in the 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 3.x series.
box.watch
(gh-9632).exclude_null
option is now supported by functional indexes (gh-9732).exclude_null
part were used (gh-9954).ER_PROTOCOL
when transactions ended
with a local space operation (gh-9491).box_collect_confirmed_vclock
stack after return (gh-9505).ER_WAL_IO
write error (gh-9399).Backported patches from the vanilla LuaJIT trunk (gh-9145, gh-9595). The following issues were fixed as part of this activity:
2^20
.IR_NEWREF
when restoring sunk values for side
trace (gh-7937).IR_HREFK
optimization for huge tables.__concat
metamethod.jit.off()
.TNEW
with a huge array
part.string.format()
with %g
modifier and
length modifier.setmetatable()
with nil
as the second argument.select()
in case with negative first argument.cc
file type for saving bytecode.jit.bcsave
.__concat
metamethod for vararg or protected frames.debug.setmetatable()
and lua_setmetatable()
with enabled
jit.dump()
.error_object:set_prev()
(gh-9694).wait_connected = false
option of
net_box.connect
to yield, despite being required to be fully asynchronous
(gh-9489).net.box
when a connection with asynchronous requests could
get garbage collected (gh-9629).on_disconnect
trigger behavior
of net.box
connections when an error is thrown and the actual behavior
(gh-9717).on_disconnect
trigger of net.box
connections that
caused Tarantool server to hang indefinitely when an error was thrown from the
trigger (gh-9797).on_schema_reload
trigger behavior of net.box
connections when an
error is thrown is now consistent with the behavior of the on_disconnect
trigger (gh-9679).net.box
connection remained active after being closed
from the connection's on_connect
trigger (gh-9827).config:info().alerts
instead of several ones. Examples of such alerts are
privilege grant delay due to a lack of a space/function/sequence and skipping
of a non-dynamic box.cfg()
option applies on the configuration reloading
(gh-9586).require('config'):get()
in role code now returns the configuration
that is currently applied (gh-9649).post_apply
phase (ghe-643).credential
section of
the configuration (gh-9643).strptime
when the assertion was triggered (gh-8525).package.cpath
for Debian based distros (gh-9580).metrics
submodule to commit 3370f85
to fix compatibility with
luatest
commit d985997
.tarantoolctl
has been removed. Systemd, sysvinit and logrotate scripts
based on it were also removed. All this functionality is covered by the tt
utility. tarantoolctl
is no longer available in official deb and rpm
packages. This change will only affect the absence of tarantoolctl in future
releases of tarball archives. (gh-9443).--human-readable
option for the misc.memprof
parser to print
sizes like 1KiB, 234MiB, 2GiB, etc.
Made the errors from the profilers more user-friendly (gh-9217).Date: 2024-04-16 Tag: 3.1.0
3.1.0 is the first stable version of the 3.1 release series. It introduces 28 improvements and resolves 2 bugs since 3.0.2.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 3.x is backward compatible with Tarantool 2.11.x in the 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 3.x series.
uint8
, int8
, uint16
, int16
,
uint32
, int32
, uint64
, int64
, float32
, float64
(gh-9548).trigger
, for example:
local trigger = require('trigger')
trigger.set('box.iproto.override.select', 'my_select', my_select_handler)
The method works before the initial box.cfg{}
call. Also, the method allows
setting multiple handlers for a single request type (gh-8138).box.iproto.override()
was switched to the universal trigger registry. As a
side effect, now this function does not raise an error when a wrong request
type is passed. All such errors are logged with CRITICAL
level (gh-8138).tarantool.build.test_build
that shows whether a build
flag TEST_BUILD
is set.box.error.unpack()
if
the box_error_unpack_type_and_code
compat option is set to 'new'.
The default behaviour is 'old' (gh-9101).name
field to an error object (gh-9875).trigger
option to box.schema.func.create
. This option allows creating
persistent triggers (gh-8663).box.error
(gh-9104).message
argument to the table constructor of box.error.new
(gh-9102).prev
argument to the table constructor of box.error.new
(gh-9103).box.error
s serialization and added a new
box_error_serialize_verbose
option to compat
to retain old behaviour
(gh-9105).box.error
(gh-9107).level
argument to box.error
and box.error.new
to specify
the stack frame used for setting the error location (gh-9792).key_def
module
(gh-9863).tnt_election_leader_idle
metric to built-in metrics
.http_version
option to the request()
, post()
,
get()
and other request functions from the http.client
module (gh-9806).config.etcd
options watchers.reconnect_timeout
and
watchers.reconnect_max_attempts
(ghe-647).sharding.rebalancer_mode
option (gh-9657).sharding.weight
configuration option, which reflects
the relative amount of data that a replicaset can store (gh-9775).config:info()
can now display source metadata from the last successful
load along with source metadata from the very last load attempt (gh-9780).labels
configuration option. The labels are maps with
string keys that are merged to instance level (gh-9809).config:instances()
method and the instance
option to
config:get()
(gh-9680).instance_uri()
method for the config
module (gh-9842).experimental.connpool
module and the
connect()
function of this module (gh-9842).filter()
function in the experimental.connpool
module (gh-9842).call()
function in the experimental.connpool
module (gh-9842).mode
option for the filter()
and call()
functions
in the experimental.connpool
module (gh-9930).box.error.TUPLE_FOUND
(gh-6166).on_commit
or on_rollback
) now fails
with a specific error (gh-9186, gh-7331).For the list of other bugs fixed you can refer to the 3.0.2 release notes, since most of the bugs are backported to the previous version.
tarantoolctl
has been removed. Systemd, sysvinit and logrotate
scripts based on it were also removed. All this functionality is covered by the tt
utility.
tarantoolctl
is no longer available in official deb and rpm packages. This change will only
affect the absence of tarantoolctl in future releases of tarball archives.
(gh-9443).--human-readable
option for the misc.memprof
parser to print
sizes like 1KiB, 234MiB, 2GiB, etc.
Made the errors from the profilers more user-friendly (gh-9217).Date: 2024-01-25 Tag: 3.0.1
3.0.1 is the 2nd stable version of the 3.0 release series. It resolves 4 bugs since 3.0.0.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 3.x is backward compatible with Tarantool 2.11.x in the 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 3.x series.
attempt to index a nil value
error if a config with all UUIDs set is used during a cluster's
bootstrap (gh-9572).Date: 2023-12-26 Tag: 3.0.0
3.0.0 is the first stable version of the 3.0 release series. It introduces 65 improvements and resolves 38 bugs since 2.11.2.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 3.x is backward compatible with Tarantool 2.11.x in the 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 3.x series.
index_object.parts
contains the following methods, similar to the
key_def
Lua module: extract_key()
, compare()
, compare_with_key()
,
merge()
(gh-7356).box.watch_once()
function to get the value currently
associated with a notification key on the local instance without subscribing
to future changes (gh-6493).IPROTO_WATCH_ONCE
request to get the value currently
associated with a notification key on a remote instance without subscribing
to future changes (gh-6493).conn:watch_once()
net.box connection method to get the value
currently associated with a notification key on a remote instance without
subscribing to future changes. The new method is implemented using the
IPROTO_WATCH_ONCE
request type (gh-6493).tuple:info()
and space:stat()
with the detailed
information on memory consumed by data (gh-6762).box.wal_error
that is broadcast
whenever Tarantool fails to commit a transaction to the write-ahead log
(gh-9405).box.before_commit
, box.on_commit
,
and box.on_rollback
for the new trigger registry. One of the main advantages
of the new triggers is that they can be set for all transactions rather than
setting them within each transaction (gh-5717, gh-8656).box.stat.memtx()
(gh-8501).memory.tuple
statistic for box.stat.vinyl()
that shows
the total size of memory occupied by all tuples allocated by the Vinyl engine
(gh-8485).Added a new bootstrap_leader
configuration option to specify the node from
which a replica should bootstrap. To do this, set box.cfg.bootstrap_strategy
to 'config'
and set bootstrap_leader
value to either the URI or UUID of
the desired bootstrap leader. For example:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'localhost:3301',
replication = {
'localhost:3301',
'localhost:3302',
},
listen = '3302',
}
(gh-7999).
You may now control which node new replicas choose as a bootstrap leader
without touching node config. To do so, set box.cfg.bootstrap_strategy
to
'supervised'
, and the nodes will only bootstrap off the node on which you
called box.ctl.make_bootstrap_leader()
last.
This works on an empty replica set bootstrap as well: start the admin console
before configuring the nodes. Then configure the nodes:
box.cfg{
bootstrap_strategy = 'supervised',
replication = ...,
listen = ...,
}
Finally, call box.ctl.make_bootstrap_leader()
through the admin console
on the node you want to promote. All the nodes will bootstrap off that node
(gh-8509).
A new option box.cfg.cluster_name
allows assigning a human-readable name to
the entire cluster. It has to match in all instances and is displayed in
box.info.cluster.name
(gh-5029).
A new option box.cfg.replicaset_name
allows assigning a human-readable name
to the replica set. It works the same as box.cfg.replicaset_uuid
. Its value
must be the same across all instances of one replica set. The replica set name
is displayed in box.info.replicaset.name
(gh-5029).
A new option box.cfg.instance_name
allows assigning a human-readable name to
the instance. It works the same as box.cfg.instance_uuid
. Its value must be
unique in the replica set. The instance name is displayed in box.info.name
.
Names of other replicas in the same replica set are visible in
box.info.replication[id].name
(gh-5029).
Instance at rebootstrap can change its UUID while keeping its numeric ID if it has the same non-empty instance name (gh-5029).
Added the ability to set the bootstrap_leader
configuration option to the
instance name of the desired bootstrap leader:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'leader-name',
replication = {
...
},
...
}
(gh-7999, gh-8539).
varbinary
type to Lua. An object of
this type is similar to a plain string but encoded in MsgPack as MP_BIN
so
it can be used for storing binary blobs in the database. This also works the
other way round: data fields stored as MP_BIN
are now decoded in Lua as
varbinary objects, not as plain strings, as they used to be. Since the latter
may cause compatibility issues, the new compat option binary_data_decoding
was introduced to revert the built-in decoder to the old behavior (gh-1629).trigger
. This module enables managing and
calling triggers stored in trigger registry (gh-8656).space_object
, box.session
, and box.ctl
were moved to
the trigger registry (gh-8657).login
and password
fields in uri.parse()
(gh-9435).msgpack.decode
. Now, an error raised by
mgpack.decode
has a detailed error message and the offset in the input
data. If msgpack.decode
failed to unpack a MsgPack extension, it also
includes the error cause pointing to the error in the extension data
(gh-7986).net.box
module function from_fd
for creating a new
connection from a socket file descriptor number (gh-8984).inherit_fds
for popen.new
. The option takes
an array of file descriptor numbers that should be left open in the child
process (gh-8926).socket.socketpair
, socket.from_fd
, and
socket:detach
(gh-8927).xlog.meta()
method for reading a meta block from an xlog
file.DROP CONSTRAINT
statement has been
improved (gh-9112).SHOW CREATE TABLE
statement (gh-8098).SHOW CREATE TABLE
no longer supports the DEFAULT clause (gh-8793).SQL_EXPR
functions can now be set as a default value (gh-8793).+
or -
sign unless
the literal is numeric (gh-8793).IPROTO_CALL16
from net.box
(i.e., the call_16
option and the call_16
method for net.box
connections) (gh-8636).box.tuple.new
(this
was needed for gh-4693). It is possible to switch to the old behavior using
the compatibility option box_tuple_new_vararg
.sql
object type for
box.schema.user.grant
. Now only users with the 'execute'
privilege
granted on sql
or universe
can execute SQL expressions with the
IPROTO_EXECUTE
or IPROTO_PREPARE
requests. To revert to the old behavior
(no SQL access checks), use the sql_priv
compat option (gh-8803).box.info
parameter hostname
(gh-8605).box.cfg.memtx_sort_threads
parameter that specifies the number of
threads used to sort indexes keys on loading a memtx database. OpenMP is
not used to sort keys anymore (gh-3389).fselect
index method from a table of strings to
a multi-line string and dropped the print
and use_nbsp
options. With the
yaml_pretty_multiline
compat option enabled by default, multi-line strings
now look good in the console, so there's no need to return a table of strings
to prettify the fselect
output anymore.box.tuple.format
that enables format definition for tuples
created via box.tuple.new
(standalone tuples) (gh-4693).index.select
and index.pairs
with the after
option by up to 30%
in a synthetic test by eliminating an extra buffer allocation.box.session.push
is now deprecated. Consider using
box.broadcast
instead (gh-8802).box.session.new
for creating a new IPROTO
session from a socket file descriptor number (gh-8801).lua_eval
and lua_call
object types for
box.schema.user.grant
. Granting the 'execute'
privilege on lua_eval
allows the user to execute an arbitrary Lua expression with the
IPROTO_EVAL
request. Granting the 'execute'
privilege on lua_call
allows the user to execute a global user-defined Lua function with
the IPROTO_CALL
request (gh-8803, gh-9360).leader_name
field to box.info.election
(gh-8931).box_tuple_extension
backward compatibility option to disable sending
tuple formats in responses to IPROTO call and eval requests (gh-8146).box_tuple_extension
backward compatibility option can be used to
disable receiving tuple formats in IPROTO call and eval request arguments
(gh-8633).is_sync
parameter to box.atomic()
. To make the transaction
synchronous, set the is_sync
option to true
. Setting is_sync = false
is
prohibited. If any value other than true/nil is set, for example
is_sync = "some string"
, then an error will be thrown (gh-8650).-i
flag. To pass a Lua script contents via
stdin
, use dash (-
) as the script name. For more information see a help
message by running tarantool -h
(gh-8613).--name
and --config
(gh-8613).--force-recovery
CLI option (gh-8876).The following compatibility options' defaults were switched to new behavior:
yaml_pretty_multiline
sql_seq_scan_default
json_escape_forward_slash
fiber_channel_close_mode
fiber_slice_default
box_cfg_replication_sync_timeout
c_func_iproto_multireturn
More information on the new behavior can be found on the Module compat page.
\set continuation
command.fiber_set_name_n
, fiber_name
, fiber_id
, fiber_csw
and
fiber_find
into the public C API and usable via FFI as well.fiber_set_joinable
, fiber_set_ctx
and fiber_get_ctx
treat the NULL argument as the current fiber.deb
and rpm
packages.deb
and rpm
Tarantool packages.box.space._schema['cluster']
is renamed to
'replicaset_uuid'
. That is not expected to be breaking because _schema
is
an internal system space, but the key was visible in public and documented
(gh-5029).box.info.cluster
is renamed to
box.info.replicaset
. The behavior can be reverted using the compat
option
box_info_cluster_meaning
(https://tarantool.io/compat/box_info_cluster_meaning) (gh-5029).0x80
and 0xff
would
be erroneously converted to two-byte UTF-8 code points, for example, \x80
would be decoded as \uC280
(gh-8782).index_object.parts.exclude_null
always contains false
rather than
null
when it is actually false
(gh-8649).box.schema.SPACE_MAX
). Now, the max space id
equals 2147483646. The limit was decremented because the old value is used as
an error indicator in the box C API. It's still possible to revert to the old
behavior with the compatibility module option box_space_max
(gh-9118).tarantool -v
output and tarantool.build.flags
string now include
build type-specific and LTO flags if any (gh-8022).fiber_set_joinable
function panics if the fiber is dead or joined
already. The fiber_join
and fiber_join_timeout
functions now panic on a
double join if it is possible to detect it (gh-7562).on_rollback
trigger functions were invoked with an empty
iterator argument if a transaction was aborted by a fiber yield or by a
timeout (gh-9340).on_rollback
triggers were not invoked during a rollback
to a savepoint (gh-7810).box_wait_limbo_acked
would fail. The
assertion is that the lsn of the last entry in limbo is always positive after
wal_sync
. Before the patch, if the replication_synchro_quorum
was set too
high on the replica, it would never be reached. After the timeout was
triggered, the user received a TimedOut
error. If the quorum was greater
than or equal to the number of instances in the replica set, the program
immediately stopped with a segmentation fault (gh-9235).box_promote_qsync
would fail in the
debug build mode. The assertion is that at the moment when box_promote_qsync
is called, no other promote is being executed. It turned out that this
assertion is basically incorrect. In the release build mode, this incorrect
assumption could potentially lead to writing 2 PROMOTE entries in the same
term (gh-9263)._schema
space.box.cfg{replication_anon = false}
.box.ctl.demote()
with box.cfg{election_mode = 'off'}
and an owned synchro queue could simply not do anything (gh-6860).Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues were fixed as part of this activity:
Fixed frame for on-trace OOM handling. Backported patches from the vanilla LuaJIT trunk (gh-9145). The following issues were fixed as part of this activity:
Fixed error handling after return from a child coroutine.
Fixed clashing of addresses in the __call
metamethod return dispatch (again).
Fixed the assembling for the head of the side trace (gh-8767).
Prevented compilation of __concat
methamethod with tailcall to fast
function.
Fixed buffer overflow in parsing the #pragma
directive via FFI (gh-9339).
Now the error is thrown when more than 6 alignment settings are pushed on the
internal stack.
Fixed incorrect fold rule for x - (-0)
on trace (for x = -0
the result
should be 0
).
Fixed output for IR_CONV
in jit.dump()
.
Fixed math.min()
/math.max()
inconsistencies for x86/x86_64 architectures
when called with a NaN argument or -0
and 0
.
Fixed math.ceil(x)
result sign for -1 < x < 0.5.
Errors from gc finalizers are now printed instead of being rethrown.
Fixed lua_concat()
.
Fixed possible storing of NaN keys to table on trace.
Fixed ABC FOLD optimization with constants.
Marked CONV
as non-weak, to prevent invalid control flow path choice.
Fixed CSE of a REF_BASE
operand across IR_RETF
.
Fixed the fold rule for BUFHDR APPEND
.
Fixed HREFK, ALOAD, HLOAD, forwarding vs. table.clear()
.
Fixed snapshot PC when linking to BC_JLOOP
that was a BC_RET*
.
Fixed dangling references to CType.
Ensured returned string is alive in ffi.typeinfo()
.
Fixed the missing initialization of the internal structure, leading to a crash when recording a trace with an allocation of cdata.
fio.open()
was changed for newly
created files to 0666 (before umask) (gh-7981).WITH RECURSIVE
clause
(ghs-119).ALTER TABLE ADD COLUMN
(gh-8793).3.0.0-beta1
in issue gh-4467 (gh-9445).SELECT
with a GROUP BY
expression (gh-8535, ghs-125).cord_slab_cache
symbol was removed from the public
API export (gh-7124).box.schema
module are now wrapped into a
transaction to avoid database inconsistency on failed operations (gh-4348).box.schema.user.grant()
now raises an error on
an attempt to grant the execute
privilege on a space. Historically,
this action was allowed although it had no effect. It's still possible
to revert to the old behavior with the new compatibility option
box_space_execute_priv
(gh-9277)._vinyl_deferred_delete
system space (gh-5279)._stream
and
_stream_space_cache
and indexes named _space
using the net.box
stream
objects (gh-8598).box.cfg
and log.cfg
options to
infinite numbers (NaN, Inf). Setting a box.cfg
or log.cfg
option to
an infinite number could result in a crash or invalid behavior (gh-4962).box.cfg()
correctly interprets the TT_LISTEN
and TT_REPLICATION
environment variables with query parameters (gh-9539).Date: 2023-12-07 Tag: 2.11.2
2.11.2 is the 3rd stable version of the 2.11 release series. It resolves 38 bugs since 2.11.1.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 2.x is backward compatible with Tarantool 1.10.x in the 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 2.x series.
box.space._index
(gh-8688).\x80
or \u200B
(gh-8756).box.schema.downgrade
(gh-9049).1e38
. The error was present only in the debug build.
Despite the failing assertion, the behavior after the assertion was correct
(gh-8472).space:bsize()
when altering
a primary index concurrently with DML operations (gh-9247).log.cfg{modules = ...}
. Now, instead of merging the
new log modules configuration with the old one, it completely overwrites the
current configuration, which is consistent with box.cfg{log_modules = ...}
(gh-7962).on_replace
or before_replace
trigger on a global replicated space.
Such xlogs were unrecoverable and caused other nodes to break replication with
the replica (gh-8746, gh-8958).Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues were fixed as part of this activity:
Prevent integer overflow while parsing long strings.
Fixed various ^
operator and math.pow()
function inconsistencies.
Fixed parsing with predicting next()
and pairs()
.
Fixed binary number literal parsing. Parsing of binary number with a zero fractional part raises error too now.
Fixed load forwarding optimization applied after table rehashing.
Fixed recording of the BC_TSETM
.
Fixed the panic routine when mprotect
fails to change flags for mcode area.
Fixed handling of instable types in TNEW/TDUP load forwarding.
Handled table unsinking in the presence of IRFL_TAB_NOMM
.
Fixed a bug when an error could be raised on the non-currently executed coroutine (gh-6323). Backported patches from the vanilla LuaJIT trunk (gh-9145). The following issues were fixed as part of this activity:
Fixed error handling after return from a child coroutine.
Fixed clashing of addresses in the __call
metamethod return dispatch (again).
Fixed the assembling for the head of the side trace (gh-8767).
Prevented compilation of __concat
methamethod with tailcall to fast
function.
Fixed buffer overflow in parsing the #pragma
directive via FFI (gh-9339).
Now the error is thrown when more than 6 alignment settings are pushed on the
internal stack.
Fixed incorrect fold rule for x - (-0)
on trace (for x = -0
the result
should be 0
).
Fixed output for IR_CONV
in jit.dump()
.
Fixed math.min()
/math.max()
inconsistencies for x86/x86_64 architectures
when called with a NaN argument or -0
and 0
.
Fixed math.ceil(x)
result sign for -1 < x < 0.5.
Errors from gc finalizers are now printed instead of being rethrown.
Fixed lua_concat()
.
Fixed possible storing of NaN keys to table on trace.
Fixed ABC FOLD optimization with constants.
Marked CONV
as non-weak, to prevent invalid control flow path choice.
Fixed sysprof crash during stack unwinding for FFUNC (gh-8594).
CREATE TABLE
(gh-9229).EXISTS
predicate no longer requires LIMIT 1
to work correctly if more
than one row is returned in the subselect (gh-8676).box.cfg{}
string parameters is now 512 to support a
lengthy args, such as list of audit events (ghe-523).box.info.memory()
, box.info.gc()
, box.info.vinyl()
,
and box.info.sql()
are called before box.cfg{}
(gh-9173).c_func_iproto_multireturn
option to the compat
module. The new
behavior drops an additional array that wraps multiple results returned via
iproto (gh-4799).on_shutdown
triggers weren't run if os.exit()
was
called from -e
command-line option (gh-9266).require('net.box').self:call()
(gh-9131).tarantool.build.asan
that shows whether build
flag ENABLE_ASAN
is set. The flag is intended to ease tests
backporting from the master branch.Date: 2023-11-20 Tag: 3.0.0-beta1
3.0.0-beta1 is the beta version of the 3.0 release series.
This release introduces 95 new features and resolves 51 bugs since the 2.11 version. There can be bugs in less common areas. If you find any, feel free to report an issue on GitHub.
Notable changes are:
Tarantool 3.x is backward compatible with Tarantool 1.10.x in the 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 2.x series.
box.schema.upgrade()
before you can execute any DDL
operations (gh-7149).index_object.parts
contains the following methods, similar to the
key_def
Lua module: extract_key()
, compare()
, compare_with_key()
,
merge()
(gh-7356).box.watch_once()
function to get the value currently
associated with a notification key on the local instance without subscribing
to future changes (gh-6493).IPROTO_WATCH_ONCE
request to get the value currently
associated with a notification key on a remote instance without subscribing
to future changes (gh-6493).conn:watch_once()
net.box connection method to get the value
currently associated with a notification key on a remote instance without
subscribing to future changes. The new method is implemented using the
IPROTO_WATCH_ONCE
request type (gh-6493).box.schema
can now be accessed before box.cfg()
.tuple:info()
and space:stat()
with the detailed
information on memory consumed by data (gh-6762).box.stat.memtx()
(gh-8501).memory.tuple
statistic for box.stat.vinyl()
that shows
the total size of memory occupied by all tuples allocated by the Vinyl engine
(gh-8485).Added a new bootstrap_leader
configuration option to specify the node from
which a replica should bootstrap. To do this, set box.cfg.bootstrap_strategy
to 'config'
and set bootstrap_leader
value to either the URI or UUID of
the desired bootstrap leader. For example:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'localhost:3301',
replication = {
'localhost:3301',
'localhost:3302',
},
listen = '3302',
}
(gh-7999).
You may now control which node new replicas choose as a bootstrap leader
without touching node config. To do so, set box.cfg.bootstrap_strategy
to
'supervised'
, and the nodes will only bootstrap off the node on which you
called box.ctl.make_bootstrap_leader()
last.
This works on an empty replica set bootstrap as well: start the admin console
before configuring the nodes. Then configure the nodes:
box.cfg{
bootstrap_strategy = 'supervised',
replication = ...,
listen = ...,
}
Finally, call box.ctl.make_bootstrap_leader()
through the admin console
on the node you want to promote. All the nodes will bootstrap off that node
(gh-8509).
A new option box.cfg.cluster_name
allows assigning a human-readable name to
the entire cluster. It has to match in all instances and is displayed in
box.info.cluster.name
(gh-5029).
A new option box.cfg.replicaset_name
allows assigning a human-readable name
to the replicaset. It works the same as box.cfg.replicaset_uuid
. Its value
must be the same across all instances of one replicaset. The replicaset name
is displayed in box.info.replicaset.name
(gh-5029).
A new option box.cfg.instance_name
allows assigning a human-readable name to
the instance. It works the same as box.cfg.instance_uuid
. Its value must be
unique in the replicaset. The instance name is displayed in box.info.name
.
Names of other replicas in the same replicaset are visible in
box.info.replication[id].name
(gh-5029).
Instance at rebootstrap can change its UUID while keeping its numeric ID if it has the same non-empty instance name (gh-5029).
Added the ability to set the bootstrap_leader
configuration option to the
instance name of the desired bootstrap leader:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'leader-name',
replication = {
...
},
...
}
(gh-7999, gh-8539).
varbinary
type to Lua. An object of
this type is similar to a plain string but encoded in MsgPack as MP_BIN
so
it can be used for storing binary blobs in the database. This also works the
other way round: data fields stored as MP_BIN
are now decoded in Lua as
varbinary objects, not as plain strings, as they used to be. Since the latter
may cause compatibility issues, the new compat option binary_data_decoding
was introduced to revert the built-in decoder to the old behavior (gh-1629).trigger
. This module enables managing and
calling triggers stored in trigger registry (gh-8656).space_object
, box.session
, and box.ctl
were moved to
the trigger registry (gh-8657).'tarantool.trigger.on_change'
in the trigger registry.
It is called when any event in the trigger registry is modified (gh-8664).msgpack.decode
. Now, an error raised by
mgpack.decode
has a detailed error message and the offset in the input
data. If msgpack.decode
failed to unpack a MsgPack extension, it also
includes the error cause pointing to the error in the extension data
(gh-7986).net.box
module function from_fd
for creating a new
connection from a socket file descriptor number (gh-8984).inherit_fds
for popen.new
. The option takes
an array of file descriptor numbers that should be left open in the child
process (gh-8926).socket.socketpair
, socket.from_fd
, and
socket:detach
(gh-8927).xlog.meta()
method for reading a meta block from an xlog
file.SHOW CREATE TABLE
statement (gh-8098).DROP CONSTRAINT
statement has been
improved (gh-9112).SHOW CREATE TABLE
no longer supports the DEFAULT clause (gh-8793).SQL_EXPR
functions can now be set as a default value (gh-8793).+
or -
sign unless
the literal is numeric (gh-8793).box
mechanism for default
values (gh-8793).--force-recovery
CLI option (gh-8876).IPROTO_CALL16
from net.box
(i.e., the call_16
option and the call_16
method for net.box
connections) (gh-8636).box.info
parameter hostname
(gh-8605).box.cfg.memtx_sort_threads
parameter that specifies the number of
threads used to sort indexes keys on loading a memtx database. OpenMP is
not used to sort keys anymore (gh-3389).fselect
index method from a table of strings to
a multiline string and dropped the print
and use_nbsp
options. With the
yaml_pretty_multiline
compat option enabled by default, multiline strings
now look good in the console, so there's no need to return a table of strings
to prettify the fselect
output anymore.box.tuple.format
that enables format definition for tuples
created via box.tuple.new
(standalone tuples) (gh-4693).box.tuple.new
(this
was needed for gh-4693). It is possible to switch to the old behavior using
the compatibility option box_tuple_new_vararg
.index.select
and index.pairs
with the after
option by up to 30%
in a synthetic test by eliminating an extra buffer allocation.box.session.push
is now deprecated. Consider using
box.broadcast
instead (gh-8802).box.session.new
for creating a new IPROTO
session from a socket file descriptor number (gh-8801).lua_eval
and lua_call
object types for
box.schema.user.grant
. Granting the 'execute'
privilege on lua_eval
allows the user to execute an arbitrary Lua expression with the
IPROTO_EVAL
request. Granting the 'execute'
privilege on lua_call
allows the user to execute any global user-defined Lua function with
the IPROTO_CALL
request (gh-8803).sql
object type for
box.schema.user.grant
. Now only users with the 'execute'
privilege
granted on sql
or universe
can execute SQL expressions with the
IPROTO_EXECUTE
or IPROTO_PREPARE
requests. To revert to the old behavior
(no SQL access checks), use the sql_priv
compat option (gh-8803).box.cfg{}
string parameters is now 512 instead of 256.tarantool.build.asan
that shows whether build
flag ENABLE_ASAN
is set.leader_name
field to box.info.election
(gh-8931).box_tuple_extension
backward compatibility option to disable sending
tuple formats in responses to IPROTO_CALL and IPROTO_EVAL requests (gh-8146).box_tuple_extension
backward compatibility option can be used to
disable receiving tuple formats in IPROTO_CALL and IPROTO_EVAL request arguments
(gh-8633).-i
flag. To pass a Lua script contents via
stdin
, use dash (-
) as the script name. For more information see a help
message by running tarantool -h
(gh-8613).--name
and --config
(gh-8613).The following compatibility options' defaults were switched to new behavior:
yaml_pretty_multiline
sql_seq_scan_default
json_escape_forward_slash
fiber_channel_close_mode
fiber_slice_default
box_cfg_replication_sync_timeout
c_func_iproto_multireturn
More information on the new behavior can be found on the Module compat page.
memtx.sort_threads
option is now supported (gh-8861).bootstrap_leader
option is now supported (gh-8861).box.cfg{}
options are now supported by
config (gh-8861).TT_*_DEFAULT
variables. It is useful to declare defaults (gh-8862).config:get()
method (gh-8862).box.cfg{}
are now supported
in the YAML config (gh-8861).--help-env-list
CLI option (gh-8862).config.credentials
schema,
including a password setting, updating and removal for the chap-sha1
auth type (supported by both Tarantool Community Edition and Tarantool
Enterprise Edition) and the pap-sha256
(just for Enterprise Edition
where it is available) (gh-8967).box.cfg.cluster_name
(gh-8862).var/run/<...>
,
var/log/<...>
, var/lib/<...>
and so on (gh-8862).lua_eval
, lua_call
, and sql
object types are
supported by credentials (gh-8967).security.auth_type
differs from a user's
auth_type
(gh-8967).{{ replicaset_name }}
and {{ group_name }}
templates in addition to the existing {{ instance_name }}
(gh-8862).\set continuation
command.fiber_set_name_n
, fiber_name
, fiber_id
, fiber_csw
and
fiber_find
into the public C API and usable via FFI as well.fiber_set_joinable
, fiber_set_ctx
and fiber_get_ctx
treat the NULL argument as the current fiber.deb
and rpm
packages.deb
and rpm
Tarantool packages.box.space._schema['cluster']
is renamed to
'replicaset_uuid'
. That is not expected to be breaking because _schema
is
an internal system space, but the key was visible in public and documented
(gh-5029).box.info.cluster
is renamed to
box.info.replicaset
. The behaviour can be reverted using the compat
option
box_info_cluster_meaning
(https://tarantool.io/compat/box_info_cluster_meaning) (gh-5029).\x80
or \u200B
(gh-8756).0x80
and 0xff
would
be erroneously converted to two-byte UTF-8 code points, for example, \x80
would be decoded as \uC280
(gh-8782).index_object.parts.exclude_null
always contains false
rather than
null
when it is actually false
(gh-8649).box.space._index
(gh-8688).box.schema.downgrade
(gh-9049).1e38
. The error was present only in the debug build.
Despite the failing assertion, the behavior after the assertion was correct
(gh-8472).space:bsize()
when altering
a primary index concurrently with DML operations (gh-9247).log.cfg{modules = ...}
. Now, instead of merging the
new log modules configuration with the old one, it completely overwrites the
current configuration, which is consistent with box.cfg{log_modules = ...}
(gh-7962).box.schema.SPACE_MAX
). Now, the max space id
equals 2147483646. The limit was decremented because the old value is used as
an error indicator in the box C API. It's still possible to revert to the old
behavior with the compatibility module option box_space_max
(gh-9118).tarantool -v
output and tarantool.build.flags
string now include
build type-specific and LTO flags if any (gh-8022).fiber_set_joinable
function panics if the fiber is dead or joined
already. The fiber_join
and fiber_join_timeout
functions now panic on a
double join if it is possible to detect it (gh-7562)._schema
space.box.cfg{replication_anon = false}
.box.ctl.demote()
with box.cfg{election_mode = 'off'}
and an owned synchro queue could simply not do anything (gh-6860).on_replace
or before_replace
trigger on a global replicated space.
Such xlogs were unrecoverable and caused other nodes to break replication with
the replica (gh-8746, gh-8958).Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues were fixed as part of this activity:
Fixed BC_UCLO
insertion for returns.
Fixed recording of BC_VARG
with unused vararg values.
Initialization instructions on trace are now emitted only for the first member of a union.
Prevent integer overflow while parsing long strings.
Fixed various ^
operator and math.pow()
function inconsistencies.
Fixed parsing with predicting next()
and pairs()
.
Fixed binary number literal parsing. Parsing of binary number with a zero fractional part raises error too now.
Fixed load forwarding optimization applied after table rehashing.
Fixed recording of the BC_TSETM
.
Fixed the panic routine when mprotect
fails to change flags for mcode area.
Fixed frame for on-trace OOM handling.
Fixed handling of instable types in TNEW/TDUP load forwarding.
Handled table unsinking in the presence of IRFL_TAB_NOMM
.
Fixed a bug when an error could be raised on the non-currently executed coroutine (gh-6323). Backported patches from the vanilla LuaJIT trunk (gh-9145). The following issues were fixed as part of this activity:
Fixed error handling after return from a child coroutine.
fio.open()
was changed for newly
created files to 0666 (before umask) (gh-7981).WITH RECURSIVE
clause
(ghs-119).CREATE TABLE
(gh-9229).ALTER TABLE ADD COLUMN
(gh-8793)._vinyl_deferred_delete
system space (gh-5279)._stream
and
_stream_space_cache
and indexes named _space
using the net.box
stream
objects (gh-8598).cord_slab_cache
symbol was removed from the public
API export (gh-7124).box.schema
module are now wrapped into a
transaction to avoid database inconsistency on failed operations (gh-4348).box.info.memory()
, box.info.gc()
, box.info.vinyl()
,
and box.info.sql()
are called before box.cfg{}
(gh-9173).c_func_iproto_multireturn
option to the
compat
module. The new behavior drops an additional array that wraps
multiple results returned via iproto (gh-4799).on_shutdown
triggers weren't run if os.exit()
was
called from -e
command-line option (gh-9266).box.schema.user.grant()
now raises an error on
an attempt to grant the execute
privilege on a space. Historically,
this action was allowed although it had no effect. It's still possible
to revert to the old behavior with the new compatibility option
box_space_execute_priv
(gh-9277).box.cfg
and log.cfg
options to
infinite numbers (NaN, Inf). Setting a box.cfg
or log.cfg
option to
an infinite number could result in a crash or invalid behavior (gh-4962).console.socket
and log.file
(gh-8862).process.work_dir
directory (gh-8862).process.work_dir
when creating
necessary directories (gh-8862).--name
CLI option, and TT_INSTANCE_NAME
environment
variable (gh-8862).Date: 2023-09-14 Tag: 2.10.8
2.10.8 is the ninth stable version of the 2.10 release series. It introduces 5 improvements and resolves 28 bugs since 2.10.7.
The "stable" label means that we have all planned features implemented and we see no high-impact issues. However, if you encounter an issue, feel free to report it on GitHub.
Tarantool 2.x is backward compatible with Tarantool 1.10.x in the 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 2.x series.
box.cfg{}
string parameters is now 512 instead of 256.FIBER_STACK_SIZE
to set the default fiber stack size.ER_CURSOR_NO_TRANSACTION
failure for transactions
on synchronous spaces when the on_commit/on_rollback
triggers are set
(gh-8505).box.on_commit
and box.on_rollback
trigger callbacks when transaction
is synchronous (gh-8742).stream_id
field
of xlog headers (gh-8783).clang
version 15 and above with enabled AddressSanitizer
(tarantool/tarantool-qa#321).box.ctl.promote()
on
a cluster with nodes configured with election_mode = "candidate"
(gh-8497).election_mode = 'candidate'
spuriously detecting
a split-vote when another candidate should win with exactly a quorum of votes
for it (gh-8698).Backported patches from the vanilla LuaJIT trunk (gh-8516). The following issues were fixed as part of this activity:
Fixed canonicalization of +-0.0 keys for IR_NEWREF
.
Fixed result truncation for bit.rol
on x86_64 platforms.
Fixed lua_yield()
invocation inside C hooks.
Fixed memory chunk allocation beyond the memory limit.
Fixed TNEW load forwarding with instable types.
Fixed use-def analysis for BC_VARG
, BC_FUNCV
.
Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues
were fixed as part of this activity:
Fixed BC_UCLO
insertion for returns.
Fixed recording of BC_VARG
with unused vararg values.
Initialization instructions on trace are now emitted only for the first member of a union.
Prevent integer overflow while parsing long strings.
Fixed various ^
operator and math.pow()
function inconsistencies.
Fixed parsing with predicting next()
and pairs()
.
Fixed binary number literal parsing. Parsing of binary number with a zero fractional part raises error too now.
Fixed load forwarding optimization applied after table rehashing.
Fixed recording of the BC_TSETM
.
net.box
(gh-8889).language
parameter was shared between connected
clients (gh-8817).-i
flag in case stdin is not a tty (gh-5064).Date: 2023-09-12 Tag: 3.0.0-alpha3
3.0.0-alpha3 is the alpha version of the 3.0 release series.
This release introduces 71 new features and resolves 23 bugs since the 2.11.1 version. There can be bugs in less common areas. If you find any, feel free to report an issue on GitHub.
Notable changes are:
Tarantool 3.x is backward compatible with Tarantool 1.10.x in the 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 2.x series.
box.schema.upgrade()
before you can execute any DDL
operations (gh-7149).index_object.parts
contains the following methods, similar to the
key_def
Lua module: extract_key()
, compare()
, compare_with_key()
,
merge()
(gh-7356).box.watch_once()
function to get the value currently
associated with a notification key on the local instance without subscribing
to future changes (gh-6493).IPROTO_WATCH_ONCE
request to get the value currently
associated with a notification key on a remote instance without subscribing
to future changes (gh-6493).conn:watch_once()
net.box connection method to get the value
currently associated with a notification key on a remote instance without
subscribing to future changes. The new method is implemented using the
IPROTO_WATCH_ONCE
request type (gh-6493).box.stat.memtx()
(gh-8501).memory.tuple
statistic for box.stat.vinyl()
that shows
the total size of memory occupied by all tuples allocated by the Vinyl engine
(gh-8485).Added a new bootstrap_leader
configuration option to specify the node from
which a replica should bootstrap. To do this, set box.cfg.bootstrap_strategy
to 'config'
and set bootstrap_leader
value to either the URI or UUID of
the desired bootstrap leader. For example:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'localhost:3301',
replication = {
'localhost:3301',
'localhost:3302',
},
listen = '3302',
}
(gh-7999).
You may now control which node new replicas choose as a bootstrap leader
without touching node config. To do so, set box.cfg.bootstrap_strategy
to
'supervised'
, and the nodes will only bootstrap off the node on which you
called box.ctl.make_bootstrap_leader()
last.
This works on an empty replica set bootstrap as well: start the admin console
before configuring the nodes. Then configure the nodes:
box.cfg{
bootstrap_strategy = 'supervised',
replication = ...,
listen = ...,
}
Finally, call box.ctl.make_bootstrap_leader()
through the admin console
on the node you want to promote. All the nodes will bootstrap off that node
(gh-8509).
A new option box.cfg.cluster_name
allows assigning a human-readable name to
the entire cluster. It has to match in all instances and is displayed in
box.info.cluster.name
(gh-5029).
A new option box.cfg.replicaset_name
allows assigning a human-readable name
to the replicaset. It works the same as box.cfg.replicaset_uuid
. Its value
must be the same across all instances of one replicaset. The replicaset name
is displayed in box.info.replicaset.name
(gh-5029).
A new option box.cfg.instance_name
allows assigning a human-readable name to
the instance. It works the same as box.cfg.instance_uuid
. Its value must be
unique in the replicaset. The instance name is displayed in box.info.name
.
Names of other replicas in the same replicaset are visible in
box.info.replication[id].name
(gh-5029).
Instance at rebootstrap can change its UUID while keeping its numeric ID if it has the same non-empty instance name (gh-5029).
Added the ability to set the bootstrap_leader
configuration option to the
instance name of the desired bootstrap leader:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'leader-name',
replication = {
...
},
...
}
(gh-7999, gh-8539).
varbinary
type to Lua. An object of
this type is similar to a plain string but encoded in MsgPack as MP_BIN
so
it can be used for storing binary blobs in the database. This also works the
other way round: data fields stored as MP_BIN
are now decoded in Lua as
varbinary objects, not as plain strings, as they used to be. Since the latter
may cause compatibility issues, the new compat option binary_data_decoding
was introduced to revert the built-in decoder to the old behavior (gh-1629).trigger
. This module enables managing and
calling triggers stored in trigger registry (gh-8656).net.box
module function from_fd
for creating a new
connection from a socket file descriptor number (gh-8984).inherit_fds
for popen.new
. The option takes
an array of file descriptor numbers that should be left open in the child
process (gh-8926).socket.socketpair
, socket.from_fd
, and
socket:detach
(gh-8927).SHOW CREATE TABLE
statement (gh-8098).IPROTO_CALL16
from net.box
(i.e., the call_16
option and the call_16
method for net.box
connections) (gh-8636).box.info
parameter hostname
(gh-8605).box.cfg.memtx_sort_threads
parameter that specifies the number of
threads used to sort indexes keys on loading a memtx database. OpenMP is
not used to sort keys anymore (gh-3389).fselect
index method from a table of strings to
a multi-line string and dropped the print
and use_nbsp
options. With the
yaml_pretty_multiline
compat option enabled by default, multi-line strings
now look good in the console, so there's no need to return a table of strings
to prettify the fselect
output anymore.box.tuple.format
that enables format definition for tuples
created via box.tuple.new
(standalone tuples) (gh-4693).box.tuple.new
(this
was needed for gh-4693). It is possible to switch to the old behavior using
the compatibility option box_tuple_new_vararg
.index.select
and index.pairs
with the after
option by up to 30%
in a synthetic test by eliminating an extra buffer allocation.box.session.push
is now deprecated. Consider using
box.broadcast
instead (gh-8802).box.session.new
for creating a new IPROTO
session from a socket file descriptor number (gh-8801).lua_eval
and lua_call
object types for
box.schema.user.grant
. Granting the 'execute'
privilege on lua_eval
allows the user to execute an arbitrary Lua expression with the
IPROTO_EVAL
request. Granting the 'execute'
privilege on lua_call
allows the user to execute any global user-defined Lua function with
the IPROTO_CALL
request (gh-8803).sql
object type for
box.schema.user.grant
. Now only users with the 'execute'
privilege
granted on sql
or universe
can execute SQL expressions with the
IPROTO_EXECUTE
or IPROTO_PREPARE
requests. To revert to the old behavior
(no SQL access checks), use the sql_priv
compat option (gh-8803).box.cfg{}
string parameters is now 512 instead of 256.tarantool.build.asan
that shows whether build
flag ENABLE_ASAN
is set.leader_name
field to box.info.election
(gh-8931).-i
flag. To pass a Lua script contents via
stdin
, use dash (-
) as the script name. For more information see a help
message by running tarantool -h
(gh-8613).--name
and --config
(gh-8613).The following compatibility options' defaults were switched to new behavior:
yaml_pretty_multiline
sql_seq_scan_default
json_escape_forward_slash
fiber_channel_close_mode
fiber_slice_default
box_cfg_replication_sync_timeout
More information on the new behavior can be found on the Module compat page.
memtx.sort_threads
option is now supported (gh-8861).bootstrap_leader
option is now supported (gh-8861).box.cfg{}
options are now supported by
config (gh-8861).TT_*_DEFAULT
variables. It is useful to declare defaults (gh-8862).config:get()
method (gh-8862).box.cfg{}
are now supported
in the YAML config (gh-8861).--help-env-list
CLI option (gh-8862).config.credentials
schema,
including a password setting, updating and removal for the chap-sha1
auth type (supported by both Tarantool Community Edition and Tarantool
Enterprise Edition) and the pap-sha256
(just for Enterprise Edition
where it is available) (gh-8967).box.cfg.cluster_name
(gh-8862).var/run/<...>
,
var/log/<...>
, var/lib/<...>
and so on (gh-8862).\set continuation
command.deb
and rpm
packages.deb
and rpm
Tarantool packages.box.space._schema['cluster']
is renamed to
'replicaset_uuid'
. That is not expected to be breaking because _schema
is
an internal system space, but the key was visible in public and documented
(gh-5029).box.info.cluster
is renamed to
box.info.replicaset
. The behaviour can be reverted using the compat
option
box_info_cluster_meaning
(gh-5029).\x80
or \u200B
(gh-8756).0x80
and 0xff
would
be erroneously converted to two-byte UTF-8 code points, for example, \x80
would be decoded as \uC280
(gh-8782).index_object.parts.exclude_null
always contains false
rather than
null
when it is actually false
(gh-8649).box.space._index
(gh-8688)._schema
space.box.cfg{replication_anon = false}
.box.ctl.demote()
with box.cfg{election_mode = 'off'}
and an owned synchro queue could simply not do anything (gh-6860).Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues were fixed as part of this activity:
BC_UCLO
insertion for returns.BC_VARG
with unused vararg values.^
operator and math.pow()
function inconsistencies.next()
and pairs()
.BC_TSETM
.fio.open()
was changed for newly
created files to 0666 (before umask) (gh-7981).WITH RECURSIVE
clause
(ghs-119)._vinyl_deferred_delete
system space (gh-5279)._stream
and
_stream_space_cache
and indexes named _space
using the net.box
stream
objects (gh-8598).cord_slab_cache
symbol was removed from the public
API export (gh-7124).console.socket
and log.file
(gh-8862).process.work_dir
directory (gh-8862).process.work_dir
when creating
necessary directories (gh-8862).Date: 2023-08-23 Tag: 3.0.0-alpha2
3.0.0-alpha2 is the alpha version of the 3.0 release series.
This release introduces 74 new features and resolves 87 bugs since the 2.11.0 version. There can be bugs in less common areas. If you find any, feel free to report an issue on GitHub.
Notable changes are:
Tarantool 3.x is backward compatible with Tarantool 1.10.x in the 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 2.x series.
box.schema.upgrade()
before you can execute any DDL
operations (gh-7149)._schema.max_id
field in the box.space._schema
function is now deprecated.
Now the _space:max()
function is used instead of _schema.max_id
(gh-5997).box.malloc.info()
for reporting memory usage of
Tarantool internal data structures allocated with malloc()
. The function
is available only on Linux (gh-7311).index_object.parts
contains the following methods, similar to the
key_def
Lua module: extract_key()
, compare()
, compare_with_key()
,
merge()
(gh-7356).box.watch_once()
function to get the value currently
associated with a notification key on the local instance without subscribing
to future changes (gh-6493).IPROTO_WATCH_ONCE
request to get the value currently
associated with a notification key on a remote instance without subscribing
to future changes (gh-6493).conn:watch_once()
net.box connection method to get the value
currently associated with a notification key on a remote instance without
subscribing to future changes. The new method is implemented using the
IPROTO_WATCH_ONCE
request type (gh-6493).box.stat.memtx()
(gh-8501).Added a new bootstrap_leader
configuration option to specify the node from
which a replica should bootstrap. To do this, set box.cfg.bootstrap_strategy
to 'config'
and set bootstrap_leader
value to either the URI or UUID of
the desired bootstrap leader. For example:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'localhost:3301',
replication = {
'localhost:3301',
'localhost:3302',
},
listen = '3302',
}
(gh-7999).
You may now control which node new replicas choose as a bootstrap leader
without touching node config. To do so, set box.cfg.bootstrap_strategy
to
'supervised'
, and the nodes will only bootstrap off the node on which you
called box.ctl.make_bootstrap_leader()
last.
This works on an empty replica set bootstrap as well: start the admin console
before configuring the nodes. Then configure the nodes:
box.cfg{
bootstrap_strategy = 'supervised',
replication = ...,
listen = ...,
}
Finally, call box.ctl.make_bootstrap_leader()
through the admin console
on the node you want to promote. All the nodes will bootstrap off that node
(gh-8509).
A new option box.cfg.cluster_name
allows assigning a human-readable name to
the entire cluster. It has to match in all instances and is displayed in
box.info.cluster.name
(gh-5029).
A new option box.cfg.replicaset_name
allows assigning a human-readable name
to the replicaset. It works the same as box.cfg.replicaset_uuid
. Its value
must be the same across all instances of one replicaset. The replicaset name
is displayed in box.info.replicaset.name
(gh-5029).
A new option box.cfg.instance_name
allows assigning a human-readable name to
the instance. It works the same as box.cfg.instance_uuid
. Its value must be
unique in the replicaset. The instance name is displayed in box.info.name
.
Names of other replicas in the same replicaset are visible in
box.info.replication[id].name
(gh-5029).
Instance at rebootstrap can change its UUID while keeping its numeric ID if it has the same non-empty instance name (gh-5029).
Added the ability to set the bootstrap_leader
configuration option to the
instance name of the desired bootstrap leader:
box.cfg{
bootstrap_strategy = 'config',
bootstrap_leader = 'leader-name',
replication = {
...
},
...
}
(gh-7999, gh-8539).
Implemented correct recovery of mixed transactions. To do this, set
box.cfg.force_recovery
to true
. If you need to revert to the old
behavior, don't set the force_recovery
option (gh-7932).
tarantool/metrics
module for metrics aggregation and export (gh-7725).box.cfg()
function (gh-7725).varbinary
type to Lua. An object of
this type is similar to a plain string but encoded in MsgPack as MP_BIN
so
it can be used for storing binary blobs in the database. This also works the
other way round: data fields stored as MP_BIN
are now decoded in Lua as
varbinary objects, not as plain strings, as they used to be. Since the latter
may cause compatibility issues, the new compat option binary_data_decoding
was introduced to revert the built-in decoder to the old behavior (gh-1629).:is_new()
and :is_old()
helpers to tarantool.compat
options to simplify effective value checks (gh-8807).net.box
module function from_fd
for creating a new
connection from a socket file descriptor number (gh-8984).inherit_fds
for popen.new
. The option takes
an array of file descriptor numbers that should be left open in the child
process (gh-8926).socket.socketpair
, socket.from_fd
, and
socket:detach
(gh-8927).SHOW CREATE TABLE
statement (gh-8098).IPROTO_CALL16
from net.box
(i.e., the call_16
option and the call_16
method for net.box
connections) (gh-8636).box.info
parameter hostname
(gh-8605).box.cfg.memtx_sort_threads
parameter that specifies the number of
threads used to sort indexes keys on loading a memtx database. OpenMP is
not used to sort keys anymore (gh-3389).fselect
index method from a table of strings to
a multi-line string and dropped the print
and use_nbsp
options. With the
yaml_pretty_multiline
compat option enabled by default, multi-line strings
now look good in the console, so there's no need to return a table of strings
to prettify the fselect
output anymore.box.tuple.format
that enables format definition for tuples
created via box.tuple.new
(standalone tuples) (gh-4693).box.tuple.new
(this
was needed for gh-4693). It is possible to switch to the old behavior using
the compatibility option box_tuple_new_vararg
.index.select
and index.pairs
with the after
option by up to 30%
in a synthetic test by eliminating an extra buffer allocation.box.session.push
is now deprecated. Consider using
box.broadcast
instead (gh-8802).box.session.new
for creating a new IPROTO
session from a socket file descriptor number (gh-8801).lua_eval
and lua_call
object types for
box.schema.user.grant
. Granting the 'execute'
privilege on lua_eval
allows the user to execute an arbitrary Lua expression with the
IPROTO_EVAL
request. Granting the 'execute'
privilege on lua_call
allows the user to execute any global user-defined Lua function with
the IPROTO_CALL
request (gh-8803).sql
object type for
box.schema.user.grant
. Now only users with the 'execute'
privilege
granted on sql
or universe
can execute SQL expressions with the
IPROTO_EXECUTE
or IPROTO_PREPARE
requests. To revert to the old behavior
(no SQL access checks), use the sql_priv
compat option (gh-8803).-i
flag. To pass a Lua script contents via
stdin
, use dash (-
) as the script name. For more information see a help
message by running tarantool -h
(gh-8613).--name
and --config
(gh-8613).The following compatibility options' defaults were switched to new behavior:
yaml_pretty_multiline
sql_seq_scan_default
json_escape_forward_slash
fiber_channel_close_mode
fiber_slice_default
box_cfg_replication_sync_timeout
More information on the new behavior can be found on the Module compat page.
memtx.sort_threads
option is now supported (gh-8861).bootstrap_leader
option is now supported (gh-8861).box.cfg{}
options are now supported by
config (gh-8861).TT_*_DEFAULT
variables. It is useful to declare defaults (gh-8862).config:get()
method (gh-8862).box.cfg{}
are now supported
in the YAML config (gh-8861).--help-env-list
CLI option (gh-8862).config.credentials
schema,
including a password setting, updating and removal for the chap-sha1
auth type (supported by both Tarantool Community Edition and Tarantool
Enterprise Edition) and the pap-sha256
(just for Enterprise Edition
where it is available) (gh-8967).box.cfg.cluster_name
(gh-8862).var/run/<...>
,
var/log/<...>
, var/lib/<...>
and so on (gh-8862).\set continuation
command.zstd
version was updated to pre-1.5.5 (gh-8391).tt
weak dependency. The tt
command line utility combines
tarantoolctl
and cartridge-cli
functionality into one tool.
The change is a part of pushing tt
to the public (tarantool/tt#286).deb
and rpm
packages.deb
and rpm
Tarantool packages.FIBER_STACK_SIZE
to set the default fiber stack size.net.box
client when a remote space had
a field type that the client version did not support (gh-4632).id
is used to generate a new one (gh-8036).index:tuple_pos()
or to the after
option of index:select
.
Now, Tarantool validates only the key parts of the index being used and all
primary indexes (gh-8511).net.box
(ghs-121).IPROTO_EVENT
packet now has the same sync number as the last
corresponding IPROTO_WATCH
request (gh-8393).box.space._schema['cluster']
is renamed to
'replicaset_uuid'
. That is not expected to be breaking because _schema
is
an internal system space, but the key was visible in public and documented
(gh-5029).box.info.cluster
is renamed to
box.info.replicaset
. The behavior can be reverted using the compat
option
box_info_cluster_meaning
(https://tarantool.io/compat/box_info_cluster_meaning) (gh-5029).unique
constraint of a functional index that has a nullable part (gh-8587).00000000000000000000.xlog
file regardless of
the actual vclock when interrupted during the initial box.cfg()
call
(gh-8704).ER_CURSOR_NO_TRANSACTION
failure for transactions
on synchronous spaces when the on_commit/on_rollback
triggers are set
(gh-8505).box.on_commit
and box.on_rollback
trigger callbacks when transaction
is synchronous (gh-8742).\x80
or \u200B
(gh-8756).stream_id
field
of xlog headers (gh-8783).0x80
and 0xff
would
be erroneously converted to two-byte UTF-8 code points, for example, \x80
would be decoded as \uC280
(gh-8782).clang
version 15 and above with enabled AddressSanitizer
(tarantool/tarantool-qa#321).hint
option
to true
for TREE indexes (gh-8937).index_object.parts.exclude_null
always contains false
rather than
null
when it is actually false
(gh-8649).memtx_memory
parameter to specify a memory size
less than required for the stable operation of the engine (gh-7389).box.info.replication[...].upstream
being stuck in the "connecting"
state for several minutes after a replica DNS record change (gh-7294)._schema
space.box.cfg{replication_anon = false}
.box.ctl.promote()
on
a cluster with nodes configured with election_mode = "candidate"
(gh-8497).election_mode = 'candidate'
spuriously detecting
a split-vote when another candidate should win with exactly a quorum of votes
for it (gh-8698).box.cfg.bootstrap_strategy = 'auto'
when some of the bootstrapping nodes were stopped (gh-8757).Backported patches from the vanilla LuaJIT trunk (gh-8069). The following issues were fixed as part of this activity:
Fixed successful math.min/math.max
call with no args (gh-6163).
Fixed inconsistencies in math.min/math.max
calls with a NaN arg (gh-6163).
Fixed pcall()
call without arguments on arm64.
Fixed assembling of IR_{AHUV}LOAD specialized to boolean for aarch64.
Fixed constant rematerialization on arm64.
Fixed emit_rma()
for the x64/GC64 mode for non-mov
instructions.
Limited Lua C library path with the default PATH_MAX
value of 4096 bytes.
The JIT engine was disabled by default on macOS platforms to improve
the user experience. If necessary, you can enable it with jit.on
(gh-8252).
Backported patches from the vanilla LuaJIT trunk (gh-8516). The following issues
were fixed as part of this activity:
Fixed IR_LREF
assembling for the GC64 mode on x86_64.
Fixed canonicalization of +-0.0 keys for IR_NEWREF
.
Fixed result truncation for bit.rol
on x86_64 platforms.
Fixed saved bytecode encapsulated in ELF objects.
Fixed lua_yield()
invocation inside C hooks.
Fixed memory chunk allocation beyond the memory limit.
Fixed TNEW load forwarding with instable types.
Fixed use-def analysis for BC_VARG
, BC_FUNCV
.
Backported patches from the vanilla LuaJIT trunk (gh-8825). The following issues
were fixed as part of this activity:
Fixed BC_UCLO
insertion for returns.
Fixed recording of BC_VARG
with unused vararg values.
Initialization instructions on trace are now emitted only for the first member of a union.
box.stat.memtx
function is now callable, it returns
all memtx statistics. The box.stat.memtx.tx()
function
is now equivalent to the box.stat.memtx().tx
function (gh-8448).AUTH_TYPE
key to box.iproto.key
(gh-8574).IPROTO_
prefix from the POSITION
, AFTER_POSITION
,
and AFTER_TUPLE
keys exported to box.iproto.key
(gh-8577).fio.open()
was changed for newly
created files to 0666 (before umask) (gh-7981).Transfer-Encoding: chunked
setting being enabled even if
the Content-Length
header exists for stream requests (gh-8744).net.box
(gh-8889).ANY
field type now supports collation in SQL (gh-8070).ARRAY
, MAP
, and INTERVAL
values cannot be used as
arguments in the ORDER BY
clause (gh-6668).INT64_MAX
or
less than 0
to a decimal number during SQL arithmetic operations (gh-8460).WITH RECURSIVE
clause
(ghs-119).INSERT INTO ... SELECT FROM
(gh-8661).printf()
failure due
to too large size (ghs-122).box.cfg.force_recovery
doesn't work when there are
no user spaces in a snapshot (gh-7974).msgpackffi
.
It could lead to wrong select results with large number keys (gh-6119).takes_raw_args
option is now handled correctly
during downgrading (gh-8457)._vinyl_deferred_delete
system space (gh-5279).after
position option of the :select
and :pairs
methods of space and
index objects (gh-8716)._stream
and
_stream_space_cache
and indexes named _space
using the net.box
stream
objects (gh-8598).cord_slab_cache
symbol was removed from the public
API export (gh-7124).language
parameter was shared between connected
clients (gh-8817).box.iproto.override
was called with an unconfigured box.
Now, an error is raised instead (gh-8975).console.socket
and log.file
(gh-8862).process.work_dir
directory (gh-8862).process.work_dir
when creating
necessary directories (gh-8862).console.local_print()
failing on non-string arguments, which led to
some rare errors. For example, when connecting via tarantoolctl to cartridged
tarantool with incorrect credentials, a cdata error was passed through the
local_print()
, which failed to interpret it (gh-8374).tnt_strptime
(gh-8502).datetime.set
when timestamp
is passed along with nsec
,
usec
, or msec
(gh-8583).