This is an automated email from the ASF dual-hosted git repository.
dimas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new 65466895a Make CallContextCatalogFactory request-scoped (#2972)
65466895a is described below
commit 65466895a70dd3b0cbefebb71e12631bf2f3718e
Author: Christopher Lambert <[email protected]>
AuthorDate: Fri Nov 7 17:11:24 2025 +0100
Make CallContextCatalogFactory request-scoped (#2972)
note the only non-test usage spot is
`IcebergCatalogHandler#initializeCatalog`
and `IcebergCatalogHandler` is getting created by `IcebergCatalogAdapter`
which is already `@RequestScoped`.
---
.../catalog/iceberg/IcebergCatalogHandler.java | 4 +-
.../context/catalog/CallContextCatalogFactory.java | 7 +--
.../catalog/PolarisCallContextCatalogFactory.java | 33 +++++-----
.../service/admin/PolarisAuthzTestBase.java | 22 ++++---
.../iceberg/IcebergCatalogHandlerAuthzTest.java | 17 +++--
.../org/apache/polaris/service/TestServices.java | 72 +++++++++++-----------
6 files changed, 76 insertions(+), 79 deletions(-)
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
index 772aaf477..a10c7afe7 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
@@ -267,9 +267,7 @@ public class IcebergCatalogHandler extends CatalogHandler
implements AutoCloseab
this.baseCatalog = federatedCatalog;
} else {
LOGGER.atInfo().log("Initializing non-federated catalog");
- this.baseCatalog =
- catalogFactory.createCallContextCatalog(
- callContext, polarisPrincipal, resolutionManifest);
+ this.baseCatalog =
catalogFactory.createCallContextCatalog(resolutionManifest);
}
this.namespaceCatalog =
(baseCatalog instanceof SupportsNamespaces) ? (SupportsNamespaces)
baseCatalog : null;
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/CallContextCatalogFactory.java
b/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/CallContextCatalogFactory.java
index c0f9fc351..ea9a1580b 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/CallContextCatalogFactory.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/CallContextCatalogFactory.java
@@ -19,14 +19,9 @@
package org.apache.polaris.service.context.catalog;
import org.apache.iceberg.catalog.Catalog;
-import org.apache.polaris.core.auth.PolarisPrincipal;
-import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest;
public interface CallContextCatalogFactory {
- Catalog createCallContextCatalog(
- CallContext context,
- PolarisPrincipal polarisPrincipal,
- PolarisResolutionManifest resolvedManifest);
+ Catalog createCallContextCatalog(PolarisResolutionManifest resolvedManifest);
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/PolarisCallContextCatalogFactory.java
b/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/PolarisCallContextCatalogFactory.java
index 7284a0745..70cb8e6b1 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/PolarisCallContextCatalogFactory.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/context/catalog/PolarisCallContextCatalogFactory.java
@@ -18,7 +18,7 @@
*/
package org.apache.polaris.service.context.catalog;
-import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import java.util.HashMap;
import java.util.Map;
@@ -28,7 +28,7 @@ import org.apache.polaris.core.PolarisDiagnostics;
import org.apache.polaris.core.auth.PolarisPrincipal;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.entity.CatalogEntity;
-import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
+import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest;
import org.apache.polaris.core.persistence.resolver.ResolverFactory;
import org.apache.polaris.service.catalog.iceberg.IcebergCatalog;
@@ -39,7 +39,7 @@ import org.apache.polaris.service.task.TaskExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@ApplicationScoped
+@RequestScoped
public class PolarisCallContextCatalogFactory implements
CallContextCatalogFactory {
private static final Logger LOGGER =
LoggerFactory.getLogger(PolarisCallContextCatalogFactory.class);
@@ -49,36 +49,39 @@ public class PolarisCallContextCatalogFactory implements
CallContextCatalogFacto
private final AccessConfigProvider accessConfigProvider;
private final FileIOFactory fileIOFactory;
private final ResolverFactory resolverFactory;
- private final MetaStoreManagerFactory metaStoreManagerFactory;
private final PolarisEventListener polarisEventListener;
+ private final PolarisMetaStoreManager metaStoreManager;
+ private final CallContext callContext;
+ private final PolarisPrincipal principal;
@Inject
public PolarisCallContextCatalogFactory(
PolarisDiagnostics diagnostics,
ResolverFactory resolverFactory,
- MetaStoreManagerFactory metaStoreManagerFactory,
TaskExecutor taskExecutor,
AccessConfigProvider accessConfigProvider,
FileIOFactory fileIOFactory,
- PolarisEventListener polarisEventListener) {
+ PolarisEventListener polarisEventListener,
+ PolarisMetaStoreManager metaStoreManager,
+ CallContext callContext,
+ PolarisPrincipal principal) {
this.diagnostics = diagnostics;
this.resolverFactory = resolverFactory;
- this.metaStoreManagerFactory = metaStoreManagerFactory;
this.taskExecutor = taskExecutor;
this.accessConfigProvider = accessConfigProvider;
this.fileIOFactory = fileIOFactory;
this.polarisEventListener = polarisEventListener;
+ this.metaStoreManager = metaStoreManager;
+ this.callContext = callContext;
+ this.principal = principal;
}
@Override
- public Catalog createCallContextCatalog(
- CallContext context,
- PolarisPrincipal polarisPrincipal,
- final PolarisResolutionManifest resolvedManifest) {
+ public Catalog createCallContextCatalog(final PolarisResolutionManifest
resolvedManifest) {
CatalogEntity catalog = resolvedManifest.getResolvedCatalogEntity();
String catalogName = catalog.getName();
- String realm = context.getRealmContext().getRealmIdentifier();
+ String realm = callContext.getRealmContext().getRealmIdentifier();
String catalogKey = realm + "/" + catalogName;
LOGGER.debug("Initializing new BasePolarisCatalog for key: {}",
catalogKey);
@@ -86,10 +89,10 @@ public class PolarisCallContextCatalogFactory implements
CallContextCatalogFacto
new IcebergCatalog(
diagnostics,
resolverFactory,
-
metaStoreManagerFactory.getOrCreateMetaStoreManager(context.getRealmContext()),
- context,
+ metaStoreManager,
+ callContext,
resolvedManifest,
- polarisPrincipal,
+ principal,
taskExecutor,
accessConfigProvider,
fileIOFactory,
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java
b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java
index 95fd0a67f..4b1799d8c 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java
@@ -257,6 +257,7 @@ public abstract class PolarisAuthzTestBase {
PrincipalEntity rootPrincipal =
metaStoreManager.findRootPrincipal(polarisContext).orElseThrow();
this.authenticatedRoot = PolarisPrincipal.of(rootPrincipal, Set.of());
+ QuarkusMock.installMockForType(authenticatedRoot, PolarisPrincipal.class);
this.adminService =
new PolarisAdminService(
@@ -518,36 +519,37 @@ public abstract class PolarisAuthzTestBase {
@SuppressWarnings("unused") // Required by CDI
protected TestPolarisCallContextCatalogFactory() {
- this(null, null, null, null, null, null, null);
+ this(null, null, null, null, null, null, null, null, null);
}
@Inject
public TestPolarisCallContextCatalogFactory(
PolarisDiagnostics diagnostics,
ResolverFactory resolverFactory,
- MetaStoreManagerFactory metaStoreManagerFactory,
TaskExecutor taskExecutor,
AccessConfigProvider accessConfigProvider,
FileIOFactory fileIOFactory,
- PolarisEventListener polarisEventListener) {
+ PolarisEventListener polarisEventListener,
+ PolarisMetaStoreManager metaStoreManager,
+ CallContext callContext,
+ PolarisPrincipal principal) {
super(
diagnostics,
resolverFactory,
- metaStoreManagerFactory,
taskExecutor,
accessConfigProvider,
fileIOFactory,
- polarisEventListener);
+ polarisEventListener,
+ metaStoreManager,
+ callContext,
+ principal);
}
@Override
- public Catalog createCallContextCatalog(
- CallContext context,
- PolarisPrincipal polarisPrincipal,
- final PolarisResolutionManifest resolvedManifest) {
+ public Catalog createCallContextCatalog(PolarisResolutionManifest
resolvedManifest) {
// This depends on the BasePolarisCatalog allowing calling initialize
multiple times
// to override the previous config.
- Catalog catalog = super.createCallContextCatalog(context,
polarisPrincipal, resolvedManifest);
+ Catalog catalog = super.createCallContextCatalog(resolvedManifest);
catalog.initialize(
CATALOG_NAME,
ImmutableMap.of(
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
index e5ebcc62e..924e376e4 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
@@ -1124,8 +1124,7 @@ public class IcebergCatalogHandlerAuthzTest extends
PolarisAuthzTestBase {
CallContextCatalogFactory mockFactory =
Mockito.mock(CallContextCatalogFactory.class);
// Mock the catalog factory to return our regular catalog but with mocked
config
- Mockito.when(mockFactory.createCallContextCatalog(Mockito.any(),
Mockito.any(), Mockito.any()))
- .thenReturn(baseCatalog);
+
Mockito.when(mockFactory.createCallContextCatalog(Mockito.any())).thenReturn(baseCatalog);
return newWrapperWithFineLevelAuthDisabled(Set.of(), CATALOG_NAME,
mockFactory, false);
}
@@ -1894,18 +1893,16 @@ public class IcebergCatalogHandlerAuthzTest extends
PolarisAuthzTestBase {
new PolarisCallContextCatalogFactory(
diagServices,
resolverFactory,
- managerFactory,
Mockito.mock(),
accessConfigProvider,
new DefaultFileIOFactory(),
- polarisEventListener) {
+ polarisEventListener,
+ metaStoreManager,
+ callContext,
+ authenticatedRoot) {
@Override
- public Catalog createCallContextCatalog(
- CallContext context,
- PolarisPrincipal polarisPrincipal,
- PolarisResolutionManifest resolvedManifest) {
- Catalog catalog =
- super.createCallContextCatalog(context, polarisPrincipal,
resolvedManifest);
+ public Catalog createCallContextCatalog(PolarisResolutionManifest
resolvedManifest) {
+ Catalog catalog = super.createCallContextCatalog(resolvedManifest);
String fileIoImpl = "org.apache.iceberg.inmemory.InMemoryFileIO";
catalog.initialize(
externalCatalog,
ImmutableMap.of(CatalogProperties.FILE_IO_IMPL, fileIoImpl));
diff --git
a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
index 06d01ca06..030e00b73 100644
---
a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
+++
b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
@@ -206,6 +206,39 @@ public record TestServices(
PolarisMetaStoreManager metaStoreManager =
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
+ CreatePrincipalResult createdPrincipal =
+ metaStoreManager.createPrincipal(
+ callContext.getPolarisCallContext(),
+ new PrincipalEntity.Builder()
+ .setName("test-principal")
+ .setCreateTimestamp(Instant.now().toEpochMilli())
+ .setCredentialRotationRequiredState()
+ .build());
+ PolarisPrincipal principal =
PolarisPrincipal.of(createdPrincipal.getPrincipal(), Set.of());
+
+ SecurityContext securityContext =
+ new SecurityContext() {
+ @Override
+ public Principal getUserPrincipal() {
+ return principal;
+ }
+
+ @Override
+ public boolean isUserInRole(String s) {
+ return false;
+ }
+
+ @Override
+ public boolean isSecure() {
+ return true;
+ }
+
+ @Override
+ public String getAuthenticationScheme() {
+ return "";
+ }
+ };
+
EntityCache entityCache =
metaStoreManagerFactory.getOrCreateEntityCache(realmContext,
realmConfig);
ResolverFactory resolverFactory =
@@ -251,11 +284,13 @@ public record TestServices(
new PolarisCallContextCatalogFactory(
diagnostics,
resolverFactory,
- metaStoreManagerFactory,
taskExecutor,
accessConfigProvider,
fileIOFactory,
- polarisEventListener);
+ polarisEventListener,
+ metaStoreManager,
+ callContext,
+ principal);
ReservedProperties reservedProperties = ReservedProperties.NONE;
@@ -289,39 +324,6 @@ public record TestServices(
IcebergRestConfigurationApi restConfigurationApi =
new IcebergRestConfigurationApi(catalogService);
- CreatePrincipalResult createdPrincipal =
- metaStoreManager.createPrincipal(
- callContext.getPolarisCallContext(),
- new PrincipalEntity.Builder()
- .setName("test-principal")
- .setCreateTimestamp(Instant.now().toEpochMilli())
- .setCredentialRotationRequiredState()
- .build());
- PolarisPrincipal principal =
PolarisPrincipal.of(createdPrincipal.getPrincipal(), Set.of());
-
- SecurityContext securityContext =
- new SecurityContext() {
- @Override
- public Principal getUserPrincipal() {
- return principal;
- }
-
- @Override
- public boolean isUserInRole(String s) {
- return false;
- }
-
- @Override
- public boolean isSecure() {
- return true;
- }
-
- @Override
- public String getAuthenticationScheme() {
- return "";
- }
- };
-
PolarisAdminService adminService =
new PolarisAdminService(
callContext,