TDG Documentation portal logo
Помощь
Обновлена 22 июня 2026 г. в 15:31

Журнал изменений

На этой странице находится актуальная информация о версиях Tarantool Data Grid. Формат журнала изменений основан на документе Keep a Changelog, а версионирование следует правилам Semantic Versioning.

[2.20.0] - 2026-10-07

Обновления TDG

Добавлено:

  • История конфигурации теперь по умолчанию хранит 50 последних версий конфигурации. Спейсы архива конфигурации очищаются при первом запуске после обновления.

  • Опция extra_body для output-коннекторов HTTP: дополнительные поля добавляются к телу отправляемого JSON-запроса. Параметр поддерживает только format: json и несовместим с методом GET:

    output:  - name: http_output    type: http    url: http://example.com/    format: json    extra_body:      source: tdg
  • Поддержка переопределения параметров TLS/SSL (ssl_cert_file, ssl_key_file, ssl_password, ssl_password_file, ssl_ca_file, ssl_ciphers, ssl_verify_client) для input-коннекторов HTTP, которые слушают пользовательский порт (опция port) вместо того, чтобы всегда наследовать их от HTTP-сервера по умолчанию.

  • Снижено потребление памяти на каждый вызов net.box/vshard: контекст запроса, передаваемый между экземплярами кластера, теперь урезан до полей, которые читает удалённый код (id, account, version, sample, explain), — объём сериализованных данных уменьшился с ~4 КБ до ~200 Б на вызов.

  • Детектор медленного сканирования. Теперь сканирования repository.find() и версионирования, которые выполняются слишком долго, регистрируются с дополнительной диагностической информацией. Эта информация дополняет предупреждения о срезах файбера (fiber slice), которые сами по себе не содержат достаточного контекста для отладки медленных запросов.

  • Атомарные операции add и compare_and_set в общее хранилище песочницы. Операция get теперь также возвращает поколение значения, которое можно передать в compare_and_set, чтобы не перезаписать значение, изменённое конкурентно.

  • Опции setpause и setstepmul в раздел конфигурации gc для настройки инкрементальной сборки мусора без включения принудительной сборки.

  • Проверка срока действия сертификатов расширена на ssl_cert для HTTP-выводов и ssl_cert_file и ssl_ca_file для HTTP-вводов. Отсутствующие или нечитаемые файлы сертификатов теперь сообщаются как критические проблемы.

  • Добавлена метрика tnt_is_replication_healthy.

  • Добавлена аутентификация через внешнего провайдера идентификации (identity provider) OpenID Connect, в частности Keycloak.

    Раньше TDG проверял только те учётные данные, которыми владел сам: логин и пароль, собственные токены приложений и LDAP. В организации, где доступ управляется централизованно в Keycloak, учётные записи TDG приходилось создавать и отзывать отдельно. Теперь клиент может получить токен из Keycloak и передать его в TDG. TDG самостоятельно проверяет подпись токена и сопоставляет группы пользователя со своими ролями. Пользователь при этом не обязан существовать в TDG.

    Токен передаётся в стандартном заголовке:

    Authorization: Bearer <JWT>

    Встроенный верификатор поддерживает входящие JWT-токены, подписанные асимметричным ключом. Его подключения для discovery и JWKS поддерживают proxy, proxy_port, proxy_user_pwd и no_proxy. Интерактивный вход в браузере с перенаправлением в Keycloak (Authorization Code Flow) не встроен. Расширение может реализовать интроспекцию по RFC 7662, в том числе для непрозрачных токенов доступа, как описано ниже в разделе Точки расширения.

    Исходящие HTTP-выводы (output). HTTP-вывод может получить токен доступа OAuth 2.0 с помощью Client Credentials и отправить его как Authorization: Bearer. Это не зависит от входа через Keycloak и поддерживает непрозрачные токены доступа. Ответ адреса обработки запросов токена (token endpoint) обычно содержит положительное числовое значение expires_in, которое TDG использует для кэширования и обновления токена. RFC 6749 делает этот элемент необязательным: для такого адреса обработки запросов задайте положительное значение параметра token_ttl в секции auth как явное резервное время жизни. В подключении можно задать TLS-, proxy- и транспортные опции встроенного верификатора, в том числе proxy, proxy_port, proxy_user_pwd и no_proxy. Опции применяются к запросу токена независимо от запроса вывода:

    connector:  output:    - name: external-api      type: http      url: https://api.example.com/events      format: json      auth:        type: oauth2_client_credentials        token_url: https://sso.example.com/token        client_id: tdg-output        client_secret: secret        scopes: [events.write]

    По умолчанию клиент аутентифицируется на адресе обработки запросов токена с помощью HTTP Basic (RFC 6749, раздел 2.3.1). Если адрес обработки запросов ожидает учётные данные в теле запроса, задайте для параметра token_endpoint_auth_method значение client_secret_post. Другое допустимое значение, client_secret_basic, используется по умолчанию. Такой запрос не содержит заголовка Authorization и передаёт client_id и client_secret как поля формы.

    Параметр auth.type принимает только значение oauth2_client_credentials. Для Keycloak адрес обработки запросов токена выглядит как строка вида <issuer>/protocol/openid-connect/token, например https://keycloak.example.com/realms/tdg/protocol/openid-connect/token (Keycloak до версии 17 добавляет /auth перед /realms). Оба способа аутентификации клиента работают с конфиденциальным клиентом, у которого включены сервисные аккаунты.

    Токены кэшируются отдельно для каждого вывода и обновляются до истечения срока действия, параллельные запросы совместно используют одно обновление. Непредвиденная ошибка во время обновления токена завершает его как недоступный адрес обработки запросов и никогда не оставляет ожидающие выполнения запросы в заблокированном состоянии. При применении конфигурации TDG никогда не обращается к адресу обработки запросов токена. Ответ 401 от сервера ресурсов делает недействительной только ту генерацию токена, которую использовал этот запрос, принудительные обновления ограничиваются по частоте. TDG никогда не повторяет запрос вывода автоматически.

    Место в цепочке аутентификации. Внешние провайдеры опрашиваются первыми, до собственных токенов TDG и cookie-сессий. Чтобы не нарушить существующие интеграции, провайдер Keycloak реагирует только на то, что выглядит как JWT — значение после Bearer , которое состоит из трёх непустых частей, разделённых точками. Всё остальное провайдер передаёт дальше по цепочке, поэтому токены приложений TDG не затрагиваются. Токен, который выглядит как JWT, но не проходит проверку, отклоняется с кодом 401 и телом Invalid Keycloak token. В этом случае резервного пути нет. Отказы сопровождаются заголовком ответа WWW-Authenticate: Bearer error="invalid_token".

    Конфигурация. Новая секция кластерной конфигурации auth_providers задает внешние провайдеры аутентификации. В секции auth_providers можно задать несколько провайдеров keycloak — по одному на каждый уникальный идентификатор издателя токена issuer. У каждого провайдера задаются уникальное имя (name, начинается с буквы или _ и содержит только буквы, цифры, _ и -), тип провайдера (type: keycloak) и настройки провайдера (options).

    auth_providers:  - name: keycloak-main    type: keycloak    options:      issuer: https://keycloak.example.com/realms/tdg      audience: [tdg-api]      groups_claim: realm_access.roles      roles:        - role: admin          groups:            - tdg-admins        - role: data-reader          groups:            - tdg-analysts            - tdg-support

    Полный список параметров конфигурации auth_providers и опций встроенного верификатора oidc_jwks приведён в справочнике по настройке auth_providers.

    Несколько областей (realm). Если провайдеров несколько, для каждого провайдера также должен быть задан свой уникальный непустой issuer. TDG читает непроверенное поле iss только для выбора провайдера. Доступ не предоставляется, пока выбранный провайдер не проверит подпись и все настроенные поля, поэтому JWT для другой настроенной области (realm) проходит мимо предыдущего провайдера. Токен с совпадающим issuer, не прошедший проверку подписи, отклоняется и не может быть принят последующим провайдером. Два провайдера с совпадающим идентификатором токена отклоняются как неоднозначные. Унаследованный пользовательский верификатор без идентификатора поддерживается, если он единственный провайдер Keycloak.

    auth_providers:  - name: keycloak-internal    type: keycloak    options:      issuer: https://keycloak.example.com/realms/internal      audience: [tdg-api]      roles: [{role: admin, groups: [/tdg/admin]}]  - name: keycloak-partners    type: keycloak    options:      issuer: https://keycloak.example.com/realms/partners      audience: [tdg-partner-api]      roles: [{role: user, groups: [/tdg/users]}]

    Имена TLS и транспортных опций совпадают с теми, что уже использует output-коннектор HTTP, TDG передаёт их HTTP-клиенту без изменений.

    Если параметр не объявлен ни провайдером, ни выбранным верификатором, он вызывает ошибку при проверке конфигурации. Такой подход позволяет отслеживать опечатки. Исключением является верификатор, который не публикует свои опции в capabilities.options. Такой верификатор не проверяется, поскольку TDG не может определить, какие имена принимать.

    Ограничение клиентов, которым разрешено обращаться к TDG. Токен принимается, когда его поле aud пересекается с audience. Конфигурация клиента в Keycloak определяет, что попадет в поле aud. Чтобы поле содержало идентификатор TDG, администратор области добавляет клиенту маппер протокола Audience. Без него aud содержит значение области по умолчанию — такое есть у каждого токена этой области и оно ничего не ограничивает.

    Клиентов также можно ограничить по полю azp. Keycloak указывает в этом поле идентификатор клиента, которому выдан токен, и клиент не влияет на это значение. Опция max_token_age дополнительно ограничивает возраст принятого токена, когда время жизни токена нельзя изменить в Keycloak.

    options:  issuer: https://keycloak.example.com/realms/tdg  audience: [account]  authorized_parties:    - tdg-connector  max_token_age: 300

    Сопоставление групп с ролями. Каждое правило в roles сопоставляет роль TDG со списком групп. Параметр role хранит имя существующей системной или пользовательской роли TDG (например admin, supervisor или user). Если в поле указана несуществующая роль, она отклоняется при валидации конфигурации.

    Опция groups представляет собой непустой список групп, которые TDG ищет по полю, заданному в параметре groups_claim. Для опции достаточно одного совпадения, само поле при этом может быть строкой или списком строк. Пользователю назначаются все роли, чьи правила совпали. Токен с корректной подписью, но без подходящего правила отклоняется.

    Роль также можно сопоставить по идентификатору клиента Keycloak. Этот вариант подходит для сервисного аккаунта, который аутентифицируется через Client Credentials. Задайте groups_claim: azp и перечислите ожидаемые идентификаторы клиентов в опции groups. Здесь azp — это скалярное поле авторизованной стороны, а не роль Keycloak. Используйте также authorized_parties, если к TDG могут обращаться только выбранные клиенты. Предпочитайте azp специфичному для Keycloak полю клиента сервисного аккаунта: в Keycloak 21 он был переименован из clientId в client_id, тогда как azp содержит идентификатор клиента во всех версиях. Проверено с Keycloak 19, 20, 21, 22, 24 и 26.

    Учётная запись. Аутентифицированный пользователь получает временную учётную запись, которая существует только в течение времени обработки запроса. Эта учетная запись не требует предварительного создания и не хранится в списке пользователей TDG. Идентификатор учетной записи имеет вид keycloak:<имя провайдера>:<claim sub>. Отображаемое имя содержит поле claim preferred_username, email или sub, а источник — Keycloak.

    Что проверяется. Токен принимается, если соблюдаются условия ниже:

    • заголовок токена содержит kid и допустимый алгоритм;
    • если задана опция header_types, заголовок JOSE typ входит в header_types;
    • поле typ из полезной нагрузки Keycloak входит в claim_types (по умолчанию принимается Bearer);
    • подпись подтверждается ключом с этим значением kid из локального снимка;
    • iss равен issuer;
    • aud пересекается с audience;
    • если задана опция authorized_parties, azp входит в authorized_parties;
    • exp присутствует и ещё не истёк (с учётом clock_skew);
    • nbf, если присутствует, уже наступил;
    • iat, если присутствует, не в будущем, а при заданном max_token_age он обязателен и токен не старше этого значения;
    • sub — непустая строка;
    • совпало хотя бы одно правило из опции roles.

    Каждая из трёх частей токена должна быть в канонической форме base64url без паддинга (RFC 7515, раздел 2). Паддинг, стандартный алфавит + и /, пробелы, другие символы или ненулевые хвостовые биты делают токен некорректным (malformed), так что один токен имеет ровно одно написание.

    Из JWKS берутся только те ключи, которые подходят для проверки подписи (use: sig или отсутствие use; и verify в key_ops, когда этот участник присутствует). Ключ с указанным alg используется только для этого алгоритма. Ключ без alg используется со всеми включёнными алгоритмами, совместимыми с его типом и кривой для ECDSA. RSA-ключи короче 2048 бит отклоняются. Токен сопоставляется со своим ключом только по значению kid, поэтому ключ без kid пропускается. Keycloak всегда его задаёт, а провайдер идентификации, публикующий единственный безымянный ключ, не поддерживается.

    Ключи и устойчивость. Подписи проверяются по локальному снимку набора ключей. TDG никогда не обращается к сети во время аутентификации. С Keycloak связывается только фоновый обработчик, поэтому задержки Keycloak не влияют на время ответа TDG.

    Первая перезагрузка ключей планируется в фоне при применении конфигурации, при этом применение конфигурации никогда не ждёт Keycloak. Если Keycloak в этот момент недоступен, конфигурация всё равно применяется, и после этого запускается экземпляр. Аутентификация завершается неудачей (fail closed), пока обработчик не загрузит снимок. Применение конфигурации происходит при каждом перезапуске, и недоступный провайдер идентификации не должен мешать запуску кластера. Неизменённый провайдер сохраняет свой верификатор и локальный снимок ключей, когда конфигурацию меняет другой провайдер. Снимок перезагружается каждые refresh_interval секунд. Токен с неизвестным kid обычно сигнализирует о том, что Keycloak сменил ключи. Такой токен отклоняется, но после этого запускается обработчик, поэтому следующая попытка выполняется успешно.

    Такие принудительные перезагрузки ограничены по частоте опцией min_refresh_interval, чтобы поток неизвестных ключей не превратился в поток запросов к Keycloak. Как только снимок становится старше jwks_ttl, токены перестают приниматься даже с корректной подписью, поскольку снимок больше не считается актуальным. Значение по умолчанию составляет один час, поскольку ключи подписи меняются редко, а токены несут собственный срок действия — короткий TTL превращал бы краткие сбои Keycloak в неудачные входы.

    Каждый экземпляр кластера запускает собственный обработчик и хранит собственный снимок, поскольку аутентифицировать запрос может любой экземпляр. Каждая перезагрузка загружает сначала документ discovery, а затем набор ключей. Для одного провайдера Keycloak выполняет два запроса на экземпляр каждые refresh_interval. При заданном jwks_url выполняется только один запрос. Непредвиденная ошибка внутри обработчика сохраняется в журнал и считается неудачной перезагрузкой, обработчик при этом продолжает работать.

    В журнал экземпляра попадают только смены состояния — по одной строке на переход:

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

    Отдельные отклонения токенов не записываются в журнал — путь аутентификации доступен без аутентификации, поэтому строка на каждый токен позволила бы любому вызывающему переполнить журнал. Успешные и отклонённые решения внешней аутентификации записываются в журнал аудита с уровнем INFO. Записи Keycloak содержат настроенный провайдер и, после проверки токена, его sub и идентификаторы сопоставленных ролей TDG.

    Отклонение токенов также содержит причину ошибки (reason) из закрытого набора кодов: malformed, unsupported_header, header_type, unknown_key, keys_unavailable, keys_stale, bad_signature, issuer, audience, authorized_party, claim_type, missing_exp, expired, not_yet_valid, issued_in_future, missing_iat, too_old, no_subject, role_unresolved, no_mapped_role и invalid_token для всего остального. Запись называет kid и alg заголовка JOSE как unverified_kid и unverified_alg, поскольку они читаются до проверки подписи. После проверки подписи запись также содержит подлинные поля sub, azp, aud и exp, чтобы отклонение по полю можно было объяснить, не доверяя вызывающему. Поля токена, не прошедшего проверку подписи, никогда не сообщаются. Управляющие символы в любых из этих значений заменяются. Тело ответа сохраняет общую причину, а текст ошибки верификатора токена по-прежнему не журналируется и не возвращается: возвращается только код ошибки из списка выше.

    Операционный статус. Запрос auth_provider_config также возвращает допускающий null runtime-статус status для верификаторов, которые его публикуют. Встроенный OIDC-верификатор сообщает один из статусов (ready, degraded, stale, unavailable или closed) вместе с количеством и возрастом кэшированных ключей, временными метками перезагрузки, очищенной ошибкой перезагрузки и признаком ожидающей принудительной перезагрузки:

    • статусы ready и degraded означают, что остался пригодный снимок;
    • статусы stale и unavailable означают отказ с блокировкой (fail closed).

    Такой же статус управляет проблемами Cartridge:

    • неудачная перезагрузка с пригодными ключами — предупреждение;
    • отсутствие пригодного снимка — критично.

    Тела ответов, токены, сертификаты и учётные данные никогда не раскрываются через этот статус. Статус, как и снимок, относится к одному экземпляру: auth_provider_config сообщает об экземпляре, обслужившем запрос, а проблемы Cartridge и метрики приходят с каждого экземпляра.

    Метрики. Состояние OIDC экспортируется по метке provider как метрики tdg_oidc_jwks_ready, tdg_oidc_jwks_snapshot_age_seconds и tdg_oidc_jwks_keys. Обновления экспортируются как tdg_oidc_jwks_refresh_total{provider,result} и tdg_oidc_jwks_refresh_duration_seconds{provider,result}, где result — success или failure; исходы аутентификации — tdg_oidc_auth_decisions_total{provider,decision}, где decision — accept, reject или fallback, а отклонение дополнительно несёт код reason, описанный выше.

    Активность адреса обработки запросов токена OAuth2 Client Credentials экспортируется как tdg_output_oauth2_token_requests_total{output,result} и tdg_output_oauth2_token_request_duration_seconds{output,result}, а срок действия токена, которым владеет вывод, — как tdg_output_oauth2_token_expiry_timestamp_seconds{output} (Unix-время, поэтому настройте предупреждение по нему через time()).

    Ряды провайдера или вывода удаляются, как только он исчезает из конфигурации. Рекомендуется настроить предупреждение, когда значение метрики tdg_oidc_jwks_ready равно 0 для провайдера, который должен обслуживать трафик. Кроме того, проверяйте продолжительные обновления result="failure" до того, как устареет локальный снимок.

    Подписи проверяются через символы OpenSSL, которые экспортирует Tarantool Enterprise. Дополнительные библиотеки не поставляются и не загружаются динамически.

    Стандарты. TDG проверяет токен как сторона, принимающая запрос к ресурсу. Реализовано в соответствии со спецификациями: заголовок bearer-токена (RFC 6750, раздел 2.1); JWS Compact Serialization и проверка подписи (RFC 7515); JWK и JWK Set, включая kty, kid, use и alg (RFC 7517); RSASSA-PKCS1-v1_5 с SHA-256/384/512 и ECDSA на кривых P-256/P-384/P-521 (RFC 7518, разделы 3.3 и 3.4); claims iss, sub, aud, exp, nbf и iat, где aud — строка или массив (RFC 7519, раздел 4.1); политика TDG, требующая iss, sub, aud и exp; claim azp, сопоставляемый с идентификатором клиента (OpenID Connect Core, раздел 3.1.3.7); discovery-документ и jwks_uri, причём идентификатор (issuer) внутри документа проверяется на соответствие тому, для которого он был запрошен (OpenID Connect Discovery 1.0, разделы 4 и 4.3). Следуя RFC 8725, используется алгоритм из настроенного списка разрешённых, а из заголовка токена, поэтому alg: none и симметричные алгоритмы отклоняются. JWK, объявляющий alg, ограничен им; поскольку в RFC 7517 alg необязателен, ключ без пометки (unlabelled) используется со всеми включёнными совместимыми асимметричными алгоритмами. Явная типизация токена (раздел 3.11) доступна через header_types, а claim_types покрывает claim из полезной нагрузки Keycloak.

    Не реализовано: RSASSA-PSS (PS256, PS384, PS512) и EdDSA (последний требует символ OpenSSL, который Tarantool Enterprise не экспортирует); зашифрованные токены (JWE, RFC 7516); jti и, как следствие, защита от повторного использования — проверка лишь наличия claim ничего не даёт, а для обнаружения повторов нужно хранилище увиденных идентификаторов, общее для экземпляров; а также встроенный отзыв токенов и интроспекция (RFC 7662). RFC 9068, JWT-профиль для OAuth 2.0 access-токенов, — ближайший документ к этому сценарию. Keycloak можно настроить на выпуск заголовка typ: at+jwt; инсталляции, которые его включают, могут требовать его через header_types: [at+jwt]. TDG не навязывает весь профиль формату токена Keycloak по умолчанию; роль, которую там играет client_id, принадлежит azp, проверяемому через authorized_parties.

    Проверка использует только сам токен и не обращается к серверу авторизации, поэтому токен, отозванный в Keycloak, остаётся действительным в TDG до его exp. Если не интроспектировать каждый токен (RFC 7662), стандартного способа узнать об отзыве нет: RFC 7009 описывает только отзыв токена его владельцем и не предлагает запроса в обратном направлении. Другие стороны, локально проверяющие JWT, ведут себя так же. Задержка отзыва задаётся временем жизни токена, настроенным в Keycloak, а max_token_age сокращает её на стороне TDG. HTTP-заголовки кэширования в ответах discovery и JWKS игнорируются в пользу jwks_ttl.

    API и веб-интерфейс. Провайдерами можно управлять, не редактируя кластерную конфигурацию вручную. В GraphQL-схеме admin, в разделе account_provider:

    • auth_provider_config возвращает настроенных провайдеров и возможности (capabilities), публикуемые каждым доступным верификатором;
    • auth_provider_add(name, type, options), auth_provider_update(name, newName, type, options) и auth_provider_delete(name) изменяют провайдеры. Параметр options передаётся как строка YAML.

    В веб-интерфейсе есть страница настроек Keycloak, поля которой следуют capabilities, публикуемым выбранным верификатором, поэтому при смене верификатора неподдерживаемые им опции скрываются, а поддерживаемые показываются. Значения audience, authorized_parties, типов токенов и алгоритмов вводятся по одному значению на строку. Встроенный верификатор также показывает свои настройки прокси (proxy) (в том числе поле секретных учётных данных прокси) и настройку транспорта за кнопкой «Расширенные HTTP-опции», которая открывается сама, когда одна из этих опций содержит значение, отличное от значения по умолчанию. Очистка поля типов claim токена сохраняет пустой список и, таким образом, принимает токен независимо от его claim typ; поле, оставленное со значением по умолчанию верификатора, не записывается в конфигурацию, поэтому открытие и сохранение провайдера не изменяет его. Отдельное поле пользовательских опций предназначено для верификаторов, зарегистрированных во время выполнения, которые объявляют имена опций, для которых в форме нет полей; оно не предлагается для встроенного oidc_jwks, чьи опции форма покрывает полностью, а опция, которую не объявляет ни провайдер, ни выбранный верификатор, отклоняется при применении конфигурации. Пока страница открыта, её колонка операционного состояния обновляется каждые 30 секунд. Это состояние текущего экземпляра TDG, а не агрегированное состояние кластера.

    Точки расширения. Пользовательский способ проверки токена Keycloak можно зарегистрировать при запуске, после этого он становится доступен через опцию token_verifier. Регистрацию необходимо выполнять на верхнем уровне модуля роли, включённого в cartridge.cfg, до того, как TDG начнёт валидацию конфигурации. Загрузка из управляемой конфигурацией директории пользовательских ролей не является поддерживаемым механизмом регистрации. Для верификатора интроспекции, который должен принимать непрозрачные (не-JWT) токены, необходимо задать значение accepts_opaque_tokens = true. Маршрутизация по идентификатору (issuer) JWT для таких токенов намеренно пропускается, поскольку у непрозрачного токена нет локально читаемого идентификатора. Непрозрачный токен, который верификатор не распознал, передаётся следующему провайдеру и встроенной аутентификации TDG:

    local keycloak = require('account_provider.keycloak')keycloak.register_token_verifier('custom_runtime', {    validate_config = function(options, provider_cfg, prefix, checks)        -- Deterministic option checks, run before the config is applied.    end,    create = function(options, provider_cfg)        -- Build caches and workers while configuration is being applied.        local verifier = create_verifier(options, provider_cfg)        return {            verify = function(token)                return verifier:verify(token)            end,            close = function()                verifier:close()            end,        }    end,    capabilities = {        alg = 'CUSTOM',        options = {'issuer', 'audience'},        accepts_opaque_tokens = true,    },})

    Верификатор может задать поле code в возвращаемой ошибке, и TDG передаст в нём один из кодов ошибки (reason). Поля (claims), относящиеся к этой ошибке, передаются только для встроенного верификатора, для которого TDG выполняет проверку подписи самостоятельно.

    Здесь подходит верификатор интроспекции (RFC 7662): verify выполняется на пути аутентификации каждого запроса, поэтому кэшируйте его результат с коротким TTL и ограниченным размером, сами проверяйте active, exp и aud и оборачивайте встроенный верификатор (require('account_provider.keycloak.oidc').verifier()), когда провайдер выдаёт JWT, а интроспекция лишь добавляет проверку отзыва. Не задавайте accepts_opaque_tokens, если непрозрачные токены не ожидаются. Внешние провайдеры проверяются до собственных токенов TDG, поэтому верификатор, включивший опцию, также получает токены приложений TDG, которые никогда нельзя отправлять другой стороне.

    Провайдер экспортирует методы compile_role_rules(provider_cfg) и map_roles(payload, rules) для пользовательского типа провайдера, которому нужно обычное сопоставление поля групп с ролями TDG. Метод compile_role_rules() подготавливает настроенные правила — вызывайте его при создании провайдера, а не на каждый запрос. Метод map_roles() возвращает role_ids и role_names. Если метод не может разрешить совпавшую несистемную роль, возвращается nil, nil, err. Определённые идентификаторы ролей сохраняются экземпляром провайдера.

    Также можно зарегистрировать пользовательский тип провайдера — для провайдеров идентификации, которые не покрывает Keycloak:

    local external_auth = require('account_provider.external_auth')external_auth.register_provider_type('custom', {    validate_config = function(provider_cfg, prefix)        return true    end,    create = function(provider_cfg)        return {            auth = function(request)                -- accept, reject, or fallback                return {decision = 'fallback'}            end,        }    end,})

    После регистрации такой тип настраивается в параметре auth_providers со значением type: custom.

    create выполняется при применении конфигурации, а не на каждый запрос, поэтому дорогая инициализация должна быть там. Новый набор экземпляров строится до того, как TDG переключится на него: если их создание не удалось, ранее работавшая конфигурация остаётся активной, а уже построенные экземпляры закрываются. После успешного переключения или при удалении провайдера close старого экземпляра вызывается ровно один раз.

    Текст ошибки обратного вызова не возвращается вызывающему и не сохраняется в журнале. Обратный вызов содержит опции провайдера и bearer-токен, так что его сообщение может содержать секрет и находиться вне контроля TDG. В обратном вызове сообщается только имя провайдера и верификатора. Верификатор должен сохранять в журнал собственные смены состояния — так же, как встроенный сообщает, если снимок JWKS перестал обновляться. Детерминированные проверки опций выполняются в validate_config, чей результат сообщается администратору в виде ошибки валидации конфигурации.

