Tarantool Versions Save

Get your data in RAM. Get compute close to data. Enjoy the performance.

2.11.3

1 month ago

2.11.3

Date: 2024-04-17 Tag: 2.11.3

Overview

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.

Compatibility

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.

Bugs fixed

Core

  • Fixed a bug when the assertion in 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).
  • Fixed a bug when the assertion in 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).
  • The error messages are no longer stripped (gh-4975).
  • Increased the maximum number of tuples in a hash index from 2147483648 (2^31) to 4294967288 (2^32 - 8) (gh-9864).
  • Fixed a bug that resulted in a crash when both MVCC and index with the exclude_null part were used (gh-9954).
  • Now box.cfg() correctly interprets the TT_LISTEN and TT_REPLICATION environment variables with query parameters (gh-9539).
  • The exclude_null option is now supported by functional indexes (gh-9732).

Replication

  • Now transactions are not rolled back if the transaction fiber is cancelled when waiting for quorum from replicas (gh-9480).
  • Fixed a bug when replication broke with ER_PROTOCOL when transactions ended with a local space operation (gh-9491).
  • Fixed an issue when it was possible to use the box_collect_confirmed_vclock stack after return (gh-9505).

LuaJIT

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

  • 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.
  • Limited exponent range in number parsing by 2^20.
  • Fixed double-emitting of IR_NEWREF when restoring sunk values for side trace (gh-7937).
  • Fixed the IR_HREFK optimization for huge tables.
  • Fixed recording of the __concat metamethod.
  • Fixed the embedded bytecode loader.
  • Improved error reporting on stack overflow.
  • Fixed assertion on the Lua stack overflow for a stitched trace.
  • Fixed snapshoting of functions for non-base frames.
  • Fixed a crash in the allocator during sysprof profiling (gh-8140).
  • No side traces are recorded now after disabling the JIT via jit.off().
  • Fixed handling of instable boolean types in TDUP load forwarding.
  • Fixed a crash during the restoration of the sunk TNEW with a huge array part.
  • Fixed stack-buffer-overflow for string.format() with %g modifier and length modifier.
  • Fixed recording of setmetatable() with nil as the second argument.
  • Fixed recording of select() in case with negative first argument.
  • Fixed use-def analysis for child upvalues.
  • Added the cc file type for saving bytecode.
  • Fixed C file generation in jit.bcsave.
  • Fixed trace error handling during trace stitching.
  • Fixed recording of the __concat metamethod for vararg or protected frames.
  • Fixed recording of a side trace returning to a lower frame with a maximum possible frame size.
  • Fixed debug.setmetatable() and lua_setmetatable() with enabled jit.dump().
  • Fixed recording of side traces with a down-recursion.

Lua

  • Fixed a memory leak in error_object:set_prev() (gh-9694).
  • Fixed alias detection in the YAML encoder (gh-8350, gh-8310, gh-8321).
  • Fixed a regression that caused the wait_connected = false option of net_box.connect to yield, despite being required to be fully asynchronous (gh-9489).
  • Fixed a bug in net.box when a connection with asynchronous requests could get garbage collected (gh-9629).
  • Fixed an inconsistency between the documented on_disconnect trigger behavior of net.box connections when an error is thrown and the actual behavior (gh-9717).
  • Fixed a bug in the on_disconnect trigger of net.box connections that caused Tarantool server to hang indefinitely when an error was thrown from the trigger (gh-9797).
  • The 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).
  • Fixed a bug when a net.box connection remained active after being closed from the connection's on_connect trigger (gh-9827).

HTTP client

  • Fixed a crash on garbage collection of httpc objects (gh-9283).
  • Fixed a crash due to a race in GC finalizers (gh-9346).
  • Fixed behaviour of GC-finalizer of HTTP client Lua object when chunked HTTP request is alive. (gh-9453).

SQL

  • Fixed a memory leak when an error occurred in SELECT with a GROUP BY expression (gh-8535, ghs-125).
  • Fixed a crash when a decimal literal representing a decimal number greater than or equal to 10^38 was parsed in SQL (gh-9469).

Datetime

  • Fixed a bug in strptime when the assertion was triggered (gh-8525).

Build

  • Updated libcurl to version 8.5.0.

Testing

  • Bumped metrics submodule to commit 3370f85 to fix compatibility with luatest commit d985997.

Tools

  • Added the --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).

3.0.2

1 month ago

3.0.2

Date: 2024-04-16 Tag: 3.0.2

Overview

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.

Compatibility

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.

Bugs fixed

Core

  • Fixed a bug when Tarantool could hang due to box.watch (gh-9632).
  • Fixed a crash on dropping a just accepted connection (gh-9717).
  • The error messages are no longer stripped (gh-4975).
  • Increased the maximum number of tuples in a hash index from 2147483648 (2^31) to 4294967288 (2^32 - 8) (gh-9864).
  • Now all triggers either have a direct impact on the execution flow (for example, closing a connection or throwing an error) or print a message to the error log when they throw an error (gh-9309).
  • The exclude_null option is now supported by functional indexes (gh-9732).
  • Fixed a memory leak when dropping fully-temporary spaces (gh-9296).
  • Fixed a bug that resulted in a crash when both MVCC and index with the exclude_null part were used (gh-9954).

Replication

  • Fixed a bug when replication broke with ER_PROTOCOL when transactions ended with a local space operation (gh-9491).
  • Fixed an issue when it was possible to use the box_collect_confirmed_vclock stack after return (gh-9505).

Raft

  • Now the leader resigns on the first encounter with the ER_WAL_IO write error (gh-9399).

LuaJIT

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

  • Limited exponent range in number parsing by 2^20.
  • Fixed build with internal unwinding.
  • Fixed double-emitting of IR_NEWREF when restoring sunk values for side trace (gh-7937).
  • Fixed the IR_HREFK optimization for huge tables.
  • Fixed recording of the __concat metamethod.
  • Fixed the embedded bytecode loader.
  • Improved error reporting on stack overflow.
  • Fixed assertion on the Lua stack overflow for a stitched trace.
  • Fixed snapshoting of functions for non-base frames.
  • Fixed a crash in the allocator during sysprof profiling (gh-8140).
  • No side traces are recorded now after disabling the JIT via jit.off().
  • Fixed handling of instable boolean types in TDUP load forwarding.
  • Fixed a crash during the restoration of the sunk TNEW with a huge array part.
  • Fixed stack-buffer-overflow for string.format() with %g modifier and length modifier.
  • Fixed recording of setmetatable() with nil as the second argument.
  • Fixed recording of select() in case with negative first argument.
  • Fixed use-def analysis for child upvalues.
  • Added the cc file type for saving bytecode.
  • Fixed C file generation in jit.bcsave.
  • Fixed trace error handling during trace stitching.
  • Fixed recording of the __concat metamethod for vararg or protected frames.
  • Fixed recording of a side trace returning to a lower frame with a maximum possible frame size.
  • Fixed debug.setmetatable() and lua_setmetatable() with enabled jit.dump().
  • Fixed recording of side traces with a down-recursion.

Lua

  • Fixed a memory leak in error_object:set_prev() (gh-9694).
  • Fixed alias detection in the YAML encoder (gh-8350, gh-8310, gh-8321).
  • Fixed a regression that caused the wait_connected = false option of net_box.connect to yield, despite being required to be fully asynchronous (gh-9489).
  • Fixed a bug in net.box when a connection with asynchronous requests could get garbage collected (gh-9629).
  • Fixed an inconsistency between the documented on_disconnect trigger behavior of net.box connections when an error is thrown and the actual behavior (gh-9717).
  • Fixed a bug in the on_disconnect trigger of net.box connections that caused Tarantool server to hang indefinitely when an error was thrown from the trigger (gh-9797).
  • The 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).
  • Fixed a bug when a net.box connection remained active after being closed from the connection's on_connect trigger (gh-9827).

Config

  • Fixed a bug when only one alert of a particular type is reported in 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).
  • An alert regarding delayed privilege granting is now cleared when the privilege is granted (gh-9574).
  • Calling require('config'):get() in role code now returns the configuration that is currently applied (gh-9649).
  • The config status is now set after the post_apply phase (ghe-643).
  • A non-existent role can now be assigned in the credential section of the configuration (gh-9643).
  • Privileges that were not granted by the config module are no longer revoked by the config module (gh-9643).
  • Fixed a non-verbose error on an empty configuration file. Now Tarantool can successfully start up with an empty configuration file using data from other configuration sources (gh-9845).
  • Added additional validation to a cluster's configuration. Now it is forbidden to create an empty group or replicaset (gh-9895).
  • Added a subject URI to the error that is thrown on configuration verification (gh-9644).
  • Added a warning with the skipped (unsuitable) URI to replicaset and sharding configuration (gh-9644).

