Configuration Reference

This document provides a comprehensive reference for all Polaris configuration options.

All properties listed here are runtime properties and can be changed without rebuilding Polaris.

Table of ContentsπŸ”—

Features & BehaviorπŸ”—

polaris.featuresπŸ”—

Feature configurations for Polaris. These are stable, user-facing settings.

polaris.features."ADD_TRAILING_SLASH_TO_LOCATION"πŸ”—

When set, the base location for a table or namespace will have / added as a suffix if not present

  • Type: Boolean
  • Default: true
  • Catalog Config: polaris.config.add-trailing-slash-to-location

polaris.features."ALLOW_DROPPING_NON_EMPTY_PASSTHROUGH_FACADE_CATALOG"πŸ”—

If enabled, allow dropping a passthrough-facade catalog even if it contains namespaces or tables. passthrough-facade catalogs may contain leftover entities when syncing with source catalog.In the short term these entities will be ignored, in the long term there will be method/background job to clean them up.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.allow-dropping-non-empty-passthrough-facade-catalog

polaris.features."ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING"πŸ”—

If set to true, allow credential vending for external catalogs.

  • Type: Boolean
  • Default: true
  • Catalog Config: polaris.config.enable.credential.vending

polaris.features."ALLOW_EXTERNAL_METADATA_FILE_LOCATION"πŸ”—

If set to true, allows metadata files to be located outside the default metadata directory.

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_EXTERNAL_TABLE_LOCATION"πŸ”—

If set to true, allows tables to have external locations outside the default structure.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.allow.external.table.location

polaris.features."ALLOW_FEDERATED_CATALOGS_CREDENTIAL_VENDING"πŸ”—

If set to true (default), allow credential vending for external catalogs. Note this requires ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING to be true first.

  • Type: Boolean
  • Default: true
  • Catalog Config: polaris.config.allow-federated-catalogs-credential-vending

polaris.features."ALLOW_INSECURE_STORAGE_TYPES"πŸ”—

Allow usage of FileIO implementations that are considered insecure. Enabling this setting may expose the service to possibly severe security risks! This should only be set to ’true’ for tests!

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_NAMESPACE_LOCATION_OVERLAP"πŸ”—

If set to true, allow one namespace’s location to reside within another namespace’s location. This is only enforced within a parent catalog or namespace.

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_OPTIMIZED_SIBLING_CHECK"πŸ”—

When set to true, Polaris will permit enabling the feature OPTIMIZED_SIBLING_CHECK for catalogs, this is done to prevent accidental enabling the feature in cases such as schema migrations, without backfill and hence leading to potential data integrity issues. This will be removed in 2.0.0 when polaris ships with the necessary migrations to backfill the index.

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_OVERLAPPING_CATALOG_URLS"πŸ”—

If set to true, allows catalog URLs to overlap.

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_SETTING_S3_ENDPOINTS"πŸ”—

If set to true (default), Polaris will permit S3 storage configurations to have custom endpoints. If set to false, Polaris will not accept catalog create and update requests that contain S3 endpoint properties.

  • Type: Boolean
  • Default: true

polaris.features."ALLOW_SETTING_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS"πŸ”—

If set to true (default), Polaris will allow setting or changing catalog property polaris.config.enable-sub-catalog-rbac-for-federated-catalogs.If set to false, Polaris will disallow setting or changing the above catalog property

  • Type: Boolean
  • Default: true

polaris.features."ALLOW_SPECIFYING_FILE_IO_IMPL"πŸ”—

Config key for whether to allow setting the FILE_IO_IMPL using catalog properties. Must only be enabled in dev/test environments, should not be in production systems.

  • Type: Boolean
  • Default: false

polaris.features."ALLOW_TABLE_LOCATION_OVERLAP"πŸ”—

If set to true, allow one table’s location to reside within another table’s location. This is only enforced within a given namespace.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.allow.overlapping.table.location

polaris.features."ALLOW_UNSTRUCTURED_TABLE_LOCATION"πŸ”—

If set to true, allows unstructured table locations.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.allow.unstructured.table.location

polaris.features."ALLOW_WILDCARD_LOCATION"πŸ”—

Indicates whether asterisks (’*’) in configuration values defining allowed storage locations are processed as meaning ‘any location’.

  • Type: Boolean
  • Default: false

polaris.features."AZURE_RETRY_COUNT"πŸ”—

Number of retry attempts for Azure API requests. Uses exponential backoff with jitter to handle transient failures.

  • Type: Integer
  • Default: 3

polaris.features."AZURE_RETRY_DELAY_MILLIS"πŸ”—

Initial delay in milliseconds before first retry for Azure API requests. Delay doubles with each retry (exponential backoff).

  • Type: Integer
  • Default: 2000

polaris.features."AZURE_RETRY_JITTER_FACTOR"πŸ”—

Jitter factor (0.0 to 1.0) applied to retry delays for Azure API requests. The jitter is applied as a random percentage of the computed exponential backoff delay. For example, 0.5 means up to 50%% random jitter will be added to each retry delay. Helps prevent thundering herd when multiple requests fail simultaneously.

  • Type: Double
  • Default: 0.5

polaris.features."AZURE_TIMEOUT_MILLIS"πŸ”—

Timeout in milliseconds for Azure API requests. Prevents indefinite blocking when Azure endpoints are slow or unresponsive. Used internally by Azure storage integration for credential vending and other operations.

  • Type: Integer
  • Default: 15000

polaris.features."CLEANUP_ON_CATALOG_DROP"πŸ”—