Исправлено:

  • Запросы count с пустым фильтром, которые могли выполняться долго. Теперь они выполняются за заданное время.
  • Указание lifetime_hours или keep_version_count в разделе конфигурации версионирования для типа с отключенным версионированием (enabled=false) теперь вызывает ошибку проверки конфигурации вместо того, чтобы молча запускать expirationd для несуществующего спейса с историей версий.
  • Ошибка, из-за которой оптимизация выбора fields в GraphQL API иногда возвращала некорректные результаты для запросов, использующих фрагменты.
  • Исправлена ошибка при обновлении вложенных записей, содержащих массивы: при одновременном обновлении нескольких объектов она иногда давала некорректные результаты.
  • Переименование роли доступа, на которую ссылается секция конфигурации LDAP, больше не ломает сопоставление ролей LDAP — теперь такое переименование отклоняется с той же ошибкой, что и попытка удалить такую роль.
  • Построение URL/пути коннектора: строки запроса и фрагменты в path запроса теперь анализируются и объединяются с params более надежно.
  • HTTP-сервер теперь отклоняет запросы, разбитые на части, ранее такие запросы могли приводить к некорректным ответам.
  • Необработанные Bearer-токены больше не записываются в журнал аудита при неудачной аутентификации; вместо этого записывается короткий отпечаток токена.

