Журнал изменений
На этой странице находится актуальная информация о версиях Tarantool Data Grid. Формат журнала изменений основан на документе Keep a Changelog, а версионирование следует правилам Semantic Versioning.
Добавлено:
-
История конфигурации теперь по умолчанию хранит 50 последних версий конфигурации. Спейсы архива конфигурации очищаются при первом запуске после обновления.
-
Опция
extra_bodyдля output-коннекторов HTTP: дополнительные поля добавляются к телу отправляемого JSON-запроса. Параметр поддерживает толькоformat: jsonи несовместим с методомGET:output:- name: http_outputtype: httpurl: http://example.com/format: jsonextra_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-apitype: httpurl: https://api.example.com/eventsformat: jsonauth:type: oauth2_client_credentialstoken_url: https://sso.example.com/tokenclient_id: tdg-outputclient_secret: secretscopes: [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-maintype: keycloakoptions:issuer: https://keycloak.example.com/realms/tdgaudience: [tdg-api]groups_claim: realm_access.rolesroles:- role: admingroups:- tdg-admins- role: data-readergroups:- tdg-analysts- tdg-supportПолный список параметров конфигурации
auth_providersи опций встроенного верификатораoidc_jwksприведён в справочнике по настройке auth_providers.Несколько областей (realm). Если провайдеров несколько, для каждого провайдера также должен быть задан свой уникальный непустой
issuer. TDG читает непроверенное полеissтолько для выбора провайдера. Доступ не предоставляется, пока выбранный провайдер не проверит подпись и все настроенные поля, поэтому JWT для другой настроенной области (realm) проходит мимо предыдущего провайдера. Токен с совпадающимissuer, не прошедший проверку подписи, отклоняется и не может быть принят последующим провайдером. Два провайдера с совпадающим идентификатором токена отклоняются как неоднозначные. Унаследованный пользовательский верификатор без идентификатора поддерживается, если он единственный провайдер Keycloak.auth_providers:- name: keycloak-internaltype: keycloakoptions:issuer: https://keycloak.example.com/realms/internalaudience: [tdg-api]roles: [{role: admin, groups: [/tdg/admin]}]- name: keycloak-partnerstype: keycloakoptions:issuer: https://keycloak.example.com/realms/partnersaudience: [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/tdgaudience: [account]authorized_parties:- tdg-connectormax_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>. Отображаемое имя содержит поле claimpreferred_username,emailилиsub, а источник —Keycloak.Что проверяется. Токен принимается, если соблюдаются условия ниже:
- заголовок токена содержит
kidи допустимый алгоритм; - если задана опция
header_types, заголовок JOSEtypвходит в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); claimsiss,sub,aud,exp,nbfиiat, гдеaud— строка или массив (RFC 7519, раздел 4.1); политика TDG, требующаяiss,sub,audиexp; claimazp, сопоставляемый с идентификатором клиента (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 7517algнеобязателен, ключ без пометки (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 токена сохраняет пустой список и, таким образом, принимает токен независимо от его claimtyp; поле, оставленное со значением по умолчанию верификатора, не записывается в конфигурацию, поэтому открытие и сохранение провайдера не изменяет его. Отдельное поле пользовательских опций предназначено для верификаторов, зарегистрированных во время выполнения, которые объявляют имена опций, для которых в форме нет полей; оно не предлагается для встроенного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 trueend,create = function(provider_cfg)return {auth = function(request)-- accept, reject, or fallbackreturn {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 обновлен с версии 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;
- Cartridge 2.17.1 → 2.18.1;
- graphqlapi 0.0.11 → 0.0.15;
- graphqlapi-helpers 0.0.11 → 0.0.12;
- kafka 1.6.14 → 1.6.15;
- metrics 1.7.0 → 1.8.3;
- vshard 0.1.41 → 0.1.42.
Это 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.
Этот релиз охватывает версии 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 секунду, чтобы новый мастер-узел не застрял в режиме только для чтения.
Этот релиз охватывает версии 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.
В этом релизе обновлены зависимости и тестовое окружение.
Добавлено:
- Новые опции
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.
Добавлено:
- Флаг сборки
WITH_ZSTDдля включения поддержки сжатия zstd. В сборке Enterprise SDK поддержка zstd включена по умолчанию.
Изменено:
- Обновлена версия librdkafka до 2.15.1.
Этот релиз охватывает версии 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'}}, из-за которой пользовательские селекторы метрик исключались в дополнение к встроенным группам метрик.
Версия 0.1.42 полностью совместима с предыдущими версиями vshard.
Добавлено:
- Бэкенд для менеджера точек восстановления Tarantool: бэкенд
vshard-router. Он позволяет менеджеру периодически создавать согласованные с кластером точки восстановления, которые впоследствии можно использовать для резервного копирования и восстановления всего кластера vshard на определённый момент времени. Новый публичный метод роутераvshard.router.create_cluster_recovery_point()создаёт точку восстановления на мастер-узле в каждом наборе реплик.
Добавлено:
-
Спейсы хранилища
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: trueinterval_sec: 3600threshold_info_days: 7threshold_warn_days: 1Для сертификатов с истекшим сроком действия TDG всегда записывает предупреждение на уровне
warning. -
В веб-интерфейс добавлена вкладка Sandbox для отладки кода в окружении
sandbox.
Исправлено:
-
Исправлены потеря и дублирование данных, а также отказ репликации при одновременной ребалансировке и смене мастер-узла.
-
Исправлено восстановление планировщика задач после сбоя. Задачи, завершенные на раннере во время простоя планировщика, теперь корректно подхватываются при перезапуске - без зависания на неопределенное время или некорректного перезапуска.
-
Исправлено создание индекса по полю
bytes, вызывавшееOperationError. Типbytesтеперь ведет себя как псевдоним дляstring.
SDK обновлен с версии 2.11.8-0-r707 до версии 2.11.9-0-r709.
- Tarantool 2.11.8 → 2.11.9;
- Cartridge 2.16.6 → 2.17.1;
- vshard 0.1.39 → 0.1.41;
- graphqlapi-helpers 0.0.9 → 0.0.11-1: Удалена поддержка
ddl-eeиcrud-ee.
Это 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().
Этот релиз охватывает версии 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()andswitch_to_off_election_mode()to migrate a stateful replicaset between Tarantool election_mode = 'off' and election_mode = 'manual'. - Документация по миграции набора реплик в режиме
statefulв режим выборовmanual, в том числе миграции на основе перезапуска, вспомогательные функции (*helpers) во время выполнения, откат и рекомендации по изоляции (fencing).
Изменено:
Обновлены зависимости:
vshardс версии 0.1.39 до 0.1.41 (см. изменения в vshard 0.1.39 → 0.1.41).
Исправлено:
- Исправлена гонка координатора в режиме
statefulпри добавлении нового набора реплик: если у поставщика состояния еще нет назначения для этого набора реплик,failover.cfg()теперь возвращается кtopology.get_leaders_order(...)[1](failover_priority[1]) для первоначального назначения. Такой подход предотвращает переключение будущего лидер-узла в режимread_only=trueи позволяет избежать взаимной блокировки во время применения топологии.
Этот релиз охватывает версии 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.
Добавлено:
-
Добавлено больше записей в журнал аудита.
-
Имя экземпляра
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_httptype: httpformat: 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 обновлен с версии 2.11.8-0-r706 до версии 2.11.8-0-r707.
- Cartridge 2.16.5 → 2.16.6;
- metrics 1.6.2 → 1.7.0;
- vshard 0.1.38 → 0.1.39;
- graphqlapi 0.0.11 → 0.0.13: Удалена поддержка
ddl-ee.
Изменено:
- На странице кода дерево файлов больше не раскрывается автоматически по умолчанию.
- Обновлены зависимости:
vshardс версии 0.1.38 до 0.1.39 (см. изменения в vshard 0.1.38 → 0.1.39).
Исправлено:
- Мониторинг синхронных спейсов с учётом фактического режима
failover: предупреждение о синхронных спейсах теперь записывается в журнал только еслиfailoverнастроен в режиме, который их не поддерживает (например,eventualилиstatefulбезsynchro_mode), а не всегда при старте экземпляра. В модульcartridge.failoverдобавлена функцияis_sync_spaces_supported(); синхронные спейсы теперь определяются динамически, включая спейсы, добавленные во время работы.
Добавлено:
- Для плагина
graphiteдобавлена возможность отправлять метрики на несколько серверов. Обратная совместимость с предыдущей версией плагина сохранена. Изменения в поведении:initтеперь присваивает уникальное имя создаваемому файберуfiberна основе входных опцийgraphite server(если они переданы).- добавлен метод
stop()для остановки всех файберовfibers, запущенных плагином.
Исправлено:
- Удаление реплики с помощью метода
box.space._cluster:delete()не удаляет информацию об этой реплике из метрик. Информация исчезает только после перезапуска кластера.
Версия 0.1.39 полностью совместима с предыдущими версиями vshard.
Исправлено:
- Теперь разрешена запись в другие спейсы из
on_replace‑триггера при работе с системным спейсом_bucket.
-
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_nameusername: userpassword: secretdb: 127.0.0.1:1521/SOURCE_CCMprefetch_count: 100 # optional: prefetch row count amount from Oracleprefetch_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.
- 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).
- Исправлена ошибка, при которой последняя версия объекта пропадала во
время пагинации с включенной опцией
all_versions.
-
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 } } }
-
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: kafkatype: kafkadisable_metrics: trueoptions:...
- Cartridge обновлен до версии 2.15.3.
- kafka обновлен до версии 1.6.10.
- Обновлены зависимости фронтенда.
- Cartridge обновлен до версии 2.15.2.
- Исправлена ошибка, при которой обновление записи могло изменять несвязанные поля.
- Смягченная проверка миграции: теперь ее можно использовать для массовых обновлений данных без необходимости изменения схемы данных.
- Добавлено логирование 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.
- Исправлено несколько ошибок, связанных с менеджером учетных записей.
- Добавлен
methodв output-опции подключения HTTP. - SDK обновлен до версии 2.11.5-0-r662.
- Исправлено сообщение
Invalid merge source, возникающее при использованииrepository.pairsв случае превышения лимитов на число просканированных записей. - Исправлена ошибка, при которой настройки хранилища журналов игнорировались в случае восстановления после сбоев (failover).
- Исправлена потеря обновлений при изменении вложенного массива.
- SDK обновлен до версии 2.11.4-0-r658.
- Расширена информация о клиенте, записываемая в журнал аудита при неудачных попытках авторизации.
- Исправлена ошибка при попытке использования фрагментов в GraphQL-запросах.
- Исправлена ошибка при попытке указать две выборки в GraphQL-запросе.
- Исправлена ошибка при указании уровня логирования в аргументе командной строки или переменной окружения.
- Исправлена возможность обновления необнуляемого элемента массива на null.
- Убран sandboxing из функции, использующейся при миграции спейсов. Теперь можно использовать произвольные функции Lua/Tarantool.
- Исправлена ошибка при запуске миграций в режиме
dry_run. - Исправлена некорректная обработка спанов при включенном трейсинге при ошибке обработки объектов из Kafka.
- Исправлена ошибка
Field version nullability mismatch.
- Cartridge обновлен до версии 2.12.4.
- SDK обновлен до версии 2.11.4-0-r653.
- Breaking change Базовый образ для сборки проекта обновлен с CentOS 7 до AlmaLinux 8. Теперь проект может не работать на более старых дистрибутивах.
- Breaking change Отключено сопоставление с Lua-шаблоном при поиске содержимого сообщений журнала.
- Удалить поле из модели данных теперь можно без запуска миграции.
- Исправлены ошибки, возникающие при обновлении полей-массивов.
- Kafka consumer теперь логирует offset сообщения в случае возникновения проблем.
- Исправлена ошибка, возникающая при запуске миграций в режиме
dry_runдля спейсов с отключенным версионированием. - Cartridge обновлен до версии 2.12.3.
- metrics обновлен до версии 1.2.0.
- Добавлен метод
connector.http_requestв sandbox. - Добавлена подсистема событий
events. - Исправлено разыменование
nil(nil dereference) при перезагрузке конфигурации в Kafka-клиенте. - Исправлена обработка ошибок маршрутизации.
- Исправлен расчет размера журнала TDG (спейса
tdg_log). - Добавлен доступ к странице веб-интерфейса Console для
пользователей с привилегией
eval. - Cartridge обновлен до версии 2.12.0.
- SDK обновлен до версии 2.11.3-0-r636.
- Исправлена ошибка: account provider watcher печатал ошибку при инициализации.
- Cartridge обновлен до версии 2.10.0.
- expirationd обновлен до версии 1.6.0.
- SDK обновлен до версии 2.11.3-0-r631.
- Добавлен фильтр полей для запросов на получение данных.
- Исправлена ошибка
table is nilв обнуляемом поле записи. - Исправлена ошибка vshard gc при балансировке.
- Исправлена ошибка, связанная с передачей значений
cdataв метрики. - Исправлено использование типа
Unionсовместно с массивами. - Исправлено значение версии по умолчанию для схемы GraphQL.
- Исправлена нумерация версий PRM-пакета.
- Исправлено переполнение в значениях дат.
- SDK обновлен до версии 2.11.2-0-r621.
- Cartridge обновлен до версии 2.9.0.
- Исправлена сборка Docker-образа.
- 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.
- Breaking change Полностью удалена функциональность тенантов.
- Добавлена возможность вызова
repository.call_on_storage()без указания типа. - Исправлена некорректная сериализация массивов.
- Исправлена обработка параметра
pkeyфункцииrepository.get()при указании версии. - Исправлены ошибки в триггерах механизма версионирования.
- SDK обновлен до версии 2.11.2-0-r609.
- SDK обновлен до версии 2.11.1-0-r605.
- Cartridge обновлен до версии 2.8.4.
- Обновлены зависимости web UI.
- Breaking change Частично удалена функциональность тенантов.
- Добавлена опция
handlerдля Kafka-коннектора. - Добавлена обработка ошибок в Kafka-коннекторе.
- Добавлены метрики обработчика исходящих данных.
- Добавлена возможность использования
requireкода из конфигурации в расширениях.
- Исправлен вызов
deinitдо вызоваinitв ролиscheduler. - Исправлено отсутствие сообщений об ошибках в Kafka consumer.
- Исправлено удаление частей конфигурации коннекторов в веб-интерфейсе.
- 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.
- Cartridge обновлен до версии 2.8.1.
- Добавлены аргументы
first_n_on_storageиafterфункцийdeleteиupdate. - Добавлена возможность чтения данных из Kafka в простом (plain) формате.
- Добавлена возможность повтора попытки загрузки первых N объектов из ремонтной очереди.
- Улучшена валидация имен функций.
- Исправлена потеря обнуляемых полей типа массив в возвращаемых типах сервисов.
- Исправлено присваивание значения
nullчерез GraphQL.
- Исправлен обход директорий в процессе распаковки конфигурации.
- Добавлен список допустимых расширений файлов в архиве с конфигурацией.
- 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-типа на другой тип.
- Исправлено некорректное сообщение об ошибке при валидации объединений (union).
- Спейсы в хранилище vinyl теперь создаются только для типов со
стратегией удаления
cold_storage. - Исправлена ошибка при открытии вкладки Model до бутстрапа кластера.
- Исправлен запуск задач до полного завершения применения конфигурации.
- Исправлена ошибка: игнорирование изменений функций по умолчанию, используемых в модели, при загрузке конфигурации.
- Исправлена ошибка, связанная с контекстом запроса Kafka.
- 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.
- Обновлен Cartridge.
- undici обновлен с версии 5.8.2 до 5.19.1.
- SDK обновлен до версии 2.10.5-0-r543.
- Добавлена возможность получить
countдля типов используя REST и GraphQL API. - Исправлена проблема связанная с тем, что время старта задачи могло быть позднее времени завершения.
- SDK обновлен до версии 2.10.4-0-r538.
- Исправлена проблема с обновлением записей при использовании массивов записей.
- Добавлена возможность поместить набор объектов используя REST.
- SDK обновлен до версии 2.10.4-0-r532.
- Обновлен и улучшен модуль graphiql в WebUI.
- Добавлена отдача контекста (yield) в функции
cleanupжурнала аудита и обычного журнала.
- SDK обновлен до версии 2.10.4-0-r518.
- Cartridge обновлен до сборки (f4258ae2).
- metrics обновлен до версии 0.15.1.
- kafka обновлен до версии 1.6.2.
- Добавлена возможность указывать в конфигурации аргументы, которые будут переданы в функцию задачи планировщика.
- Добавлена возможность запускать задачи на конкретных экземплярах Runner, которые помечены в конфигурации метками.
- Улучшены компоненты редактора:
- Полнотекстовый поиск на страницах Model и Code.
- Отображение номеров строк на страницах Model и Test.
- Сохранение состояния страниц GraphQL и Test при переходах и обновлении страниц.
- Имя токена теперь отображается в журнале аудита.
- Исправлена невозможность использовать тип
Enumв аргументах сервисов.
- SDK обновлен до версии 2.10.3-0-r510.
- Добавлено значение
0(хранить бесконечно) дляlifetime_hours. - В пространство sandbox добавлен модуль msgpack.
- Cartridge обновлен до версии 2.7.6.
- metrics обновлен до версии 0.15.0.
- SDK обновлен до версии 2.10.2-0-gf4228cb7d-r502.
- Отображение ошибок при вызовах сервисов через IPROTO.
- Исправлено некорректное отображение ошибок.
- Исправлена маршрутизация запросов при использовании пагинации.
- Исправлено некорректное предупреждение в коннекторе Kafka.
- Исправлено присвоение для вложенных записей в
repository.update.
- Добавлена поддержка заголовков Kafka во входящем коннекторе.
- Добавлен логический тип
Timestamp. - Добавлено значение
0(неограниченно) дляkeep_version_count. - Добавлена поддержка параметра
skip_resultвrepository.putиrepository.put_batch. - Добавлена функция sandbox
tonumber64. - Добавлена возможность задавать правила сопоставления (collations) для отдельных частей индекса.
- Журнал аудита теперь работает на основе модуля audit из Tarantool 2.10.
- Добавлена валидация для обнуляемых полей в
repository.update. - Убрана поддержка параметра
firstвrepository.delete. - Исправлена маршрутизация запросов при использовании пагинации.
- Исправлена некорректная валидация значений полей.
- Переименованы метрики
tdg_expirationвexpirationd.
- Добавлена страница настроек LDAP.
- Tarantool
flightrecвключен по умолчанию. - Реализована возможность включать компрессию для полей кортежа.
- Добавлена поддержка заголовков Kafka во входящем коннекторе.
- В модуль
datetimeсреды sandbox добавлены новые функции модуля Tarantooldatetime.
- Исправлен ряд ошибок фронтенда.
- Исправлено некорректное предупреждение в коннекторе Kafka.
- Исправлено некорректное сообщение об ошибке GraphQL в журнале.
- Файловый коннектор теперь ожидает доступности хотя бы одного
экземпляра с ролью
runner. - Исправлено присвоение для вложенных записей в
repository.update.
- Добавлен столбец Config file name в таблицу Configuration Files.
- Доступен Docker-образ с включенным режимом разработки.
- Исправлена фильтрация по неиндексированным полям логического типа - добавлено приведение полей к нативному виду.
- Значения метрик Kafka типа boolean заменены на числовые.
- Переработана фильтрация журнала и журнала аудита.
- Добавлена обработка ошибок в
repository.put_batch.
- Теперь для журнала отладки 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.
- Удаление профиля доступа, который используется в роли, теперь не допускается.
- Пакет обновлен до версии 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.
- Cartridge обновлен до версии 2.7.3.
- Возможность настраивать время ожидания для функций
map_reduceиcall_on_storage. - Статистика времени жизни бизнес-объектов добавлена к экспортируемым метрикам.
- Добавлена опция
use_active_directoryдля LDAP. - Добавлена опция
organizational_unitsдля LDAP.
- Кортежи с истекшим сроком жизни теперь не возвращаются при вызове.
- Исправлена обработка пустых фильтров в запросах.
- Исправлена ошибка, которая могла приводить к блокировке в нескольких подсистемах TDG.
- Исправлено несколько ошибок, связанных с задачами и отложенными работами.
- Исправлено присваивание массивов при обновлении данных.
- Исправлены ошибки, связанные с подсистемой для работы с LDAP.
- Авторизация через cookie-файлы при подключении к кластеру больше не допускается.
- Тип
nullв запросах GraphQL больше не допускается.
- Секция конфигурации Expiration переименована в Versioning.
- Добавлена поддержка
ILIKE, т.е.LIKEбез учета регистра. LIKEиILIKEразрешены только для строк и в явном виде запрещены для индексов.- При трассировке теперь сохраняется иерархия структуры фрагментов span.
- Добавлены метрики для интерфейса управления данными REST.
- Добавлен интерфейс GraphQL, позволяющий блокировать секции конфигурации и предотвращать их удаление.
- API GraphQL
modelиexpirationзаменены на общий APIdata_type. - Добавлен интерфейс GraphQL для настройки метрик.
- Исправлены некоторые ошибки мультитенантности.
- Обратная итерация без курсора теперь запрещена.
- В API
modelбольше не допускается использовать полеnamespace.
- При обновлении объектов теперь проверяются поля типа
enum. - Добавлена проверка
input_processor.storage.type. - Появилась возможность добавлять несколько входов Kafka.
- Вместо файбера TDG
time_deltaтеперь нужно использовать параметр Cartridgeissues_limits. - Добавлена проверка, являются ли несуществующие типы данных элементами обнуляемого массива и используются ли они в качестве аргументов/возвращаемых значений.
- Исправлена обработка сценария, при котором в секции
expirationуказан тип, не указанный в секцииtypes. - Обнуляемые элементы массивов теперь обрабатываются корректно.
- Составные индексы, заданные по двум и более полям с логическими типами, теперь работают корректно.
- Стало невозможно назначить разным коннекторам одинаковые имена в конфигурации.
Выпуск первой публичной версии 2.1.0.