Datetime

  • Fixed a bug in strptime when the assertion was triggered (gh-8525).

Build

  • Fixed package.cpath for Debian based distros (gh-9580).

Testing

  • Bumped metrics submodule to commit 3370f85 to fix compatibility with luatest commit d985997.

Tools

  • 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).
  • Added the --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).

3.1.0

1 month ago

3.1.0

Date: 2024-04-16 Tag: 3.1.0

Overview

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.

Compatibility

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.

Functionality added or changed

Core

  • Introduced fixed-size numeric field types: uint8, int8, uint16, int16, uint32, int32, uint64, int64, float32, float64 (gh-9548).
  • Now it is possible to set IPROTO request handler callbacks by using the new Lua module 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).
  • Added a new flag tarantool.build.test_build that shows whether a build flag TEST_BUILD is set.
  • Hide redundant fields from box.error.unpack() if the box_error_unpack_type_and_code compat option is set to 'new'. The default behaviour is 'old' (gh-9101).
  • Sped up the creation of large sparse tuples by up to 3.5x in a synthetic test.
  • Error details are now available as error payload fields (gh-9108).
  • Added the name field to an error object (gh-9875).
  • Added a trigger option to box.schema.func.create. This option allows creating persistent triggers (gh-8663).

Lua

  • Now it is possible to add custom payload fields to box.error (gh-9104).
  • Added a message argument to the table constructor of box.error.new (gh-9102).
  • Added a prev argument to the table constructor of box.error.new (gh-9103).
  • Now it is possible to access a payload field of an error's cause directly from the error (gh-9106).
  • Increased the verbosity of box.errors serialization and added a new box_error_serialize_verbose option to compat to retain old behaviour (gh-9105).
  • Added autocompletion (including payload fields) to box.error (gh-9107).
  • Added the level argument to box.error and box.error.new to specify the stack frame used for setting the error location (gh-9792).
  • Added key validation and comparison functions to the key_def module (gh-9863).
  • Added a tnt_election_leader_idle metric to built-in metrics.

Http client

  • Added the http_version option to the request(), post(), get() and other request functions from the http.client module (gh-9806).

Config

  • Added new config.etcd options watchers.reconnect_timeout and watchers.reconnect_max_attempts (ghe-647).
  • Introduced the sharding.rebalancer_mode option (gh-9657).
  • Introduced the 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).
  • Introduced the labels configuration option. The labels are maps with string keys that are merged to instance level (gh-9809).
  • Added the config:instances() method and the instance option to config:get() (gh-9680).
  • Introduced the instance_uri() method for the config module (gh-9842).

Experimental

  • Introduced the experimental.connpool module and the connect() function of this module (gh-9842).
  • Introduced the filter() function in the experimental.connpool module (gh-9842).
  • Introduced the call() function in the experimental.connpool module (gh-9842).
  • Introduced the mode option for the filter() and call() functions in the experimental.connpool module (gh-9930).

Bugs fixed

Core

  • Provided old and new tuples in box.error.TUPLE_FOUND (gh-6166).
  • An attempt to execute a DDL, DML, DQL, DCL or TCL query within a transactional trigger (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.

Tools

  • 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).
  • Added the --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).

3.0.1

3 months ago

3.0.1

Date: 2024-01-25 Tag: 3.0.1

Overview

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.

Compatibility

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.

Bugs fixed

Lua

  • Fixed the incorrect propagation of Lua errors raised while loading the module via the Tarantool-specific loaders.

Config

  • Fixed an issue when a leader fails to start with the attempt to index a nil value error if a config with all UUIDs set is used during a cluster's bootstrap (gh-9572).

Httpc

  • Fixed a bug when read from a chunked request returns nothing (gh-9547).

Build

  • Updated libcurl to version 8.5.0.

3.0.0

4 months ago

3.0.0

Date: 2023-12-26 Tag: 3.0.0

Overview

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.

Compatibility

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.

Functionality added or changed

Core

  • Now index_object.parts contains the following methods, similar to the key_def Lua module: extract_key(), compare(), compare_with_key(), merge() (gh-7356).
  • Introduced the 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).
  • Introduced the new 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).
  • Introduced the 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).
  • Introduced the default field values in the space format (gh-8157).
  • Added support for functional variant of the default field values (gh-8609).
  • box.schema can now be accessed before box.cfg().
  • Introduced new methods tuple:info() and space:stat() with the detailed information on memory consumed by data (gh-6762).
  • Introduced the new built-in system event box.wal_error that is broadcast whenever Tarantool fails to commit a transaction to the write-ahead log (gh-9405).
  • Introduced transaction-related events 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).

Memtx

  • Added memtx read view statistics to box.stat.memtx() (gh-8501).

Vinyl

  • Introduced the 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).

Replication

  • 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).

LuaJIT

  • LuaJIT now can handle exceptions on traces (gh-7745).

Lua

  • [Breaking change] Added the new 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).
  • Introduced the new Lua module trigger. This module enables managing and calling triggers stored in trigger registry (gh-8656).
  • Triggers from space_object, box.session, and box.ctl were moved to the trigger registry (gh-8657).
  • Introduced a new event 'tarantool.trigger.on_change' in the trigger registry. It is called when any event in the trigger registry is modified (gh-8664).
  • Introduced helpers for encoding and decoding IPROTO packets in Lua (gh-8054).
  • Any callable object can now be registered as a trigger (gh-6484).
  • All triggers are now provided with optional names (gh-8659).
  • Introduced the login and password fields in uri.parse() (gh-9435).

Msgpack

  • Improved error reporting for 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).

Netbox

  • Introduced the new net.box module function from_fd for creating a new connection from a socket file descriptor number (gh-8984).

Popen

  • Introduced new option 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

  • Introduced new socket functions socket.socketpair, socket.from_fd, and socket:detach (gh-8927).

Xlog

  • Introduced the xlog.meta() method for reading a meta block from an xlog file.

SQL

  • [Breaking change] The DROP CONSTRAINT statement has been improved (gh-9112).
  • [Breaking change] Names in SQL are now case-sensitive. To support backward compatibility, a second lookup using a name normalized using the old rules is added (gh-4467).
  • [Breaking change] SQL now uses the BOX mechanism for default values (gh-8793).
  • Introduced the 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).
  • A literal set as the default value can no longer have a + or - sign unless the literal is numeric (gh-8793).

Box

  • [Breaking change] Dropped support for IPROTO_CALL16 from net.box (i.e., the call_16 option and the call_16 method for net.box connections) (gh-8636).
  • [Breaking change] Disabled argument list syntax of 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.
  • [Breaking change] Introduced the new 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).
  • Non-system spaces in a snapshot file are now sorted by their IDs. As before, all non-system spaces are stored after system spaces (gh-7954).
  • Added support for square brackets in procedure resolution for Lua calls (gh-8604).
  • Added support for accepting IPROTO requests with a space or index name instead of an identifier (gh-8146).
  • Added a new box.info parameter hostname (gh-8605).
  • Added the 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).
  • Changed the output of the 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.
  • Allowed multiple updates to the same tuple field in a single call (gh-8226).
  • Introduced box.tuple.format that enables format definition for tuples created via box.tuple.new (standalone tuples) (gh-4693).
  • Introduced a declarative server and cluster configuration (gh-8724, gh-8861, gh-8862, gh-8967, gh-8978, gh-9007, gh-9078, gh-9431, gh-9432, gh-9452, gh-9485, gh-9497, gh-9506).
  • Sped up index.select and index.pairs with the after option by up to 30% in a synthetic test by eliminating an extra buffer allocation.
  • The function box.session.push is now deprecated. Consider using box.broadcast instead (gh-8802).
  • Introduced the new function box.session.new for creating a new IPROTO session from a socket file descriptor number (gh-8801).
  • Introduced the new 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).
  • Added the leader_name field to box.info.election (gh-8931).
  • Now it is possible to specify the sort order for each part of an index (gh-5529).
  • Added support for sending tuple formats in IPROTO responses. Added a box_tuple_extension backward compatibility option to disable sending tuple formats in responses to IPROTO call and eval requests (gh-8146).
  • Added support for sending tuple formats in IPROTO call and eval request arguments. box_tuple_extension backward compatibility option can be used to disable receiving tuple formats in IPROTO call and eval request arguments (gh-8633).
  • Added a new 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).