Обновления SDK и модулей

SDK обновлен с версии 2.11.9-0-r709 до версии 2.11.10-0-r711. Помимо версии Tarantool, в релизе обновлёны следующие компоненты экосистемы: cartridge, vshard, metrics, checks, membership, graphqlapi, graphqlapi-helpers и kafka.

Tarantool 2.11.9 → 2.11.10

Это bugfix-релиз: с версии 2.11.9 добавлена 1 новая опция в Enterprise Edition (r708) и исправлено 15 проблем в соответствующем релизе Community Edition. Новая опция отключена по умолчанию и не оказывает никакого эффекта, пока не включена явно.

Добавлено:

  • (Core) Нединамическая опция box.cfg.memtx_memory_recovery_check (по умолчанию 'off') для предупреждения ('warn') или отказа в запуске ('panic'), если memtx_memory задан ниже ранее зафиксированного уровня использования.

Изменено:

  • (Fio) Режим доступа по умолчанию для файлов, создаваемых через fio.open(), изменён на 0666 (до применения umask).

Исправлено:

  • (Core) Вызов box.cfg с аргументом, не являющимся таблицей, теперь завершается понятной ошибкой cfg should be a table вместо невнятной внутренней ошибки.
  • (Core) Устаревшие опции box.cfg, заданные через переменные окружения TT_*, теперь преобразуются в соответствующие опции-замены, а само преобразование больше не перезаписывает молча значение опции-замены, если оно было задано явно.
  • (Core) Избыточное предупреждение об устаревании replication_connect_quorum, которое выводилось при явном указании bootstrap_strategy = 'legacy' в том же вызове box.cfg.
  • (Репликация) Ошибка упорядочивания при батчинге WAL, из-за которой присоединяющаяся реплика могла пропустить строки, записанные мастер-узлом.
  • (LuaJIT) В рамках работы по LuaJIT перенесены патчи из основной ветки (trunk) ванильного LuaJIT. При этом были исправлены следующие проблемы:
    • Некорректное поведение JIT для вариативных (vararg) FFI-функций на платформе macOS AArch64.
    • Различные проблемы ABI и соглашений вызова FFI для архитектур x64/AArch64.
    • ipairs_aux() — приведено в соответствие с поведением JIT-бэкенда на x86/x64.
    • Возврат -1 функцией os.time().
    • Предупреждения UBSan для table.new().
  • (HTTP-клиент) Регрессия авторизации на HTTP-прокси или целевом хосте HTTP(S) по алгоритму Basic.
  • (Модуль Datetime) Разбор времени с десятичной дробной частью часа или минуты.
  • (Модуль Datetime) Переполнение стека в функции strptime() при разборе часовых поясов.
  • (Pickle) Аварийное завершение при вызове pack() с пустой строкой формата или строковым значением для спецификатора формата 'a'.
  • (URI) Падение use-after-poison в uri.format(), вызванное длинным URI.