If set to true, clean up data when a catalog is dropped

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.cleanup.on.catalog.drop

polaris.features."CLEANUP_ON_NAMESPACE_DROP"πŸ”—

If set to true, clean up data when a namespace is dropped

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.cleanup.on.namespace.drop

polaris.features."DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED"πŸ”—

When enabled, Iceberg tables and views created without a location specified will have a prefix applied to the location within the catalog’s base location, rather than a location directly inside the parent namespace. Note that this requires ALLOW_EXTERNAL_TABLE_LOCATION to be enabled, but with OPTIMIZED_SIBLING_CHECK enabled it is still possible to enforce the uniqueness of table locations within a catalog.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.default-table-location-object-storage-prefix.enabled

polaris.features."DROP_WITH_PURGE_ENABLED"πŸ”—

If set to true, allows tables to be dropped with the purge parameter set to true.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.drop-with-purge.enabled

polaris.features."ENABLE_CATALOG_FEDERATION"πŸ”—

If true, allows creating and using ExternalCatalogs containing ConnectionConfigInfos to perform federation to remote catalogs.

  • Type: Boolean
  • Default: false

polaris.features."ENABLE_CREDENTIAL_RESET"πŸ”—

Flag to enable or disable the API to reset principal credentials. Defaults to enabled, but service providers may want to disable it.

  • Type: Boolean
  • Default: true

polaris.features."ENABLE_FINE_GRAINED_UPDATE_TABLE_PRIVILEGES"πŸ”—

When true, enables finer grained update table privileges which are passed to the authorizer for update table operations

  • Type: Boolean
  • Default: true
  • Catalog Config: polaris.config.enable-fine-grained-update-table-privileges

polaris.features."ENABLE_GENERIC_TABLES"πŸ”—

If true, the generic-tables endpoints are enabled

  • Type: Boolean
  • Default: true

polaris.features."ENABLE_POLICY_STORE"πŸ”—

If true, the policy-store endpoints are enabled

  • Type: Boolean
  • Default: true

polaris.features."ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS"πŸ”—

When enabled, allows RBAC operations to create synthetic entities for entities in federated catalogs that don’t exist in the local metastore.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.enable-sub-catalog-rbac-for-federated-catalogs

polaris.features."ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING"πŸ”—

If set to true, require that principals must rotate their credentials before being used for anything else.

  • Type: Boolean
  • Default: false

polaris.features."ENTITY_CACHE_WEIGHER_TARGET"πŸ”—

The maximum weight for the entity cache. This is a heuristic value without any particular unit of measurement. It roughly correlates with the total heap size of cached values. Fine-tuning requires experimentation in the specific deployment environment

  • Type: Long
  • Default: 104857600

polaris.features."ICEBERG_COMMIT_MAX_RETRIES"πŸ”—

The max number of times to try committing to an Iceberg table

  • Type: Integer
  • Default: 4
  • Catalog Config: polaris.config.iceberg-commit-max-retries

polaris.features."ICEBERG_ROLLBACK_COMPACTION_ON_CONFLICTS"πŸ”—

Rollback replace snapshots created by compaction which have polaris.internal.conflict-resolution.by-operation-type.replace property set to rollback in their snapshot summary

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.rollback.compaction.on-conflicts.enabled

polaris.features."INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL"πŸ”—

If set to true, principal name will be included in temporary subscoped credentials. Currently only AWS credentials are supported for which session name of the generated credentials will look like ‘polaris-’ rather than simple ‘polaris’. Note that enabling this feature leads to degradation in temporary credential caching as catalog will no longer be able to reuse credentials for multiple principals.

  • Type: Boolean
  • Default: false

polaris.features."INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL"πŸ”—

If set to true, session tags (catalog, namespace, table, principal, roles) will be included in AWS STS AssumeRole requests for credential vending. These tags appear in CloudTrail events, enabling correlation between catalog operations and S3 data access. Requires the IAM role trust policy to allow sts:TagSession action. Note that enabling this feature may lead to degradation in temporary credential caching as catalog will no longer be able to reuse credentials for different tables/namespaces/roles.

  • Type: Boolean
  • Default: false

polaris.features."INCLUDE_TRACE_ID_IN_SESSION_TAGS"πŸ”—

If set to true (and INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL is also true), the OpenTelemetry trace ID will be included as a session tag in AWS STS AssumeRole requests. This enables end-to-end correlation between catalog operations (Polaris events), credential vending (CloudTrail), and metrics reports from compute engines. WARNING: Enabling this feature completely disables credential caching because every request has a unique trace ID. This may significantly increase latency and STS API costs. Consider leaving this disabled unless end-to-end tracing correlation is critical.

  • Type: Boolean
  • Default: false

polaris.features."LIST_PAGINATION_ENABLED"πŸ”—

If set to true, pagination for APIs like listTables is enabled.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.list-pagination-enabled

polaris.features."MAX_METADATA_REFRESH_RETRIES"πŸ”—

How many times to retry refreshing metadata when the previous error was retryable

  • Type: Integer
  • Default: 2

polaris.features."OPTIMIZED_SIBLING_CHECK"πŸ”—

When set, an index is used to perform the sibling check between tables, views, and namespaces. New locations will be checked against previous ones based on components, so the new location /foo/bar/ will check for a sibling at /, /foo/ and /foo/bar/%. In order for this check to be correct, locations should end with a slash. See ADD_TRAILING_SLASH_TO_LOCATION for a way to enforce this when new locations are added. Only supported by the JDBC metastore.

  • Type: Boolean
  • Default: false