CLI

  • [Behavior change] Disabled starting the Lua REPL by default when running Tarantool. Now, Tarantool yields the message that shows the command usage. To run the Lua REPL, just set the -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).
  • Introduced new command-line options --name and --config (gh-8613).
  • Added the new --force-recovery CLI option (gh-8876).

Compat

  • 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.

Console

  • Now multiline commands can be used by setting the continuation marker using the \set continuation command.

Fiber

  • Exported fiber_set_name_n, fiber_name, fiber_id, fiber_csw and fiber_find into the public C API and usable via FFI as well.
  • Make fiber_set_joinable, fiber_set_ctx and fiber_get_ctx treat the NULL argument as the current fiber.

Space

  • Introduces space type: a new space definition field.
  • Introduces the fully temporary space type. It is the same as data-temporary but also has temporary metadata. Temporary spaces can now be created in read_only mode, they disappear after server restart and don't exist on replicas (gh-8323).

Build

  • Tarantool does not depend on libgomp anymore (gh-7689).
  • Added building static deb and rpm packages.
  • Dropped building distro-specific deb and rpm Tarantool packages.
  • Dropped building Tarantool packages with GC32. Now only GC64 packages are shipped.
  • Exported all LuaJIT public functions from Tarantool binary (gh-3680).

Test

Fuzz

  • Added a grammar-based SQL fuzzer (gh-4826).

Bugs fixed

Core

  • [Breaking change] The key 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).
  • [Breaking change] The table 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).
  • Fixed decoding of escape sequences for single-byte character codes from YAML. Before the fix, single-byte character codes between 0x80 and 0xff would be erroneously converted to two-byte UTF-8 code points, for example, \x80 would be decoded as \uC280 (gh-8782).
  • Now index_object.parts.exclude_null always contains false rather than null when it is actually false (gh-8649).
  • Now the "Type Ctrl-C to exit Tarantool" message is displayed when a local console is exited, but background fibers are running (gh-7017).
  • Decremented the max space id (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).
  • The tarantool -v output and tarantool.build.flags string now include build type-specific and LTO flags if any (gh-8022).
  • Fixed a possible inconsistent state entering if fibers are joined incorrectly. Now the 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).
  • Fixed a bug when 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).
  • Fixed a bug when on_rollback triggers were not invoked during a rollback to a savepoint (gh-7810).
  • Fixed a bug when the assertion in 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).
  • Fixed a bug when the assertion in 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).

Replication

  • Fixed a bug that allowed to change a replica set UUID via the _schema space.
  • Fixed a bug when new instances could try to register via an anon instance which previously failed to apply box.cfg{replication_anon = false}.
  • Fixed a bug when box.ctl.demote() with box.cfg{election_mode = 'off'} and an owned synchro queue could simply not do anything (gh-6860).
  • Fixed anonymous replicas not receiving the synchronous transaction queue state during join (gh-9401).
  • Now transactions are not rolled back if the transaction fiber is cancelled when waiting for a quorum from replicas (gh-9480).

LuaJIT

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.

Lua

  • The default permission mode for fio.open() was changed for newly created files to 0666 (before umask) (gh-7981).

SQL

  • Fixed a Use-After-Free vulnerability in the WITH RECURSIVE clause (ghs-119).
  • A space no longer loses a default value after ALTER TABLE ADD COLUMN (gh-8793).
  • Fixed a bug when an incorrect query result could be returned if tables participated in a join and their names met certain conditions. The bug was added in version 3.0.0-beta1 in issue gh-4467 (gh-9445).
  • Fixed a memory leak when an error occurred in SELECT with a GROUP BY expression (gh-8535, ghs-125).
  • Fixed a crash when a decimal literal representing a decimal number greater than or equal to 10^38 was parsed in SQL (gh-9469).

Box

  • [Breaking change] The cord_slab_cache symbol was removed from the public API export (gh-7124).
  • All DDL functions from the box.schema module are now wrapped into a transaction to avoid database inconsistency on failed operations (gh-4348).
  • [Breaking change] 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).
  • Fixed the ability to drop _vinyl_deferred_delete system space (gh-5279).
  • Fixed a bug when it was not possible to access spaces named _stream and _stream_space_cache and indexes named _space using the net.box stream objects (gh-8598).
  • Added a check that disables setting 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).
  • Fixed a bug when local references to a space object got out of sync with the space on the space drop rollback (gh-9120).
  • Fixed a very rare bug when a function deletion could cause an inconsistent state of the database (gh-9426).
  • Now box.cfg() correctly interprets the TT_LISTEN and TT_REPLICATION environment variables with query parameters (gh-9539).

Http

  • Fixed a crash on garbage collection of httpc objects (gh-9283).
  • Fixed a crash due to a race in GC finalizers (gh-9346).
  • Fixed behavior of GC-finalizer of HTTP client Lua object when chunked HTTP request is alive. (gh-9453).

Build

  • Updated libcurl to version 8.4.0.

2.11.2

5 months ago

Date: 2023-12-07 Tag: 2.11.2

Overview

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.

Compatibility

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.

Bugs fixed

Core

  • Fixed a crash that could happen when inserting an index definition with an empty parts list directly into box.space._index (gh-8688).
  • Fixed the memory leak on unpacking an invalid MsgPack error extension (gh-8921).
  • Fixed a use-after-free bug in fiber recycling code (gh-9020).
  • Fixed a use-after-free bug in iproto server code (gh-9037).
  • Fixed a heap-buffer-overflow bug in fiber creation code (gh-9026).
  • Eliminated implicit conversion of unprintable utf-8 strings to binary blobs when encoded in YAML. Now unprintable characters are encoded as escaped utf-8 code points, for example, \x80 or \u200B (gh-8756).
  • An error is no longer raised on an attempt to print a dead fiber (gh-4265).
  • Fixed a possible out-of-bound write in debug build on unpacking a MsgPack error extension (gh-9098).
  • Fixed a bug that caused a replication error after calling box.schema.downgrade (gh-9049).
  • Fixed a possible crash when unpacking an invalid MsgPack error extension (gh-9136).
  • Fixed a wrong assertion in index comparators when comparing decimals with floats greater than 1e38. The error was present only in the debug build. Despite the failing assertion, the behavior after the assertion was correct (gh-8472).
  • Fixed a bug that could result in the incorrect space:bsize() when altering a primary index concurrently with DML operations (gh-9247).
  • Fixed a crash that happened while printing the stack trace on a stack overflow bug (gh-9222).
  • Fixed the behavior of 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).
  • Fixed a bug in the network buffer that could result in a crash when there are a lot of pending requests (gh-9218)
  • Fixed a potential data corruption when the number of tuples in a hash index is more than 2147483648 (gh-3594).
  • Fixed graceful shutdown break on init script exit (gh-9411).
  • Fixed potential use-after-free on Tarantool shutdown with lingering fiber join (gh-9406).
  • Fixed incorrect calculation of requests in progress in case of iproto override fallback (gh-9345).

Replication

  • Fixed a false-positive split-brain in a replica set on the first promotion after an upgrade from versions before 2.10.1 (gh-8996).
  • Fixed replicas writing corrupted xlogs when appending data to a local space from an 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).
  • Fixed a false-positive split-brain error when an old synchronous transaction queue owner confirmed the same transactions which were already confirmed by the new queue owner, or rolled back the same transactions which were rolled back by the new queue owner (gh-9138).

LuaJIT

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).

Lua

  • An error from a serializer function for cdata and userdata is not ignored now (gh-9396).

Http client

  • Fixed a streaming connection stuck if etcd is stopped unexpectedly (gh-9086).

SQL

  • Fixed a memory leak in a parser for a column's default rule (gh-9159).
  • Fixed assertion in a debug build when a collation was added after an index with more than one field (gh-9229).
  • Fixed a bug that in some cases would not assign collations to an index created during CREATE TABLE (gh-9229).
  • The EXISTS predicate no longer requires LIMIT 1 to work correctly if more than one row is returned in the subselect (gh-8676).

Box

  • The maximum length of box.cfg{} string parameters is now 512 to support a lengthy args, such as list of audit events (ghe-523).
  • Fixed crashes if box.info.memory(), box.info.gc(), box.info.vinyl(), and box.info.sql() are called before box.cfg{} (gh-9173).
  • Added a 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).
  • Fixed a bug that allows downgrading from a schema version more recent than a Tarantool version (gh-9182).
  • Fixed a bug when on_shutdown triggers weren't run if os.exit() was called from -e command-line option (gh-9266).