Cartridge 2.17.1 → 2.18.1

Этот релиз охватывает версии 2.17.2, 2.17.3, 2.18.0 и 2.18.1.

Добавлено:

  • Опция --vshard-bootstrap-timeout (переменная окружения TARANTOOL_VSHARD_BOOTSTRAP_TIMEOUT) для роли vshard-router, позволяющая настроить время ожидания для операции bootstrap в vshard. Значение по умолчанию в 10 секунд сохранено, однако его может быть недостаточно для распределения сегментов по узлам хранилища на медленных CI-раннерах.
  • Необязательный аргумент timeout для методов cartridge.test-helpers.Cluster:start, cartridge.test-helpers.Cluster:bootstrap и cartridge.test-helpers.Cluster:bootstrap_vshard, позволяющий увеличить время ожидания HTTP-запроса для операции bootstrap.

Изменено:

  • Обновлена версия membership с версии 2.5.3 до 2.5.4 (исправлена ошибка, из-за которой данные участника могли безвозвратно теряться после вызова leave() и последующего повторного присоединения);
  • Обновлена версия vshard с версии 0.1.41 до 0.1.42 (см. изменения в vshard 0.1.41 → 0.1.42);
  • Обновлена версия checks с версии 3.4.0 до 3.4.1 (добавлены аннотации EmmyLua);
  • Обновлена версия http с версии 1.9.0 до 1.9.1 (в релиз включены исправления инфраструктуры, которые не меняют поведение модуля).

Исправлено:

  • Проблема, приводящая к состоянию гонки при завершении работы экземпляра, из-за которой membership.leave() мог выполняться до остановки ролей, вызывая ошибки.
  • Когда метод box.ctl.promote() возвращает ошибку ER_INTERFERING_PROMOTE во время срабатывания аварийного переключения, повторная попытка box.ctl.promote() выполняется 3 раза с задержкой в 1 секунду, чтобы новый мастер-узел не застрял в режиме только для чтения.

graphqlapi 0.0.11 → 0.0.15

Этот релиз охватывает версии 0.0.12, 0.0.13, 0.0.14 и 0.0.15.

Изменено:

  • Поддержка ddl-ee была добавлена в 0.0.12 и отменена в 0.0.13; это изменение не сохранилось в 0.0.15.

Исправлено:

  • Определение Tarantool Enterprise в utils.get_tnt_version() теперь выполняется по tarantool.package.
  • Нестабильные тесты cluster.test_get_instances и cluster.test_get_replicaset_instances — теперь тест дожидается статуса healthy у всех экземпляров перед проверками.
  • Аварийное завершение utils.get_tnt_version() с ошибкой variable 'tarantool' is not declared в приложениях на Cartridge, из-за чего ломалось определение Tarantool Enterprise.

graphqlapi-helpers 0.0.11 → 0.0.12

В этом релизе обновлены зависимости и тестовое окружение.

Добавлено:

  • Новые опции box.cfg для Tarantool 2.11: auth_delay, auth_type, bootstrap_strategy, disable_guest, election_fencing_mode, metrics, password_enforce_digits, password_enforce_lowercase, password_enforce_specialchars, password_enforce_uppercase, password_history_length, password_lifetime_days, password_min_length.

Исправлено:

  • Учтено изменение драйвера статистики crud по умолчанию на metrics.

kafka 1.6.14 → 1.6.15

Добавлено:

  • Флаг сборки WITH_ZSTD для включения поддержки сжатия zstd. В сборке Enterprise SDK поддержка zstd включена по умолчанию.

Изменено:

  • Обновлена версия librdkafka до 2.15.1.

metrics 1.7.0 → 1.8.3

Этот релиз охватывает версии 1.8.0, 1.8.1, 1.8.2 и 1.8.3.

Добавлено:

  • Поддержка анализатора EmmyLUA и аннотаций.
  • Фильтрация пользовательских метрик на основе селекторов. Методы metrics.namespace() и metrics.set_filter() используются для пометки пользовательских сборщиков/коллбэков селекторами и их фильтрации во время сбора данных.

Изменено:

  • CI теперь запускается для пулл-реквестов (в дополнение к push-событиям в ветки). Для пулл-реквестов внутри базового репозитория запуски пропускаются во избежание дублирования.
  • Для параметра config.checks в default_config установлено значение 'off', чтобы при выполнении тестов избежать возникновения предупреждений, зависящих от окружения (THP, readahead).

Исправлено:

  • Для config_metrics_test системные оповещения отключаются только при наличии опции config.checks (вместо проверки версии Tarantool), благодаря чему тест проходит на любой версии Tarantool 3.x.
  • Ошибка в metrics.cfg{exclude = {'all'}}, из-за которой пользовательские селекторы метрик исключались в дополнение к встроенным группам метрик.

vshard 0.1.41 → 0.1.42

Версия 0.1.42 полностью совместима с предыдущими версиями vshard.

Добавлено:

  • Бэкенд для менеджера точек восстановления Tarantool: бэкенд vshard-router. Он позволяет менеджеру периодически создавать согласованные с кластером точки восстановления, которые впоследствии можно использовать для резервного копирования и восстановления всего кластера vshard на определённый момент времени. Новый публичный метод роутера vshard.router.create_cluster_recovery_point() создаёт точку восстановления на мастер-узле в каждом наборе реплик.

[2.19.0] - 2026-05-29

Обновления TDG

Добавлено:

  • Спейсы хранилища audit_log и common_log перенесены из движка memtx на движок vinyl. В отличие от memtx, vinyl хранит данные на диске и не использует оперативную память для записей сообщений в журнал. При первом запуске после обновления существующий спейс memtx автоматически переносится в vinyl в фоновом режиме; запросы на чтение при этом остаются согласованными в течение всего процесса миграции. Опции конфигурации max_msg_in_log и max_log_size теперь считаются устаревшими и выводят соответствующее предупреждение, не влияя на работу движка vinyl.

  • Добавлены операторы фильтрации != и !=CI для метода repository.find(). != исключает записи, в которых поле равно заданному в операторе значению. Оператор !=CI выполняет ту же проверку без учета регистра и принимает на вход только строку. Оба оператора являются фильтрами post-scan и могут применяться к обычным полям и составным индексам:

    – Исключить одно значениеrepository.find('Database', {{'name', '!=', 'MongoDB'}})– Исключить нулевые меткиrepository.find('Database', {{'label', '!=', nil}})– Исключение значения без учета регистраrepository.find('Database', {{'name', '!=CI', 'mongodb'}})– Составное имя индекса в сокращенном видеrepository.find('Database', {{'name_label', '!=', {'MongoDB', 'MongoDB'}}})
  • Улучшен алгоритм выбора индекса в планировщике запросов. До этого, если поля составного индекса были указаны по одному (например, {{'field1','==','a'}, {'field2','==','b'}}), в сканирование включалось только первое поле. Остальные условия при этом превращались в фильтры после сканирования и возникал риск выполнения полного сканирования. Теперь планировщик формирует самый длинный совпадающий префикс равенства для каждого потенциального индекса и выбирает тот, который имеет наибольшее покрытие полей, поэтому оба условия используются ключом сканирования.

  • Добавлена опция api-encoding для полей типов string и bytes в модели данных. Опция позволяет прозрачно кодировать и декодировать бинарные данные в API HTTP и GraphQL. Поддерживаются кодировки base64 и hex. Опция принимает на вход либо одну строку кодировки (применяемую к интерфейсам HTTP и GraphQL), либо таблицу со значениями для каждого интерфейса (http, graphql):

    {  "name": "Payload",  "type": "record",  "fields": [    {"name": "id",   "type": "string"},    {"name": "data", "type": "bytes", "api-encoding": "base64"},    {"name": "hash", "type": "string", "api-encoding": {"http": "hex", "graphql": "base64"}}  ]}
  • Добавлена проверка срока действия сертификатов для коннекторов Kafka и HTTP. TDG периодически сканирует TLS-сертификаты, заданные в конфигурации коннектора, и записывает в журнал сообщение уровня INFO или WARN, когда срок действия сертификата подходит к концу или уже истек. Проверяются параметры ssl.certificate.location, ssl.certificate.pem, ssl.ca.location, ssl.ca.pem для Kafka и параметры ca_file, ca_path для HTTP. Проверку сертификатов и сообщения об истечении срока их действия можно настроить в разделе конфигурации cert_checker:

    cert_checker:  enabled: true  interval_sec: 3600  threshold_info_days: 7  threshold_warn_days: 1

    Для сертификатов с истекшим сроком действия TDG всегда записывает предупреждение на уровне warning.

  • В веб-интерфейс добавлена вкладка Sandbox для отладки кода в окружении sandbox.

Исправлено:

  • Исправлены потеря и дублирование данных, а также отказ репликации при одновременной ребалансировке и смене мастер-узла.

  • Исправлено восстановление планировщика задач после сбоя. Задачи, завершенные на раннере во время простоя планировщика, теперь корректно подхватываются при перезапуске - без зависания на неопределенное время или некорректного перезапуска.

  • Исправлено создание индекса по полю bytes, вызывавшее OperationError. Тип bytes теперь ведет себя как псевдоним для string.

Обновления SDK и модулей

SDK обновлен с версии 2.11.8-0-r707 до версии 2.11.9-0-r709.

Tarantool 2.11.8 → 2.11.9

Это bugfix-релиз: с версии 2.11.8 исправлена 1 проблема в Enterprise Edition (r702) и 34 - в соответствующем релизе Community Edition.

Добавлено:

  • (Core) Новое встроенное системное событие box.wal_error, которое рассылается каждый раз, когда Tarantool не удаётся зафиксировать транзакцию в журнале упреждающей записи (WAL).
  • (LuaJIT) Поддержка ffi.abi("dualnum") для определения режима LuaJIT (dual-number: различение целых int64 и double).
  • (LuaJIT) Добавлены флаги misc.memprof.available и misc.sysprof.available для определения доступности соответствующего профайлера в текущей сборке. Подробнее про профайлеры можно узнать в разделах документации Tarantool LuaJIT memory profiler и LuaJIT platform profiler.
  • (Модуль Datetime) Для обратной совместимости добавлена опция compat.datetime_setfn_timestamp_type_check. Сейчас опция по умолчанию выключена («старое» поведение), проверка типа при этом не выполняется. «Новое» поведение с проверкой типа планируется сделать значением по умолчанию в версии Tarantool 4.x.

