This is an automated email from the ASF dual-hosted git repository. dhuo pushed a commit to branch persistence-poc in repository https://gitbox.apache.org/repos/asf/polaris.git
commit 7d8942f8e30769be920778ab60496ebd6eeb4869 Author: Dennis Huo <[email protected]> AuthorDate: Tue Feb 25 03:15:50 2025 +0000 Restructure persistence class hierarchy and remove vestigial interfaces Extract a basic abstract base class BaseMetaStoreManager which can hold shared logic between implementations of PolarisMetaStoreManager --- .../PolarisEclipseLinkMetaStoreSessionImpl.java | 4 +- .../core/persistence/BaseMetaStoreManager.java | 48 ++++++++++++++++++++++ .../persistence/PolarisMetaStoreManagerImpl.java | 26 ++---------- .../PolarisTreeMapMetaStoreSessionImpl.java | 2 +- .../storage/cache/StorageCredentialCacheTest.java | 3 +- .../service/catalog/io/DefaultFileIOFactory.java | 3 -- .../context/DefaultCallContextResolver.java | 4 ++ 7 files changed, 59 insertions(+), 31 deletions(-) diff --git a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java index 7950075c..04787d51 100644 --- a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java +++ b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java @@ -49,7 +49,7 @@ import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.entity.PolarisGrantRecord; import org.apache.polaris.core.entity.PolarisPrincipalSecrets; import org.apache.polaris.core.exceptions.AlreadyExistsException; -import org.apache.polaris.core.persistence.PolarisMetaStoreManagerImpl; +import org.apache.polaris.core.persistence.BaseMetaStoreManager; import org.apache.polaris.core.persistence.PolarisMetaStoreSession; import org.apache.polaris.core.persistence.PrincipalSecretsGenerator; import org.apache.polaris.core.persistence.RetryOnConcurrencyException; @@ -674,7 +674,7 @@ public class PolarisEclipseLinkMetaStoreSessionImpl implements PolarisMetaStoreS PolarisStorageIntegration<T> loadPolarisStorageIntegration( @Nonnull PolarisCallContext callCtx, @Nonnull PolarisBaseEntity entity) { PolarisStorageConfigurationInfo storageConfig = - PolarisMetaStoreManagerImpl.readStorageConfiguration(callCtx, entity); + BaseMetaStoreManager.extractStorageConfiguration(callCtx, entity); return storageIntegrationProvider.getStorageIntegrationForConfig(storageConfig); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/BaseMetaStoreManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/BaseMetaStoreManager.java new file mode 100644 index 00000000..c27ee1b3 --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/BaseMetaStoreManager.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.polaris.core.persistence; + +import jakarta.annotation.Nonnull; +import java.util.Map; +import org.apache.polaris.core.PolarisCallContext; +import org.apache.polaris.core.entity.PolarisBaseEntity; +import org.apache.polaris.core.entity.PolarisEntityConstants; +import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; + +public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { + public static PolarisStorageConfigurationInfo extractStorageConfiguration( + @Nonnull PolarisCallContext callCtx, PolarisBaseEntity reloadedEntity) { + Map<String, String> propMap = + PolarisObjectMapperUtil.deserializeProperties( + callCtx, reloadedEntity.getInternalProperties()); + String storageConfigInfoStr = + propMap.get(PolarisEntityConstants.getStorageConfigInfoPropertyName()); + + callCtx + .getDiagServices() + .check( + storageConfigInfoStr != null, + "missing_storage_configuration_info", + "catalogId={}, entityId={}", + reloadedEntity.getCatalogId(), + reloadedEntity.getId()); + return PolarisStorageConfigurationInfo.deserialize( + callCtx.getDiagServices(), storageConfigInfoStr); + } +} diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManagerImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManagerImpl.java index 98fd7789..6214d0f0 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManagerImpl.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManagerImpl.java @@ -63,7 +63,7 @@ import org.slf4j.LoggerFactory; * and retrieve all Polaris metadata */ @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") -public class PolarisMetaStoreManagerImpl implements PolarisMetaStoreManager { +public class PolarisMetaStoreManagerImpl extends BaseMetaStoreManager { private static final Logger LOGGER = LoggerFactory.getLogger(PolarisMetaStoreManagerImpl.class); /** mapper, allows to serialize/deserialize properties to/from JSON */ @@ -2107,7 +2107,7 @@ public class PolarisMetaStoreManagerImpl implements PolarisMetaStoreManager { entityId); PolarisStorageConfigurationInfo storageConfigurationInfo = - readStorageConfiguration(callCtx, reloadedEntity.getEntity()); + BaseMetaStoreManager.extractStorageConfiguration(callCtx, reloadedEntity.getEntity()); try { EnumMap<PolarisCredentialProperty, String> creds = storageIntegration.getSubscopedCreds( @@ -2159,7 +2159,7 @@ public class PolarisMetaStoreManagerImpl implements PolarisMetaStoreManager { // validate access PolarisStorageConfigurationInfo storageConfigurationInfo = - readStorageConfiguration(callCtx, reloadedEntity.getEntity()); + BaseMetaStoreManager.extractStorageConfiguration(callCtx, reloadedEntity.getEntity()); Map<String, String> validateLocationAccess = storageIntegration .validateAccessToLocations(storageConfigurationInfo, actions, locations) @@ -2174,26 +2174,6 @@ public class PolarisMetaStoreManagerImpl implements PolarisMetaStoreManager { return new ValidateAccessResult(validateLocationAccess); } - public static PolarisStorageConfigurationInfo readStorageConfiguration( - @Nonnull PolarisCallContext callCtx, PolarisBaseEntity reloadedEntity) { - Map<String, String> propMap = - PolarisObjectMapperUtil.deserializeProperties( - callCtx, reloadedEntity.getInternalProperties()); - String storageConfigInfoStr = - propMap.get(PolarisEntityConstants.getStorageConfigInfoPropertyName()); - - callCtx - .getDiagServices() - .check( - storageConfigInfoStr != null, - "missing_storage_configuration_info", - "catalogId={}, entityId={}", - reloadedEntity.getCatalogId(), - reloadedEntity.getId()); - return PolarisStorageConfigurationInfo.deserialize( - callCtx.getDiagServices(), storageConfigInfoStr); - } - /** * Get the internal property map for an entity * diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisTreeMapMetaStoreSessionImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisTreeMapMetaStoreSessionImpl.java index bea20541..6516b7b7 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisTreeMapMetaStoreSessionImpl.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisTreeMapMetaStoreSessionImpl.java @@ -565,7 +565,7 @@ public class PolarisTreeMapMetaStoreSessionImpl implements PolarisMetaStoreSessi PolarisStorageIntegration<T> loadPolarisStorageIntegration( @Nonnull PolarisCallContext callCtx, @Nonnull PolarisBaseEntity entity) { PolarisStorageConfigurationInfo storageConfig = - PolarisMetaStoreManagerImpl.readStorageConfiguration(callCtx, entity); + BaseMetaStoreManager.extractStorageConfiguration(callCtx, entity); return storageIntegrationProvider.getStorageIntegrationForConfig(storageConfig); } diff --git a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java index d19bc41c..a4f7c693 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java @@ -39,7 +39,6 @@ import org.apache.polaris.core.entity.PolarisEntitySubType; import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.persistence.BaseResult; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; -import org.apache.polaris.core.persistence.PolarisMetaStoreManagerImpl; import org.apache.polaris.core.persistence.PolarisMetaStoreSession; import org.apache.polaris.core.persistence.PolarisObjectMapperUtil; import org.apache.polaris.core.persistence.PolarisTreeMapMetaStoreSessionImpl; @@ -70,7 +69,7 @@ public class StorageCredentialCacheTest { PolarisMetaStoreSession metaStore = new PolarisTreeMapMetaStoreSessionImpl(store, Mockito.mock(), RANDOM_SECRETS); callCtx = new PolarisCallContext(metaStore, diagServices); - metaStoreManager = Mockito.mock(PolarisMetaStoreManagerImpl.class); + metaStoreManager = Mockito.mock(PolarisMetaStoreManager.class); storageCredentialCache = new StorageCredentialCache(); } diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java index 2c9b928c..48d9a280 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java @@ -37,7 +37,6 @@ import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisEntityManager; -import org.apache.polaris.core.persistence.PolarisMetaStoreSession; import org.apache.polaris.core.persistence.PolarisResolvedPathWrapper; import org.apache.polaris.core.storage.PolarisCredentialVendor; import org.apache.polaris.core.storage.PolarisStorageActions; @@ -83,8 +82,6 @@ public class DefaultFileIOFactory implements FileIOFactory { realmEntityManagerFactory.getOrCreateEntityManager(realmContext); PolarisCredentialVendor credentialVendor = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); - PolarisMetaStoreSession metaStoreSession = - metaStoreManagerFactory.getOrCreateSessionSupplier(realmContext).get(); // Get subcoped creds properties = new HashMap<>(properties); diff --git a/service/common/src/main/java/org/apache/polaris/service/context/DefaultCallContextResolver.java b/service/common/src/main/java/org/apache/polaris/service/context/DefaultCallContextResolver.java index ff394972..985e57d8 100644 --- a/service/common/src/main/java/org/apache/polaris/service/context/DefaultCallContextResolver.java +++ b/service/common/src/main/java/org/apache/polaris/service/context/DefaultCallContextResolver.java @@ -60,6 +60,10 @@ public class DefaultCallContextResolver implements CallContextResolver { .addKeyValue("headers", headers) .log("Resolving CallContext"); + // TODO: Once we have non-transactional-database persistence stores, this should be + // pushed down for the metaStoreManagerFactory to inject Transactional-DB specific things + // (including the MetaStoreSession" into the PolarisCallContext. The non-transactional + // factories would then inject something else instead if needed. PolarisMetaStoreSession metaStoreSession = metaStoreManagerFactory.getOrCreateSessionSupplier(realmContext).get(); PolarisCallContext polarisContext =