Net.box

  • It is now possible to call stored Lua functions and C module functions with require('net.box').self:call() (gh-9131).

Misc

  • Updated luarocks version to 3.9.2 to address rockspec security issues (gh-6587).

Testing

  • Added a new flag tarantool.build.asan that shows whether build flag ENABLE_ASAN is set. The flag is intended to ease tests backporting from the master branch.

Tools

Debugger

  • Introduced readline support to tarantool debugger (gh-7738).

3.0.0-beta1

5 months ago

Date: 2023-11-20 Tag: 3.0.0-beta1

Overview

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:

  • New configuration capabilities (gh-8724)
  • Fixes and improvements of the configuration process based on early adopters feedback.

Compatibility

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.

Functionality added or changed

Core

  • [Breaking change] Disabled DDL operations with an old system schema. Now you have to run box.schema.upgrade() before you can execute any DDL operations (gh-7149).
  • Now index_object.parts contains the following methods, similar to the key_def Lua module: extract_key(), compare(), compare_with_key(), merge() (gh-7356).
  • Introduced the 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).
  • Introduced the new 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).
  • Introduced the 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).
  • Introduced the default field values in the space format (gh-8157).
  • Added support for functional variant of the default field values (gh-8609).
  • box.schema can now be accessed before box.cfg().
  • Introduced new methods tuple:info() and space:stat() with the detailed information on memory consumed by data (gh-6762).

Memtx

  • Added memtx read view statistics to box.stat.memtx() (gh-8501).

Vinyl

  • Introduced the 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).

Replication

  • 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).

LuaJIT

  • LuaJIT now can handle exceptions on traces (gh-7745).

Lua

  • [Breaking change] Added the new 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).
  • Introduced the new Lua module trigger. This module enables managing and calling triggers stored in trigger registry (gh-8656).
  • Triggers from space_object, box.session, and box.ctl were moved to the trigger registry (gh-8657).
  • Introduced a new event 'tarantool.trigger.on_change' in the trigger registry. It is called when any event in the trigger registry is modified (gh-8664).
  • Introduced helpers for encoding and decoding IPROTO packets in Lua (gh-8054).

Msgpack

  • Improved error reporting for 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).

Netbox

  • Introduced the new net.box module function from_fd for creating a new connection from a socket file descriptor number (gh-8984).

Popen

  • Introduced new option 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

  • Introduced new socket functions socket.socketpair, socket.from_fd, and socket:detach (gh-8927).

Xlog

  • Introduced the xlog.meta() method for reading a meta block from an xlog file.

SQL

  • Introduced the SHOW CREATE TABLE statement (gh-8098).
  • [Breaking change] The DROP CONSTRAINT statement has been improved (gh-9112).
  • [Breaking change] Names in SQL are now case sensitive. To support backward compatibility, a second lookup using a name normalized using the old rules is added (gh-4467).
  • SHOW CREATE TABLE no longer supports the DEFAULT clause (gh-8793).
  • SQL_EXPR functions can now be set as a default value (gh-8793).
  • A literal set as the default value can no longer have a + or - sign unless the literal is numeric (gh-8793).
  • [Breaking change] SQL now uses the box mechanism for default values (gh-8793).

App

  • Added the new --force-recovery CLI option (gh-8876).

Box

  • Non-system spaces in a snapshot file are now sorted by their IDs. As before, all non-system spaces are stored after system spaces (gh-7954).
  • [Breaking change] Dropped support for IPROTO_CALL16 from net.box (i.e., the call_16 option and the call_16 method for net.box connections) (gh-8636).
  • Added support for square brackets in procedure resolution for Lua calls (gh-8604).
  • Added support for accepting IPROTO requests with a space or index name instead of an identifier (gh-8146).
  • Added a new box.info parameter hostname (gh-8605).
  • Added the 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).
  • Changed the output of the 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.
  • Allowed multiple updates to the same tuple field in a single call (gh-8226).
  • Introduced box.tuple.format that enables format definition for tuples created via box.tuple.new (standalone tuples) (gh-4693).
  • [Breaking change] Disabled argument list syntax of 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.
  • Sped up index.select and index.pairs with the after option by up to 30% in a synthetic test by eliminating an extra buffer allocation.
  • The function box.session.push is now deprecated. Consider using box.broadcast instead (gh-8802).
  • Introduced the new function box.session.new for creating a new IPROTO session from a socket file descriptor number (gh-8801).
  • Introduced the new 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).
  • [Breaking change] Introduced the new 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).
  • The maximum length of box.cfg{} string parameters is now 512 instead of 256.
  • Added a new flag tarantool.build.asan that shows whether build flag ENABLE_ASAN is set.
  • Added the leader_name field to box.info.election (gh-8931).
  • Now it is possible to specify the sort order for each part of an index (gh-5529).
  • Added support for sending tuple formats in IPROTO responses. Added a box_tuple_extension backward compatibility option to disable sending tuple formats in responses to IPROTO_CALL and IPROTO_EVAL requests (gh-8146).
  • Added support for sending tuple formats in IPROTO_CALL and IPROTO_EVAL request arguments. box_tuple_extension backward compatibility option can be used to disable receiving tuple formats in IPROTO_CALL and IPROTO_EVAL request arguments (gh-8633).

CLI

  • [Behavior change] Disabled starting the Lua REPL by default when running Tarantool. Now, Tarantool yields the message that shows the command usage. To run the Lua REPL, just set the -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).
  • Introduced new command-line options --name and --config (gh-8613).

Compat

  • 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.

Config

  • Initial version of the declarative server and cluster configuration (gh-8724).
  • All vinyl options are now supported (gh-8861).
  • All feedback options are now supported (gh-8861).
  • The memtx.sort_threads option is now supported (gh-8861).
  • The bootstrap_leader option is now supported (gh-8861).
  • All flight recorder options are now supported (gh-8861).
  • All security hardening box.cfg{} options are now supported by config (gh-8861).
  • Added a low priority environment configuration source, which looks into TT_*_DEFAULT variables. It is useful to declare defaults (gh-8862).
  • It is now possible to access configuration from the application script using the config:get() method (gh-8862).
  • All metrics configuration options from box.cfg{} are now supported in the YAML config (gh-8861).
  • Added --help-env-list CLI option (gh-8862).
  • Introduced a non-public API for extending the declarative config functionality in Tarantool Community Edition (gh-8862).
  • Improved the credentials applier: now it supports two-way synchronization of roles and privileges for both users and roles (gh-8861).
  • Removed the sha1 and sha256 hash entries from the config credentials schema as not planned for development (gh-8967).
  • Implemented a full password support in the 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).
  • A group name from a topology defined by the cluster configuration doesn't persisted anymore as box.cfg.cluster_name (gh-8862).
  • The default directory and file paths are changed to var/run/<...>, var/log/<...>, var/lib/<...> and so on (gh-8862).
  • The directory that contains the configuration file is now added into the Lua modules search paths (gh-8862).
  • Most of vshard options are now added in the config (gh-9007).
  • Added initial support of vshard (gh-9007).
  • All audit options are now supported (gh-8861).
  • Non-default privileges are now revoked from default users and roles when they are removed from the config (gh-8967).
  • Introduced the initial support for roles - programs that run when a configuration is loaded or reloaded (gh-9078).
  • On read-only instances, Tarantool now synchronizes credentials in the background when switching to read-write mode instead of skipping the synchronization (gh-8967).
  • Now the permissions for space, function, and sequence can be granted via the config. If the object has not been created yet, the grant is postponed and executed after the creation of the object (gh-8967).
  • Now the brand-new lua_eval, lua_call, and sql object types are supported by credentials (gh-8967).
  • Now a password hash (and salt) will be regenerated for users managed in the configuration file if security.auth_type differs from a user's auth_type (gh-8967).
  • Introduced validation for replicaset_name/uuid and instance_name/uuid mismatches before the recovery process when Tarantool is configured via a YAML file or etcd.
  • If Tarantool is configured via a YAML file or etcd, then instance and replica set names are automatically set when possible (gh-8978).
  • Added support for the {{ replicaset_name }} and {{ group_name }} templates in addition to the existing {{ instance_name }} (gh-8862).

Console

  • Now multiline commands can be used by setting continuation marker using the \set continuation command.

Debugger

  • Introduced readline support to tarantool debugger (gh-7738).

Fiber

  • Exported fiber_set_name_n, fiber_name, fiber_id, fiber_csw and fiber_find into the public C API and usable via FFI as well.
  • Make fiber_set_joinable, fiber_set_ctx and fiber_get_ctx treat the NULL argument as the current fiber.