Исправлено:

  • Проблема, из-за которой ошибки SSL некорректно регистрировались при разрыве соединения с клиентом.
  • (Core) Ошибка, из-за которой Tarantool мог зависать при использовании box.watch.
  • (Core) Ошибка, при которой файлы .xlog.inprogress не удалялись автоматически во время запуска сервера, если wal_dir задан и отличается от значения по умолчанию.
  • (Core) Ошибка, при которой локальный спейс нельзя было очистить (truncate), если спейс _truncate настроен как синхронный (synchronous).
  • (Выбор лидера) Если при записи в WAL возникает ER_WAL_IO, текущий лидер при первом же таком случае отказывается от своей роли.
  • (LuaJIT) Некорректная генерация IR_TBAR на aarch64.
  • (LuaJIT) Обработка переполнения стека при выходе из трассировки.
  • (LuaJIT) «Висячие» ссылки на CType.
  • (LuaJIT) Закрытие состояния VM после раннего OOM.
  • (LuaJIT) Генерация IR_MUL на x86/x64.
  • (LuaJIT) Некорректное объединение инструкций stp/ ldp на aarch64.
  • (LuaJIT) Инвалидизация записи SCEV при возврате в более низкий фрейм.
  • (LuaJIT) Сборка на macOS 15/Clang 16.
  • (LuaJIT) Генерация IR_HREFK на aarch64.
  • (LuaJIT) Проверки стека в varargs-вызовах в сборке GC64.
  • (LuaJIT) Проверки стека в pcall()/ xpcall() в сборке GC64.
  • (LuaJIT) Лимит аллокаций для сборки без JIT.
  • (LuaJIT) Обработка ошибок OOM при расширении стека в coroutine.resume() и lua_checkstack().
  • (LuaJIT) Запись (recording) циклов со значением шага -0 или управляющими значениями NaN.
  • (LuaJIT) Формирование сообщений об ошибках, когда ошибка возникает во время обработки ошибки.
  • (LuaJIT) «Висячая» ссылка для FFI callback.
  • (LuaJIT) BC_UNM для аргумента -0 в режиме dual-number.
  • (LuaJIT) Сужение (narrowing) унарного минуса в режиме dual-number.
  • (LuaJIT) Запись (recording) string.byte(), string.sub() и string.find().
  • (LuaJIT) Отсутствие преобразования типов для слотов BC_FORI в режиме dual-number.
  • (LuaJIT) Различные пограничные случаи в VM events.
  • (LuaJIT) Запись разрешения индекса конструктора в JIT-компиляторе.
  • (LuaJIT) Предупреждение UBSan в unpack().
  • (Модуль Datetime) Падение из-за срабатывания assert при разборе неоднозначной даты: когда в тексте одновременно указаны день года (yday, который неявно задаёт месяц и день месяца) и календарный месяц (без дня месяца). Теперь такие случаи распознаются, и отображается ошибка.
  • (Модуль Datetime) Вычисления tzoffset для случаев вида `new({timestamp=x, tz='Zone'})``.
  • (Модуль Datetime) Неконсистентность между датами, создаваемыми new({tzoffset=x}), и d:set({tzoffset=x}), когда d.tz ~= '' идёт перед set().
  • (Модуль Datetime) Теперь datetime.new() и datetime_object:set() проверяют, что значение timestamp находится в допустимом диапазоне.
  • (Модуль Datetime) Проверка типа timestamp в set().

Cartridge 2.16.6 → 2.17.1

Этот релиз охватывает версии 2.16.6, 2.17.0 и 2.17.1.

Добавлено:

  • Поддержка режима election_mode = 'manual' для координатора отказоустойчивости в режиме stateful, в том числе для наборов реплик из одного экземпляра.
  • Добавлены Runtime Lua API helpers require('cartridge.lua-api.failover').switch_to_manual_election_mode() and switch_to_off_election_mode() to migrate a stateful replicaset between Tarantool election_mode = 'off' and election_mode = 'manual'.
  • Документация по миграции набора реплик в режиме stateful в режим выборов manual, в том числе миграции на основе перезапуска, вспомогательные функции (*helpers) во время выполнения, откат и рекомендации по изоляции (fencing).

Изменено:

Обновлены зависимости:

Исправлено:

  • Исправлена гонка координатора в режиме stateful при добавлении нового набора реплик: если у поставщика состояния еще нет назначения для этого набора реплик, failover.cfg() теперь возвращается к topology.get_leaders_order(...)[1] (failover_priority[1]) для первоначального назначения. Такой подход предотвращает переключение будущего лидер-узла в режим read_only=true и позволяет избежать взаимной блокировки во время применения топологии.

vshard 0.1.39 → 0.1.41

Этот релиз охватывает версии 0.1.40 и 0.1.41.

Версия 0.1.41 полностью совместима с предыдущими версиями vshard.

Добавлено:

  • Опция конфигурации хранилища rebalancer_bucket_send_timeout. Опция задает время ожидания в секундах для отправки одного сегмента во время перебалансировки. Это можно использовать для ограничения времени, в течение которого сегмент может быть недоступен для записи во время его отправки.
  • Улучшен выбор сегментов балансировщика: теперь балансировщик предпочитает сегменты, в которых нет активных запросов на чтение и запись (RW).
  • Вызов методов vshard.router.info() и vshard.storage.info() теперь разрешен даже в том случае, если роутер или хранилище отключены. Теперь методы дополнительно возвращают новое булево поле is_enabled.
  • Улучшено логирование действий, связанных с балансировкой и восстановлением.

Исправлено:

  • Ошибка, из-за которой могли появляться дубли активных сегментов из-за задержки stray-пакетов TCP.
  • Ошибка, из-за которой запросы на чтение и запись могли нарушить репликацию после переключения мастер-узла во время перебалансировки.
  • Ошибка, при которой переключения мастер-узла во время ребалансировки могли привести к появлению дублей активных сегментов.
  • Ошибка, из-за которой ошибка пользователя маскировалась ошибкой Transaction is active... при вызове персистентной функции, которая генерирует ошибку и не закрывает транзакцию в версиях Tarantool ниже 3.0.0-beta1-18. Теперь модуль vshard автоматически закрывает такие транзакции и возвращает исходную ошибку пользователя.
  • Ошибка, из-за которой соединение с репликой не восстанавливалось автоматически при его закрытии пользователем либо vshard.

[2.18.0] - 2026-04-10

Обновления TDG

Добавлено:

  • Добавлено больше записей в журнал аудита.

  • Имя экземпляра node в записи журнала аудита.

  • Опция params в запросы HTTP и SOAP. В примере ниже отправляется запрос на <http_output.url>?hello=world:

    connector.http_request('http_output', 'get', nil, { params = { hello = 'world' } })
  • Путь к параметрам SOAP-запроса. Путь добавляется к URL, указанному в конфигурации. Например, если адрес - example.com, а путь - /path/to/somewhere, результат будет выглядеть так: example.com/path/to/somewhere.

  • Время ожидания на стороне хранилища для журнала событий и журнала аудита:

    • для предотвращения чрезмерного использования ЦП во время сканирования без указания диапазона;
    • параметр Timeout теперь можно указать только через GraphQL API.
  • Объединены все GraphQL API для конфигурации журнала аудита. Для выполнения мутации теперь используется следующий формат:

    mutation { audit_log { config { ... } } }

    Для выполнения запроса на получание данных теперь ипользуется следующий формат:

    { audit_log { config { ... } } }
  • Все коды ответов 2xx теперь считаются успешными для output-коннекторов HTTP и SOAP.

  • Добавлен формат plain для output-коннектора HTTP:

    connector:  output:    - name: plain_http      type: http      format: plain  # Content-Type = 'text/plain;charset=UTF-8'      url: http://localhost
  • Метод repository.get теперь принимает опцию fields (как в методе repository.find).

  • (Sandbox) Добавлены методы register_callback() и unregister_callback() в модуль metrics. В целях повышения производительности количество обратных вызовов, которые может зарегистрировать пользователь, ограничено 128.

  • (Sandbox) Добавлен модуль xml - обертка вокруг модуля luarapidxml.

  • (Frontend) Улучшена сортировка/фильтрация на вкладках Repair, Failed Jobs и Output Processor.

  • (Frontend) Добавлен вывод информации о раннерах на вкладке Task Information.

  • (Frontend) Добавлена опция async для коннекторов на вкладке Test.

  • (Frontend) Добавлено больше настроек на вкладку Settings → Audit Log.

  • (Frontend) Добавлено выпадающее меню format для Kafka на вкладке Connector.

  • (Frontend) Добавлена вкладка Migrations.

Исправлено:

  • Исправлено хранение смещения для коннектора Kafka, когда опция enable.auto.offset явно включена в конфигурации.

  • Отключена возможность указывать мультиключевой индекс в качестве первичного, это приводило к ошибке OperationError.

  • Отключена возможность указывать отрицательное значение search_timeout для LDAP.

Обновления SDK и модулей

SDK обновлен с версии 2.11.8-0-r706 до версии 2.11.8-0-r707.

Cartridge 2.16.5 → 2.16.6

Изменено:

  • На странице кода дерево файлов больше не раскрывается автоматически по умолчанию.
  • Обновлены зависимости:

Исправлено:

  • Мониторинг синхронных спейсов с учётом фактического режима failover: предупреждение о синхронных спейсах теперь записывается в журнал только если failover настроен в режиме, который их не поддерживает (например, eventual или stateful без synchro_mode), а не всегда при старте экземпляра. В модуль cartridge.failover добавлена функция is_sync_spaces_supported(); синхронные спейсы теперь определяются динамически, включая спейсы, добавленные во время работы.

metrics 1.6.2 → 1.7.0

Добавлено:

  • Для плагина graphite добавлена возможность отправлять метрики на несколько серверов. Обратная совместимость с предыдущей версией плагина сохранена. Изменения в поведении:
    • init теперь присваивает уникальное имя создаваемому файберу fiber на основе входных опций graphite server (если они переданы).
    • добавлен метод stop() для остановки всех файберов fibers, запущенных плагином.

Исправлено:

  • Удаление реплики с помощью метода box.space._cluster:delete() не удаляет информацию об этой реплике из метрик. Информация исчезает только после перезапуска кластера.

vshard 0.1.38 → 0.1.39

Версия 0.1.39 полностью совместима с предыдущими версиями vshard.

Исправлено:

  • Теперь разрешена запись в другие спейсы из on_replace‑триггера при работе с системным спейсом _bucket.

[2.17.0] - 2025-12-25

  • metrics обновлен до версии 1.6.2.

  • Cartridge обновлен до версии 2.16.5.

  • kafka обновлен до версии 1.6.14.

  • SDK обновлен до версии 2.11.8-0-r706.

  • Улучшено отображение записей в журнале аудита.

  • Добавлена возможность указывать опции для SOAP output-коннектора (как для HTTP-коннектора).

  • Добавлена возможность передавать раздел (partition) для Kafka producer: connector.send('to_kafka', object, {partition = 1}).

  • Добавлено время ожидания по умолчанию для SOAP and HTTP output-коннекторов (~4.5 минуты).

  • Добавлена поддержка настраиваемых параметров часового пояса.

  • Добавлена функция metrics.get_labels в sandbox, она позволяет получить метки текущего экземпляра.

  • Добавлена функция log.new(module_name) в sandbox.

  • Добавлены следующие функции журнала аудита в sandbox: audit.new(module_name), audit.verbose, audit.info, audit.warn и audit.alarm.

  • Добавлен путь к параметрам HTTP-запроса. Путь добавляется к URL, указанному в конфигурации. Например, если адрес - example.com, а путь - /path/to/somewhere, результат будет выглядеть так: example.com/path/to/somewhere. Это достигается путем использования опции path при взаимодействии с HTTP-коннектором.

  • Добавлена библиотека uri в sandbox со следующими методами: uri.parse, uri.format, uri.escape, uri.unescape, uri.parse_many и uri.unreserved.

  • Добавлен oracle-коннектор. Как и ODBC-коннектор, его можно задать в файле конфигурации:

    oracle: - name: connection_name   username: user   password: secret   db: 127.0.0.1:1521/SOURCE_CCM   prefetch_count: 100 # optional: prefetch row count amount from Oracle   prefetch_size: 4096 # optional: memory limit for prefetching (in MB)   batch_size: 50 # optional: the size of each SELECT loop batch on exec() and cursor:fetch_all()

    После вы сможете использовать указанный коннектор в Lua-коде:

    local oracle = require('oracle')local res, err = oracle.execute('connection_name', 'INSERT INTO test(i, s) VALUES(:I, :S)', {I=1, S='Hello!'})local cursor, err = oracle.cursor('connection_name', 'SELECT a, b, c FROM table')cursor:fetch_row()cursor:fetch(fetch_size)cursor:fetch_all()cursor:fetch_first(fetch_size)cursor:fetch_last()cursor:fetch_absolute(fetch_size, offset)cursor:fetch_relative(fetch_size, offset)cursor:fetch_current(fetch_size)cursor:fetch_prior(fetch_size)cursor:get_position()cursor:ipairs()cursor:is_closed()cursor:close()
  • Исправлено неясное сообщение об ошибке фронтенда, когда часы между узлами не были синхронизированы.

  • Исправлено несколько мелких ошибок ODBC-коннектора.

  • Исправлена ошибка Transaction has been aborted by a fiber yield, когда запрос запускался с флагом skip_result.

[2.16.0] - 2025-10-23

  • Cartridge обновлен до версии 2.16.4.
  • SDK обновлен до версии 2.11.8-0-r703.
  • metrics обновлен до версии 1.6.0.
  • Улучшен макет страниц в веб-интерфейсе: увеличены интервалы и уменьшен отступ для более аккуратного вида.
  • Добавлена метрика tdg_kafka_broker_state (состояние брокера). Возможные значения метрики: INIT (1), DOWN, CONNECT, AUTH, APIVERSION_QUERY, AUTH_HANDSHAKE, UP, UPDATE (8), UNKNOWN (-1).
  • Добавлена метрика tdg_kafka_broker_source (источник брокера). Возможные значения метрики: learned (1), configured, internal, logical (4), unknown (-1).
  • Добавлена метрика tdg_kafka_cgrp_state (состояние обработчика локальной группы consumer). Возможные значения метрики: init (1), term, query-coord, wait-coord, wait-broker, wait-broker-transport, up (7), unknown (-1).
  • Добавлена метрика tdg_kafka_cgrp_join_state (состояние присоединения обработчика локальной группы consumer). Возможные значения метрики: init (1), wait-join, wait-metadata, wait-sync, wait-assign-call, wait-unassign-call, wait-unassign-to-complete, wait-incr-unassign-to-complete, steady (9), unknown (-1).
  • Добавлено логирование для отслеживания процесса миграции.
  • Исправлена ошибка при миграции, когда тип данных содержал поля по умолчанию.
  • Исправлено вводящее в заблуждение сообщение об ошибке при закрытии SMTP-коннектора.
  • Логи консоли теперь используют функционал логирования модуля из Tarantool.
  • Исправлена проблема с хранилищем, которая могла возникать при одновременных чтении и записи нескольких экземпляров - например, во время восстановления после сбоев.
  • Запрещено добавление новых ненулевых полей в существующие модели данных.
  • Опция token_name для продюсеров Kafka теперь обязательна при включенной авторизации.
  • Исправлена ошибка, при которой некоторые интерфейсы принимали некорректные строки даты и времени (datetime).

[2.15.1] - 2025-09-12

  • Исправлена ошибка, при которой последняя версия объекта пропадала во время пагинации с включенной опцией all_versions.

[2.15.0] - 2025-09-02

  • Cartridge обновлен до версии 2.16.3.

  • metrics обновлен до версии 1.5.0.

  • Добавлена подсказка с исходным временем на вкладке Audit Log.

  • Добавлено имя конкретного токена в сообщения об ошибках авторизации Kafka producer.

  • Снижена нагрузка на ЦП, возникавшая при создании роутером большого количества файберов для запросов на чтение логов, журналов аудита или очереди восстановления.

  • Исправлена опция disable_metrics для Kafka producer и consumer.

  • Исправлено логирование опций конфигурации *.password для Kafka producer и consumer.

  • Исправлено некорректное поведение при присвоении значения null непустому массиву.

  • Исправлена ошибка, при которой некоторые файлы создавались с некорректными правами доступа.

  • Исправлена ошибка с созданием сериализаторов и десериализаторов для больших моделей, которая могла привести к состоянию OperationError.

  • Исправлена ошибка connection state is ..., возникающая при попытке остановить задачу.

  • Исправлена некорректная десериализация массивов при добавлении новых полей.

  • Добавлена опция mode в секцию конфигурации gc. Возможные значения: step (по умолчанию), collect.

  • Добавлена возможность включать сжатие для полей типа Enum.

  • Добавлено API для получения размера ввода и вывода очереди восстановления:

    { repair_list_info { size } }{ output_processor { info { size } } }

[2.14.0] - 2025-07-18

  • Cartridge обновлен до версии 2.16.2.

  • metrics обновлен до версии 1.4.0.

  • expirationd обновлен до версии 1.8.0.

  • SDK обновлен до версии 2.11.7-0-r691.

  • Account provider больше не отправляет пустые запросы для обновления информации об активности пользователей и токенов.

  • Account provider теперь отправляет информацию об активности пользователей и токенов в триггере on_shutdown.

  • Исправлен доступ к заблокированным пользователям и токенам при отключенной авторизации.

  • Исправлена возможная потеря информации об активности пользователей и токенов.

  • Улучшены сообщения об ошибках:

    • Добавлена явная ошибка, если не указан routing_key.
    • Добавлена ошибка в случае, если в схеме данных указан null-литерал вместо строки null.
  • Исправлены ошибки типов данных при объявлении сервисов. Теперь можно объявить тип в момент использования, например: a: ["null", {"name": "abc", "type": "record", "fields": [..]}].

  • Добавлена поддержка query plan при запросе через iproto repository API.

  • Добавлена опция disable_metrics для отключения метрик Kafka:

    connector:  input:    - name: kafka      type: kafka      disable_metrics: true      options:        ...

[2.13.2] - 2025-05-06

  • Cartridge обновлен до версии 2.15.3.
  • kafka обновлен до версии 1.6.10.
  • Обновлены зависимости фронтенда.

[2.13.1] - 2025-04-17

  • Cartridge обновлен до версии 2.15.2.
  • Исправлена ошибка, при которой обновление записи могло изменять несвязанные поля.
  • Смягченная проверка миграции: теперь ее можно использовать для массовых обновлений данных без необходимости изменения схемы данных.

[2.13.0] - 2025-03-27

  • Добавлено логирование DML-операций при изменении ролей доступа и действий с данными.
  • Добавлена страница Show password для пользователей.
  • Исправлена десериализация типов Date, DateTime и Timestamp во вложенных массивах.
  • Исправлено преобразование GET-запроса в POST-запрос при использовании connector.http_request с непустым телом.
  • Cartridge обновлен до версии 2.15.1.
  • SDK обновлен до версии 2.11.6-0-r672.
  • Зарезервировано название поля cursor во избежание конфликтов с полем системного курсора.
  • Увеличена стабильность проверки запуска модуля vshard для предотвращения различных неясных ошибок.
  • Исправлена ошибка Assertion failed при использовании журнала аудита.
  • Добавлено периодическое обновление кэша данных учетных записей пользователей, токенов и прав доступа для предотвращения проблем с инвалидацией кэша.
  • Добавлено логирование потенциальных проблем в коде sandbox.

[2.12.7] - 2025-01-23

  • Исправлено несколько ошибок, связанных с менеджером учетных записей.
  • Добавлен method в output-опции подключения HTTP.
  • SDK обновлен до версии 2.11.5-0-r662.
  • Исправлено сообщение Invalid merge source, возникающее при использовании repository.pairs в случае превышения лимитов на число просканированных записей.
  • Исправлена ошибка, при которой настройки хранилища журналов игнорировались в случае восстановления после сбоев (failover).
  • Исправлена потеря обновлений при изменении вложенного массива.

[2.12.6] - 2024-11-12

  • SDK обновлен до версии 2.11.4-0-r658.
  • Расширена информация о клиенте, записываемая в журнал аудита при неудачных попытках авторизации.

[2.12.5] - 2024-10-23

  • Исправлена ошибка при попытке использования фрагментов в GraphQL-запросах.

[2.12.4] - 2024-10-22

  • Исправлена ошибка при попытке указать две выборки в GraphQL-запросе.
  • Исправлена ошибка при указании уровня логирования в аргументе командной строки или переменной окружения.

[2.12.3] - 2024-10-14

  • Исправлена возможность обновления необнуляемого элемента массива на null.
  • Убран sandboxing из функции, использующейся при миграции спейсов. Теперь можно использовать произвольные функции Lua/Tarantool.
  • Исправлена ошибка при запуске миграций в режиме dry_run.
  • Исправлена некорректная обработка спанов при включенном трейсинге при ошибке обработки объектов из Kafka.

[2.12.2] - 2024-09-24

  • Исправлена ошибка Field version nullability mismatch.

[2.12.1] - 2024-09-18

  • Cartridge обновлен до версии 2.12.4.
  • SDK обновлен до версии 2.11.4-0-r653.

[2.12.0] - 2024-08-20

  • Breaking change Базовый образ для сборки проекта обновлен с CentOS 7 до AlmaLinux 8. Теперь проект может не работать на более старых дистрибутивах.
  • Breaking change Отключено сопоставление с Lua-шаблоном при поиске содержимого сообщений журнала.
  • Удалить поле из модели данных теперь можно без запуска миграции.
  • Исправлены ошибки, возникающие при обновлении полей-массивов.
  • Kafka consumer теперь логирует offset сообщения в случае возникновения проблем.
  • Исправлена ошибка, возникающая при запуске миграций в режиме dry_run для спейсов с отключенным версионированием.
  • Cartridge обновлен до версии 2.12.3.
  • metrics обновлен до версии 1.2.0.

[2.11.5] - 2024-06-05

  • Добавлен метод connector.http_request в sandbox.
  • Добавлена подсистема событий events.
  • Исправлено разыменование nil (nil dereference) при перезагрузке конфигурации в Kafka-клиенте.
  • Исправлена обработка ошибок маршрутизации.
  • Исправлен расчет размера журнала TDG (спейса tdg_log).
  • Добавлен доступ к странице веб-интерфейса Console для пользователей с привилегией eval.
  • Cartridge обновлен до версии 2.12.0.
  • SDK обновлен до версии 2.11.3-0-r636.

[2.11.4] - 2024-04-23

  • Исправлена ошибка: account provider watcher печатал ошибку при инициализации.
  • Cartridge обновлен до версии 2.10.0.
  • expirationd обновлен до версии 1.6.0.
  • SDK обновлен до версии 2.11.3-0-r631.

[2.11.3] - 2024-04-01

  • Добавлен фильтр полей для запросов на получение данных.
  • Исправлена ошибка table is nil в обнуляемом поле записи.
  • Исправлена ошибка vshard gc при балансировке.
  • Исправлена ошибка, связанная с передачей значений cdata в метрики.
  • Исправлено использование типа Union совместно с массивами.
  • Исправлено значение версии по умолчанию для схемы GraphQL.

[2.11.2] - 2024-03-13

  • Исправлена нумерация версий PRM-пакета.
  • Исправлено переполнение в значениях дат.
  • SDK обновлен до версии 2.11.2-0-r621.
  • Cartridge обновлен до версии 2.9.0.

[2.11.1] - 2024-02-27

  • Исправлена сборка Docker-образа.

[2.11.0] - 2024-02-26

  • Breaking change Изменен формат ошибок некоторых функций Repository API.
  • Добавлена возможность указания заголовков (headers) для Kafka-коннектора.
  • Исправлено некорректное отображение версии продукта при использовании Docker-образа.
  • Исправлена обработка параметра if_not_exists в repository.put_batch().
  • Исправлена неконсистентность ошибок, возвращаемых repository.put_batch().
  • SDK обновлен до версии 2.11.2-0-r616.
  • Cartridge обновлен до версии 2.8.6.

[2.10.0] - 2023-12-11

  • Breaking change Полностью удалена функциональность тенантов.
  • Добавлена возможность вызова repository.call_on_storage() без указания типа.
  • Исправлена некорректная сериализация массивов.
  • Исправлена обработка параметра pkey функции repository.get() при указании версии.
  • Исправлены ошибки в триггерах механизма версионирования.
  • SDK обновлен до версии 2.11.2-0-r609.

[2.9.0] - 2023-11-21

Обновления

  • SDK обновлен до версии 2.11.1-0-r605.
  • Cartridge обновлен до версии 2.8.4.
  • Обновлены зависимости web UI.

Новые возможности

  • Breaking change Частично удалена функциональность тенантов.
  • Добавлена опция handler для Kafka-коннектора.
  • Добавлена обработка ошибок в Kafka-коннекторе.
  • Добавлены метрики обработчика исходящих данных.
  • Добавлена возможность использования require кода из конфигурации в расширениях.

Исправленные ошибки

  • Исправлен вызов deinit до вызова init в роли scheduler.
  • Исправлено отсутствие сообщений об ошибках в Kafka consumer.
  • Исправлено удаление частей конфигурации коннекторов в веб-интерфейсе.

[2.8.0] - 2023-08-30

Обновления

  • SDK обновлен до версии 2.11.1-0-r579.
  • Cartridge обновлен до версии 2.8.2.
  • expirationd обновлен до версии 1.5.0.
  • Обновлены зависимости для веб-интерфейса.

Новые возможности

  • Breaking change Удалены настройки тенантов из веб-интерфейса.
  • Модуль compress добавлен в sandbox.
  • Добавлены настройки Kafka consumer в sandbox: consumer_seek_partitions и consumer_metadata.
  • Добавлены настройки Kafka consumer в sandbox: consumer_pause, consumer_resume и consumer_status.
  • Добавлен параметр initial_state во входящую конфигурацию Kafka.
  • Добавлен менеджер для управления вводом Kafka с помощью флагов в etcd.
  • В сообщение Kafka consumer добавлено название коннектора.
  • Добавлены метрики для обработчика REST.
  • Для tdg_service_user добавлена возможность вызова функции box.info().
  • Добавлена поддержка алгоритма сжатия zlib для полей типов данных.

Исправленные ошибки

  • Исправлен запуск задач перед бутстрапом vshard.
  • Исправлена обработка сложных нулевых типов в сервисах.
  • Исправлена визуальная ошибка в EditDataActionForm.
  • Исправлена обработка параметра lifetime_hours=0.

[2.7.2] - 2023-07-21

  • Cartridge обновлен до версии 2.8.1.
  • Добавлены аргументы first_n_on_storage и after функций delete и update.
  • Добавлена возможность чтения данных из Kafka в простом (plain) формате.
  • Добавлена возможность повтора попытки загрузки первых N объектов из ремонтной очереди.
  • Улучшена валидация имен функций.
  • Исправлена потеря обнуляемых полей типа массив в возвращаемых типах сервисов.
  • Исправлено присваивание значения null через GraphQL.

[2.7.1] - 2023-06-07

  • Исправлен обход директорий в процессе распаковки конфигурации.
  • Добавлен список допустимых расширений файлов в архиве с конфигурацией.

[2.7.0] - 2023-05-30

Обновления

  • SDK обновлен до версии 2.11.0-0-r563.
  • Cartridge обновлен до версии 2.8.0.
  • metrics обновлен до версии 1.0.0.
  • kafka обновлен до версии 1.6.6.

Новые возможности

  • icu-date заменен на модуль datetime во внутренних механизмах.

  • LuaJIT переведен в режим GC64.

  • Добавлена функция repository.update_batch.

  • Добавлена функция repository.call_on_storage_batch.

  • Добавлен экспериментальный режим построения индексов в фоне. Включается опцией background_index_build.

  • Модуль clock добавлен в sandbox.

  • Добавлена возможность установки ключа (key) для отправки сообщений в kafka.

  • Watchdog выключен по умолчанию. Вместо него используется механизм fiber.slice.

  • Для HARD_LIMITS_SCANNED установлено значение unlimited. Вместо него используется механизм fiber.slice.

Исправленные ошибки

  • Запрещены union-типы с одним полем.
  • Удалены некорректные предупреждения в веб-интерфейсе при выполнении некоторых GraphQL-запросов.
  • Исправлена ошибка при передаче аргументов сервисов через REST API.
  • Исправлена ошибка при изменении union-типа на другой тип.

[2.6.9] - 2023-04-27

  • Исправлено некорректное сообщение об ошибке при валидации объединений (union).
  • Спейсы в хранилище vinyl теперь создаются только для типов со стратегией удаления cold_storage.
  • Исправлена ошибка при открытии вкладки Model до бутстрапа кластера.
  • Исправлен запуск задач до полного завершения применения конфигурации.
  • Исправлена ошибка: игнорирование изменений функций по умолчанию, используемых в модели, при загрузке конфигурации.
  • Исправлена ошибка, связанная с контекстом запроса Kafka.

[2.6.8] - 2023-04-07

Обновления

  • Cartridge обновлен до сборки (5c30d1cc).
  • expirationd обновлен до версии 1.4.0.
  • metrics обновлен до версии 0.17.0.
  • avro-schema обновлен до версии 3.1.0.
  • smtp обновлен до версии 0.0.7.
  • SDK обновлен до версии 2.10.6-0-r549.

Новые возможности

  • Добавлена поддержка aarch64 в Docker-сборки.
  • Добавлена проверка двойной индексации полей.
  • Изменено поведение кнопки Submit в компонентах Model и KeepVersionModel.
  • Добавлена проверка на положительность значения параметра jobs.max_jobs_in_parallel.

Исправленные ошибки

  • Исправлена ошибка при добавлении полей обнуляемых логических типов.
  • Исправлено возможное зависание во время локальных RPC-вызовов.
  • Исправлено падение файбера, отвечающего за запуск работ на роли Storage.

[2.6.7] - 2023-02-27

  • Обновлен Cartridge.
  • undici обновлен с версии 5.8.2 до 5.19.1.
  • SDK обновлен до версии 2.10.5-0-r543.
  • Добавлена возможность получить count для типов используя REST и GraphQL API.
  • Исправлена проблема связанная с тем, что время старта задачи могло быть позднее времени завершения.

[2.6.6] - 2023-02-20

  • SDK обновлен до версии 2.10.4-0-r538.
  • Исправлена проблема с обновлением записей при использовании массивов записей.
  • Добавлена возможность поместить набор объектов используя REST.

[2.6.5] - 2023-02-03

  • SDK обновлен до версии 2.10.4-0-r532.
  • Обновлен и улучшен модуль graphiql в WebUI.
  • Добавлена отдача контекста (yield) в функции cleanup журнала аудита и обычного журнала.

[2.6.4] - 2022-11-16

Обновления

  • SDK обновлен до версии 2.10.4-0-r518.
  • Cartridge обновлен до сборки (f4258ae2).
  • metrics обновлен до версии 0.15.1.
  • kafka обновлен до версии 1.6.2.

Новые возможности

  • Добавлена возможность указывать в конфигурации аргументы, которые будут переданы в функцию задачи планировщика.
  • Добавлена возможность запускать задачи на конкретных экземплярах Runner, которые помечены в конфигурации метками.
  • Улучшены компоненты редактора:
    • Полнотекстовый поиск на страницах Model и Code.
    • Отображение номеров строк на страницах Model и Test.
    • Сохранение состояния страниц GraphQL и Test при переходах и обновлении страниц.
  • Имя токена теперь отображается в журнале аудита.

Исправленные ошибки

  • Исправлена невозможность использовать тип Enum в аргументах сервисов.

[2.6.3] - 2022-10-06

Обновления

  • SDK обновлен до версии 2.10.3-0-r510.

Новые возможности

  • Добавлено значение 0 (хранить бесконечно) для lifetime_hours.
  • В пространство sandbox добавлен модуль msgpack.

[2.6.2] - 2022-09-05

Обновления

  • Cartridge обновлен до версии 2.7.6.
  • metrics обновлен до версии 0.15.0.
  • SDK обновлен до версии 2.10.2-0-gf4228cb7d-r502.

Новые возможности

  • Отображение ошибок при вызовах сервисов через IPROTO.

Исправленные ошибки

  • Исправлено некорректное отображение ошибок.

[2.5.3] - 2022-08-18

Исправленные ошибки

  • Исправлена маршрутизация запросов при использовании пагинации.
  • Исправлено некорректное предупреждение в коннекторе Kafka.
  • Исправлено присвоение для вложенных записей в repository.update.

[2.5.2] - 2022-08-12

Новые возможности

  • Добавлена поддержка заголовков Kafka во входящем коннекторе.

[2.6.1] - 2022-08-11

Новые возможности

  • Добавлен логический тип Timestamp.
  • Добавлено значение 0 (неограниченно) для keep_version_count.
  • Добавлена поддержка параметра skip_result в repository.put и repository.put_batch.
  • Добавлена функция sandbox tonumber64.
  • Добавлена возможность задавать правила сопоставления (collations) для отдельных частей индекса.
  • Журнал аудита теперь работает на основе модуля audit из Tarantool 2.10.

Исправленные ошибки

  • Добавлена валидация для обнуляемых полей в repository.update.
  • Убрана поддержка параметра first в repository.delete.
  • Исправлена маршрутизация запросов при использовании пагинации.
  • Исправлена некорректная валидация значений полей.

[2.6.0] - 2022-06-30

Критические изменения

  • Переименованы метрики tdg_expiration в expirationd.

Новые возможности

  • Добавлена страница настроек LDAP.
  • Tarantool flightrec включен по умолчанию.
  • Реализована возможность включать компрессию для полей кортежа.
  • Добавлена поддержка заголовков Kafka во входящем коннекторе.
  • В модуль datetime среды sandbox добавлены новые функции модуля Tarantool datetime.

Исправленные ошибки

  • Исправлен ряд ошибок фронтенда.
  • Исправлено некорректное предупреждение в коннекторе Kafka.
  • Исправлено некорректное сообщение об ошибке GraphQL в журнале.
  • Файловый коннектор теперь ожидает доступности хотя бы одного экземпляра с ролью runner.
  • Исправлено присвоение для вложенных записей в repository.update.

[2.5.1] - 2022-06-30

Новые возможности

  • Добавлен столбец Config file name в таблицу Configuration Files.
  • Доступен Docker-образ с включенным режимом разработки.
  • Исправлена фильтрация по неиндексированным полям логического типа - добавлено приведение полей к нативному виду.

Исправленные ошибки

  • Значения метрик Kafka типа boolean заменены на числовые.
  • Переработана фильтрация журнала и журнала аудита.
  • Добавлена обработка ошибок в repository.put_batch.

[2.5.0] - 2022-04-25

Критические изменения

  • Теперь для журнала отладки Kafka по умолчанию настроен уровень детализации all.
  • Поле плана запроса в GraphQL изменено на _query_plan (одно нижнее подчеркивание) для соответствия спецификации GraphQL.
  • Из Kafka-коннектора и файлового коннектора удалены все строковые метрики.

Новые возможности

  • Добавлен флаг skip_result для интерфейсов update и delete (iproto, REST, graphql, repository).
  • В окно Kafka-коннектора добавлены флажки журнала событий (logger).
  • Теперь в формах создания и редактирования пользователя/токена можно фильтровать список ролей по тенантам.
  • Добавлена настройка GraphQL для проверки консьюмеров Kafka (config.kafka_check_input).
  • В REST API добавлен параметр indexed_by, позволяющий выбирать индекс для сканирования.
  • Теперь можно передавать параметры для LDAP-соединений.
  • В окно конфигурации Kafka добавлена кнопка Test Connection.
  • Добавлена возможность загружать в конфигурацию самостоятельно определенные роли.
  • В пространство sandbox добавлены функции table.make_map и table.make_array.
  • К метрикам добавлена гистограмма просканированных и возвращенных кортежей.

Исправленные ошибки

  • Жесткие лимиты (hard limits): значение returned по умолчанию больше не равняется значению scanned.
  • В окне создания пользователя значение поля tenant по умолчанию теперь Default.
  • В журнале событий (logger) Kafka больше нет режима отключения вывода.
  • Вместе с сообщением Kafka в обработчик теперь передаются параметры topic, key, offset и partition.
  • Теперь LDAP-пользователи, для которых указаны несколько групп, имеют доступ ко всем ролям, связанных с этими группами.
  • Доработана проверка значений поля Expires in в окне создания пользователя.
  • Исправлена ошибка Cannot perform action with bucket при вызове repository.put_batch.
  • Исправлена ошибка, которая появлялась, если среди аргументов сервис-функции были enum-значения в кодировке utf-8.
  • Теперь при неполадках с Kafka-коннектором показывается сообщение.
  • Исправлена ошибка, возникавшая при попытке доступа LDAP-пользователя к GraphQL API.
  • Удаление профиля доступа, который используется в роли, теперь не допускается.

[2.4.0] - 2022-01-28

Обновления

  • Пакет обновлен до версии Tarantool 2.8.3-0-g01023dbc2-r442.

Новые возможности

  • Добавлены метрики IProto API.
  • В окне Edit tenant теперь отображаются сообщения об ошибках.
  • Теперь с LDAP можно использовать UPN без учета регистра.
  • В конфигурации Kafka-коннекторов появилась настройка enable_debug.
  • Теперь для GraphQL можно указывать параметры read, balance, mode.
  • Появилась возможность отправлять запросы к данным с помощью директивы @options.
  • Плагин auth теперь позволяет возвращать устанавливаемые пользователем заголовки и коды статуса.
  • Добавлены метрики для Kafka-коннектора.
  • Добавлены новые метрики для файлового коннектора.
  • Теперь можно настраивать логирование для Kafka-коннекторов с помощью параметра logger. Он принимает следующие значения: stderr, tdg, disable.
  • Теперь можно очистить спейсы определенного типа, передав имя этого типа в API maintenance.clear_data.
  • Завершение работы роли коннектора теперь происходит мягко (graceful shutdown).

Исправленные ошибки

  • Доработано окно Compare configuration.
  • Стал удобнее формат метрик для REST API (/data).
  • Отключено автозаполнение в форме редактирования ролей.
  • Теперь сообщение об ошибке исчезает из окна удаления тенанта, когда ошибка исправлена.
  • Из веб-интерфейса удален параметр Kafka-коннектора ssl.key.password.
  • Исправлена проблема, из-за которой задача могла зависнуть, если некоторое время был недоступен экземпляр runner.

[2.3.0] - 2021-10-27

Обновления

  • Cartridge обновлен до версии 2.7.3.

Новые возможности

  • Возможность настраивать время ожидания для функций map_reduce и call_on_storage.
  • Статистика времени жизни бизнес-объектов добавлена к экспортируемым метрикам.
  • Добавлена опция use_active_directory для LDAP.
  • Добавлена опция organizational_units для LDAP.

Исправленные ошибки

  • Кортежи с истекшим сроком жизни теперь не возвращаются при вызове.
  • Исправлена обработка пустых фильтров в запросах.
  • Исправлена ошибка, которая могла приводить к блокировке в нескольких подсистемах TDG.
  • Исправлено несколько ошибок, связанных с задачами и отложенными работами.
  • Исправлено присваивание массивов при обновлении данных.
  • Исправлены ошибки, связанные с подсистемой для работы с LDAP.
  • Авторизация через cookie-файлы при подключении к кластеру больше не допускается.
  • Тип null в запросах GraphQL больше не допускается.

Устаревшее название

  • Секция конфигурации Expiration переименована в Versioning.

[2.2.0] - 2021-09-29

Новые возможности

  • Добавлена поддержка ILIKE, т.е. LIKE без учета регистра.
  • LIKE и ILIKE разрешены только для строк и в явном виде запрещены для индексов.
  • При трассировке теперь сохраняется иерархия структуры фрагментов span.
  • Добавлены метрики для интерфейса управления данными REST.
  • Добавлен интерфейс GraphQL, позволяющий блокировать секции конфигурации и предотвращать их удаление.
  • API GraphQL model и expiration заменены на общий API data_type.
  • Добавлен интерфейс GraphQL для настройки метрик.

Исправленные ошибки

  • Исправлены некоторые ошибки мультитенантности.
  • Обратная итерация без курсора теперь запрещена.
  • В API model больше не допускается использовать поле namespace.

[2.1.1] - 2021-09-01

Новые возможности

  • При обновлении объектов теперь проверяются поля типа enum.
  • Добавлена проверка input_processor.storage.type.
  • Появилась возможность добавлять несколько входов Kafka.
  • Вместо файбера TDG time_delta теперь нужно использовать параметр Cartridge issues_limits.
  • Добавлена проверка, являются ли несуществующие типы данных элементами обнуляемого массива и используются ли они в качестве аргументов/возвращаемых значений.

Исправленные ошибки

  • Исправлена обработка сценария, при котором в секции expiration указан тип, не указанный в секции types.
  • Обнуляемые элементы массивов теперь обрабатываются корректно.
  • Составные индексы, заданные по двум и более полям с логическими типами, теперь работают корректно.
  • Стало невозможно назначить разным коннекторам одинаковые имена в конфигурации.

[2.1.0] - 2021-08-24

Выпуск первой публичной версии 2.1.0.