Skip to main content

Platform, Configuration & Security

Two changes here will stop a 2.0 server from behaving as expected with a 1.13 configuration: the LLM and embedding configuration move, and the new session limits.

LLM and embedding configuration moved

Breaking. Affects every deployment using semantic search, natural-language query, or any LLM feature.
Provider configuration is no longer nested inside elasticsearch.naturalLanguageSearch. It moves to a new top-level llmConfiguration block, with embeddings as a sub-section that reuses the same provider credentials.

Removed from naturalLanguageSearch

What remains under naturalLanguageSearch is only its own knobs — semanticSearchEnabled, knnNumCandidatesMultiplier (new, default 2) and a new filterExtractor block. Every LLM provider, credential, chat model and embedding setting now lives under llmConfiguration.

The 2.0 shape

conf/openmetadata.yaml
The embedding provider may differ from the chat provider; embeddings reuse the credentials from the provider blocks above.

Environment variable renames

The embedding-specific variables keep their names but move under llmConfiguration.embeddings. Unchanged: SEMANTIC_SEARCH_ENABLED, EMBEDDING_PROVIDER, MAX_CONCURRENT_EMBEDDING_REQUESTS, BEDROCK_AWS_IAM_AUTH_ENABLED, and every *_EMBEDDING_MODEL_ID / *_EMBEDDING_DIMENSION variable.
LLM_ENABLED and LLM_PROVIDER gate the entire block. Both must be set before embeddings — or any other LLM feature — will run. Porting the provider credentials across without also enabling the block leaves semantic search switched off.
BEDROCK_AWS_IAM_AUTH_ENABLED flips from false to true. Deployments that relied on the default being off, and supplied static keys, should confirm which credential chain is used.
Port your configuration into llmConfiguration before upgrading. Semantic search silently degrades — the provider resolves to noop — rather than failing loudly if the block is missing.

Session management

Sessions are database-backed

Behavioural. Affects multi-pod deployments.
2.0 adds a user_session table so sessions survive pod restarts and are shared across pods. Previously each pod held its own in-memory session state, which caused spurious logouts behind a load balancer without sticky sessions.

Concurrent sessions are capped per user

Behavioural — users will be logged out.
When the limit is exceeded, the least recently used active sessions are revoked. sessionExpiry now applies to all auth providers with a minimum of 3600 s; oidcConfiguration.sessionExpiry becomes a deprecated fallback.
Users who work across several browsers or devices, and service accounts driving many concurrent sessions, will start being silently signed out of the oldest sessions. Raise AUTHENTICATION_MAX_ACTIVE_SESSIONS_PER_USER if that is your pattern — but prefer bot tokens for automation.

Additional trusted redirect URIs

Additive. additionalTrustedRedirectUris allows redirect URIs beyond the callback URL and the server’s own callbacks. Each entry must match the requested URI exactly. Intended for browser-extension logins.
Related SSO hardening: the server callback is trusted in the SAML redirect allowlist, SAML pending-session ids are carried in RelayState, and the OIDC login loop is hardened with an interactive fallback that preserves pending logins.

Admin test-login

Additive. POST /v1/system/security/test-login/validate-token validates a browser-obtained OIDC id_token against a candidate (unsaved) security configuration, so an admin can confirm a real login resolves the expected identity before saving.

LDAP

Additive. recursiveGroupMembership (default false) enables transitive group resolution for Active Directory nested groups.

Database connection timeouts changed

Behavioural — long-running queries will now be cut off.
Any statement that previously ran for more than five minutes — a large reindex batch, a heavy Data Insights aggregation, an oversized CSV import — now aborts. Raise DB_QUERY_TIMEOUT_SECONDS, DB_POSTGRESQL_SOCKET_TIMEOUT or DB_MYSQL_SOCKET_TIMEOUT if you have legitimately long statements, and check upgrade logs for statement-timeout errors.

Server & logging configuration

HTTP/2 is available (opt-in)

Additive.
Both HTTP/2 modes are backwards compatible — HTTP/1.1 clients keep working on the same port. Worth enabling when browsers hit the server directly; not worth it behind an HTTP/2-terminating load balancer.

Response compression enabled

Behavioural. server.gzip.enabled is now true. Responses above roughly 256 bytes are gzipped. Clients that mishandle Content-Encoding: gzip need Accept-Encoding: identity.

Logging hardening

Behavioural and security-relevant.
LOG_LEVEL sets the root logger, and at DEBUG the HTTP parser prints every request header verbatim — including Authorization: Bearer <jwt> and session cookies. Since DEBUG is exactly what support asks customers to enable, and those logs get attached to tickets, the Jetty logger is now pinned independently via JETTY_LOG_LEVEL. Audit entries are logged at INFO with an audit marker and routed to logs/audit.log, and a filter keeps them out of the console appender.
If you parsed audit entries out of stdout, read logs/audit.log instead. If you need Jetty debug output, set JETTY_LOG_LEVEL=DEBUG explicitly — and be aware of what it prints.

Object storage configuration expanded

Behavioural. Affects deployments using file attachments.
The objectStorage block gains full s3 and azure sub-sections (endpoint, bucket, region, credentials, IAM role, prefix path, SSE algorithm and KMS key for S3; container, connection string, managed identity and blob endpoint for Azure). The default provider changes from NOOP to s3, but enabled still defaults to false, so nothing activates until you turn it on. This backs the new /v1/attachments API for uploaded assets. For MinIO, use provider s3 and point s3.endpoint at the MinIO server.

The 2.0.0 database migration

Plan a maintenance window.

New tables

Altered tables

  • background_jobs gains progress, total, result, error, message, cancelRequested, completedAt
  • tag_usage gains metadata JSON
  • audit_log_event gains search_text
  • thread_entity is renamed to thread_entity_legacy

Data migrations

Index additions

Many, including (deleted, name) and (deleted, serviceType) composites on all thirteen service tables (for /v1/services/overview), name indexes on the new entity tables so the distributed reindex cursor runs index-only, and an execution-id index on the workflow instance state time series.
On clusters with tens of millions of rows, composite index creation on service and entity tables is the long pole of the migration. Size your maintenance window accordingly.

Dependency and CVE updates

Additive — not breaking, but relevant to hardened deployments.
Backend: Jetty 12.1.10 (with the Jetty BOM imported so transitive modules follow), Netty 4.1.137.Final, BouncyCastle 1.85, jackson-databind 2.18.8, log4j 2.25.5, thrift 0.24.0, reactor-netty-http 1.2.18, tomcat-jdbc/juli 11.0.11, httpcore5 5.4.3, Redshift JDBC 2.2.2, Kubernetes client-java 25.0.1 and Apache Airflow 3.2.1. Frontend: ws 8.21.0, handlebars 4.5.2, js-yaml 5.2.2, fast-uri 3.1.5, nanoid 3.3.17 and brace-expansion 1.1.18 / 5.0.9. Other operationally relevant security fixes: test-connection workflow triggers are authorized, CSRF failures fail secure and retry on the next request, testDestination redacts destination configuration, and SCIM displayName synchronisation is fixed.