Space

  • Introduced space type: a new space definition field.
  • Introduced the fully temporary space type. It is the same as data-temporary but also has temporary metadata. Temporary spaces can now be created in read-only mode, they disappear after server restart and don't exist on replicas (gh-8323).

Test

Fuzz

  • Added a grammar-based SQL fuzzer (gh-4826).

Build

  • Tarantool does not depend on libgomp anymore (gh-7689).
  • Added building static deb and rpm packages.
  • Dropped building distro-specific deb and rpm Tarantool packages.
  • Dropped building Tarantool packages with GC32. Now only GC64 packages are shipped.
  • Exported all LuaJIT public functions from Tarantool binary (gh-3680).
  • Updated libcurl to version 8.3.0.

Misc

  • Updated luarocks version to 3.9.2 (gh-6597).

Bugs fixed

Core

  • [Breaking change] The key 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).
  • [Breaking change] The table 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).
  • Eliminated implicit conversion of unprintable utf-8 strings to binary blobs when encoded in YAML. Now unprintable characters are encoded as escaped utf-8 code points, for example, \x80 or \u200B (gh-8756).
  • Fixed decoding of escape sequences for single-byte character codes from YAML. Before the fix, single-byte character codes between 0x80 and 0xff would be erroneously converted to two-byte UTF-8 code points, for example, \x80 would be decoded as \uC280 (gh-8782).
  • Now index_object.parts.exclude_null always contains false rather than null when it is actually false (gh-8649).
  • Fixed a crash that could happen when inserting an index definition with an empty parts list directly into box.space._index (gh-8688).
  • Fixed the memory leak on unpacking an invalid MsgPack error extension (gh-8921).
  • Fixed a use-after-free bug in fiber recycling code (gh-9020).
  • Fixed a use-after-free bug in iproto server code (gh-9037).
  • Fixed a heap-buffer-overflow bug in fiber creation code (gh-9026).
  • An error is no longer raised on an attempt to print a dead fiber (gh-4265).
  • Fixed a possible out-of-bound write in debug build on unpacking a MsgPack error extension (gh-9098).
  • Fixed a bug that caused a replication error after calling box.schema.downgrade (gh-9049).
  • Fixed a possible crash when unpacking an invalid MsgPack error extension (gh-9136).
  • Fixed a wrong assertion in index comparators when comparing decimals with floats greater than 1e38. The error was present only in the debug build. Despite the failing assertion, the behavior after the assertion was correct (gh-8472).
  • Now the "Type Ctrl-C to exit Tarantool" message is displayed when a local console is exited, but background fibers are running (gh-7017).
  • Fixed a bug that could result in the incorrect space:bsize() when altering a primary index concurrently with DML operations (gh-9247).
  • Fixed a crash that happened while printing the stack trace on a stack overflow bug (gh-9222).
  • Fixed the behavior of 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).
  • Fixed a bug in the network buffer that could result in a crash when there are a lot of pending requests (gh-9218)
  • Fixed a potential data corruption when the number of tuples in a hash index is more than 2147483648 (gh-3594).
  • Decremented the max space id (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).
  • The tarantool -v output and tarantool.build.flags string now include build type-specific and LTO flags if any (gh-8022).
  • Fixed a possible inconsistent state entering if fibers are joined incorrectly. Now the 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).

Replication

  • Fixed a bug that allowed to change replicaset UUID via _schema space.
  • Fixed a bug when new instances could try to register via an anon instance which previously failed to apply box.cfg{replication_anon = false}.
  • Fixed a bug when box.ctl.demote() with box.cfg{election_mode = 'off'} and an owned synchro queue could simply not do anything (gh-6860).
  • Fixed a false-positive split-brain in a replica set on the first promotion after an upgrade from versions before 2.10.1 (gh-8996).
  • Fixed replicas writing corrupted xlogs when appending data to a local space from an 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).

LuaJIT

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.

Lua

Fio

  • The default permission mode for fio.open() was changed for newly created files to 0666 (before umask) (gh-7981).

SQL

  • Fixed a Use-After-Free vulnerability in the WITH RECURSIVE clause (ghs-119).
  • Fixed a memory leak in a parser for a column's default rule (gh-9159).
  • Fixed assertion in a debug build when a collation was added after an index with more than one field (gh-9229).
  • Fixed a bug that in some cases would not assign collations to an index created during CREATE TABLE (gh-9229).
  • A space no longer loses a default value after ALTER TABLE ADD COLUMN (gh-8793).

Box

  • Fixed the ability to drop _vinyl_deferred_delete system space (gh-5279).
  • Fixed a bug when it was not possible to access spaces named _stream and _stream_space_cache and indexes named _space using the net.box stream objects (gh-8598).
  • [Breaking change] The cord_slab_cache symbol was removed from the public API export (gh-7124).
  • All DDL functions from the box.schema module are now wrapped into a transaction to avoid database inconsistency on failed operations (gh-4348).
  • Fixed crashes if box.info.memory(), box.info.gc(), box.info.vinyl(), and box.info.sql() are called before box.cfg{} (gh-9173).
  • [Breaking change] Added a 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).
  • Fixed a bug that allows downgrading from a schema version more recent than a Tarantool version (gh-9182).
  • Fixed a bug when on_shutdown triggers weren't run if os.exit() was called from -e command-line option (gh-9266).
  • [Breaking change] 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).
  • Added a check that disables setting 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).

Config

  • Fixed an error message if the cluster configuration was not provided or the instance was not found in the cluster configuration during reload (gh-8862).
  • Support parent directories creation for options that accept a directory or a file (gh-8862).
  • Create parent directories for console.socket and log.file (gh-8862).
  • Create the process.work_dir directory (gh-8862).
  • Consider all the paths as relative to process.work_dir when creating necessary directories (gh-8862).
  • Added the validation of instance, replica set, and group names in the configuration, --name CLI option, and TT_INSTANCE_NAME environment variable (gh-8862).

Http

  • Fixed a streaming connection stuck if etcd is stopped unexpectedly (gh-9086).

2.10.8

8 months ago

Date: 2023-09-14 Tag: 2.10.8

Overview

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.

Compatibility

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.

Functionality added or changed

Box

  • The maximum length of box.cfg{} string parameters is now 512 instead of 256.

Test

Fuzz

  • LuaJIT now can be fuzzed using grammar-based fuzzer (gh-4823).

Build

  • Hardening against memory corruption attacks is now enabled by default on FreeBSD (gh-7536).
  • Added the CMake option FIBER_STACK_SIZE to set the default fiber stack size.
  • Updated libcurl to version 8.3.0.

Bugs fixed