polaris.features."POLARIS_TASK_TIMEOUT_MILLIS"πŸ”—

Polaris task expiry timeout (milliseconds). Older unfinished tasks may not be processed.

  • Type: Long
  • Default: 300000

polaris.features."PURGE_VIEW_METADATA_ON_DROP"πŸ”—

If set to true, Polaris will attempt to delete view metadata files when a view is dropped.

  • Type: Boolean
  • Default: true
  • Catalog Config: polaris.config.purge-view-metadata-on-drop

polaris.features."RESOLVE_CREDENTIALS_BY_STORAGE_NAME"πŸ”—

If set to true, resolve AWS credentials based on the storageName field of the storage configuration. When disabled, the default AWS credentials are used for all storages.

  • Type: Boolean
  • Default: false

polaris.features."SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION"πŸ”—

If set to true, skip credential-subscoping indirection entirely whenever trying to obtain storage credentials for instantiating a FileIO. If ’true’, no attempt is made to use StorageConfigs to generate table-specific storage credentials, but instead the default fallthrough of table-level credential properties or else provider-specific APPLICATION_DEFAULT credential-loading will be used for the FileIO. Typically this setting is used in single-tenant server deployments that don’t rely on “credential-vending” and can use server-default environment variables or credential config files for all storage access, or in test/dev scenarios.

  • Type: Boolean
  • Default: false

polaris.features."STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS"πŸ”—

How long to store storage credentials in the local cache. This should be less than STORAGE_CREDENTIAL_DURATION_SECONDS

  • Type: Integer
  • Default: 1800

polaris.features."STORAGE_CREDENTIAL_DURATION_SECONDS"πŸ”—

The duration of time that vended storage credentials are valid for. Support for longer (or shorter) durations is dependent on the storage provider. GCS current does not respect this value.

  • Type: Integer
  • Default: 3600

polaris.features."SUPPORTED_CATALOG_CONNECTION_TYPES"πŸ”—

The list of supported catalog connection types for federation

  • Type: List<String>
  • Default: [ICEBERG_REST]

polaris.features."SUPPORTED_CATALOG_STORAGE_TYPES"πŸ”—

The list of supported storage types for a catalog

  • Type: List<String>
  • Default: [S3, AZURE, GCS]
  • Catalog Config: polaris.config.supported.storage.types

polaris.features."SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES"πŸ”—

The list of supported authentication types for catalog federation

  • Type: List<String>
  • Default: [OAUTH, BEARER, SIGV4]

polaris.features."TABLE_METADATA_CLEANUP_BATCH_SIZE"πŸ”—

Metadata batch size for tasks that clean up dropped tables’ files.

  • Type: Integer
  • Default: 10

polaris.behavior-changesπŸ”—

Internal behavior change configurations. These are unstable and may be removed.

polaris.behavior-changes."ALLOW_NAMESPACE_CUSTOM_LOCATION"πŸ”—

If set to true, allow namespaces with completely arbitrary locations. This should not affect credential vending.

  • Type: Boolean
  • Default: false
  • Catalog Config: polaris.config.namespace-custom-location.enabled

polaris.behavior-changes."ENTITY_CACHE_SOFT_VALUES"πŸ”—

Whether or not to use soft values in the entity cache

  • Type: Boolean
  • Default: false

polaris.behavior-changes."SCHEMA_VERSION_FALL_BACK_ON_DNE"πŸ”—

If set to true, exceptions encountered while loading the VERSION table which appear to be caused by the VERSION table not existing will be interpreted as meaning that the schema version is currently 0.

  • Type: Boolean
  • Default: true

polaris.behavior-changes."STORAGE_CONFIGURATION_MAX_LOCATIONS"πŸ”—

How many locations can be associated with a storage configuration, or -1 for unlimited locations

  • Type: Integer
  • Default: -1

polaris.behavior-changes."TABLE_OPERATIONS_MAKE_METADATA_CURRENT_ON_COMMIT"πŸ”—

If true, BasePolarisTableOperations should mark the metadata that is passed into commit as current, and reuse it to skip a trip to object storage to re-construct the committed metadata again.

  • Type: Boolean
  • Default: true

polaris.behavior-changes."VALIDATE_VIEW_LOCATION_OVERLAP"πŸ”—

If true, validate that view locations don’t overlap when views are created

  • Type: Boolean
  • Default: true

Authentication & AuthorizationπŸ”—

polaris.authenticationπŸ”—

