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.cfgoptions 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 немедленно завершит работу, не дожидаясь окончания обработки оставшихся триггеров.
С помощью нового API
on_shutdown(gh-5723) разработчики модулей Tarantool могут указывать функции, которые будут вызываться при остановке Tarantool. Подробнее: Function 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.cfgcan 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(стандартный тип сборки).