Core

  • Fixed a bug when Tarantool failed to decode a request containing an unknown IPROTO key. The bug resulted in broken connectivity between Tarantool 2.10 and 2.11 (gh-8745).
  • Fixed a bug causing the ER_CURSOR_NO_TRANSACTION failure for transactions on synchronous spaces when the on_commit/on_rollback triggers are set (gh-8505).
  • Fixed a bug causing the effective session and user are not propagated to box.on_commit and box.on_rollback trigger callbacks when transaction is synchronous (gh-8742).
  • Fixed a crash that could happen when Tarantool is started in the background mode (gh-6128).
  • Fixed a bug when MVCC sometimes lost gap record (gh-8326).
  • Fixed a bug when MVCC rollback of prepared statement could break internal invariants (gh-8648).
  • Now MVCC engine automatically aborts a transaction if it reads changes of a prepared transaction and this transaction is aborted (gh-8654).
  • Fixed a bug that caused writing incorrect values into the stream_id field of xlog headers (gh-8783).
  • Fixed a bug when a space that is referenced by a foreign key could not be truncated even if the referring space was empty (gh-8946).
  • Fixed a crash that could happen when Tarantool is compiled by clang version 15 and above with enabled AddressSanitizer (tarantool/tarantool-qa#321).
  • Fixed a use-after-free bug in iproto server code (gh-9037).
  • Fixed a heap-buffer-overflow bug in fiber creation code (gh-9026).

Memtx

  • Fixed a heap-use-after-free bug in the transaction manager, which could occur when performing a DDL operation concurrently with a transaction on the same space (gh-8781).

Vinyl

  • Fixed a heap-use-after-free bug in the Vinyl read iterator caused by a race between a disk read and a memory dump task. The bug could lead to a crash or an invalid query result (gh-8852).

Replication

  • Fixed a possible failure to promote the desired node by box.ctl.promote() on a cluster with nodes configured with election_mode = "candidate" (gh-8497).
  • Fixed nodes configured with election_mode = 'candidate' spuriously detecting a split-vote when another candidate should win with exactly a quorum of votes for it (gh-8698).

LuaJIT

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.

Lua

  • Fixed the xlog reader Lua module to show unknown row header fields. Before this change the xlog reader silently skipped them.

Netbox

  • Fixed a heap-use-after-free bug in the function creating a tuple format Lua object for net.box (gh-8889).

Box

  • Fixed the memory leaks caused by the multi-statement transaction errors in the space index building and the space format checking operations (gh-8773).
  • Fixed a bug in the box console implementation because of which the language parameter was shared between connected clients (gh-8817).
  • Fixed an invalid memory access in a corner case of a specialized comparison function (gh-8899).

Console

  • Fixed console ignoring -i flag in case stdin is not a tty (gh-5064).

Datetime

  • Fixed a bug raising a false positive error when creating new intervals with range boundary values (gh-8878).
  • Fixed a bug with buffer overflow in tnt_strptime (gh-8502).

Http

  • Fixed a streaming connection stuck if etcd is stopped unexpectedly (gh-9086).

Msgpack

  • Fixed decoding datetime intervals with fields larger than possible int32 values (gh-8887).

3.0.0-alpha3

8 months ago

Date: 2023-09-12 Tag: 3.0.0-alpha3

Overview

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:

  • Added initial support of configuring vshard's storage and router roles in the declarative configuration (gh-9007).
  • Fixes and improvements of the configuration process based on early adopters feedback.
  • New config sections: metrics, feedback, vinyl, flightrec (EE), security (EE) (gh-8861).
  • Added initial support of roles in the declarative configuration.

Compatibility

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.

Functionality added or changed

Core

  • [Breaking change] Disabled DDL operations with an old system schema. Now you have to run box.schema.upgrade() before you can execute any DDL operations (gh-7149).
  • Now index_object.parts contains the following methods, similar to the key_def Lua module: extract_key(), compare(), compare_with_key(), merge() (gh-7356).
  • Introduced the 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).
  • Introduced the new 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).
  • Introduced the 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).
  • Introduced the default field values in the space format (gh-8157).
  • Added support for functional variant of the default field values (gh-8609).

Memtx

  • Added memtx read view statistics to box.stat.memtx() (gh-8501).

Vinyl

  • Introduced the 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).

Replication

  • 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).

LuaJIT

  • LuaJIT now can handle exceptions on traces (gh-7745).

Lua

  • [Breaking change] Added the new 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).
  • Introduced the new Lua module trigger. This module enables managing and calling triggers stored in trigger registry (gh-8656).

Netbox

  • Introduced the new net.box module function from_fd for creating a new connection from a socket file descriptor number (gh-8984).

Popen

  • Introduced new option 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

  • Introduced new socket functions socket.socketpair, socket.from_fd, and socket:detach (gh-8927).

SQL

  • Introduced the SHOW CREATE TABLE statement (gh-8098).

Box

  • Non-system spaces in a snapshot file are now sorted by their IDs. As before, all non-system spaces are stored after system spaces (gh-7954).
  • [Breaking change] Dropped support for IPROTO_CALL16 from net.box (i.e., the call_16 option and the call_16 method for net.box connections) (gh-8636).
  • Added support for square brackets in procedure resolution for Lua calls (gh-8604).
  • Added support for accepting IPROTO requests with a space or index name instead of an identifier (gh-8146).
  • Added a new box.info parameter hostname (gh-8605).
  • Added the 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).
  • Changed the output of the 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.
  • Allowed multiple updates to the same tuple field in a single call (gh-8226).
  • Introduced box.tuple.format that enables format definition for tuples created via box.tuple.new (standalone tuples) (gh-4693).
  • [Breaking change] Disabled argument list syntax of 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.
  • Sped up index.select and index.pairs with the after option by up to 30% in a synthetic test by eliminating an extra buffer allocation.
  • The function box.session.push is now deprecated. Consider using box.broadcast instead (gh-8802).
  • Introduced the new function box.session.new for creating a new IPROTO session from a socket file descriptor number (gh-8801).
  • Introduced the new 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).
  • [Breaking change] Introduced the new 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).
  • The maximum length of box.cfg{} string parameters is now 512 instead of 256.
  • Added a new flag tarantool.build.asan that shows whether build flag ENABLE_ASAN is set.
  • Added the leader_name field to box.info.election (gh-8931).

Cli

  • [Behavior change] Disabled starting the Lua REPL by default when running Tarantool. Now, Tarantool yields the message that shows the command usage. To run the Lua REPL, just set the -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).
  • Introduced new command-line options --name and --config (gh-8613).

Compat

  • 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.

Config

  • Initial version of the declarative server and cluster configuration (gh-8724).
  • All vinyl options are now supported (gh-8861).
  • All feedback options are now supported (gh-8861).
  • The memtx.sort_threads option is now supported (gh-8861).
  • The bootstrap_leader option is now supported (gh-8861).
  • All flight recorder options are now supported (gh-8861).
  • All security hardening box.cfg{} options are now supported by config (gh-8861).
  • Added a low priority environment configuration source, which looks into TT_*_DEFAULT variables. It is useful to declare defaults (gh-8862).
  • It is now possible to access configuration from the application script using the config:get() method (gh-8862).
  • All metrics configuration options from box.cfg{} are now supported in the YAML config (gh-8861).
  • Added --help-env-list CLI option (gh-8862).
  • Introduced a non-public API for extending the declarative config functionality in Tarantool Community Edition (gh-8862).
  • Improved the credentials applier: now it supports two-way synchronization of roles and privileges for both users and roles (gh-8861).
  • Removed the sha1 and sha256 hash entries from the config credentials schema as not planned for development (gh-8967).
  • Implemented a full password support in the 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).
  • A group name from a topology defined by the cluster configuration doesn't persisted anymore as box.cfg.cluster_name (gh-8862).
  • The default directory and file paths are changed to var/run/<...>, var/log/<...>, var/lib/<...> and so on (gh-8862).
  • The directory that contains the configuration file is now added into the Lua modules search paths (gh-8862).
  • Most of vshard options are now added in the config (gh-9007).
  • Added initial support of vshard (gh-9007).
  • All audit options are now supported (gh-8861).
  • Non-default privileges are now revoked from default users and roles when they are removed from the config (gh-8967).
  • Introduced the initial support for roles - programs that run when a configuration is loaded or reloaded (gh-9078).

Console

  • Now multiline commands can be used by setting continuation marker using the \set continuation command.

Debugger

  • Introduced readline support to tarantool debugger (gh-7738).

Space

  • Introduced space type: a new space definition field.
  • Introduced the fully temporary space type. It is the same as data-temporary but also has temporary metadata. Temporary spaces can now be created in read_only mode, they disappear after server restart and don't exist on replicas (gh-8323).

Test

Fuzz

  • Added a grammar-based SQL fuzzer (gh-4826).

Build

  • Tarantool does not depend on libgomp anymore (gh-7689).
  • Added building static deb and rpm packages.
  • Dropped building distro-specific deb and rpm Tarantool packages.
  • Dropped building Tarantool packages with GC32. Now only GC64 packages are shipped.
  • Exported all LuaJIT public functions from Tarantool binary (gh-3680).

Bugs fixed

Core

  • [Breaking change] The key 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).
  • [Breaking change] The table box.info.cluster is renamed to box.info.replicaset. The behaviour can be reverted using the compat option box_info_cluster_meaning (gh-5029).
  • Eliminated implicit conversion of unprintable utf-8 strings to binary blobs when encoded in YAML. Now unprintable characters are encoded as escaped utf-8 code points, for example, \x80 or \u200B (gh-8756).
  • Fixed decoding of escape sequences for single-byte character codes from YAML. Before the fix, single-byte character codes between 0x80 and 0xff would be erroneously converted to two-byte UTF-8 code points, for example, \x80 would be decoded as \uC280 (gh-8782).
  • Now index_object.parts.exclude_null always contains false rather than null when it is actually false (gh-8649).
  • Fixed a crash that could happen when inserting an index definition with an empty parts list directly into box.space._index (gh-8688).
  • Fixed the memory leak on unpacking an invalid MsgPack error extension (gh-8921).
  • Fixed a use-after-free bug in fiber recycling code (gh-9020).
  • Fixed a use-after-free bug in iproto server code (gh-9037).
  • Fixed a heap-buffer-overflow bug in fiber creation code (gh-9026).
  • An error is no longer raised on an attempt to print a dead fiber (gh-4265).
  • Fixed a possible out-of-bound write in debug build on unpacking a MsgPack error extension (gh-9098).