PropertyDefault ValueTypeDescription
polaris.authentication.typeinternalINTERNAL, EXTERNAL, MIXEDThe type of authentication to use.
polaris.authentication.authenticator.typedefaultstringThe type of the identity provider. Must be a registered (Authenticator) identifier.
polaris.authentication.token-service.typedefaultstringThe type of the OAuth2 service. Must be a registered (IcebergRestOAuth2ApiService) identifier.
polaris.authentication.token-broker.max-token-generationPT1HdurationThe maximum token duration.
polaris.authentication.token-broker.typersa-key-pairstringThe type of the token broker factory. Must be a registered (TokenBrokerFactory) identifier.
polaris.authentication.token-broker.rsa-key-pair.public-key-filepathThe path to the public key file.
polaris.authentication.token-broker.rsa-key-pair.private-key-filepathThe path to the private key file.
polaris.authentication.token-broker.symmetric-key.secretstringThe secret to use for both signing and verifying signatures. Either this option of (#file()) must be provided.
polaris.authentication.token-broker.symmetric-key.filepathThe file to read the secret from. Either this option of (#secret()) must be provided.
polaris.authentication.<realm>.typeinternalINTERNAL, EXTERNAL, MIXEDThe type of authentication to use.
polaris.authentication.<realm>.authenticator.typedefaultstringThe type of the identity provider. Must be a registered (Authenticator) identifier.
polaris.authentication.<realm>.token-service.typedefaultstringThe type of the OAuth2 service. Must be a registered (IcebergRestOAuth2ApiService) identifier.
polaris.authentication.<realm>.token-broker.max-token-generationPT1HdurationThe maximum token duration.
polaris.authentication.<realm>.token-broker.typersa-key-pairstringThe type of the token broker factory. Must be a registered (TokenBrokerFactory) identifier.
polaris.authentication.<realm>.token-broker.rsa-key-pair.public-key-filepathThe path to the public key file.
polaris.authentication.<realm>.token-broker.rsa-key-pair.private-key-filepathThe path to the private key file.
polaris.authentication.<realm>.token-broker.symmetric-key.secretstringThe secret to use for both signing and verifying signatures. Either this option of (#file()) must be provided.
polaris.authentication.<realm>.token-broker.symmetric-key.filepathThe file to read the secret from. Either this option of (#secret()) must be provided.

polaris.authorizationπŸ”—

PropertyDefault ValueTypeDescription
polaris.authorization.typeinternalstring

polaris.authorization.opaπŸ”—

Configuration for OPA (Open Policy Agent) authorization.

Beta Feature: OPA authorization is currently in Beta and is not a stable release. It may undergo breaking changes in future versions. Use with caution in production environments.

PropertyDefault ValueTypeDescription
polaris.authorization.opa.policy-uriuri
polaris.authorization.opa.auth.typenoneNONE, BEARERType of authentication
polaris.authorization.opa.auth.bearer.static-token.valuestringStatic bearer token value
polaris.authorization.opa.auth.bearer.file-based.pathpathPath to file containing bearer token
polaris.authorization.opa.auth.bearer.file-based.refresh-intervaldurationHow often to refresh file-based bearer tokens (defaults to 5 minutes if not specified)
polaris.authorization.opa.auth.bearer.file-based.jwt-expiration-refreshbooleanWhether to automatically detect JWT tokens and use their ’exp’ field for refresh timing. If true and the token is a valid JWT with an ’exp’ claim, the token will be refreshed based on the expiration time minus the buffer, rather than the fixed refresh interval. Defaults to true if not specified.
polaris.authorization.opa.auth.bearer.file-based.jwt-expiration-bufferdurationBuffer time before JWT expiration to refresh the token. Only used when jwtExpirationRefresh is true and the token is a valid JWT. Defaults to 1 minute if not specified.
polaris.authorization.opa.http.timeoutPT2Sduration
polaris.authorization.opa.http.verify-ssltrueboolean
polaris.authorization.opa.http.trust-store-pathpath
polaris.authorization.opa.http.trust-store-passwordstring

polaris.oidcπŸ”—

Polaris-specific configuration for OIDC tenants.

PropertyDefault ValueTypeDescription
polaris.oidc.principal-mapper.id-claim-pathstringThe path to the claim that contains the principal ID. Nested paths can be expressed using “/” as a separator, e.g. "resource_access/client1/roles" would look for the “roles” field inside the “client1” object inside the “resource_access” object in the token claims.

Optional. Either this option or (#nameClaimPath()) must be provided.
polaris.oidc.principal-mapper.name-claim-pathstringThe claim that contains the principal name. Nested paths can be expressed using “/” as a separator, e.g. "resource_access/client1/roles" would look for the “roles” field inside the “client1” object inside the “resource_access” object in the token claims.

Optional. Either this option or (#idClaimPath()) must be provided.
polaris.oidc.principal-mapper.typedefaultstringThe type of the principal mapper. Must be a registered (org.apache.polaris.service.auth.external.mapping.PrincipalMapper) identifier.
polaris.oidc.principal-roles-mapper.typedefaultstringThe type of the principal roles mapper. Must be a registered (org.apache.polaris.service.auth.external.mapping.PrincipalRolesMapper) identifier.
polaris.oidc.principal-roles-mapper.filterstringA regular expression that matches the role names in the identity. Only roles that match this regex will be included in the Polaris-specific roles.
polaris.oidc.principal-roles-mapper.mappingslist ofA list of regex mappings that will be applied to each role name in the identity.
polaris.oidc.principal-roles-mapper.mappings.regexstringA regular expression that will be applied to each role name in the identity. Along with (#replacement()), this regex is used to transform the role names in the identity into Polaris-specific roles.
polaris.oidc.principal-roles-mapper.mappings.replacementstringThe replacement string for the role names in the identity. This is used along with (#regex()) to transform the role names in the identity into Polaris-specific roles.
polaris.oidc.<tenant>.principal-mapper.id-claim-pathstringThe path to the claim that contains the principal ID. Nested paths can be expressed using “/” as a separator, e.g. "resource_access/client1/roles" would look for the “roles” field inside the “client1” object inside the “resource_access” object in the token claims.

Optional. Either this option or (#nameClaimPath()) must be provided.
polaris.oidc.<tenant>.principal-mapper.name-claim-pathstringThe claim that contains the principal name. Nested paths can be expressed using “/” as a separator, e.g. "resource_access/client1/roles" would look for the “roles” field inside the “client1” object inside the “resource_access” object in the token claims.

Optional. Either this option or (#idClaimPath()) must be provided.
polaris.oidc.<tenant>.principal-mapper.typedefaultstringThe type of the principal mapper. Must be a registered (org.apache.polaris.service.auth.external.mapping.PrincipalMapper) identifier.
polaris.oidc.<tenant>.principal-roles-mapper.typedefaultstringThe type of the principal roles mapper. Must be a registered (org.apache.polaris.service.auth.external.mapping.PrincipalRolesMapper) identifier.
polaris.oidc.<tenant>.principal-roles-mapper.filterstringA regular expression that matches the role names in the identity. Only roles that match this regex will be included in the Polaris-specific roles.
polaris.oidc.<tenant>.principal-roles-mapper.mappingslist ofA list of regex mappings that will be applied to each role name in the identity.
polaris.oidc.<tenant>.principal-roles-mapper.mappings.regexstringA regular expression that will be applied to each role name in the identity. Along with (#replacement()), this regex is used to transform the role names in the identity into Polaris-specific roles.
polaris.oidc.<tenant>.principal-roles-mapper.mappings.replacementstringThe replacement string for the role names in the identity. This is used along with (#regex()) to transform the role names in the identity into Polaris-specific roles.
polaris.oidc.tenant-resolver.typedefaultstringThe type of the OIDC tenant resolver. Must be a registered (OidcTenantResolver) implementation.

polaris.service-identityπŸ”—

Configuration interface for managing service identities across multiple realms in Polaris.

A service identity represents the Polaris service itself when it needs to authenticate to external systems (e.g., AWS services for SigV4 authentication). Each realm can configure its own set of service identities for different cloud providers.

This interface supports multi-tenant deployments where each realm (tenant) can have distinct service identities, as well as single-tenant deployments with a default configuration shared across all catalogs.

Configuration is loaded from polaris.service-identity.* properties at startup and includes credentials that Polaris uses to assume customer-provided roles when accessing federated catalogs.

Example Configuration:

 # Default service identity (used when no realm-specific configuration exists)
 polaris.service-identity.aws-iam.iam-arn=arn:aws:iam::123456789012:user/polaris-default-user
 # Optional: provide static credentials, or omit to use AWS default credential chain
 polaris.service-identity.aws-iam.access-key-id=<access-key-id>
 polaris.service-identity.aws-iam.secret-access-key=<secret-access-key>
 polaris.service-identity.aws-iam.session-token=<optional-session-token>
 # Realm-specific service identity for multi-tenant deployments
 polaris.service-identity.my-realm.aws-iam.iam-arn=arn:aws:iam::123456789012:user/my-realm-user
 polaris.service-identity.my-realm.aws-iam.access-key-id=<access-key-id>
 polaris.service-identity.my-realm.aws-iam.secret-access-key=<secret-access-key>
PropertyDefault ValueTypeDescription
polaris.service-identity.aws-iam.iam-arnstringThe IAM role or user ARN representing the service identity. If not provided, Polaris won’t surface it in the catalog identity.
polaris.service-identity.aws-iam.access-key-idstringOptional AWS access key ID associated with the IAM identity. If not provided, the AWS default credential chain will be used.
polaris.service-identity.aws-iam.secret-access-keystringOptional AWS secret access key associated with the IAM identity. If not provided, the AWS default credential chain will be used.
polaris.service-identity.aws-iam.session-tokenstringOptional AWS session token associated with the IAM identity. If not provided, the AWS default credential chain will be used.
polaris.service-identity.<realm>.aws-iam.iam-arnstringThe IAM role or user ARN representing the service identity. If not provided, Polaris won’t surface it in the catalog identity.
polaris.service-identity.<realm>.aws-iam.access-key-idstringOptional AWS access key ID associated with the IAM identity. If not provided, the AWS default credential chain will be used.
polaris.service-identity.<realm>.aws-iam.secret-access-keystringOptional AWS secret access key associated with the IAM identity. If not provided, the AWS default credential chain will be used.
polaris.service-identity.<realm>.aws-iam.session-tokenstringOptional AWS session token associated with the IAM identity. If not provided, the AWS default credential chain will be used.

Storage & CredentialsπŸ”—

polaris.storageπŸ”—

Configuration interface containing parameters for clients accessing S3 services from Polaris servers.

Currently, this configuration does not apply to all of Polaris code, but only to select services.

PropertyDefault ValueTypeDescription
polaris.storage.aws.access-keystringThe AWS access key to use for authentication. If not present, the default credentials provider chain will be used.
polaris.storage.aws.secret-keystringThe AWS secret key to use for authentication. If not present, the default credentials provider chain will be used.
polaris.storage.aws.<storage>.access-keystringThe AWS access key to use for authentication when using named storages.
polaris.storage.aws.<storage>.secret-keystringThe AWS secret key to use for authentication when using named storages.
polaris.storage.gcp.tokenstringThe GCP access token to use for authentication. If not present, the default credentials provider chain will be used.
polaris.storage.gcp.lifespandurationThe lifespan of the GCP access token. If not present, the default token lifespan (null) will be used.
polaris.storage.clients-cache-max-sizeintMaximum number of entries to keep in the STS clients cache.
polaris.storage.max-http-connectionsintOverride the default maximum number of pooled connections.
polaris.storage.read-timeoutdurationOverride the default connection read timeout.
polaris.storage.connect-timeoutdurationOverride the default TCP connect timeout.
polaris.storage.connection-acquisition-timeoutdurationOverride default connection acquisition timeout. This is the time a request will wait for a connection from the pool.
polaris.storage.connection-max-idle-timedurationOverride default max idle time of a pooled connection.
polaris.storage.connection-time-to-livedurationOverride default time-time of a pooled connection.
polaris.storage.expect-continue-enabledbooleanOverride default behavior whether to expect an HTTP/100-Continue.

polaris.storage-credential-cacheπŸ”—

PropertyDefault ValueTypeDescription
polaris.storage-credential-cache.max-entries10000long

polaris.credential-managerπŸ”—

Quarkus configuration mapping for Polaris Credential Manager.

Defines which (PolarisCredentialManager) implementation should be used at runtime. This allows switching between different credential management strategies via configuration.

PropertyDefault ValueTypeDescription
polaris.credential-manager.typestringThe type identifier of the PolarisCredentialManager implementation to use. This corresponds to the @Identifier annotation value on the implementation (e.g., “default”).

polaris.secrets-managerπŸ”—

PropertyDefault ValueTypeDescription
polaris.secrets-manager.typestringThe type of the UserSecretsManagerFactory to use. This is the (org.apache.polaris.core.secrets.UserSecretsManagerFactory) identifier.

polaris.file-ioπŸ”—

PropertyDefault ValueTypeDescription
polaris.file-io.typestringThe type of the catalog IO to use. Must be a registered (org.apache.polaris.service.catalog.io.FileIOFactory) identifier.

PersistenceπŸ”—

polaris.persistenceπŸ”—

PropertyDefault ValueTypeDescription
polaris.persistence.typestringThe type of the persistence to use. Must be a registered (org.apache.polaris.core.persistence.MetaStoreManagerFactory) identifier.
polaris.persistence.auto-bootstrap-typeslist of string
polaris.persistence.reference-previous-head-count20int
polaris.persistence.max-index-stripes20int
polaris.persistence.max-embedded-index-size32kMemorySize
polaris.persistence.max-index-stripe-size128kMemorySize
polaris.persistence.bucketized-bulk-fetch-size16intThe number of objects to fetch at once via (Persistence#bucketizedBulkFetches(Stream,<br> Class)).
polaris.persistence.max-serialized-value-size350kMemorySizeThe maximum size of a serialized value in a persisted database row.

polaris.persistence.cacheπŸ”—

Persistence cache configuration.

PropertyDefault ValueTypeDescription
polaris.persistence.cache.enabletruebooleanOptionally disable the cache, the default value is true, meaning that the cache is enabled by default.
polaris.persistence.cache.reference-ttlPT15MdurationDuration to cache the state of references.
polaris.persistence.cache.reference-negative-ttldurationDuration to cache whether a reference does not exist (negative caching).
polaris.persistence.cache.sizing.fraction-of-max-heap-sizedoubleFraction of Java’s max heap size to use for cache objects, set to 0 to disable. Must not be used with fixed cache sizing. If neither this value nor a fixed size is configured, a default of .4 (40%) is assumed, if enable-soft-references is enabled, else .6 (60%) is assumed.
polaris.persistence.cache.sizing.fraction-min-size64MMemorySizeWhen using fractional cache sizing, this amount in MB is the minimum cache size.
polaris.persistence.cache.sizing.fraction-adjustment256MMemorySizeWhen using fractional cache sizing, this amount in MB of the heap will always be “kept free” when calculating the cache size.
polaris.persistence.cache.sizing.fixed-sizeMemorySizeCapacity of the persistence cache in MiB.
polaris.persistence.cache.sizing.cache-capacity-overshoot0.1doubleAdmitted cache-capacity-overshoot fraction, defaults to 0.1 (10 %).

New elements are admitted to be added to the cache, if the cache’s size is less than cache-capacity * (1 + cache-capacity-overshoot .

Cache eviction happens asynchronously. Situations when eviction cannot keep up with the amount of data added could lead to out-of-memory situations.

The value, if present, must be greater than 0.

polaris.persistence.distributed-cache-invalidationsπŸ”—

PropertyDefault ValueTypeDescription
polaris.persistence.distributed-cache-invalidations.service-nameslist of stringHost names or IP addresses or kubernetes headless-service name of all Polaris server instances accessing the same repository.

This value is automatically configured via the Polaris Helm chart, additional configuration is not required.

If you have your own Helm chart or custom deployment, make sure to configure the IPs of all Polaris instances here.

Names that start with an equal sign are not resolved but used “as is”.
polaris.persistence.distributed-cache-invalidations.valid-tokenslist of stringList of cache-invalidation tokens to authenticate incoming cache-invalidation messages.

The first token is used in outgoing cache-invalidation messages.
polaris.persistence.distributed-cache-invalidations.uri/polaris-management/cache-coherencystringURI of the cache-invalidation endpoint, only available on the Quarkus management port, defaults to 9000.
polaris.persistence.distributed-cache-invalidations.service-name-lookup-intervalPT10SdurationInterval of service-name lookups to resolve the service names (#cacheInvalidationServiceNames()) into IP addresses.
polaris.persistence.distributed-cache-invalidations.batch-size20intMaximum number of cache-invalidation messages to send in a single request to peer nodes.
polaris.persistence.distributed-cache-invalidations.request-timeoutdurationRequest timeout for sent cache-invalidation messages. Timeouts trigger a warning or error message.
polaris.persistence.distributed-cache-invalidations.dns.query-timeoutPT5SdurationTimeout for DNS queries to resolve peer nodes.

polaris.persistence.nosqlπŸ”—

Polaris persistence backend configuration.

PropertyDefault ValueTypeDescription
polaris.persistence.nosql.backendstringName of the persistence backend to use.

polaris.persistence.nosql.maintenanceπŸ”—

Maintenance service configuration.

PropertyDefault ValueTypeDescription
polaris.persistence.nosql.maintenance.expected-reference-count100longProvides the expected number of references in all realms to retain, defaults to 100, must be at least 100. This value is used as the default if no information of a previous maintenance run is present, it is also the minimum number of expected references.
polaris.persistence.nosql.maintenance.expected-obj-count100000longProvides the expected number of objects in all realms to retain, defaults to 100000, must be at least 100000. This value is used as the default if no information of a previous maintenance run is present, it is also the minimum number of expected objects.
polaris.persistence.nosql.maintenance.count-from-last-run-multiplier1.1doubleMaintenance service sizes the bloom-filters used to hold the identified references and objects according to the expression lastRun.numberOfIdentified * countFromLastRunMultiplier. The default is to add 10% to the number of identified items.
polaris.persistence.nosql.maintenance.filter-initialized-fpp1.0E-5doubleFalse-positive-probability (FPP) used to initialize the bloom-filters for identified references and objects.
polaris.persistence.nosql.maintenance.max-acceptable-filter-fpp5.0E-5doubleExpected maximum false-positive-probability (FPP) used to check the bloom-filters for identified references and objects.

If the FPP of a bloom filter exceeds this value, no individual references or objects will be purged.
polaris.persistence.nosql.maintenance.retained-runs50intNumber of retained maintenance run objects (MaintenanceRunInformation), must be at least 2.
polaris.persistence.nosql.maintenance.created-at-grace-timePT3HdurationObjects and references that have been created after a maintenance run has started are never purged. This option defines an additional grace time to when the maintenance run has started.

This value is a safety net for two reasons:

* Respect the wall-clock drift between Polaris nodes.
* Respect the order of writes in Polaris persistence. Objects are written before those become reachable via a commit. Commits may take a little time (milliseconds, up to a few seconds, depending on the system load) to complete. Therefore, implementations enforce a minimum of 5 minutes.

polaris.persistence.nosql.maintenance.object-scan-rate-limit-per-secondintOptionally limit the number of objects scanned per second. Default is to not throttle object scanning.
polaris.persistence.nosql.maintenance.reference-scan-rate-limit-per-secondintOptionally limit the number of references scanned per second.

Default is to not throttle reference scanning.
polaris.persistence.nosql.maintenance.delete-batch-size10intSize of the delete-batches when purging objects.

polaris.persistence.nosql.maintenance.catalogπŸ”—

No SQL persistence implementation of Polaris stores a history of changes per kind of object (principals, principal roles, grants, immediate tasks, catalog roles and catalog state).

The rules are defined using a CEL script . The default rules for all kinds of objects are to retain the history for 3 days, for the catalog state for 30 days.

The scripts have access to the following declared values:

  • ref (string) name of the reference
  • commits (64-bit int) number of the currently processed commit, starting at 1
  • ageDays (64-bit int) age of currently processed commit in days
  • ageHours (64-bit int) age of currently processed commit in hours
  • ageMinutes (64-bit int) age of currently processed commit in minutes

Scripts must return a boolean yielding whether the commit shall be retained. Note that maintenance-service implementations can keep the first not-to-be-retained commit.

Example scripts

  • ageDays < 30 || commits <= 10 retains the reference history with at least 10 commits and commits that are younger than 30 days
  • true retains the whole reference history
  • false retains the most recent commit
PropertyDefault ValueTypeDescription
polaris.persistence.nosql.maintenance.catalog.principals-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.principal-roles-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.grants-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.immediate-tasks-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.catalogs-history-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.catalog-roles-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.catalog-policies-retainfalsestring
polaris.persistence.nosql.maintenance.catalog.catalog-state-retainfalsestring

polaris.persistence.nosql.mongodbπŸ”—

Polaris persistence, MongoDB backend specific configuration.

PropertyDefault ValueTypeDescription
polaris.persistence.nosql.mongodb.connection-stringstring
polaris.persistence.nosql.mongodb.database-namestring
polaris.persistence.nosql.mongodb.allow-prefix-deletionbooleanOptionally enable realm-deletion using a prefix-delete.

Prefix-deletion is disabled by default.

polaris.persistence.relational.jdbcπŸ”—

PropertyDefault ValueTypeDescription
polaris.persistence.relational.jdbc.max-retriesint
polaris.persistence.relational.jdbc.max-duration-in-mslong
polaris.persistence.relational.jdbc.initial-delay-in-mslong

EventsπŸ”—

polaris.event-listenerπŸ”—

PropertyDefault ValueTypeDescription
polaris.event-listener.typestringThe type of the event listener to use. Must be a registered (PolarisEventListener) identifier.

polaris.event-listener.persistence-in-memory-bufferπŸ”—

PropertyDefault ValueTypeDescription
polaris.event-listener.persistence-in-memory-buffer.buffer-time5000msduration
polaris.event-listener.persistence-in-memory-buffer.max-buffer-size5int

polaris.event-listener.aws-cloudwatchπŸ”—

Configuration interface for AWS CloudWatch event listener integration.

PropertyDefault ValueTypeDescription
polaris.event-listener.aws-cloudwatch.log-grouppolaris-cloudwatch-default-groupstringReturns the AWS CloudWatch log group name for event logging.

The log group is a collection of log streams that share the same retention, monitoring, and access control settings. If not specified, defaults to “polaris-cloudwatch-default-group”.

Configuration property: polaris.event-listener.aws-cloudwatch.log-group
polaris.event-listener.aws-cloudwatch.log-streampolaris-cloudwatch-default-streamstringReturns the AWS CloudWatch log stream name for event logging.

A log stream is a sequence of log events that share the same source. Each log stream belongs to one log group. If not specified, defaults to “polaris-cloudwatch-default-stream”.

Configuration property: polaris.event-listener.aws-cloudwatch.log-stream
polaris.event-listener.aws-cloudwatch.regionus-east-1stringReturns the AWS region where CloudWatch logs should be sent.

This specifies the AWS region for the CloudWatch service endpoint. The region must be a valid AWS region identifier. If not specified, defaults to “us-east-1”.

Configuration property: polaris.event-listener.aws-cloudwatch.region
polaris.event-listener.aws-cloudwatch.synchronous-modefalsebooleanReturns the synchronous mode setting for CloudWatch logging.

When set to “true”, log events are sent to CloudWatch synchronously, which may impact application performance but ensures immediate delivery. When set to “false” (default), log events are sent asynchronously for better performance.

Configuration property: polaris.event-listener.aws-cloudwatch.synchronous-mode

OperationalπŸ”—

polaris.tasksπŸ”—

PropertyDefault ValueTypeDescription
polaris.tasks.max-concurrent-tasks-1int
polaris.tasks.max-queued-tasks-1int

polaris.asyncπŸ”—

Advanced configuration options to tune async activities.

PropertyDefault ValueTypeDescription
polaris.async.thread-keep-alivePT1SdurationDuration to keep idle threads alive.
polaris.async.max-threadsintMaximum number of threads available for asynchronous execution. Default is 256.

polaris.rate-limiter.filterπŸ”—

PropertyDefault ValueTypeDescription
polaris.rate-limiter.filter.typestringThe type of the rate limiter. Must be a registered (org.apache.polaris.service.ratelimiter.RateLimiter) identifier.

polaris.rate-limiter.token-bucketπŸ”—

PropertyDefault ValueTypeDescription
polaris.rate-limiter.token-bucket.requests-per-secondlongNumber of allowed requests per second per realm. The value must be greater than zero.
polaris.rate-limiter.token-bucket.windowdurationThis setting is no longer used and will be removed in a future release.

Deprecated
polaris.rate-limiter.token-bucket.typestringThe type of the token bucket factory. Must be a registered (org.apache.polaris.service.ratelimiter.TokenBucketFactory) identifier.

polaris.metricsπŸ”—

PropertyDefault ValueTypeDescription
polaris.metrics.tags.<name>stringAdditional tags to include in the metrics.
polaris.metrics.realm-id-tag.enable-in-api-metricsfalsebooleanWhether to include the Realm ID tag in the API request metrics.

Beware that if the cardinality of this tag is too high, it can cause performance issues or even crash the server.
polaris.metrics.realm-id-tag.enable-in-http-metricsfalsebooleanWhether to include the Realm ID tag in the HTTP server request metrics.

Beware that if the cardinality of this tag is too high, it can cause performance issues or even crash the server.
polaris.metrics.realm-id-tag.http-metrics-max-cardinality100intThe maximum number of Realm ID tag values allowed for the HTTP server request metrics.

This is used to prevent the number of tags from growing indefinitely and causing performance issues or crashing the server.

If the number of tags exceeds this value, a warning will be logged and no more HTTP server request metrics will be recorded.
polaris.metrics.user-principal-tag.enable-in-api-metricsfalsebooleanWhether to include the User Principal tag in the API request metrics.

Beware that if the cardinality of this tag is too high, it can cause performance issues or even crash the server.

polaris.iceberg-metrics.reportingπŸ”—

PropertyDefault ValueTypeDescription
polaris.iceberg-metrics.reporting.typedefaultstring

polaris.logπŸ”—

PropertyDefault ValueTypeDescription
polaris.log.request-id-header-namestringThe name of the header that contains the request ID.
polaris.log.mdc.<name>stringAdditional MDC values to include in the log context.

polaris.readinessπŸ”—

PropertyDefault ValueTypeDescription
polaris.readiness.ignore-severe-issuesfalsebooleanSetting this to true means that Polaris will start up even if severe security risks have been detected, accepting the risk of denial-of-service, data-loss, corruption and other risks.

polaris.nodeπŸ”—

Node management configuration.

PropertyDefault ValueTypeDescription
polaris.node.lease-durationPT1HdurationDuration of a node-lease.
polaris.node.renewal-periodPT15MdurationTime window before the end of a node lease when the lease will be renewed.
polaris.node.num-nodes1024intMaximum number of concurrently active Polaris nodes. Do not change this value or the ID generator spec, it is a rather internal property. See ID generator spec below.
polaris.node.id-generator-spec.typesnowflakestring
polaris.node.id-generator-spec.params.<name>string

OtherπŸ”—

polaris.realm-contextπŸ”—

PropertyDefault ValueTypeDescription
polaris.realm-context.realmslist of stringThe set of realms that are supported by the realm context resolver. The first realm is considered the default realm.
polaris.realm-context.header-namestringThe header name that contains the realm identifier.
polaris.realm-context.require-headerbooleanWhether to require the realm header to be present in the request. If this is true and the realm header is not present, the request will be rejected. If this is false and the realm header is not present, the default realm will be used.

Note: this is actually only enforced in production setups.
polaris.realm-context.typestringThe type of the realm context resolver. Must be a registered (org.apache.polaris.service.context.RealmContextResolver) identifier.