Top.Mail.Ru
Релизы Tarantool в августе 2021 | Tarantool
Примечания к версиям Релизы Tarantool в августе 2021

Релизы Tarantool в августе 2021

Релизы Tarantool в августе 2021

Дата: 2021-08-19

В августе 2021 года вышли новые релизы Tarantool: v. 2.8.2, v. 2.7.3 и v. 1.10.11.

Кроме того, выпущен бета-релиз v. 2.10.0-beta1.

Алгоритм восстановления после сбоев, основанный на Raft, теперь входит в состав сборки Tarantool. Используйте этот алгоритм, чтобы повысить безопасность данных и надежность приложений Tarantool.

Пишите приложения с интерактивными транзакциями на любом языке программирования по вашему выбору.

Эти транзакции теперь поддерживает протокол iproto, и их могут использовать приложения на любом языке.

Tarantool 2.x обратно совместим с Tarantool 1.10.x в отношении структуры двоичных данных, клиент-серверного протокола и протокола репликации.

Чтобы получить доступ ко всем новым функциям серии 2.x, обновите Tarantool с помощью box.schema.upgrade().

Некоторые изменения помечены как [Критическое изменение]. Это означает, что старое поведение, вызывавшее сбои, было изменено, чтобы защитить пользователей от непреднамеренных ошибок. Тем не менее есть небольшая вероятность, что кто-то из пользователей будет полагаться на старое поведение. Поэтому, чтобы привлечь внимание к изменениям, была добавлена особая пометка.

  • Информацию о состоянии синхронной репликации теперь можно получить через интерфейс box.info.synchro (v. 2.7.3, v. 2.10.0-beta1, gh-5191).

  • Тип поля UUID теперь входит в тип SCALAR (v. 2.10.0-beta1, gh-6042).

  • В SQL теперь есть поля типа UUID. Чтобы создать UUID-значение, можно использовать новую встроенную функцию UUID() (v. 2.10.0-beta1, gh-5886).

  • [Критическое изменение] Метод timeout() соединения net.box, объявленный устаревшим более четырех лет назад (в релизе 1.7.4), теперь удален. Он ухудшал производительность часто используемых методов net.box, например call() и select(), если их вызывали, не указывая тайм-аут (v. 2.10.0-beta1, gh-6242).

  • Переписаны на языке C часто используемые участки кода net.box, что улучшило производительность этого модуля в пределах 70% (v. 2.10.0-beta1, gh-6241).

  • Добавлены компактные кортежи для небольших пользовательских данных. Каждый такой кортеж занимает на 4 байта меньше обычного (v. 2.10.0-beta1, gh-5385)

  • Теперь в протоколе iproto реализованы стримы (streams), где совершаются интерактивные транзакции. У каждого стрима есть идентификатор ID, уникальный внутри соединения. Все запросы с одним и тем же ненулевым ID относятся к одному стриму и обрабатываются синхронно: следующий запрос не начинает выполняться, пока не завершен предыдущий. Запросы с ID, равным 0, не привязаны к конкретному стриму и обрабатываются по-старому.

    В модуле net.box стрим (stream) — это объект-обертка вокруг соединения. Он обладает теми же методами, но может выполнять запросы последовательно. ID потока создается на стороне клиента автоматически. Чтобы задействовать стримы с пользовательскими коннекторами, необходимо передавать stream_id по протоколу iproto.

    Основное предназначение стримов — выполнение транзакций через протокол iproto. Поскольку каждый стрим может запустить транзакцию, одно соединение способно мультиплексировать несколько транзакций. Начать транзакцию, сделать ее коммит и отменить ее можно, используя с синтаксисом транзакции SQL различные методы стрима: call, eval или execute. Пользователь может смешивать эти методы. Например, можно начать транзакцию с помощью stream:begin(), а коммит провести, используя stream:call('box.commit') или stream:execute('COMMIT'). Если какой-либо запрос завершится ошибкой во время транзакции, это не повлияет на остальные запросы. Если во время активной транзакции в стриме произойдет сбой подключения, эта транзакция будет отменена, если она не прошла коммит до сбоя.

  • В box.cfg{} добавлена настройка memtx_allocator. Она позволяет при необходимости выбрать подходящий аллокатор для кортежей memtx. Возможные значения: system для аллокатора malloc и small для аллокатора по умолчанию.

    Реализован системный аллокатор на основе malloc. У аллокатора slab, который используется для кортежей, есть особый недостаток: он может приводить к неразрешимой фрагментации при определенных рабочих нагрузках (миграции размера). В этом случае пользователю нужна возможность выбрать другой аллокатор. Системный аллокатор основан на функции malloc, но ограничен той же квотой, что и аллокатор slab. Системный аллокатор не распределяет всю память в начале, а выделяет ее по мере необходимости, проверяя, не превышена ли квота (v. 2.10.0-beta1, gh-5419).

  • Добавлено поле box.info.replication[n].downstream.lag, позволяющее отслеживать состояние репликации. Значение этого поля — временной промежуток между моментом, когда основной узел записывает транзакцию в WAL-файл, и моментом, когда приходит подтверждение для этой транзакции от реплики (v. 2.10.0-beta1, gh-5447).
  • Добавлены триггеры on_election. Их можно зарегистрировать через интерфейс box.ctl.on_election() и запускать асинхронно при каждом изменении box.info.election (v. 2.10.0-beta1, gh-5819).

  • В файле luajit-gdb.py добавлена поддержка режима LJ_DUALNUM (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6224).
  • Добавлена предварительная поддержка GNU/Linux ARM64 и MacOS M1 (v. 2.10.0-beta1). Решены следующие проблемы:
    • Добавлена поддержка всего 64-битного интервала значений lightuserdata (gh-2712).
    • Теперь выделяемые адреса всегда занимают меньше 48 бит. Запрос памяти у ОС при вызове mremap всегда возвращает не более чем 47-битные адреса (gh-2712).
    • Исправлено распознавание архитектуры M1 (gh-6065).
    • Исправлена обработка переменного количества аргументов в библиотеке FFI для архитектуры M1 (gh-6066).
    • Исправлено поведение table.move при реаллокации таблицы (gh-6084).
    • Исправлена несогласованность стека Lua, возникавшая, когда функция xpcall на ARM64 вызывалась с недопустимым вторым аргументом (gh-6093).
    • Исправлена семантика байт-кода BC_USETS для закрытых значений и серых строк.
    • Исправлен патчинг инструкции безусловного перехода (jump) на сторонний выход из трассы с учетом допустимых диапазонов прыжков для архитектуры ARM64 (gh-6098).
    • Ранее на архитектуре ARM64 текущая Lua-корутина не восстанавливалась на пути исключения. Теперь эта ошибка исправлена (gh-6189).

  • Добавлен новый метод table.equals. Он сравнивает значения двух таблиц с помощью метаметода __eq (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1).

  • В модуль digest добавлены новые типы хэш-сумм: xxhash32 и xxhash64 (v. 2.10.0-beta1, gh-2003).

  • Новая функция fiber_object:info() позволяет получать информацию от файбера. Функция работает аналогично require(fiber).info(), но только для одного файбера (v. 2.10.0-beta1).
  • Новая функция fiber_object:csw() позволяет получать от файбера значение csw (Context SWitch, переключение контекста). Также теперь значение csw нового файбера всегда равно нулю. Раньше оно могло быть положительным (v. 2.10.0-beta1, gh-5799).
  • Изменен вывод функции fiber.info(). Из него исключена обратная трассировка файберов в состоянии idle (v. 2.10.0-beta1, gh-4235).

  • Модуль log теперь поддерживает символьное представление уровней журналирования: можно указывать уровни так же, как при вызове box.cfg{} (v. 2.8.2, v. 2.10.0-beta1, gh-5882).

    Например, вместо

    require('log').cfg{level = 6}
    

    можно использовать

    require('log').cfg{level = 'verbose'}
    

  • Описание ошибок несоответствия и несовместимости типов стало более информативным (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6176).

  • Удалено явное приведение BOOLEAN к числовым типам, а числовых типов — к значениям BOOLEAN (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-4770).

    Например, в версии 2.8 значение выражения CAST(FALSE AS INTEGER) было 0. Теперь такое выражение вызывает ошибку.

  • Удалено явное приведение VARBINARY к числовым типам, а числовых типов — к значениям VARBINARY (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-4772, gh-5852).

  • Исправлена ошибка, из-за которой строку, не заканчивающуюся NULL, нельзя было перевести в BOOLEAN, даже если по правилам преобразование было бы успешным (v. 2.8.2, v. 2.10.0-beta1, v. 2.7.3).

  • Теперь числовое значение может приводиться к другому числовому типу, только если приведение точное. Кроме того, значение UUID не может быть неявно преобразовано в STRING/VARBINARY, а STRING/VARBINARY — в UUID (v. 2.10.0-beta1, gh-4470).

  • Теперь любое число можно сравнить с любым числом, а значение любого скалярного типа — с любым значением того же типа. Значения нечислового скалярного типа нельзя сравнивать со значениями других скалярных типов (v. 2.10.0-beta1, gh-4230).

  • Из системного спейса _func удалены встроенные функции SQL (v. 2.10.0-beta1, gh-6106).

  • Каждая функция теперь ищется сначала среди встроенных функций SQL, а затем в пользовательских функциях (v. 2.10.0-beta1).

  • Когда неправильно используется функция, устанавливающая значение по умолчанию, появляется сообщение об ошибке. Теперь оно исправлено (v. 2.10.0-beta1).

  • Результат вызова функции TYPEOF() с аргументом NULL теперь NULL, если тип аргумента невозможно определить из контекста (v. 2.10.0-beta1, gh-5956). Кроме того, TYPEOF(-NaN) теперь возвращает DOUBLE, а TYPEOF(map_column)VARBINARY, не map, как раньше.

    Например, в версии 2.8 значение выражения SELECT TYPEOF(NULL) было BOOLEAN. Теперь оно NULL.

  • В SQL переработаны типы SCALAR и NUMBER. Удалено неявное приведение значений SCALAR к другим скалярным типам, а значений NUMBER — к другим числовым типам. Это означает, что для значений SCALAR и NUMBER больше не разрешены ни арифметические, ни побитовые операции, а также не поддерживается конкатенация. Кроме того, любое значение SCALAR теперь можно сравнивать по правилам этого типа со значениями любого другого скалярного типа (v. 2.10.0-beta1, gh-6221).

  • Теперь в SQL есть поля типа DECIMAL. Добавлено неявное преобразование как из INTEGER и DOUBLE в DECIMAL, так и в обратном направлении. Значения типа DECIMAL можно использовать в арифметических операциях и сравнениях вместе со значениями других определенных числовых типов (v. 2.10.0-beta1, gh-4415).

  • [Критическое изменение] Типы аргументов встроенных функций SQL теперь обычно проверяются во время парсинга. Кроме того, в это время всегда проверяется количество аргументов (v. 2.10.0-beta1, gh-6105).

  • [Критическое изменение] Для типа данных NUMBER теперь недопустимы ни арифметические операции (+ * - / % & | ~), ни операции сдвига (>> <<) (v. 2.10.0-beta1).

    Например, в версии 2.8 запрос SELECT number_column + 1 мог выполниться. Теперь он вызывает ошибку.

  • [Критическое изменение] Для типа данных SCALAR теперь недопустимы ни арифметические операции (+ * - / % & | ~), ни операции сдвига (>> <<), ни конкатенация (||). В столбцах типа SCALAR теперь содержатся значения только этого типа, а не исходных типов (v. 2.10.0-beta1).

    Например, в версии 2.8 значение выражения TYPEOF(CAST(1 AS SCALAR)) было INTEGER. Теперь оно SCALAR.

  • [Критическое изменение] Арифметические операции теперь требуют числовых операндов. Строковые операнды недопустимы.

    Например, в версии 2.8 значение выражения SELECT 1 + '1' было 2. Теперь выражение вызывает ошибку.

  • [Критическое изменение] Для столбцов типа SCALAR операции сравнения и функции, требующие определенного типа, больше не работают. Тип значения больше не определяет, является ли операция допустимой.

    Например, запрос UPPER(scalar_column) к таблице T с одной строкой со скалярным столбцом, содержащим символ 'a', в версии Tarantool 2.8 выполнялся с результатом 'А'. Теперь такой запрос вызывает ошибку.

  • [Критическое изменение] Аргументы типа STRING для функции HEX() больше не поддерживаются. Разрешены только аргументы типа VARBINARY (v. 2.10.0-beta1).

    Например, в версии 2.8 значение выражения HEX('a') было '41'. Теперь выражение вызывает ошибку.

  • [Критическое изменение] Для функции POSITION() аргументы типа VARBINARY больше не допускаются. Разрешены только аргументы типа STRING (v. 2.10.0-beta1).

    Например, в версии 2.8 значение выражения POSITION(X'41',X'41') было 1. Теперь выражение вызывает ошибку.

  • Установлен параметр FORCE_CONFIG=false, чтобы конфигурация luarocks могла загружать файл .rocks/config-5.1.lua на стороне проекта (v. 2.10.0-beta1).

  • Теперь поддерживаются сборки для Fedora 34 (v. 2.8.2, v. 2.10.0-beta1, gh-6074).
  • Сборки для Fedora 28 и 29 больше не поддерживаются.

  • [Критическое изменение] Запуск функций fiber.wakeup() в Lua и fiber_wakeup() в C больше не срабатывает в текущем файбере. Ранее эти функции позволяли игнорировать следующий переход в спящий режим или передачу управления с помощью yield, что приводило к неожиданным ошибочным пробуждениям. Вызов функций непосредственно перед fiber.create() в коде на Lua или fiber_start() в коде на C в отладочной сборке мог привести к сбою, а в релизной — к неопределенному поведению (gh-6043).

    Прежнее поведение отличалось от fiber.sleep(0) в Lua и fiber_sleep(0) в C и было полезно в единственном случае — когда требовалось запланировать дальнейшее выполнение файбера на конец текущей итерации событийного цикла. Ниже показано, как это можно было сделать.

    На C:

    fiber_wakeup(fiber_self());
    fiber_yield();
    

    На Lua:

    fiber.self():wakeup()
    fiber.yield()
    

    Чтобы добиться того же результата в C, можно использовать fiber_reschedule(). В Lua теперь невозможно перепланировать выполнение файбера на конец текущей итерации событийного цикла. Файбер может изменить свое место в цикле через другой файбер, но это категорически не рекомендуется:

    -- не используйте этот код
    local self = fiber.self()
    fiber.new(function() self:wakeup() end)
    fiber.sleep(0)
    
  • Исправлена утечка памяти в функциях box.on_commit() и box.on_rollback() (gh-6025).

  • Функция fiber_join() теперь проверяет, является ли ее аргумент файбером, который можно присоединить. Отсутствие этой проверки могло бы привести к непредсказуемым результатам. Обратите внимание, что изменение затрагивает только уровень C. В интерфейсе Lua защита функции fiber:join() уже включена (v. 2.8.2, v. 2.10.0-beta1, v. 2.7.3).

  • Теперь Tarantool выполняет yield, когда сканирует файлы .xlog в поиске последних примененных векторных часов (vclock) и точки восстановления. Это означает, что экземпляр начинает реагировать сразу после вызова box.cfg, даже если пустой .xlog не был создан при предыдущем завершении работы.

    Это исправление также предотвращает тайм-аут потока relay в случае, когда только что включенной в кластер реплике требуются строки из конца относительно длинного (сотни мегабайт) файла .xlog (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5979).

  • Счетчик в сообщениях журнала N rows processed (обработано N строк) больше не сбрасывается при каждом вновь восстановленном файле .xlog (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1).

  • Изменения состояния файбера теперь печатаются без ошибок. Неправильная спецификация типа раньше приводила к тому, что в журнал записывались отрицательные идентификаторы файберов (v. 2.10.0-beta1, gh-5846).

    Например, так:

    main/-244760339/cartridge.failover.task I> Instance state changed
    

    вместо правильного варианта:

    main/4050206957/cartridge.failover.task I> Instance state changed
    
  • Идентификаторы файберов теперь представляют собой монотонно увеличивающиеся 8-байтовые беззнаковые целые, поэтому больше нет перехода ID через ноль. Так что теперь можно определять порядок запуска файберов по их идентификаторам (v. 2.10.0-beta1, gh-5846).

  • Исправлена ошибка обновления JSON в кортеже/спейсе, которая возникала, когда две или более операции обращались к несуществующим полям в обратном порядке. Пример: box.tuple.new({1}):update({{'=', 4, 4}, {'=', 3, 3}}) (v. 2.8.2, v. 2.10.0-beta1, gh-6069).

  • Исправлена ошибка, из-за которой функция encode модуля json возвращала некорректные результаты, когда вызывалась из сборщика мусора Lua — например, через функцию-финализатор, установленную на объект с помощью ffi.gc() (gh-6050).

  • Теперь количество введенных пользователем потоков iproto проверяется: значение должно быть больше нуля и не больше 1000 (v. 2.8.2, v. 2.10.0-beta1, gh-6005).

  • Изменение адреса из списка больше не может привести к тому, что потоки iproto будут закрывать один и тот же сокет несколько раз (v. 2.8.2, v. 2.10.0-beta1)

  • Tarantool теперь всегда корректно удаляет Unix-сокет при завершении работы (v. 2.8.2).

  • Одновременное обновление ключа в разных транзакциях больше не приводит к сбою механизма MVCC (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6131).

  • Исправлена ошибка, из-за которой механизм MVCC движка memtx аварийно завершал работу при чтении не прошедшего коммит DDL-запроса (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5515).

  • Исправлена ошибка, из-за которой механизм MVCC движка memtx аварийно завершал работу, если в потоке обработчика транзакций создавался индекс (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6137).

  • Исправлена ошибка сегментации в механизме MVCC, возникавшая, когда спейс целиком обновлялся посредством нескольких параллельных транзакций (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5892).

  • Исправлена ошибка, приводившая к сбою проверочного утверждения после стресс-обновления одного и того же ключа (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6193).

  • Исправлен сбой, из-за которого команду box.snapshot можно было вызвать до завершения транзакции (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6229).

  • Исправлен сбой подключения консольного клиента, возникавший при тайм-ауте запроса (gh-6249).

  • В функцию net.box.future:discard() добавлена отправка широковещательного сообщения. Теперь файберы, ожидающие результата запроса, просыпаются, когда запрос отбрасывается (gh-6250).

  • Раньше, если в коде пользователя были обработчики __gc, то функции box.info.uuid, box.info.cluster.uuid и tostring(decimal) с любым десятичным числом в Lua иногда могли возвращать мусор. Эта ошибка исправлена (v. 2.8.2, v. 2.7.3, gh-6259).

  • Исправлено сообщение об ошибке, которое могло приводить к сбою в конкретном случае во время работы MVCC (gh-6247).

  • Исправлено нарушение повторяющегося чтения, возникавшее после операции удаления (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6206).

  • Исправлена ошибка, из-за которой движок MVCC не отслеживал хэш select{} (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6040).

  • Исправлен сбой в MVCC, возникавший после удаления спейса с несколькими индексами (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6274).

  • Исправлена ошибка, из-за которой сборщик мусора мог оставлять кортежи во вторичных индексах (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6234).

  • Запрещена передача управления через yield после DDL-операций в режиме MVCC. Это исправило сбой, который происходил, когда несколько транзакций ссылались на системные спейсы (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5998).

  • Исправлена ошибка в механизме MVCC, возникавшая при отмене операции DDL (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5998).

  • Исправлена ошибка, из-за которой отмена транзакции приводила к несериализуемому поведению (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6325).

  • Ранее при построении вторичного индекса могли расходиться ключи, что иногда приводило к потере кортежей. Эта ошибка исправлена (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6045).
  • Ликвидирована гонка в Vinyl между сборкой мусора и слиянием, приводившая к повреждению vylog и сбою восстановления (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5436).

  • Исправлен cбой обращения к памяти в потоке relay при включенных выборах лидера (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6031).
  • Устранена вероятность сбоя в момент, когда за синхронной транзакцией следует асинхронная, а подтверждение первой еще записывается (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6057).
  • Исправлена ошибка, из-за которой реплика при попытке подписаться на внешний кластер с другим UUID набора реплик не замечала, что это невозможно, и вместо этого попадала в бесконечный цикл повторных попыток, выводя ошибку TOO_EARLY_SUBSCRIBE (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6094).
  • Исправлена ошибка, из-за которой реплика при попытке присоединиться к кластеру с репликами, доступными только для чтения, просто использовала собственный набор реплик, вместо того чтобы сообщить о сбое или повторить попытку. Теперь такая ситуация приводит к сбою с сообщением об ошибке, объясняющим, что другие узлы доступны только для чтения и поэтому не могут зарегистрировать новую реплику (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5613).
  • Исправлены сообщения об ошибках, связанных с транзакциями, которые были получены от удаленных экземпляров через репликацию. Любая ошибка, возникавшая во время применения такой транзакции, всегда сопровождалась сообщением «Не удалось записать на диск» (Failed to write to disk), независимо от того, что произошло на самом деле. Теперь ошибка отображается правильно. Например: «Не хватает памяти» (Out of memory) или «Транзакция прервана из-за конфликта» (Transaction has been aborted by conflict) (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6027).
  • Исправлен сбой, из-за которого репликация иногда останавливалась с ошибкой ER_INVALID_MSGPACK, когда реплика была под высокой нагрузкой (gh-4040).
  • Исправлена ошибка, из-за которой кластер иногда не мог загрузиться, если содержал узлы, у которых для параметра election_mode установлено значение manual или voter (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6018).
  • Исправлен сбой, иногда происходивший при вызове функции box.ctl.promote() в кластере с более чем тремя экземплярами. Сбой возникал в отладочной сборке и мог приводить к неопределенному поведению в релизной сборке. Эта проблема обычно проявлялась, если незадолго до вызова box.ctl.promote() добавлялся новый узел (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5430).
  • Исправлена редкая ошибка, возникавшая, когда более чем одна реплика присоединялась к кластеру при включенном механизме MVCC (box.cfg.memtx_use_mvcc_engine = true). Ранее присоединение могло завершаться с ошибкой ER_TUPLE_FOUND: Duplicate key exists in unique index 'primary' in space '_cluster'. То же самое могло происходить при инициализации кластера с более чем тремя узлами (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5601).

  • Исправлен редкий сбой, возникавший при включенных выборах лидера (значение параметра election_mode — любое, кроме off). Этот сбой мог произойти, если лидер отказался от своей роли, а другой узел в это время записывал в WAL что-то, связанное с выборами. Сбой происходил в отладочной сборке, а в релизной сборке наблюдалось неопределенное поведение (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6129).
  • Исправлен сбой, из-за которого новая реплика в кластере Raft пыталась присоединиться не от лидера, а от другой реплики, что приводило к ошибке ER_READONLY (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6127).

  • Исправлена оптимизация для односимвольных строк в процедуре сборки IR_BUFPUT.
  • Исправлено выравнивание в выводе команды lj-stack при включенном параметре LJ_GC64 (gh-5876).
  • В выводе команды lj-stack исправлено отображение стека Lua без вызванных функций.
  • Исправлено обнаружение несогласованных переименований. Теперь оно также работает при наличии слотов, не предполагающих аллокацию памяти под объекты (sunk values) (gh-4252, gh-5049, gh-5118).
  • Исправлен порядок аллокации регистров виртуальных машин, обеспечиваемый интерфейсом LuaJIT в случае BC_ISGE и BC_ISGT (gh-6227).

  • Исправлена ошибка, из-за которой многобайтовые символы нарушали вывод команды space:fselect() (v. 2.10.0-beta1).
  • Когда во время кодирования результатов вызова возникала ошибка, вспомогательное значение lightuserdata не удалялось из стека главной корутины Lua. До исправления это приводило к неопределенному поведению при следующем использовании этой корутины (gh-4617).
  • Исправлен сбой, из-за которого API для языка C в Lua использовался некорректно. Ранее об ошибке в незащищенной корутине объявлялось во время кодирования результатов вызова, а затем ожидалось, что эта ошибка будет обработана в другой, защищенной корутине (gh-6248).

  • Исправлен сбой, связанный с тем, что триггер удалял сам себя. Исправлен также сбой, возникавший при удалении триггера в момент, когда тот передавал управление с помощью yield (gh-6266).

  • Пользовательские функции теперь могут возвращать в SQL результат типа VARBINARY (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6024).
  • Устранен сбой, возникавший, когда значение типа DOUBLE больше -1.0 и меньше 0.0 приводилось к типу INTEGER или UNSIGNED (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-6225).
  • Устранено самопроизвольное преобразование из INTEGER в DOUBLE в поле типа NUMBER (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5335).
  • Все арифметические операции теперь принимают только числовые значения (v. 2.8.2, v. 2.7.3, v. 2.10.0-beta1, gh-5756).
  • Теперь функция QUOTE() возвращает свой аргумент, если его тип — DOUBLE. Это соответствует ее поведению для других числовых типов. Для нечисловых типов функция возвращает результат типа STRING (v. 2.10.0-beta1, gh-6239).
  • Функция TRIM() теперь не теряет настройки сравнения символов, когда выполняется с ключевыми словами BOTH, LEADING или TRAILING (v. 2.10.0-beta1, gh-6299).

  • Исправлена ошибка, возникавшая во время исполнения SQL-запроса при включенном механизме MVCC (v. 2.8.2, v. 2.10.0-beta1, gh-6095).
  • После конфликта кортежи больше не теряются (v. 2.8.2, v. 2.10.0-beta1, gh-6132).
  • Исправлена ошибка сегментации, возникавшая при обновлении/удалении одного и того же кортежа (v. 2.8.2, v. 2.10.0-beta1, gh-6021).