Replication

  • Fixed a bug that allowed to change replicaset UUID via _schema space.
  • Fixed a bug when new instances could try to register via an anon instance which previously failed to apply box.cfg{replication_anon = false}.
  • Fixed a bug when box.ctl.demote() with box.cfg{election_mode = 'off'} and an owned synchro queue could simply not do anything (gh-6860).

LuaJIT

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.

Lua

Fio

  • The default permission mode for fio.open() was changed for newly created files to 0666 (before umask) (gh-7981).

SQL

  • Fixed a Use-After-Free vulnerability in the WITH RECURSIVE clause (ghs-119).

Box

  • Fixed the ability to drop _vinyl_deferred_delete system space (gh-5279).
  • Fixed a bug when it was not possible to access spaces named _stream and _stream_space_cache and indexes named _space using the net.box stream objects (gh-8598).
  • [Breaking change] The cord_slab_cache symbol was removed from the public API export (gh-7124).

Config

  • Fixed an error message if the cluster configuration was not provided or the instance was not found in the cluster configuration during reload (gh-8862).
  • Support parent directories creation for options that accept a directory or a file (gh-8862).
  • Create parent directories for console.socket and log.file (gh-8862).
  • Create the process.work_dir directory (gh-8862).
  • Consider all the paths as relative to process.work_dir when creating necessary directories (gh-8862).

3.0.0-alpha2

8 months ago

Date: 2023-08-23 Tag: 3.0.0-alpha2

Overview

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:

  • Added initial support of configuring vshard's storage and router roles in the declarative configuration (gh-9007).
  • Fixes and improvements of the configuration process based on early adopters feedback.
  • New config sections: metrics, feedback, vinyl, flightrec (EE), security (EE) (gh-8861).

Compatibility

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.

Functionality added or changed

Core

  • [Breaking change] Disabled DDL operations with an old system schema. Now you have to run box.schema.upgrade() before you can execute any DDL operations (gh-7149).
  • The _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).
  • Added the new function box.malloc.info() for reporting memory usage of Tarantool internal data structures allocated with malloc(). The function is available only on Linux (gh-7311).
  • Now index_object.parts contains the following methods, similar to the key_def Lua module: extract_key(), compare(), compare_with_key(), merge() (gh-7356).
  • Introduced the 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).
  • Introduced the new 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).
  • Introduced the 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).
  • Introduced the default field values in the space format (gh-8157).
  • Added support for a functional variant of the default field values (gh-8609).

Memtx

  • Added memtx read view statistics to box.stat.memtx() (gh-8501).

Replication

  • 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).

LuaJIT

  • LuaJIT now can handle exceptions on traces (gh-7745).

Lua

  • Embedded the tarantool/metrics module for metrics aggregation and export (gh-7725).
  • Metrics can now be configured using the box.cfg() function (gh-7725).
  • [Breaking change] Added the new 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).
  • Added the :is_new() and :is_old() helpers to tarantool.compat options to simplify effective value checks (gh-8807).

Netbox

  • Introduced the new net.box module function from_fd for creating a new connection from a socket file descriptor number (gh-8984).

Popen

  • Introduced new option 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

  • Introduced new socket functions socket.socketpair, socket.from_fd, and socket:detach (gh-8927).

SQL

  • Introduced the SHOW CREATE TABLE statement (gh-8098).

Box

  • Non-system spaces in a snapshot file are now sorted by their IDs. As before, all non-system spaces are stored after system spaces (gh-7954).
  • [Breaking change] Dropped support for IPROTO_CALL16 from net.box (i.e., the call_16 option and the call_16 method for net.box connections) (gh-8636).
  • Added support for square brackets in procedure resolution for Lua calls (gh-8604).
  • Added support for accepting IPROTO requests with a space or index name instead of an identifier (gh-8146).
  • Added a new box.info parameter hostname (gh-8605).
  • Added the 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).
  • Changed the output of the 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.
  • Allowed multiple updates to the same tuple field in a single call (gh-8226).
  • Introduced box.tuple.format that enables format definition for tuples created via box.tuple.new (standalone tuples) (gh-4693).
  • [Breaking change] Disabled argument list syntax of 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.
  • Allowed truncation of temporary and local spaces in the read-only mode (gh-5616).
  • Sped up index.select and index.pairs with the after option by up to 30% in a synthetic test by eliminating an extra buffer allocation.
  • The function box.session.push is now deprecated. Consider using box.broadcast instead (gh-8802).
  • Introduced the new function box.session.new for creating a new IPROTO session from a socket file descriptor number (gh-8801).
  • Introduced the new 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).
  • [Breaking change] Introduced the new 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).

Cfg

  • Implemented a way to set a table as box.cfg{} options value via environment variables (gh-8051).

Cli

  • [Behavior change] Disabled starting the Lua REPL by default when running Tarantool. Now, Tarantool yields the message that shows the command usage. To run the Lua REPL, just set the -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).
  • Introduced new command-line options --name and --config (gh-8613).

Compat

  • 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.

Config

  • Initial version of the declarative server and cluster configuration (gh-8724).
  • All vinyl options are now supported (gh-8861).
  • All feedback options are now supported (gh-8861).
  • The memtx.sort_threads option is now supported (gh-8861).
  • The bootstrap_leader option is now supported (gh-8861).
  • All flight recorder options are now supported (gh-8861).
  • All security hardening box.cfg{} options are now supported by config (gh-8861).
  • Added a low priority environment configuration source, which looks into TT_*_DEFAULT variables. It is useful to declare defaults (gh-8862).
  • It is now possible to access configuration from the application script using the config:get() method (gh-8862).
  • All metrics configuration options from box.cfg{} are now supported in the YAML config (gh-8861).
  • Added --help-env-list CLI option (gh-8862).
  • Introduced a non-public API for extending the declarative config functionality in Tarantool Community Edition (gh-8862).
  • Improved the credentials applier: now it supports two-way synchronization of roles and privileges for both users and roles (gh-8861).
  • Removed the sha1 and sha256 hash entries from the config credentials schema as not planned for development (gh-8967).
  • Implemented a full password support in the 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).
  • A group name from a topology defined by the cluster configuration doesn't persisted anymore as box.cfg.cluster_name (gh-8862).
  • The default directory and file paths are changed to var/run/<...>, var/log/<...>, var/lib/<...> and so on (gh-8862).
  • The directory that contains the configuration file is now added into the Lua modules search paths (gh-8862).
  • Most of vshard options are now added in the config (gh-9007).
  • Added initial support of vshard (gh-9007).

Console

  • Now multiline commands can be used by setting the continuation marker using the \set continuation command.

Debugger

  • Introduced readline support to tarantool debugger (gh-7738).

Test

Fuzz

  • Now LuaJIT can be fuzzed using grammar-based fuzzer (gh-4823).
  • Added a grammar-based SQL fuzzer (gh-4826).

Build

  • The zstd version was updated to pre-1.5.5 (gh-8391).
  • Added 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).
  • Tarantool does not depend on libgomp anymore (gh-7689).
  • Hardening against memory corruption attacks is now enabled by default on FreeBSD (gh-7536).
  • Hardening against memory corruption attacks is now enabled by default on AArch64 systems (gh-7536).
  • Added building static deb and rpm packages.
  • Dropped building distro-specific deb and rpm Tarantool packages.
  • Dropped building Tarantool packages with GC32. Now only GC64 packages are shipped.
  • Exported all LuaJIT public functions from Tarantool binary (gh-3680).
  • Added the CMake option FIBER_STACK_SIZE to set the default fiber stack size.

Bugs fixed

