Журнал изменений Enterprise SDK
Версия Tarantool Enterprise SDK состоит из двух частей:
<TARANTOOL_BASE_VERSION>-r<REVISION>
Например: 2.11.1-0-gc42d9735b-r589.
TARANTOOL_BASE_VERSION— версия Tarantool Enterprise.REVISION— ревизия SDK. Помимо самого Tarantool, она включает утилитуtt, набор модулей с открытым и закрытым исходным кодом, а также примеры. Подробнее см. в разделе Комплектация.
В релизе обновлены ключевые зависимости платформы: Tarantool 2.11.9 — bugfix‑релиз ветки 2.11, ориентированный на повышение стабильности и предсказуемости работы. В релизе улучшены диагностика и реакция на ошибки WAL, устранены зависания и проблемы обслуживания WAL‑файлов в Core, а также внесён большой набор исправлений в LuaJIT и модуль Datetime. Дополнительно обновлены и доработаны ключевые компоненты экосистемы (crud, vshard, metrics, tt-ee, cartridge, http), включая улучшения безопасной работы при ребалансировке, отказоустойчивого чтения и изменения в TLS/mTLS‑настройках HTTP.
Это bugfix-релиз: исправлено 34 проблемы с версии 2.11.8 (r702).
- Версия 2.x — предыдущая стабильная ветка; рекомендуется обновляться до 3.x.
- Чтобы обновиться с Tarantool 2.x на 3.x см. процедуру обновления.
При обновлении SDK рекомендуется:
- перед началом обновления убедиться, что все наборы реплик исправны и находятся в согласованном состоянии;
- выполнять обновление последовательно, проверяя состояние кластера после обновления каждого компонента;
- не запускать ребалансировку данных при прохождении через CRUD 1.7.0, пока обновление полностью не завершено.
Добавлено:
- Новое встроенное системное событие
box.wal_error, которое рассылается каждый раз, когда Tarantool не удаётся зафиксировать транзакцию в журнале предзаписи (WAL) (gh-9405).
Исправлено:
- Проблема, из-за которой ошибки SSL некорректно регистрировались при разрыве соединения с клиентом.
- Ошибка, из-за которой Tarantool мог зависать при использовании
box.watch(gh-9632). - Ошибка, при которой файлы
.xlog.inprogressне удалялись автоматически во время запуска сервера, еслиwal_dirзадан и отличается от значения по умолчанию (gh-12081). - Ошибка, при которой локальный спейс нельзя было очистить (truncate), если спейс
_truncateнастроен как синхронный (synchronous) (gh-12585).
- Если при записи в WAL возникает
ER_WAL_IO, текущий лидер при первом же таком случае отказывается от своей роли.
Добавлено:
- Поддержка
ffi.abi("dualnum")для определения режима LuaJIT (dual-number: различение целых int64 и double). - Добавлены флаги
misc.memprof.availableиmisc.sysprof.availableдля определения доступности соответствующего профайлера в текущей сборке. Подробнее про профайлеры см. в разделах LuaJIT memory profiler и LuaJIT platform profiler.
Исправлено:
- Некорректная генерация
IR_TBARна aarch64. - Обработка переполнения стека при выходе из трассировки.
- «Висячие» ссылки на
CType. - Закрытие состояния VM после раннего OOM.
- Генерация
IR_MULна x86/x64. - Некорректное объединение инструкций
stp/ldpна aarch64. - Инвалидизация записи SCEV при возврате в более низкий фрейм.
- Сборка на macOS 15/Clang 16.
- Генерация
IR_HREFKна aarch64. - Проверки стека в varargs-вызовах в сборке GC64.
- Проверки стека в
pcall()/xpcall()в сборке GC64. - Лимит аллокаций для сборки без JIT.
- Обработка ошибок OOM при расширении стека в
coroutine.resume()иlua_checkstack(). - Запись (recording) циклов со значением шага
-0или управляющими значениямиNaN. - Формирование сообщений об ошибках, когда ошибка возникает во время обработки ошибки.
- «Висячая» ссылка для FFI callback.
BC_UNMдля аргумента-0в режимеdual-number.- Сужение (narrowing) унарного минуса в режиме
dual-number. - Запись (recording)
string.byte(),string.sub()иstring.find(). - Отсутствие преобразования типов для слотов
BC_FORIв режимеdual-number. - Различные пограничные случаи в
VM events. - Запись разрешения индекса конструктора в JIT-компиляторе.
- Предупреждение UBSan в
unpack().
Исправлено:
- Падение из-за срабатывания
assertпри разборе неоднозначной даты: когда в тексте одновременно указаны день года (yday, который неявно задаёт месяц и день месяца) и календарный месяц (без дня месяца). Теперь такие случаи распознаются, и отображается ошибка. - Вычисления
tzoffsetдля случаев видаnew({timestamp=x, tz='Zone'}). - Неконсистентность между датами, создаваемыми
new({tzoffset=x}), иd:set({tzoffset=x}), когдаd.tz ~= ''идёт передset(). - Теперь
datetime.new()иdatetime_object:set()проверяют, что значениеtimestampнаходится в допустимом диапазоне. - Проверка типа
timestampвset().
Для обратной совместимости добавлена опция compat.datetime_setfn_timestamp_type_check. Сейчас она по умолчанию выключена («старое» поведение), то есть проверка типа не выполняется. «Новое» поведение с проверкой типа планируется сделать значением по умолчанию в версии 4.x.
Примечание
Ниже приведены модули, в которых произошли изменения. Если модуль не указан в списке ниже, то обновления для него не выпускались.
Примечание
Начиная с CRUD 1.6.0 закрыта уязвимость, позволявшая выполнять операции, на которые у пользователя не было прав. Теперь CRUD строго соблюдает права доступа: пользователь может выполнять только те действия, которые разрешены его привилегиями. Если приложению требуется доступ к служебным спейсам, соответствующие права необходимо выдавать явно.
Подробнее Чтение и запись данных через модуль CRUD.
Подробности о безопасном режиме и совместимости при поэтапном (rolling) обновлении описаны в разделе Обновление модуля crud (см. Ограничение совместимости при обновлении и Порядок обновления).
Добавлено:
- Метод
crud.locate()для определения, где находится кортеж — в движке memtx или vinyl. Работает для спейсов, управляемых enterprise-модулемcooler. - В
crud.lenдобавлена поддержка опций:mode,balance,prefer_replica,request_timeout. safe mode— безопасный режим, предотвращающий запись данных в неверный набор реплик во время ребалансировки vshard.- Метрика
tnt_crud_router_cache_clear_ts, помогающая корректно отключать безопасный режим в кластере. - Автоматическое переключение в безопасный режим при старте ребалансировки.
- Возможность вручную вернуть быстрый режим (
fast mode). - Метрика
tnt_crud_storage_nil_bucket_id_compat_totalдля отслеживания операций, выполненных безbucket_ref(режим совместимости со старыми роутерами).
Исправлено:
- Операции только для чтения (
get,select,pairs,count,min,max) теперь выполняются через здоровые реплики, даже если все мастер-узлы в кластере недоступны. - Совместимость узлов хранилища с роутерами версии < 1.7.0: в
get,update,deleteкорректно обрабатываетсяbucket_id = nil. В этом случае хранилище пропускаетbucket referencingи пишетrate-limitedпредупреждение о сниженной безопасности ребаланса во время обновления без простоя (rolling upgrade). - Ошибка
bucket_refв методахcrud.*_manyтеперь возвращается в виде массива. - Вызов
bucket_unrefвынесен из транзакции. - Предотвращено создание дублирующихся метрик при повторном вызове
init. - Предотвращено создание дублирующихся триггеров на спейсе
_crud_settings_localпри повторном вызовеinit. - Взаимная блокировка в
crud.schema()после ошибки перезагрузки схемы. - Удалена метрика
tnt_crud_storage_safe_mode_enabledс роутера. - Убрана обёртка
wrap_box_space_func_resultдля сокращения аллокаций и ускорения вызовов узла хранилища. - У* Оптимизирована пагинация в
crud.select()иcrud.pairs()с курсоромafter: для позиционирования курсора за O(1) на Tarantool 2.10+ используется нативная опцияafter.
Изменено:
- При переключении в безопасный режим прекращена практика пометки/остановки iproto файберов в быстром режиме; корректность операций на узле хранилища проверяется через
yield_checksв тестах. - Переключение в безопасный режим перенесено с триггера
on_commitнаon_replace. - Спейсы на движке vinyl всегда работают в безопасном режиме.
Версия 0.1.40 полностью совместима с предыдущими версиями vshard.
Добавлено:
- Возможность отключать ограничитель частоты логирования (log rate limiter) через модуль
consts. - Теперь вызывать
vshard.router.info()иvshard.storage.info()можно, даже если роутер или хранилище отключены. Кроме того, функции возвращают новое булево поле:is_enabled. - Улучшено журналирование операций, связанных с ребалансировкой и восстановлением.
Исправлено:
- Проблема, из‑за которой старый мастер-узел не мог обнаружить новый мастер-экземпляр в пределах набора реплик.
- Утечка соединений: соединение не освобождалось сборщиком мусора после реконфигурации или перезагрузки.
- Ограничение транзакций при работе с
_bucket: ранееon_commit‑триггер на_bucketблокировал запись в другие спейсы в рамках той же транзакции (например, изon_replace‑триггеров). Теперь такие сценарии разрешены — вon_commitпропускаются изменения, относящиеся к «чужим» спейсам. - Проблема, из-за которой ошибка пользователя маскировалась ошибкой
Transaction is active...при вызове персистентной функции, которая выбрасывает ошибку и не закрывает транзакцию на версиях Tarantool младше 3.0.0-beta1-18. Теперь vshard автоматически закрывает такие транзакции и возвращает исходную ошибку пользователя. - Проблема, из-за которой соединение с репликой не восстанавливалось автоматически, если оно было закрыто vshard или пользователем.
graphite: добавлена возможность отправлять метрики на несколько серверов.- Удаление реплики с помощью метода
box.space._cluster:delete()не удаляет информацию об этой реплике из метрик. Информация исчезает только после перезапуска кластера. - Обратная совместимость с предыдущей версией плагина сохранена.
- Изменения в поведении:
initтеперь присваивает уникальное имя создаваемому файберуfiberна основе входных опцийgraphite server(если переданы).- Добавлен метод
stop()для остановки всех файберовfibers, запущенных плагином.
Добавлено:
tt pack: добавлена поддержка вложенных файлов.packignoreв корне окружения tt.tt status: добавлена опция--formatдля вывода в форматах JSON и YAML (машиночитаемый вывод).
Изменено:
tt export: изменено поведение по умолчанию для составных полей (массивы и словари) — теперь они экспортируются в JSON. Для возврата прежнего поведения используйте--compound-value-format=ignore.
Исправлено:
- Проверка целостности для приложения, использующего структуру каталогов Cartridge (одиночное приложение, у которого корневой каталог совпадает с корнем окружения).
- Проблема с Tarantool 3.5+: экземпляр не останавливался при падении периодической проверки целостности.
- Исправления, выявленные статическим анализатором Svacer и проверками на известные уязвимости (CVE).
Изменено:
- По умолчанию дерево файлов на странице кода больше не разворачивается.
- Обновлена зависимость vshard до версии 0.1.40.
- Обновлена зависимость membership до версии 2.5.3.
- Обновлена зависимость cartridge-metrics-role до версии 0.1.3.
- Обновлена зависимость graphql до версии 0.3.1.
- Обновлена зависимость http до версии 1.9.0.
Исправлено:
- Переработан мониторинг синхронных спейсов с учетом фактического режима отказоустойчивости. Предупреждение о синхронных спейсах теперь записывается в журнал, когда отказоустойчивость (failover) настроена в режиме, который их не поддерживает (eventual, stateful без
synchro_mode), а не безусловно при запуске экземпляра. - Добавлена функция
is_sync_spaces_supported()в модульcartridge.failover. - Синхронные спейсы теперь обнаруживаются динамически, что позволяет учитывать спейсы, добавленные во время работы.
Этот релиз добавляет новую опцию ssl_verify_client и изменяет поведение по умолчанию при заданном параметре ca_file. Также исправлено несколько ошибок.
Добавлено:
- Новая опция
ssl_verify_client.
Исправлено:
- Сервер не пересоздается, если его адрес и порт не изменились.
- Сервер не изменяется после обновления параметров при перезагрузке конфигурации.
Критические изменения:
Mutual TLS (взаимный TLS) с опцией ca_file включен по умолчанию.
Документация: Модуль http.
- Added manual trigger job to run tests to generate
certificate of compliance. Ready for Astra Linux.
- Bumped Cartridge version to 2.16.0.
- Bumped Cartridge version to 2.15.4.
- Bumped Kafka version to 1.6.10.
- Bumped Cartridge version to 2.15.3.
- Bumped Cartridge version to 2.15.1.
- Bumped
tt-eeversion to v2.8.1. - Bumped
vshard-eeversion to 0.1.32.
- Bumped Cartridge version to 2.15.0.
- Bumped
membershipversion to 2.5.1. - Bumped
expirationd-eeversion to 1.8.0.
- Bumped
tarantool-2.11series to 2.11.6. - Bumped
tt-eeversion to v2.8.0. - Bumped
migrations-eeversion to 1.3.1.
- Bumped
tarantool-2.11series to 2.11.5. - Bumped
tt-eeversion to v2.5.2. - Updated Kafka to 1.6.9.
- Bumped
tt-eeversion to v2.5.1. - Bumped
tt-eeversion to v2.5.0.
- Moved
cartridge-auth-extensionto stable directory. - Bumped
crud-eeversion to 1.7.1. - Bumped
migrations-eeversion to 1.3.0.
- Bumped
tarantool-2.11series to 2.11.4. - Bumped Cartridge version to 2.12.3.
- Bumped
tt-eeversion to v2.4.0. - Bumped
queueversion to 1.4.2. - Added Migration Guide to bundle.
- Moved to Enterprise Edition modules.
- Fixed Docker image due to CentOS 7 EOL.
- Fixed CI/CD workflows running inside CentOS 7.
- Bumped
tt-eeversion to v2.3.1. - Enabled
ttbash completion. - Updated Kafka to 1.6.8.
- Updated Docker image.
- Updated CMake to 3.20.6.
- Installed dependencies for building OpenSSL.
- Fixed installation of Python 3.6.
- Updated CRUD to 1.5.1.
- Updated
sideserviceto 0.2.1. - Updated
httpgoto 0.2.2. - Updated
httpgo-crudto 0.1.1.
- Updated
cartridge-clito 2.12.12. ttused instead oftarantoolctlfor build/test routines.- Made Tarantool and bundle versions correct.
- Bumped
tarantool-2.11to 2.11.3.
- Updated
cartridge-clito 2.12.9. - Updated
tt-eeto 1.3.1.
- Updated
cartridge-clito 2.12.7. - Updated
tarantool-2.11to 2.11.1.
- Added
vshard0.1.22.
- Fixed non-interactive installation of the
brewpackage. - Changed the owner of the
/usr/local/bindirectory. - Installed
awscli@1instead ofawsclisince it takes much less time.
- Added
expirationd1.3.1.
- Added CRUD 1.0.0.
- Refactored the way that GC64 builds are defined in the build workflow. There are no changes to the composition of resulting bundles.
- Added alerting failures in builds on stable branches and integration testing to VK Teams chats.
- Added Cartridge 2.7.7.
Release SDK by tags:
- Run workflow in SDK docker container.
- Uploaded SDK files for 1.10, 2.8, 2.10 versions to release folder.
- Added consistency check for all versions.
- Removed support of Tarantool 2.7.
- Started using
tarantool/actions/prepare-checkoutto make builds more stable.
- Remove the local registry and setup using GitHub registry.
- Sync rocks cache to S3 and back.
- Setup using shared runners.
- Refactor and format
ci-linux.ymlandci-macos.yml.
- Removed Kafka 1.5.0 due to a build issue with Tarantool 2.10.3 and higher.
- Updated Kafka to version 1.6.2.
- Updated
tuple-keydefto version 0.0.3.
- Updated Tarantool to 2.10.3.
- Added a readable error for the case when the flight recoder fails
to write data due to insufficient free space on the disk device.
Previously, it was sending a
SIGBUSerror. - Fixed a crash in the flight recorder caused by non-thread-safe log recording from multiple threads.
- Updated Tarantool to 2.10.2.
- Increased resolution of stored entries in flight recorder.
- Fixed a bug in the flight recorder that resulted in skipping log entries in case
box.cfg.log_levelis less thanflightrec_log_level.
- Updated Tarantool to 2.10.1.
- Updated Cyrus SASL to version 2.1.28.
- Updated OpenLDAP to version 2.5.13.
- Updated LZ4 to version 1.9.3. Fixed CVE-2021-3520.
- Fixed replication reconnect failure after disabling SSL encryption.
- Fixed a crash that occurred while tyring to start an instance that has
a compressed
memtxspace. - Fixed CVE-2022-29242 in GOST SSL engine.
- Fixed a bug in the flight recorder reader implementation that resulted in a hang or error while trying to open an empty section.
- Implemented user-defined audit events. Now it’s possible to log custom messages to the audit log from Lua.
- [Breaking change] Switched the default audit log format to CSV. The
format can be switched back to JSON using the new
box.cfg.audit_formatconfiguration option. - Implemented the audit log filter. Now, it’s possible to enable logging only
for a subset of all audit events using the new
box.cfg.audit_filterconfiguration option.
- Implement constraints and foreign keys. Now a user can create function constraints and foreign key relations (gh-6436).
- Changed log level of some information messages from critical to info (gh-4675).
- Added predefined system events:
box.status,box.id,box.electionandbox.schema(gh-6260). - Introduced transaction isolation levels in Lua and IPROTO (gh-6930).
- Disabled the deferred DELETE optimization in Vinyl to avoid possible
performance degradation of secondary index reads. Now, to enable the
optimization, one has to set the
defer_deletesflag in space options (gh-4501).
- Added support of console autocompletion for
net.boxobjectsstreamandfuture(gh-6305).
- Added bundling of GNU libunwind to support backtrace feature on AARCH64 architecture and distributives that don’t provide libunwind package.
- Re-enabled backtrace feature for all RHEL distributions by default, except for AARCH64 architecture and ancient GCC versions, which lack compiler features required for backtrace (gh-4611).
- Disabled audit log unless explicitly configured. Before this change,
audit events were written to stderr if
box.cfg.audit_logwasn’t set. Now, audit log is disabled in this case. - Disabled audit logging of replicated events. Now, replicated events (for example, user creation) are logged only on the origin, never on a replica.
- Banned DDL operations in space on_replace triggers, since they could lead to a crash (gh-6920).
- Fixed a bug due to which all fibers created with
fiber_attr_setstacksize()leaked until the thread exit. Their stacks also leaked except whenfiber_set_joinable(..., true)was used. - Fixed a crash in mvcc connected with secondary index conflict (gh-6452).
- Fixed a bug which resulted in wrong space count (gh-6421).
- Select in RO transaction now reads confirmed data, like a standalone (auotcommit) select does (gh-6452).
- Fixed potential obsolete data write in synchronous replication due to race in accessing terms while disk write operation is in progress and not yet completed.
- Fixed replicas failing to bootstrap when master is just re-started (gh-6966).
- Fixed the behavior of tarantool console on SIGINT. Now Ctrl+C discards the current input and prints the new prompt (gh-2717).
Intervals received after datetime arithmetic operations may be improperly normalized if result was negative
tarantool> date.now() - date.now() --- - -1.000026000 seconds ...
I.e. 2 immediately called
date.now()produce very close values, whose difference should be close to 0, not 1 second (gh-6882).
- Changed the type of the error returned by net.box on timeout
from
ClientErrortoTimedOut(gh-6144).
- Added binary protocol encryption.
- Added tuple field compression.