Skip to content

Commit 6546689

Browse files
authored
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`.
1 parent 12dcea7 commit 6546689

File tree

6 files changed

+76
-79
lines changed

6 files changed

+76
-79
lines changed

runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,7 @@ protected void initializeCatalog() {
267267
this.baseCatalog = federatedCatalog;
268268
} else {
269269
LOGGER.atInfo().log("Initializing non-federated catalog");
270-
this.baseCatalog =
271-
catalogFactory.createCallContextCatalog(
272-
callContext, polarisPrincipal, resolutionManifest);
270+
this.baseCatalog = catalogFactory.createCallContextCatalog(resolutionManifest);
273271
}
274272
this.namespaceCatalog =
275273
(baseCatalog instanceof SupportsNamespaces) ? (SupportsNamespaces) baseCatalog : null;

runtime/service/src/main/java/org/apache/polaris/service/context/catalog/CallContextCatalogFactory.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,9 @@
1919
package org.apache.polaris.service.context.catalog;
2020

2121
import org.apache.iceberg.catalog.Catalog;
22-
import org.apache.polaris.core.auth.PolarisPrincipal;
23-
import org.apache.polaris.core.context.CallContext;
2422
import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest;
2523

2624
public interface CallContextCatalogFactory {
2725

28-
Catalog createCallContextCatalog(
29-
CallContext context,
30-
PolarisPrincipal polarisPrincipal,
31-
PolarisResolutionManifest resolvedManifest);
26+
Catalog createCallContextCatalog(PolarisResolutionManifest resolvedManifest);
3227
}

runtime/service/src/main/java/org/apache/polaris/service/context/catalog/PolarisCallContextCatalogFactory.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.apache.polaris.service.context.catalog;
2020

21-
import jakarta.enterprise.context.ApplicationScoped;
21+
import jakarta.enterprise.context.RequestScoped;
2222
import jakarta.inject.Inject;
2323
import java.util.HashMap;
2424
import java.util.Map;
@@ -28,7 +28,7 @@
2828
import org.apache.polaris.core.auth.PolarisPrincipal;
2929
import org.apache.polaris.core.context.CallContext;
3030
import org.apache.polaris.core.entity.CatalogEntity;
31-
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
31+
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
3232
import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest;
3333
import org.apache.polaris.core.persistence.resolver.ResolverFactory;
3434
import org.apache.polaris.service.catalog.iceberg.IcebergCatalog;
@@ -39,7 +39,7 @@
3939
import org.slf4j.Logger;
4040
import org.slf4j.LoggerFactory;
4141

42-
@ApplicationScoped
42+
@RequestScoped
4343
public class PolarisCallContextCatalogFactory implements CallContextCatalogFactory {
4444
private static final Logger LOGGER =
4545
LoggerFactory.getLogger(PolarisCallContextCatalogFactory.class);
@@ -49,47 +49,50 @@ public class PolarisCallContextCatalogFactory implements CallContextCatalogFacto
4949
private final AccessConfigProvider accessConfigProvider;
5050
private final FileIOFactory fileIOFactory;
5151
private final ResolverFactory resolverFactory;
52-
private final MetaStoreManagerFactory metaStoreManagerFactory;
5352
private final PolarisEventListener polarisEventListener;
53+
private final PolarisMetaStoreManager metaStoreManager;
54+
private final CallContext callContext;
55+
private final PolarisPrincipal principal;
5456

5557
@Inject
5658
public PolarisCallContextCatalogFactory(
5759
PolarisDiagnostics diagnostics,
5860
ResolverFactory resolverFactory,
59-
MetaStoreManagerFactory metaStoreManagerFactory,
6061
TaskExecutor taskExecutor,
6162
AccessConfigProvider accessConfigProvider,
6263
FileIOFactory fileIOFactory,
63-
PolarisEventListener polarisEventListener) {
64+
PolarisEventListener polarisEventListener,
65+
PolarisMetaStoreManager metaStoreManager,
66+
CallContext callContext,
67+
PolarisPrincipal principal) {
6468
this.diagnostics = diagnostics;
6569
this.resolverFactory = resolverFactory;
66-
this.metaStoreManagerFactory = metaStoreManagerFactory;
6770
this.taskExecutor = taskExecutor;
6871
this.accessConfigProvider = accessConfigProvider;
6972
this.fileIOFactory = fileIOFactory;
7073
this.polarisEventListener = polarisEventListener;
74+
this.metaStoreManager = metaStoreManager;
75+
this.callContext = callContext;
76+
this.principal = principal;
7177
}
7278

7379
@Override
74-
public Catalog createCallContextCatalog(
75-
CallContext context,
76-
PolarisPrincipal polarisPrincipal,
77-
final PolarisResolutionManifest resolvedManifest) {
80+
public Catalog createCallContextCatalog(final PolarisResolutionManifest resolvedManifest) {
7881
CatalogEntity catalog = resolvedManifest.getResolvedCatalogEntity();
7982
String catalogName = catalog.getName();
8083

81-
String realm = context.getRealmContext().getRealmIdentifier();
84+
String realm = callContext.getRealmContext().getRealmIdentifier();
8285
String catalogKey = realm + "/" + catalogName;
8386
LOGGER.debug("Initializing new BasePolarisCatalog for key: {}", catalogKey);
8487

8588
IcebergCatalog catalogInstance =
8689
new IcebergCatalog(
8790
diagnostics,
8891
resolverFactory,
89-
metaStoreManagerFactory.getOrCreateMetaStoreManager(context.getRealmContext()),
90-
context,
92+
metaStoreManager,
93+
callContext,
9194
resolvedManifest,
92-
polarisPrincipal,
95+
principal,
9396
taskExecutor,
9497
accessConfigProvider,
9598
fileIOFactory,

runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ public void before(TestInfo testInfo) {
257257
PrincipalEntity rootPrincipal =
258258
metaStoreManager.findRootPrincipal(polarisContext).orElseThrow();
259259
this.authenticatedRoot = PolarisPrincipal.of(rootPrincipal, Set.of());
260+
QuarkusMock.installMockForType(authenticatedRoot, PolarisPrincipal.class);
260261

261262
this.adminService =
262263
new PolarisAdminService(
@@ -518,36 +519,37 @@ public static class TestPolarisCallContextCatalogFactory
518519

519520
@SuppressWarnings("unused") // Required by CDI
520521
protected TestPolarisCallContextCatalogFactory() {
521-
this(null, null, null, null, null, null, null);
522+
this(null, null, null, null, null, null, null, null, null);
522523
}
523524

524525
@Inject
525526
public TestPolarisCallContextCatalogFactory(
526527
PolarisDiagnostics diagnostics,
527528
ResolverFactory resolverFactory,
528-
MetaStoreManagerFactory metaStoreManagerFactory,
529529
TaskExecutor taskExecutor,
530530
AccessConfigProvider accessConfigProvider,
531531
FileIOFactory fileIOFactory,
532-
PolarisEventListener polarisEventListener) {
532+
PolarisEventListener polarisEventListener,
533+
PolarisMetaStoreManager metaStoreManager,
534+
CallContext callContext,
535+
PolarisPrincipal principal) {
533536
super(
534537
diagnostics,
535538
resolverFactory,
536-
metaStoreManagerFactory,
537539
taskExecutor,
538540
accessConfigProvider,
539541
fileIOFactory,
540-
polarisEventListener);
542+
polarisEventListener,
543+
metaStoreManager,
544+
callContext,
545+
principal);
541546
}
542547

543548
@Override
544-
public Catalog createCallContextCatalog(
545-
CallContext context,
546-
PolarisPrincipal polarisPrincipal,
547-
final PolarisResolutionManifest resolvedManifest) {
549+
public Catalog createCallContextCatalog(PolarisResolutionManifest resolvedManifest) {
548550
// This depends on the BasePolarisCatalog allowing calling initialize multiple times
549551
// to override the previous config.
550-
Catalog catalog = super.createCallContextCatalog(context, polarisPrincipal, resolvedManifest);
552+
Catalog catalog = super.createCallContextCatalog(resolvedManifest);
551553
catalog.initialize(
552554
CATALOG_NAME,
553555
ImmutableMap.of(

runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,8 +1124,7 @@ private IcebergCatalogHandler newWrapperWithFineGrainedAuthzDisabled() {
11241124
CallContextCatalogFactory mockFactory = Mockito.mock(CallContextCatalogFactory.class);
11251125

11261126
// Mock the catalog factory to return our regular catalog but with mocked config
1127-
Mockito.when(mockFactory.createCallContextCatalog(Mockito.any(), Mockito.any(), Mockito.any()))
1128-
.thenReturn(baseCatalog);
1127+
Mockito.when(mockFactory.createCallContextCatalog(Mockito.any())).thenReturn(baseCatalog);
11291128

11301129
return newWrapperWithFineLevelAuthDisabled(Set.of(), CATALOG_NAME, mockFactory, false);
11311130
}
@@ -1894,18 +1893,16 @@ public void testSendNotificationSufficientPrivileges() {
18941893
new PolarisCallContextCatalogFactory(
18951894
diagServices,
18961895
resolverFactory,
1897-
managerFactory,
18981896
Mockito.mock(),
18991897
accessConfigProvider,
19001898
new DefaultFileIOFactory(),
1901-
polarisEventListener) {
1899+
polarisEventListener,
1900+
metaStoreManager,
1901+
callContext,
1902+
authenticatedRoot) {
19021903
@Override
1903-
public Catalog createCallContextCatalog(
1904-
CallContext context,
1905-
PolarisPrincipal polarisPrincipal,
1906-
PolarisResolutionManifest resolvedManifest) {
1907-
Catalog catalog =
1908-
super.createCallContextCatalog(context, polarisPrincipal, resolvedManifest);
1904+
public Catalog createCallContextCatalog(PolarisResolutionManifest resolvedManifest) {
1905+
Catalog catalog = super.createCallContextCatalog(resolvedManifest);
19091906
String fileIoImpl = "org.apache.iceberg.inmemory.InMemoryFileIO";
19101907
catalog.initialize(
19111908
externalCatalog, ImmutableMap.of(CatalogProperties.FILE_IO_IMPL, fileIoImpl));

runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,39 @@ public TestServices build() {
206206
PolarisMetaStoreManager metaStoreManager =
207207
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
208208

209+
CreatePrincipalResult createdPrincipal =
210+
metaStoreManager.createPrincipal(
211+
callContext.getPolarisCallContext(),
212+
new PrincipalEntity.Builder()
213+
.setName("test-principal")
214+
.setCreateTimestamp(Instant.now().toEpochMilli())
215+
.setCredentialRotationRequiredState()
216+
.build());
217+
PolarisPrincipal principal = PolarisPrincipal.of(createdPrincipal.getPrincipal(), Set.of());
218+
219+
SecurityContext securityContext =
220+
new SecurityContext() {
221+
@Override
222+
public Principal getUserPrincipal() {
223+
return principal;
224+
}
225+
226+
@Override
227+
public boolean isUserInRole(String s) {
228+
return false;
229+
}
230+
231+
@Override
232+
public boolean isSecure() {
233+
return true;
234+
}
235+
236+
@Override
237+
public String getAuthenticationScheme() {
238+
return "";
239+
}
240+
};
241+
209242
EntityCache entityCache =
210243
metaStoreManagerFactory.getOrCreateEntityCache(realmContext, realmConfig);
211244
ResolverFactory resolverFactory =
@@ -251,11 +284,13 @@ public TestServices build() {
251284
new PolarisCallContextCatalogFactory(
252285
diagnostics,
253286
resolverFactory,
254-
metaStoreManagerFactory,
255287
taskExecutor,
256288
accessConfigProvider,
257289
fileIOFactory,
258-
polarisEventListener);
290+
polarisEventListener,
291+
metaStoreManager,
292+
callContext,
293+
principal);
259294

260295
ReservedProperties reservedProperties = ReservedProperties.NONE;
261296

@@ -289,39 +324,6 @@ public TestServices build() {
289324
IcebergRestConfigurationApi restConfigurationApi =
290325
new IcebergRestConfigurationApi(catalogService);
291326

292-
CreatePrincipalResult createdPrincipal =
293-
metaStoreManager.createPrincipal(
294-
callContext.getPolarisCallContext(),
295-
new PrincipalEntity.Builder()
296-
.setName("test-principal")
297-
.setCreateTimestamp(Instant.now().toEpochMilli())
298-
.setCredentialRotationRequiredState()
299-
.build());
300-
PolarisPrincipal principal = PolarisPrincipal.of(createdPrincipal.getPrincipal(), Set.of());
301-
302-
SecurityContext securityContext =
303-
new SecurityContext() {
304-
@Override
305-
public Principal getUserPrincipal() {
306-
return principal;
307-
}
308-
309-
@Override
310-
public boolean isUserInRole(String s) {
311-
return false;
312-
}
313-
314-
@Override
315-
public boolean isSecure() {
316-
return true;
317-
}
318-
319-
@Override
320-
public String getAuthenticationScheme() {
321-
return "";
322-
}
323-
};
324-
325327
PolarisAdminService adminService =
326328
new PolarisAdminService(
327329
callContext,

0 commit comments

Comments
 (0)