Core

  • Fixed various bugs related to unsafe (i.e., from an unknown source) decoding and validating of MsgPack extensions (ghs-73).
  • Fixed a crash in the net.box client when a remote space had a field type that the client version did not support (gh-4632).
  • Fixed a bug when a space creation failed with a duplication error. The issue occurred if the explicit and implicit space IDs were mixed. Now the actual maximal space id is used to generate a new one (gh-8036).
  • Relaxed the tuple format requirements on tuples passed as the page starting position to 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).
  • Fixed a crash that could happen when preparing a crash report on macOS (gh-8445).
  • Fixed an integer overflow issue in net.box (ghs-121).
  • An IPROTO_EVENT packet now has the same sync number as the last corresponding IPROTO_WATCH request (gh-8393).
  • Fixed a bug because of which a dirty (not committed to WAL) DDL record could be written to a snapshot and cause a recovery failure (gh-8530).
  • [Breaking change] The key 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).
  • [Breaking change] The table 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).
  • Fixed a bug when a tuple could be inserted even if it violates a unique constraint of a functional index that has a nullable part (gh-8587).
  • Fixed a bug when Tarantool failed to decode a request containing an unknown IPROTO key. The bug resulted in broken connectivity between Tarantool 2.10 and 2.11 (gh-8745).
  • Fixed the node writing an empty 00000000000000000000.xlog file regardless of the actual vclock when interrupted during the initial box.cfg() call (gh-8704).
  • Fixed a bug causing the ER_CURSOR_NO_TRANSACTION failure for transactions on synchronous spaces when the on_commit/on_rollback triggers are set (gh-8505).
  • Fixed a bug causing the effective session and user are not propagated to box.on_commit and box.on_rollback trigger callbacks when transaction is synchronous (gh-8742).
  • Eliminated implicit conversion of unprintable utf-8 strings to binary blobs when encoded in YAML. Now unprintable characters are encoded as escaped utf-8 code points, for example, \x80 or \u200B (gh-8756).
  • Fixed a bug when MVCC sometimes lost gap record (gh-8326).
  • Fixed a bug when MVCC rollback of prepared statement could break internal invariants (gh-8648).
  • Now MVCC engine automatically aborts a transaction if it reads changes of a prepared transaction and this transaction is aborted (gh-8654).
  • Disabled the backtrace collection feature on the AArch64 Linux platform (gh-8572).
  • Fixed a crash that could happen when Tarantool is started in the background mode (gh-6128).
  • Fixed the collection of fiber backtraces on the M1/M2 macOS platform (gh-8074).
  • Fixed a bug that caused writing incorrect values into the stream_id field of xlog headers (gh-8783).
  • Fixed decoding of escape sequences for single-byte character codes from YAML. Before the fix, single-byte character codes between 0x80 and 0xff would be erroneously converted to two-byte UTF-8 code points, for example, \x80 would be decoded as \uC280 (gh-8782).
  • Fixed a bug when a space that is referenced by a foreign key could not be truncated even if the referring space was empty (gh-8946).
  • Now foreign keys from non-temporary to temporary and from non-local to local spaces are prohibited since they can potentially break foreign key consistency (gh-8936).
  • Fixed a crash when a collation used by a space was deleted (gh-4544).
  • Fixed a crash that could happen when Tarantool is compiled by clang version 15 and above with enabled AddressSanitizer (tarantool/tarantool-qa#321).
  • Fixed a bug because of which it was impossible to set the hint option to true for TREE indexes (gh-8937).
  • Now index_object.parts.exclude_null always contains false rather than null when it is actually false (gh-8649).

Memtx

  • Fixed the ability for the memtx_memory parameter to specify a memory size less than required for the stable operation of the engine (gh-7389).
  • Fixed a heap-use-after-free bug in the transaction manager, which could occur when performing a DDL operation concurrently with a transaction on the same space (gh-8781).

Vinyl

  • Vinyl space and index directories are now created on demand. They are removed as soon as they become empty (gh-8441).
  • Fixed a heap-use-after-free bug in the Vinyl read iterator caused by a race between a disk read and a memory dump task. The bug could lead to a crash or an invalid query result (gh-8852).

Replication

  • Fixed a bug related to box.info.replication[...].upstream being stuck in the "connecting" state for several minutes after a replica DNS record change (gh-7294).
  • Fixed an issue when the nodes synchronizing with a hung leader reported the leader as alive. This behavior led to the delay of the new elections (gh-7515).
  • Fixed a bug that occurred on applier failure: a node could start an election without having a quorum to do this (gh-8433).
  • Fixed a bug that allowed to change replicaset UUID via _schema space.
  • Fixed a bug when new instances could try to register via an anon instance which previously failed to apply box.cfg{replication_anon = false}.
  • Fixed a possible failure to promote the desired node by box.ctl.promote() on a cluster with nodes configured with election_mode = "candidate" (gh-8497).
  • Fixed nodes configured with election_mode = 'candidate' spuriously detecting a split-vote when another candidate should win with exactly a quorum of votes for it (gh-8698).
  • Fixed a crash when using transactions with the linearizable isolation level during a replica reconnect (gh-7991).
  • Fixed a possible crash on bootstrap with box.cfg.bootstrap_strategy = 'auto' when some of the bootstrapping nodes were stopped (gh-8757).

LuaJIT

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.

Lua

  • The 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).
  • Exported the missing AUTH_TYPE key to box.iproto.key (gh-8574).
  • Stripped the unwanted IPROTO_ prefix from the POSITION, AFTER_POSITION, and AFTER_TUPLE keys exported to box.iproto.key (gh-8577).
  • Fixed the xlog reader Lua module to show unknown row header fields. Before this change the xlog reader silently skipped them.

Fio

  • The default permission mode for fio.open() was changed for newly created files to 0666 (before umask) (gh-7981).

Http client

  • Fixed a bug where a response body cannot be decoded (gh-8363).
  • Fixed the Transfer-Encoding: chunked setting being enabled even if the Content-Length header exists for stream requests (gh-8744).

Netbox

  • Fixed a heap-use-after-free bug in the function creating a tuple format Lua object for net.box (gh-8889).

SQL

  • The ANY field type now supports collation in SQL (gh-8070).
  • Now the ARRAY, MAP, and INTERVAL values cannot be used as arguments in the ORDER BY clause (gh-6668).
  • Fixed incorrect conversion of an integer greater than INT64_MAX or less than 0 to a decimal number during SQL arithmetic operations (gh-8460).
  • Fixed an assertion when selecting tuples with incomplete internal format (gh-8418).
  • Fixed integer overflow issues in built-in functions (ghs-119).
  • Fixed a Use-After-Free vulnerability in the WITH RECURSIVE clause (ghs-119).
  • Fixed a possible assertion or segmentation fault when optimizing INSERT INTO ... SELECT FROM (gh-8661).
  • Fixed an integer overflow issue and added a check for the printf() failure due to too large size (ghs-122).

Box

  • Fixed a bug where box.cfg.force_recovery doesn't work when there are no user spaces in a snapshot (gh-7974).
  • Fixed a bug when large numbers were encoded incorrectly by msgpackffi. It could lead to wrong select results with large number keys (gh-6119).
  • Fixed a crash on an unknown option of the function (gh-8463).
  • The takes_raw_args option is now handled correctly during downgrading (gh-8457).
  • Fixed several memory leaks on tuple encoding failures (gh-7939).
  • Fixed the ability to drop _vinyl_deferred_delete system space (gh-5279).
  • Fixed a bug (bad error message) in pagination related to the validation of the after position option of the :select and :pairs methods of space and index objects (gh-8716).
  • Fixed a bug when it was not possible to access spaces named _stream and _stream_space_cache and indexes named _space using the net.box stream objects (gh-8598).
  • Fixed the memory leaks caused by the multi-statement transaction errors in the space index building and the space format checking operations (gh-8773).
  • [Breaking change] The cord_slab_cache symbol was removed from the public API export (gh-7124).
  • Fixed the privilege check when using spaces with functional indexes and constraints (gh-7873).
  • Fixed the inability to insert an integral number into a double-formatted field (gh-7483).
  • Fixed a bug in the box console implementation because of which the language parameter was shared between connected clients (gh-8817).
  • Fixed the invalid memory access in a corner case of a specialized comparison function (gh-8899).
  • Fixed a crash when box.iproto.override was called with an unconfigured box. Now, an error is raised instead (gh-8975).

Config

  • Fixed an error message if the cluster configuration was not provided or the instance was not found in the cluster configuration during reload (gh-8862).
  • Support parent directories creation for options that accept a directory or a file (gh-8862).
  • Create parent directories for console.socket and log.file (gh-8862).
  • Create the process.work_dir directory (gh-8862).
  • Consider all the paths as relative to process.work_dir when creating necessary directories (gh-8862).

Console

  • Fixed 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).

Datetime

  • Fixed a bug with buffer overflow in tnt_strptime (gh-8502).
  • Fixed an error in datetime.set when timestamp is passed along with nsec, usec, or msec (gh-8583).
  • Fixed errors when the string representation of a datetime object had a negative nanosecond part (gh-8570).
  • Fixed a bug raising a false positive error when creating new intervals with range boundary values (gh-8878).

Msgpack

  • Fixed decoding datetime intervals with fields larger than possible int32 values (gh-8887).

Build

  • Enabled compiler optimizations for static build dependencies, which were erroneously disabled in version 2.10.3 (gh-8606).