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 ad450d4a8 Add PolarisDiagnostics field to BaseMetaStoreManager (#2381) ad450d4a8 is described below commit ad450d4a82d034147099b293c34e0e9a7f7db7e6 Author: Christopher Lambert <xn...@gmx.de> AuthorDate: Tue Aug 26 13:05:23 2025 +0200 Add PolarisDiagnostics field to BaseMetaStoreManager (#2381) * Add PolarisDiagnostics field to BaseMetaStoreManager the ultimate goal is removing the `PolarisCallContext` parameter from every `PolarisMetaStoreManager` interface method, so we make steps towards reducing its usage first. --- .../jdbc/JdbcMetaStoreManagerFactory.java | 2 +- ...toreManagerWithJdbcBasePersistenceImplTest.java | 3 +- .../AtomicOperationMetaStoreManager.java | 102 ++++----- .../core/persistence/BaseMetaStoreManager.java | 52 +++-- .../LocalPolarisMetaStoreManagerFactory.java | 5 +- .../TransactionalMetaStoreManagerImpl.java | 232 +++++++++++---------- ...TreeMapAtomicOperationMetaStoreManagerTest.java | 3 +- ...moryAtomicOperationMetaStoreManagerFactory.java | 5 +- 8 files changed, 203 insertions(+), 201 deletions(-) diff --git a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index c8f05e3b3..20acc3e03 100644 --- a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -87,7 +87,7 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { } protected PolarisMetaStoreManager createNewMetaStoreManager() { - return new AtomicOperationMetaStoreManager(clock); + return new AtomicOperationMetaStoreManager(clock, diagnostics); } private void initializeForRealm( diff --git a/persistence/relational-jdbc/src/test/java/org/apache/polaris/persistence/relational/jdbc/AtomicMetastoreManagerWithJdbcBasePersistenceImplTest.java b/persistence/relational-jdbc/src/test/java/org/apache/polaris/persistence/relational/jdbc/AtomicMetastoreManagerWithJdbcBasePersistenceImplTest.java index c38970994..f15da08e3 100644 --- a/persistence/relational-jdbc/src/test/java/org/apache/polaris/persistence/relational/jdbc/AtomicMetastoreManagerWithJdbcBasePersistenceImplTest.java +++ b/persistence/relational-jdbc/src/test/java/org/apache/polaris/persistence/relational/jdbc/AtomicMetastoreManagerWithJdbcBasePersistenceImplTest.java @@ -69,7 +69,8 @@ public class AtomicMetastoreManagerWithJdbcBasePersistenceImplTest Mockito.mock(), realmContext.getRealmIdentifier(), schemaVersion); - AtomicOperationMetaStoreManager metaStoreManager = new AtomicOperationMetaStoreManager(clock); + AtomicOperationMetaStoreManager metaStoreManager = + new AtomicOperationMetaStoreManager(clock, diagServices); PolarisCallContext callCtx = new PolarisCallContext(realmContext, basePersistence, diagServices); return new PolarisTestMetaStoreManager(metaStoreManager, callCtx); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java index 7d7a26c48..947d41511 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java @@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; import org.apache.polaris.core.PolarisCallContext; +import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.entity.AsyncTaskType; import org.apache.polaris.core.entity.EntityNameLookupRecord; import org.apache.polaris.core.entity.LocationBasedEntity; @@ -86,7 +87,8 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { private final Clock clock; - public AtomicOperationMetaStoreManager(Clock clock) { + public AtomicOperationMetaStoreManager(Clock clock, PolarisDiagnostics diagnostics) { + super(diagnostics); this.clock = clock; } @@ -174,11 +176,11 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { @Nonnull PolarisBaseEntity entity) { // validate the entity type and subtype - callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_dpo"); - callCtx.getDiagServices().checkNotNull(entity.getName(), "unexpected_null_name"); + getDiagnostics().checkNotNull(entity, "unexpected_null_dpo"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_name"); // creation timestamp must be filled - callCtx.getDiagServices().check(entity.getDropTimestamp() == 0, "already_dropped"); + getDiagnostics().check(entity.getDropTimestamp() == 0, "already_dropped"); // Remove the main entity itself first-thing; once its id no longer resolves successfully // it will be pruned out of any grant-record lookups anyways. @@ -281,13 +283,12 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { @Nonnull PolarisPrivilege priv) { // validate non null arguments - callCtx.getDiagServices().checkNotNull(securable, "unexpected_null_securable"); - callCtx.getDiagServices().checkNotNull(grantee, "unexpected_null_grantee"); - callCtx.getDiagServices().checkNotNull(priv, "unexpected_null_priv"); + getDiagnostics().checkNotNull(securable, "unexpected_null_securable"); + getDiagnostics().checkNotNull(grantee, "unexpected_null_grantee"); + getDiagnostics().checkNotNull(priv, "unexpected_null_priv"); // ensure that this entity is indeed a grantee like entity - callCtx - .getDiagServices() + getDiagnostics() .check(grantee.getType().isGrantee(), "entity_must_be_grantee", "entity={}", grantee); // create new grant record @@ -306,9 +307,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { // version PolarisBaseEntity granteeEntity = ms.lookupEntity(callCtx, grantee.getCatalogId(), grantee.getId(), grantee.getTypeCode()); - callCtx - .getDiagServices() - .checkNotNull(granteeEntity, "grantee_not_found", "grantee={}", grantee); + getDiagnostics().checkNotNull(granteeEntity, "grantee_not_found", "grantee={}", grantee); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedGranteeEntity = granteeEntity.withGrantRecordsVersion(granteeEntity.getGrantRecordsVersion() + 1); @@ -319,8 +318,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { PolarisBaseEntity securableEntity = ms.lookupEntity( callCtx, securable.getCatalogId(), securable.getId(), securable.getTypeCode()); - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull(securableEntity, "securable_not_found", "securable={}", securable); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedSecurableEntity = @@ -356,8 +354,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { @Nonnull PolarisGrantRecord grantRecord) { // validate securable - callCtx - .getDiagServices() + getDiagnostics() .check( securable.getCatalogId() == grantRecord.getSecurableCatalogId() && securable.getId() == grantRecord.getSecurableId(), @@ -367,8 +364,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { grantRecord); // validate grantee - callCtx - .getDiagServices() + getDiagnostics() .check( grantee.getCatalogId() == grantRecord.getGranteeCatalogId() && grantee.getId() == grantRecord.getGranteeId(), @@ -378,9 +374,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { grantRecord); // ensure the grantee is really a grantee - callCtx - .getDiagServices() - .check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); + getDiagnostics().check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); // remove that grant ms.deleteFromGrantRecords(callCtx, grantRecord); @@ -388,8 +382,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { // load the grantee and increment its grants version PolarisBaseEntity refreshGrantee = ms.lookupEntity(callCtx, grantee.getCatalogId(), grantee.getId(), grantee.getTypeCode()); - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( refreshGrantee, "missing_grantee", "grantRecord={} grantee={}", grantRecord, grantee); // grants have changed, we need to bump-up the grants version @@ -402,8 +395,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { PolarisBaseEntity refreshSecurable = ms.lookupEntity( callCtx, securable.getCatalogId(), securable.getId(), securable.getTypeCode()); - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( refreshSecurable, "missing_securable", @@ -430,7 +422,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // validate input - callCtx.getDiagServices().checkNotNull(catalog, "unexpected_null_catalog"); + getDiagnostics().checkNotNull(catalog, "unexpected_null_catalog"); Map<String, String> internalProp = catalog.getInternalPropertiesAsMap(); String integrationIdentifierOrId = @@ -462,8 +454,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { // if found, probably a retry, simply return the previously created catalog if (refreshCatalog != null) { // if found, ensure it is indeed a catalog - callCtx - .getDiagServices() + getDiagnostics() .check( refreshCatalog.getTypeCode() == PolarisEntityType.CATALOG.getCode(), "not_a_catalog", @@ -480,8 +471,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { PolarisEntityConstants.getNameOfCatalogAdminRole()); // if found, ensure not null - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( catalogAdminRole, "catalog_admin_role_not_found", "catalog={}", refreshCatalog); @@ -532,16 +522,15 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { PolarisEntityConstants.getRootEntityId(), PolarisEntityType.PRINCIPAL_ROLE.getCode(), PolarisEntityConstants.getNameOfPrincipalServiceAdminRole()); - callCtx.getDiagServices().checkNotNull(serviceAdminRole, "missing_service_admin_role"); + getDiagnostics().checkNotNull(serviceAdminRole, "missing_service_admin_role"); this.persistNewGrantRecord( callCtx, ms, adminRole, serviceAdminRole, PolarisPrivilege.CATALOG_ROLE_USAGE); } else { // grant to each principal role usage on its catalog_admin role for (PolarisEntityCore principalRole : principalRoles) { // validate not null and really a principal role - callCtx.getDiagServices().checkNotNull(principalRole, "null principal role"); - callCtx - .getDiagServices() + getDiagnostics().checkNotNull(principalRole, "null principal role"); + getDiagnostics() .check( principalRole.getTypeCode() == PolarisEntityType.PRINCIPAL_ROLE.getCode(), "not_principal_role", @@ -764,7 +753,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // validate input - callCtx.getDiagServices().checkNotNull(principal, "unexpected_null_principal"); + getDiagnostics().checkNotNull(principal, "unexpected_null_principal"); // check if that catalog has already been created PolarisBaseEntity refreshPrincipal = @@ -777,8 +766,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { // there is no concurrency conflict for something else creating a principal of this same id. if (refreshPrincipal != null) { // if found, ensure it is indeed a principal - callCtx - .getDiagServices() + getDiagnostics() .check( principal.getTypeCode() == PolarisEntityType.PRINCIPAL.getCode(), "not_a_principal", @@ -792,16 +780,14 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { String clientId = properties.get(PolarisEntityConstants.getClientIdPropertyName()); // should not be null - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( clientId, "null_client_id", "properties={}", refreshPrincipal.getInternalProperties()); // ensure non null and non empty - callCtx - .getDiagServices() + getDiagnostics() .check( !clientId.isEmpty(), "empty_client_id", @@ -813,8 +799,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { ((IntegrationPersistence) ms).loadPrincipalSecrets(callCtx, clientId); // should not be null - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( principalSecrets, "missing_principal_secrets", @@ -937,10 +922,10 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // entity cannot be null - callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); // entity name must be specified - callCtx.getDiagServices().checkNotNull(entity.getName(), "unexpected_null_entity_name"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_entity_name"); // TODO: Use post-validation to enforce consistent view against catalogPath. In the // meantime, happens-before ordering semantics aren't guaranteed during high-concurrency @@ -994,7 +979,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // entity cannot be null - callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); // persist this entity after changing it. This will update the version and update the last // updated time. Because the entity version is changed, we will update the change tracking table try { @@ -1018,7 +1003,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // ensure that the entities list is not null - callCtx.getDiagServices().checkNotNull(entities, "unexpected_null_entities"); + getDiagnostics().checkNotNull(entities, "unexpected_null_entities"); List<PolarisBaseEntity> updatedEntities = new ArrayList<>(entities.size()); List<PolarisBaseEntity> originalEntities = new ArrayList<>(entities.size()); @@ -1059,13 +1044,12 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // entity and new name cannot be null - callCtx.getDiagServices().checkNotNull(entityToRename, "unexpected_null_entityToRename"); - callCtx.getDiagServices().checkNotNull(renamedEntity, "unexpected_null_renamedEntity"); + getDiagnostics().checkNotNull(entityToRename, "unexpected_null_entityToRename"); + getDiagnostics().checkNotNull(renamedEntity, "unexpected_null_renamedEntity"); // if a new catalog path is specified (i.e. re-parent operation), a catalog path should be // specified too - callCtx - .getDiagServices() + getDiagnostics() .check( (newCatalogPath == null) || (catalogPath != null), "newCatalogPath_specified_without_catalogPath"); @@ -1159,7 +1143,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { BasePersistence ms = callCtx.getMetaStore(); // entity cannot be null - callCtx.getDiagServices().checkNotNull(entityToDrop, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entityToDrop, "unexpected_null_entity"); // TODO: Either document allowance of dropping entity concurrently with potentially-impacting // changes in the parent path (e.g. race-condition revocation of grants on parent) or @@ -1300,9 +1284,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { : PolarisPrivilege.PRINCIPAL_ROLE_USAGE; // grant usage on this role to this principal - callCtx - .getDiagServices() - .check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); + getDiagnostics().check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); PolarisGrantRecord grantRecord = this.persistNewGrantRecord(callCtx, ms, role, grantee, usagePriv); return new PrivilegeResult(grantRecord); @@ -1604,8 +1586,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { // get meta store session we should be using BasePersistence ms = callCtx.getMetaStore(); - callCtx - .getDiagServices() + getDiagnostics() .check( !allowedReadLocations.isEmpty() || !allowedWriteLocations.isEmpty(), "allowed_locations_to_subscope_is_required"); @@ -1627,8 +1608,7 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { .loadPolarisStorageIntegration(callCtx, reloadedEntity.getEntity()); // cannot be null - callCtx - .getDiagServices() + getDiagnostics() .checkNotNull( storageIntegration, "storage_integration_not_exists", @@ -1931,8 +1911,8 @@ public class AtomicOperationMetaStoreManager extends BaseMetaStoreManager { @Nonnull PolarisEntityCore target, @Nonnull PolicyEntity policy, Map<String, String> parameters) { - callCtx.getDiagServices().checkNotNull(target, "unexpected_null_target"); - callCtx.getDiagServices().checkNotNull(policy, "unexpected_null_policy"); + getDiagnostics().checkNotNull(target, "unexpected_null_target"); + getDiagnostics().checkNotNull(policy, "unexpected_null_policy"); PolarisPolicyMappingRecord mappingRecord = new PolarisPolicyMappingRecord( 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 index 6fb8448d1..884883f27 100644 --- 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 @@ -47,6 +47,16 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { return PolarisStorageConfigurationInfo.deserialize(storageConfigInfoStr); } + private final PolarisDiagnostics diagnostics; + + protected BaseMetaStoreManager(PolarisDiagnostics diagnostics) { + this.diagnostics = diagnostics; + } + + protected PolarisDiagnostics getDiagnostics() { + return diagnostics; + } + /** * Performs basic validation of expected invariants on a new entity, then returns the entity with * fields filled out for which the persistence layer is responsible. @@ -61,16 +71,13 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { @Nonnull PolarisBaseEntity entity) { // validate the entity type and subtype - callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_entity"); - callCtx - .getDiagServices() - .checkNotNull(entity.getName(), "unexpected_null_name", "entity={}", entity); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_name", "entity={}", entity); PolarisEntityType type = PolarisEntityType.fromCode(entity.getTypeCode()); - callCtx.getDiagServices().checkNotNull(type, "unknown_type", "entity={}", entity); + getDiagnostics().checkNotNull(type, "unknown_type", "entity={}", entity); PolarisEntitySubType subType = PolarisEntitySubType.fromCode(entity.getSubTypeCode()); - callCtx.getDiagServices().checkNotNull(subType, "unexpected_null_subType", "entity={}", entity); - callCtx - .getDiagServices() + getDiagnostics().checkNotNull(subType, "unexpected_null_subType", "entity={}", entity); + getDiagnostics() .check( subType.getParentType() == null || subType.getParentType() == type, "invalid_subtype", @@ -79,8 +86,7 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { subType); // if top-level entity, its parent should be the account - callCtx - .getDiagServices() + getDiagnostics() .check( !type.isTopLevel() || entity.getParentId() == PolarisEntityConstants.getRootEntityId(), "top_level_parent_should_be_account", @@ -88,8 +94,7 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { entity); // id should not be null - callCtx - .getDiagServices() + getDiagnostics() .check( entity.getId() != 0 || type == PolarisEntityType.ROOT, "id_not_set", @@ -97,7 +102,7 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { entity); // creation timestamp must be filled - callCtx.getDiagServices().check(entity.getCreateTimestamp() != 0, "null_create_timestamp"); + getDiagnostics().check(entity.getCreateTimestamp() != 0, "null_create_timestamp"); PolarisBaseEntity.Builder entityBuilder = new PolarisBaseEntity.Builder(entity); entityBuilder.lastUpdateTimestamp(entity.getCreateTimestamp()); @@ -126,16 +131,13 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { @Nonnull PolarisBaseEntity originalEntity) { // validate the entity type and subtype - callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_entity"); - callCtx - .getDiagServices() - .checkNotNull(entity.getName(), "unexpected_null_name", "entity={}", entity); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_name", "entity={}", entity); PolarisEntityType type = entity.getType(); - callCtx.getDiagServices().checkNotNull(type, "unexpected_null_type", "entity={}", entity); + getDiagnostics().checkNotNull(type, "unexpected_null_type", "entity={}", entity); PolarisEntitySubType subType = entity.getSubType(); - callCtx.getDiagServices().checkNotNull(subType, "unexpected_null_subType", "entity={}", entity); - callCtx - .getDiagServices() + getDiagnostics().checkNotNull(subType, "unexpected_null_subType", "entity={}", entity); + getDiagnostics() .check( subType.getParentType() == null || subType.getParentType() == type, "invalid_subtype", @@ -145,15 +147,11 @@ public abstract class BaseMetaStoreManager implements PolarisMetaStoreManager { entity); // entity should not have been dropped - callCtx - .getDiagServices() - .check(entity.getDropTimestamp() == 0, "entity_dropped", "entity={}", entity); + getDiagnostics().check(entity.getDropTimestamp() == 0, "entity_dropped", "entity={}", entity); // creation timestamp must be filled long createTimestamp = entity.getCreateTimestamp(); - callCtx - .getDiagServices() - .check(createTimestamp != 0, "null_create_timestamp", "entity={}", entity); + getDiagnostics().check(createTimestamp != 0, "null_create_timestamp", "entity={}", entity); // ensure time is not moving backward... long now = System.currentTimeMillis(); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java index c66938842..818bdb138 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java @@ -88,7 +88,8 @@ public abstract class LocalPolarisMetaStoreManagerFactory<StoreType> * Subclasses can override this to inject different implementations of PolarisMetaStoreManager * into the existing realm-based setup flow. */ - protected PolarisMetaStoreManager createNewMetaStoreManager(Clock clock) { + protected PolarisMetaStoreManager createNewMetaStoreManager( + Clock clock, PolarisDiagnostics diagnostics) { return new TransactionalMetaStoreManagerImpl(clock, diagnostics); } @@ -99,7 +100,7 @@ public abstract class LocalPolarisMetaStoreManagerFactory<StoreType> realmContext.getRealmIdentifier(), () -> createMetaStoreSession(backingStore, realmContext, rootCredentialsSet, diagnostics)); - PolarisMetaStoreManager metaStoreManager = createNewMetaStoreManager(clock); + PolarisMetaStoreManager metaStoreManager = createNewMetaStoreManager(clock, diagnostics); metaStoreManagerMap.put(realmContext.getRealmIdentifier(), metaStoreManager); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java index c187a6375..c3e1a9fac 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java @@ -90,11 +90,10 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { LoggerFactory.getLogger(TransactionalMetaStoreManagerImpl.class); private final Clock clock; - private final PolarisDiagnostics diagnostics; public TransactionalMetaStoreManagerImpl(Clock clock, PolarisDiagnostics diagnostics) { + super(diagnostics); this.clock = clock; - this.diagnostics = diagnostics; } /** @@ -169,11 +168,11 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisBaseEntity entity) { // validate the entity type and subtype - diagnostics.checkNotNull(entity, "unexpected_null_dpo"); - diagnostics.checkNotNull(entity.getName(), "unexpected_null_name"); + getDiagnostics().checkNotNull(entity, "unexpected_null_dpo"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_name"); // creation timestamp must be filled - diagnostics.check(entity.getDropTimestamp() == 0, "already_dropped"); + getDiagnostics().check(entity.getDropTimestamp() == 0, "already_dropped"); // for now drop all associated grants, etc. synchronously // delete ALL grant records to (if the entity is a grantee) and from that entity @@ -271,13 +270,13 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisPrivilege priv) { // validate non null arguments - diagnostics.checkNotNull(securable, "unexpected_null_securable"); - diagnostics.checkNotNull(grantee, "unexpected_null_grantee"); - diagnostics.checkNotNull(priv, "unexpected_null_priv"); + getDiagnostics().checkNotNull(securable, "unexpected_null_securable"); + getDiagnostics().checkNotNull(grantee, "unexpected_null_grantee"); + getDiagnostics().checkNotNull(priv, "unexpected_null_priv"); // ensure that this entity is indeed a grantee like entity - diagnostics.check( - grantee.getType().isGrantee(), "entity_must_be_grantee", "entity={}", grantee); + getDiagnostics() + .check(grantee.getType().isGrantee(), "entity_must_be_grantee", "entity={}", grantee); // create new grant record PolarisGrantRecord grantRecord = @@ -296,7 +295,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisBaseEntity granteeEntity = ms.lookupEntityInCurrentTxn( callCtx, grantee.getCatalogId(), grantee.getId(), grantee.getTypeCode()); - diagnostics.checkNotNull(granteeEntity, "grantee_not_found", "grantee={}", grantee); + getDiagnostics().checkNotNull(granteeEntity, "grantee_not_found", "grantee={}", grantee); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedGranteeEntity = granteeEntity.withGrantRecordsVersion(granteeEntity.getGrantRecordsVersion() + 1); @@ -307,7 +306,8 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisBaseEntity securableEntity = ms.lookupEntityInCurrentTxn( callCtx, securable.getCatalogId(), securable.getId(), securable.getTypeCode()); - diagnostics.checkNotNull(securableEntity, "securable_not_found", "securable={}", securable); + getDiagnostics() + .checkNotNull(securableEntity, "securable_not_found", "securable={}", securable); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedSecurableEntity = new PolarisBaseEntity.Builder(securableEntity) @@ -340,25 +340,27 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisGrantRecord grantRecord) { // validate securable - diagnostics.check( - securable.getCatalogId() == grantRecord.getSecurableCatalogId() - && securable.getId() == grantRecord.getSecurableId(), - "securable_mismatch", - "securable={} grantRec={}", - securable, - grantRecord); + getDiagnostics() + .check( + securable.getCatalogId() == grantRecord.getSecurableCatalogId() + && securable.getId() == grantRecord.getSecurableId(), + "securable_mismatch", + "securable={} grantRec={}", + securable, + grantRecord); // validate grantee - diagnostics.check( - grantee.getCatalogId() == grantRecord.getGranteeCatalogId() - && grantee.getId() == grantRecord.getGranteeId(), - "grantee_mismatch", - "grantee={} grantRec={}", - grantee, - grantRecord); + getDiagnostics() + .check( + grantee.getCatalogId() == grantRecord.getGranteeCatalogId() + && grantee.getId() == grantRecord.getGranteeId(), + "grantee_mismatch", + "grantee={} grantRec={}", + grantee, + grantRecord); // ensure the grantee is really a grantee - diagnostics.check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); + getDiagnostics().check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); // remove that grant ms.deleteFromGrantRecordsInCurrentTxn(callCtx, grantRecord); @@ -367,8 +369,9 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisBaseEntity refreshGrantee = ms.lookupEntityInCurrentTxn( callCtx, grantee.getCatalogId(), grantee.getId(), grantee.getTypeCode()); - diagnostics.checkNotNull( - refreshGrantee, "missing_grantee", "grantRecord={} grantee={}", grantRecord, grantee); + getDiagnostics() + .checkNotNull( + refreshGrantee, "missing_grantee", "grantRecord={} grantee={}", grantRecord, grantee); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedRefreshGrantee = refreshGrantee.withGrantRecordsVersion(refreshGrantee.getGrantRecordsVersion() + 1); @@ -379,12 +382,13 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisBaseEntity refreshSecurable = ms.lookupEntityInCurrentTxn( callCtx, securable.getCatalogId(), securable.getId(), securable.getTypeCode()); - diagnostics.checkNotNull( - refreshSecurable, - "missing_securable", - "grantRecord={} securable={}", - grantRecord, - securable); + getDiagnostics() + .checkNotNull( + refreshSecurable, + "missing_securable", + "grantRecord={} securable={}", + grantRecord, + securable); // grants have changed, we need to bump-up the grants version PolarisBaseEntity updatedRefreshSecurable = refreshSecurable.withGrantRecordsVersion(refreshSecurable.getGrantRecordsVersion() + 1); @@ -416,7 +420,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nullable PolarisStorageIntegration<?> integration, @Nonnull List<PolarisEntityCore> principalRoles) { // validate input - diagnostics.checkNotNull(catalog, "unexpected_null_catalog"); + getDiagnostics().checkNotNull(catalog, "unexpected_null_catalog"); // check if that catalog has already been created PolarisBaseEntity refreshCatalog = @@ -426,11 +430,12 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { // if found, probably a retry, simply return the previously created catalog if (refreshCatalog != null) { // if found, ensure it is indeed a catalog - diagnostics.check( - refreshCatalog.getTypeCode() == PolarisEntityType.CATALOG.getCode(), - "not_a_catalog", - "catalog={}", - catalog); + getDiagnostics() + .check( + refreshCatalog.getTypeCode() == PolarisEntityType.CATALOG.getCode(), + "not_a_catalog", + "catalog={}", + catalog); // lookup catalog admin role, should exist PolarisBaseEntity catalogAdminRole = @@ -442,8 +447,9 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisEntityConstants.getNameOfCatalogAdminRole()); // if found, ensure not null - diagnostics.checkNotNull( - catalogAdminRole, "catalog_admin_role_not_found", "catalog={}", refreshCatalog); + getDiagnostics() + .checkNotNull( + catalogAdminRole, "catalog_admin_role_not_found", "catalog={}", refreshCatalog); // done, return the existing catalog return new CreateCatalogResult(refreshCatalog, catalogAdminRole); @@ -497,19 +503,20 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisEntityConstants.getRootEntityId(), PolarisEntityType.PRINCIPAL_ROLE.getCode(), PolarisEntityConstants.getNameOfPrincipalServiceAdminRole()); - diagnostics.checkNotNull(serviceAdminRole, "missing_service_admin_role"); + getDiagnostics().checkNotNull(serviceAdminRole, "missing_service_admin_role"); this.persistNewGrantRecord( callCtx, ms, adminRole, serviceAdminRole, PolarisPrivilege.CATALOG_ROLE_USAGE); } else { // grant to each principal role usage on its catalog_admin role for (PolarisEntityCore principalRole : principalRoles) { // validate not null and really a principal role - diagnostics.checkNotNull(principalRole, "null principal role"); - diagnostics.check( - principalRole.getTypeCode() == PolarisEntityType.PRINCIPAL_ROLE.getCode(), - "not_principal_role", - "type={}", - principalRole.getType()); + getDiagnostics().checkNotNull(principalRole, "null principal role"); + getDiagnostics() + .check( + principalRole.getTypeCode() == PolarisEntityType.PRINCIPAL_ROLE.getCode(), + "not_principal_role", + "type={}", + principalRole.getType()); // grant usage on that catalog admin role to this principal this.persistNewGrantRecord( @@ -773,7 +780,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull TransactionalPersistence ms, @Nonnull PolarisBaseEntity principal) { // validate input - diagnostics.checkNotNull(principal, "unexpected_null_principal"); + getDiagnostics().checkNotNull(principal, "unexpected_null_principal"); // check if that catalog has already been created PolarisBaseEntity refreshPrincipal = @@ -783,11 +790,12 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { // if found, probably a retry, simply return the previously created principal if (refreshPrincipal != null) { // if found, ensure it is indeed a principal - diagnostics.check( - principal.getTypeCode() == PolarisEntityType.PRINCIPAL.getCode(), - "not_a_principal", - "principal={}", - principal); + getDiagnostics() + .check( + principal.getTypeCode() == PolarisEntityType.PRINCIPAL.getCode(), + "not_a_principal", + "principal={}", + principal); // get internal properties Map<String, String> properties = refreshPrincipal.getInternalPropertiesAsMap(); @@ -796,26 +804,32 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { String clientId = properties.get(PolarisEntityConstants.getClientIdPropertyName()); // should not be null - diagnostics.checkNotNull( - clientId, "null_client_id", "properties={}", refreshPrincipal.getInternalProperties()); + getDiagnostics() + .checkNotNull( + clientId, + "null_client_id", + "properties={}", + refreshPrincipal.getInternalProperties()); // ensure non null and non empty - diagnostics.check( - !clientId.isEmpty(), - "empty_client_id", - "properties={}", - refreshPrincipal.getInternalProperties()); + getDiagnostics() + .check( + !clientId.isEmpty(), + "empty_client_id", + "properties={}", + refreshPrincipal.getInternalProperties()); // get the main and secondary secrets for that client PolarisPrincipalSecrets principalSecrets = ms.loadPrincipalSecretsInCurrentTxn(callCtx, clientId); // should not be null - diagnostics.checkNotNull( - principalSecrets, - "missing_principal_secrets", - "clientId={} principal={}", - clientId, - refreshPrincipal); + getDiagnostics() + .checkNotNull( + principalSecrets, + "missing_principal_secrets", + "clientId={} principal={}", + clientId, + refreshPrincipal); // done, return the newly created principal return new CreatePrincipalResult(refreshPrincipal, principalSecrets); @@ -1003,10 +1017,10 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisBaseEntity entity) { // entity cannot be null - diagnostics.checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); // entity name must be specified - diagnostics.checkNotNull(entity.getName(), "unexpected_null_entity_name"); + getDiagnostics().checkNotNull(entity.getName(), "unexpected_null_entity_name"); // first, check if the entity has already been created, in which case we will simply return it PolarisBaseEntity entityFound = @@ -1098,7 +1112,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nullable List<PolarisEntityCore> catalogPath, @Nonnull PolarisBaseEntity entity) { // entity cannot be null - diagnostics.checkNotNull(entity, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entity, "unexpected_null_entity"); // re-resolve everything including that entity PolarisEntityResolver resolver = new PolarisEntityResolver(callCtx, ms, catalogPath, entity); @@ -1112,7 +1126,8 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { PolarisBaseEntity entityRefreshed = ms.lookupEntityInCurrentTxn( callCtx, entity.getCatalogId(), entity.getId(), entity.getTypeCode()); - diagnostics.checkNotNull(entityRefreshed, "unexpected_entity_not_found", "entity={}", entity); + getDiagnostics() + .checkNotNull(entityRefreshed, "unexpected_entity_not_found", "entity={}", entity); // check that the version of the entity has not changed at all to avoid concurrent updates if (entityRefreshed.getEntityVersion() != entity.getEntityVersion()) { @@ -1163,7 +1178,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull TransactionalPersistence ms, @Nonnull List<EntityWithPath> entities) { // ensure that the entities list is not null - diagnostics.checkNotNull(entities, "unexpected_null_entities"); + getDiagnostics().checkNotNull(entities, "unexpected_null_entities"); // list of all updated entities List<PolarisBaseEntity> updatedEntities = new ArrayList<>(entities.size()); @@ -1215,14 +1230,15 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisBaseEntity renamedEntity) { // entity and new name cannot be null - diagnostics.checkNotNull(entityToRename, "unexpected_null_entityToRename"); - diagnostics.checkNotNull(renamedEntity, "unexpected_null_renamedEntity"); + getDiagnostics().checkNotNull(entityToRename, "unexpected_null_entityToRename"); + getDiagnostics().checkNotNull(renamedEntity, "unexpected_null_renamedEntity"); // if a new catalog path is specified (i.e. re-parent operation), a catalog path should be // specified too - diagnostics.check( - (newCatalogPath == null) || (catalogPath != null), - "newCatalogPath_specified_without_catalogPath"); + getDiagnostics() + .check( + (newCatalogPath == null) || (catalogPath != null), + "newCatalogPath_specified_without_catalogPath"); // null is shorthand for saying the path isn't changing if (newCatalogPath == null) { @@ -1343,7 +1359,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nullable Map<String, String> cleanupProperties, boolean cleanup) { // entity cannot be null - diagnostics.checkNotNull(entityToDrop, "unexpected_null_entity"); + getDiagnostics().checkNotNull(entityToDrop, "unexpected_null_entity"); // re-resolve everything including that entity PolarisEntityResolver resolver = @@ -1499,25 +1515,26 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisEntityCore grantee) { // validate the grantee input - diagnostics.checkNotNull(grantee, "unexpected_null_grantee"); - diagnostics.check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); + getDiagnostics().checkNotNull(grantee, "unexpected_null_grantee"); + getDiagnostics().check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); // validate role - diagnostics.checkNotNull(role, "unexpected_null_role"); + getDiagnostics().checkNotNull(role, "unexpected_null_role"); // role should be a catalog or a principal role boolean isCatalogRole = role.getTypeCode() == PolarisEntityType.CATALOG_ROLE.getCode(); boolean isPrincipalRole = role.getTypeCode() == PolarisEntityType.PRINCIPAL_ROLE.getCode(); - diagnostics.check(isCatalogRole || isPrincipalRole, "not_a_role"); + getDiagnostics().check(isCatalogRole || isPrincipalRole, "not_a_role"); // if the role is a catalog role, ensure a catalog is specified and // vice-versa, catalog should be null if the role is a principal role - diagnostics.check( - (catalog == null && isPrincipalRole) || (catalog != null && isCatalogRole), - "catalog_mismatch", - "catalog={} role={}", - catalog, - role); + getDiagnostics() + .check( + (catalog == null && isPrincipalRole) || (catalog != null && isCatalogRole), + "catalog_mismatch", + "catalog={} role={}", + catalog, + role); // re-resolve now all these entities List<PolarisEntityCore> otherTopLevelEntities = new ArrayList<>(2); @@ -1544,14 +1561,15 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nullable List<PolarisEntityCore> catalogPath, @Nonnull PolarisEntityCore securable) { // validate role input - diagnostics.checkNotNull(grantee, "unexpected_null_grantee"); - diagnostics.check(grantee.getType().isGrantee(), "not_grantee_type", "grantee={}", grantee); + getDiagnostics().checkNotNull(grantee, "unexpected_null_grantee"); + getDiagnostics() + .check(grantee.getType().isGrantee(), "not_grantee_type", "grantee={}", grantee); // securable must be supplied - diagnostics.checkNotNull(securable, "unexpected_null_securable"); + getDiagnostics().checkNotNull(securable, "unexpected_null_securable"); if (securable.getCatalogId() > 0) { // catalogPath must be supplied if the securable has a catalogId - diagnostics.checkNotNull(catalogPath, "unexpected_null_catalogPath"); + getDiagnostics().checkNotNull(catalogPath, "unexpected_null_catalogPath"); } // re-resolve now all these entities @@ -1585,7 +1603,7 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { : PolarisPrivilege.PRINCIPAL_ROLE_USAGE; // grant usage on this role to this principal - diagnostics.check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); + getDiagnostics().check(grantee.getType().isGrantee(), "not_a_grantee", "grantee={}", grantee); PolarisGrantRecord grantRecord = this.persistNewGrantRecord(callCtx, ms, role, grantee, usagePriv); return new PrivilegeResult(grantRecord); @@ -2026,9 +2044,10 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { // get meta store session we should be using TransactionalPersistence ms = ((TransactionalPersistence) callCtx.getMetaStore()); - diagnostics.check( - !allowedReadLocations.isEmpty() || !allowedWriteLocations.isEmpty(), - "allowed_locations_to_subscope_is_required"); + getDiagnostics() + .check( + !allowedReadLocations.isEmpty() || !allowedWriteLocations.isEmpty(), + "allowed_locations_to_subscope_is_required"); // reload the entity, error out if not found EntityResult reloadedEntity = loadEntity(callCtx, catalogId, entityId, entityType); @@ -2042,12 +2061,13 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { ms.loadPolarisStorageIntegrationInCurrentTxn(callCtx, reloadedEntity.getEntity()); // cannot be null - diagnostics.checkNotNull( - storageIntegration, - "storage_integration_not_exists", - "catalogId={}, entityId={}", - catalogId, - entityId); + getDiagnostics() + .checkNotNull( + storageIntegration, + "storage_integration_not_exists", + "catalogId={}, entityId={}", + catalogId, + entityId); try { AccessConfig accessConfig = @@ -2485,8 +2505,8 @@ public class TransactionalMetaStoreManagerImpl extends BaseMetaStoreManager { @Nonnull PolarisEntityCore target, @Nonnull PolicyEntity policy, Map<String, String> parameters) { - diagnostics.checkNotNull(target, "unexpected_null_target"); - diagnostics.checkNotNull(policy, "unexpected_null_policy"); + getDiagnostics().checkNotNull(target, "unexpected_null_target"); + getDiagnostics().checkNotNull(policy, "unexpected_null_policy"); PolarisPolicyMappingRecord mappingRecord = new PolarisPolicyMappingRecord( diff --git a/polaris-core/src/test/java/org/apache/polaris/core/persistence/PolarisTreeMapAtomicOperationMetaStoreManagerTest.java b/polaris-core/src/test/java/org/apache/polaris/core/persistence/PolarisTreeMapAtomicOperationMetaStoreManagerTest.java index 0b1035668..ac8d45218 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/persistence/PolarisTreeMapAtomicOperationMetaStoreManagerTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/persistence/PolarisTreeMapAtomicOperationMetaStoreManagerTest.java @@ -36,7 +36,8 @@ public class PolarisTreeMapAtomicOperationMetaStoreManagerTest TreeMapTransactionalPersistenceImpl metaStore = new TreeMapTransactionalPersistenceImpl( diagServices, store, Mockito.mock(), RANDOM_SECRETS); - AtomicOperationMetaStoreManager metaStoreManager = new AtomicOperationMetaStoreManager(clock); + AtomicOperationMetaStoreManager metaStoreManager = + new AtomicOperationMetaStoreManager(clock, diagServices); PolarisCallContext callCtx = new PolarisCallContext(() -> "testRealm", metaStore, diagServices); return new PolarisTestMetaStoreManager(metaStoreManager, callCtx); } diff --git a/runtime/service/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java b/runtime/service/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java index 703ad1e38..fb45bc6c0 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java @@ -50,7 +50,8 @@ public class InMemoryAtomicOperationMetaStoreManagerFactory } @Override - protected PolarisMetaStoreManager createNewMetaStoreManager(Clock clock) { - return new AtomicOperationMetaStoreManager(clock); + protected PolarisMetaStoreManager createNewMetaStoreManager( + Clock clock, PolarisDiagnostics diagnostics) { + return new AtomicOperationMetaStoreManager(clock, diagnostics); } }