Tarantool 2.8.1
Дата выхода: 2021-04-21.
- Версия: v. 2.8.1.
- Тег версии:
2.8.1-0-ge2a1ec0
.
2.8.1 — бета-версия, входящая в серию 2.8.
Эта версия содержит 28 новых функций и 31 исправление по сравнению с версией 2.7.2. Возможны ошибки в менее распространенных функциях. Если вы обнаружили проблему, сообщите о ней на GitHub.
Важные изменения:
- Теперь в Tarantool можно задавать несколько потоков (threads) IPROTO.
- Setting
box.cfg
options with environment variables. - Введена новая функция
box.ctl.promote()
и механизм ручных выборов лидера. - Улучшен профилировщик памяти Lua.
Любая версия Tarantool 2.x обратно совместима с версиями Tarantool 1.10.x. Это касается структур двоичных данных, клиент-серверного протокола и протокола репликации.
Чтобы получить доступ ко всем новым функциям серии 2.x, обновите Tarantool с помощью box.schema.upgrade()
.
При определении индексируемых полей теперь можно использовать параметр
exclude_null
. Тогда в индексе не будут сохраняться кортежи, соответствующее поле которых имеет значениеnull
(gh-4480).Например, в индекс, созданный методом
s:create_index('sk', {parts={{2, 'number', exclude_null=true}}})
, не войдут кортежи{1, null}
и{2, null}
, но могут войти кортежи{null, 1}
и{1, 1}
.В
box.cfg{}
добавлен параметрslab_alloc_granularity
, позволяющий настроить гранулярность выделения памяти для аллокатора small. Значениеslab_alloc_granularity
должно быть степенью двойки, но не менее 4 (gh-5518).В предыдущих версиях триггеры Lua
on_shutdown
запускались последовательно. Теперь каждый триггер запускается в отдельном файбере. По умолчанию Tarantool в течение 3 секунд ожидает, когда завершится обработка триггеров. Пользователь может изменить этот временной промежуток с помощью новой функцииbox.ctl.set_on_shutdown_timeout
.Когда время истечёт, Tarantool немедленно завершит работу, не дожидаясь окончания обработки оставшихся триггеров.
Tarantool module developers can now register functions to call when Tarantool stops with the new
on_shutdown
API, (gh-5723). Read more: on_shutdown.Введена очередь журнала упреждающей записи (WAL). Размер очереди в байтах определяется новым параметром конфигурации
wal_queue_max_size
. Его значение по умолчанию — 16 МБ. Параметр позволяет ограничить объем транзакций, которые реплика заносит в WAL. Проверка ограничения происходит каждый раз, когда транзакция с мастера заносится в WAL на реплике. Как только транзакция будет успешно записана, ее место в очереди освободится (gh-5536).Информацию о состоянии синхронной репликации теперь можно получить через интерфейс
box.info.synchro
(gh-5191).Теперь Tarantool позволяет запускать несколько потоков (threads) IPROTO. Это полезно в ситуациях, когда единственный поток IPROTO становится узким местом производительности (gh-5645).
При операции обновления кортежей (update) пропуск полей не поддерживается. Пропущенные поля теперь заменяются нулевыми значениями (gh-3378).
Новый модуль
box.lib
позволяет загружать и выполнять хранимые процедуры на языке C на узлах, доступных только для чтения (gh-4642).Configuration options in
box.cfg
can now be defined with environment variables (gh-5602).Применяются параметры конфигурации из следующих источников в порядке приоритета:
box.cfg{}
;- переменные окружения;
- параметры
tarantoolctl
; - значения по умолчанию.
Добавлена функция
box.ctl.promote()
, введены ручные выборы лидера. Чтобы их включить, укажите параметрelection_mode='manual'
(gh-3055).Экземпляр, находящийся в ручном (
manual
) режиме выборов, большую часть времени имеет рольvoter
, но при вызовеbox.ctl.promote()
может начать выборы и стать лидером. Еслиelection_mode ~= 'manual'
, методbox.ctl.promote()
делает то же, что устаревший методbox.ctl.clear_synchro_queue()
.
Отчет профилировщика памяти LuaJIT стал удобнее для чтения (gh-5811). Теперь проще понять, в какой строке кода происходит событие. Пользователь видит имя исходного файла и строку, где выделяется память, а также количество событий и статистику памяти в байтах. Номер строки с определением функции не отображается.
Критическое изменение: информация о строке, в которой определяется функция, теперь сохраняется в поле
linedefined
таблицы символов. Полеname
теперь называетсяsource
в соответствии с Lua API для отладки.Ряд изменений в парсере профилировщика памяти:
- Теперь отчет парсера включает информацию об изменениях в состоянии динамической памяти, возникших за период работы профилировщика (gh-5812).
- Чтобы посмотреть только эти изменения, используйте параметр
--leak-only
. - Новый встроенный модуль
memprof.process
производит постобработку и агрегацию событий, связанных с выделением памяти.
Чтобы запустить профилировщик памяти, используйте следующую команду:
tarantool -e 'require("memprof")(arg)' - --leak-only /tmp/memprof.bin
- Реализованы новые инструменты для анализа инцидентов и сбора соответствующих артефактов (gh-5569).
- Инфраструктура сборки Tarantool теперь требует использования CMake версии 3.2 или более поздней.
- Доступны бинарные пакеты для Fedora 33 (gh-5502).
- Начиная с этой версии, бинарные пакеты для CentOS 6 и Debian Jessie не публикуются.
- Среди зависимостей для RPM- и DEB-пакетов больше нет
autotools
(следствие gh-4968). - Регулярное тестирование на MacOs 10.13 больше не проводится. Поддержка Tarantool для этой версии MacOS прекращена.
- Встроенный модуль
zstd
обновлён с версии 1.3.3 до версии 1.4.8 (в рамках gh-5502). - Библиотека
libcurl
, входящая в сборку, теперь поддерживает протоколы SMTP и SMTPS (gh-4559). - Файлы заголовков библиотеки
libcurl
, входящей в сборку, устанавливаются в системный каталог${PREFIX}/include/tarantool
(gh-4559).
- CI/CD Tarantool теперь проводится посредством GitHub Actions (gh-5662).
- Тестирование с помощью Jepsen на отдельных узлах теперь происходит каждый раз, когда выполняется push новых тегов, а также по cron каждые 3 часа (gh-5736).
- Фаззинг-тесты запускаются каждый раз, когда выполняется push (gh-1809).
- Реализовано независимое окружение для тестирования LuaJIT. Система сборки LuaJIT частично портирована на CMake. Инструменты для тестирования теперь находятся в репозитории tarantool/luajit (gh-4862, gh-5470).
- Теперь в инфраструктуре тестирования по умолчанию установлен Python 3 (gh-5652).
- Параметры индексируемых полей больше не пропускаются в случаях, когда тип поля не определён (gh-5674).
- Функция
lbox_ctl_is_recovery_finished()
больше не возвращает значениеtrue
в случае, если процесс восстановления ещё не завершён. - Устранена ошибка повреждения памяти в модуле
net.box
. До этого исправления область памяти, занятая структуройerror
, освобождалась преждевременно, поскольку методыffi.gc
иffi.cast
вызывались не в том порядке. - При передаче данных на реплику, которая присоединяется к кластеру или синхронизируется с мастером, больше не может истечь время ожидания (gh-5762).
- Устранена проблема, из-за которой модуль
net.box
получал схему индекса, в которой не содержится значениеpath
(gh-5451). - Раньше интенсивное использование модулей
uri
иuuid
при уровне логирования DEBUG приводило к сбоям, а результаты выполнения функций, входящих в эти модули, могли быть повреждены. Теперь эта проблема решена. Та же проблема устранена для случаев, когда модулиuri
иuuid
используются в callback-функциях, передаваемых в методffi.gc()
, а также для некоторых функций, входящих в модулиfio
,box.tuple
иiconv
(gh-5632). - Новый параметр
wal_cleanup_delay
предотвращает преждевременное удаление файлов*.xlog
, необходимых репликам. Ранее при удалении возникала ошибкаXlogGapError
(gh-5806). - Когда на мастере есть синхронные спейсы, во время стадии join на реплике больше не возникают ошибки
Unknown request type 40
(gh-5566). - Исправлена ошибка при перезагрузке скомпилированного модуля, возникавшая, если обновлённый модуль не содержал части функций, которые были в прежнем коде. Раньше событие запускало процедуру восстановления удалённых функций. Однако вместо того, чтобы восстанавливать каждую функцию по отдельности, Tarantool ошибочно обрабатывал единственную запись, что приводило к сбою при вызове любой из этих функций (gh-5968).
- Решена проблема фантомных чтений: теперь механизм MVCC движка memtx отслеживает интервалы чтения (gh-5628).
- Функция
space:count()
, используемая с механизмом MVCC движка memtx, больше не выдаёт ошибочный результат (gh-5972). - Исправлена проблема «грязного чтения» после перезапуска, возникающая при использовании механизма MVCC и синхронной репликации (gh-5973).
- Устранена проблема, из-за которой applier не обрабатывал сообщения
CONFIRM
илиROLLBACK
от мастера и не давал ответа реплике. - Устранена проблема, из-за которой некоторые кортежи не отправлялись с мастера на анонимную реплику, отставшую от него и пытающуюся зарегистрироваться в кластере.
- Исправлена ошибка, из-за которой синхронная транзакция подтверждалась и отображалась на реплике, а после перезагрузки исчезала вновь. Чаще всего это происходило в спейсах memtx при включённом механизме
memtx_use_mvcc_engine
(gh-5213). - Устранены проблемы с восстановлением отмененной синхронной транзакции, состоящей из нескольких инструкций. Если такая транзакция относилась к асинхронным спейсам, она могла быть частично применена или восстановлена с ошибками (gh-5874).
- Исправлена ошибка синхронной репликации, из-за которой при подключении достаточно старого экземпляра отменённые транзакции могли быть применены вновь (gh-5445).
- Исправлена ошибка, из-за которой метод
<swim_instance>:broadcast()
не работал на нелокальных адресах и постоянно заносил в журнал сообщения об ошибке «Permission denied». Если работа экземпляра прекращалась, метод мог вернуть ненулевой код завершения даже при отсутствии ошибок в скрипте, а затем снова начать массово логировать сообщения о той же ошибке (gh-5864). - Устранён сбой, возникавший при вызове
swim:member_by_uuid()
с аргументомnil
/box.NULL
или без аргументов (gh-5951). - Устранён сбой, возникавший при попытке передать объект неподходящего типа в метод
__serialize
реплики-участника swim в Lua (gh-5952).
- Изменение размера стека Lua больше не приводит к ошибочному поведению профилировщика памяти (gh-5842).
- Исправлена ошибка, из-за которой значение
gc_cdatanum
в метриках платформы LuaJIT уменьшалось на две единицы. Ошибка возникала в случаях, когда финализатор был назначен для объекта типаGCсdata
(gh-5820).
- Устранена проблема с параметром
-e
. Ранее, если в качестве стандартного устройства ввода был установлен терминал, командаtarantool
запускала интерактивный режим. Теперь командаtarantool -e "print('Hello')")
просто выводит словоHello
и завершает работу (gh-5040). - Устранена утечка кортежа, возникавшая при ошибке сериализации ключа во время выполнения
key_def:compare_with_key(кортеж, ключ)
(gh-5388).
- Пользовательские C- или Lua-функции теперь получают ровно те же строки, что в них передаются посредством SQL. Различия могли возникать, если строка содержала
\\0
(gh-5938). - Инструкции
SQL SELECT
иSQL UPDATE
в отношении полейUUID
иDECIMAL
больше не вызывают ошибок сегментации (gh-5011, gh-5704, gh-5913). - Устранена проблема, из-за которой инструкции
SELECT
иGROUP BY
, выполняемые в рамках одной транзакции, приводили к неверным результатам. Проблема возникала, когда одно из обрабатываемых значений имело типVARBINARY
, а обращение к нему не происходило с помощью инструкции SELECT напрямую (gh-5890).
Устранена проблема сборки на FreeBSD, связанная с неполным определением типа
struct sockaddr
(gh-5748).Уже скачанные зависимости статической сборки не будут скачиваться повторно (gh-5761).
В ходе восстановления с помощью параметра
force_recovery
теперь удаляются файлы.vylog
, созданные позднее, чем снимок данных. Благодаря этому экземпляр может восстанавливаться после инцидентов, возникающих во время сохранения контрольной точки (gh-5823).Устранены проблемы с конфигурацией
libcurl
, возникавшие, когда для сборки Tarantool использовалась командаcmake3
, а в переменнойPATH
отсутствовал путь кcmake
(gh-5955).Это исправление влияет на сборку Tarantool со встроенной библиотекой
libcurl
(стандартный тип сборки).