in polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java [151:236]
private void dropEntity(
@Nonnull PolarisCallContext callCtx,
@Nonnull TransactionalPersistence ms,
@Nonnull PolarisBaseEntity entity) {
// validate the entity type and subtype
callCtx.getDiagServices().checkNotNull(entity, "unexpected_null_dpo");
callCtx.getDiagServices().checkNotNull(entity.getName(), "unexpected_null_name");
// creation timestamp must be filled
callCtx.getDiagServices().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
final List<PolarisGrantRecord> grantsOnGrantee =
(entity.getType().isGrantee())
? ms.loadAllGrantRecordsOnGranteeInCurrentTxn(
callCtx, entity.getCatalogId(), entity.getId())
: List.of();
final List<PolarisGrantRecord> grantsOnSecurable =
ms.loadAllGrantRecordsOnSecurableInCurrentTxn(
callCtx, entity.getCatalogId(), entity.getId());
ms.deleteAllEntityGrantRecordsInCurrentTxn(callCtx, entity, grantsOnGrantee, grantsOnSecurable);
// Now determine the set of entities on the other side of the grants we just removed. Grants
// from/to these entities has been removed, hence we need to update the grant version of
// each entity. Collect the id of each.
Set<PolarisEntityId> entityIdsGrantChanged = new HashSet<>();
grantsOnGrantee.forEach(
gr ->
entityIdsGrantChanged.add(
new PolarisEntityId(gr.getSecurableCatalogId(), gr.getSecurableId())));
grantsOnSecurable.forEach(
gr ->
entityIdsGrantChanged.add(
new PolarisEntityId(gr.getGranteeCatalogId(), gr.getGranteeId())));
// Bump up the grant version of these entities
List<PolarisBaseEntity> entities =
ms.lookupEntitiesInCurrentTxn(callCtx, new ArrayList<>(entityIdsGrantChanged));
for (PolarisBaseEntity entityGrantChanged : entities) {
PolarisBaseEntity originalEntity = new PolarisBaseEntity(entityGrantChanged);
entityGrantChanged.setGrantRecordsVersion(entityGrantChanged.getGrantRecordsVersion() + 1);
ms.writeEntityInCurrentTxn(callCtx, entityGrantChanged, false, originalEntity);
}
if (entity.getType() == PolarisEntityType.POLICY
|| PolicyMappingUtil.isValidTargetEntityType(entity.getType(), entity.getSubType())) {
// Best-effort cleanup - for policy and potential target entities, drop all policy mapping
// records related
try {
final List<PolarisPolicyMappingRecord> mappingOnPolicy =
(entity.getType() == PolarisEntityType.POLICY)
? ms.loadAllTargetsOnPolicyInCurrentTxn(
callCtx, entity.getCatalogId(), entity.getId())
: List.of();
final List<PolarisPolicyMappingRecord> mappingOnTarget =
(entity.getType() == PolarisEntityType.POLICY)
? List.of()
: ms.loadAllPoliciesOnTargetInCurrentTxn(
callCtx, entity.getCatalogId(), entity.getId());
ms.deleteAllEntityPolicyMappingRecordsInCurrentTxn(
callCtx, entity, mappingOnTarget, mappingOnPolicy);
} catch (UnsupportedOperationException e) {
// Policy mapping persistence not implemented, but we should not block dropping entities
}
}
// remove the entity being dropped now
ms.deleteEntityInCurrentTxn(callCtx, entity);
// if it is a principal, we also need to drop the secrets
if (entity.getType() == PolarisEntityType.PRINCIPAL) {
// get internal properties
Map<String, String> properties =
this.deserializeProperties(callCtx, entity.getInternalProperties());
// get client_id
String clientId = properties.get(PolarisEntityConstants.getClientIdPropertyName());
// delete it from the secret slice
ms.deletePrincipalSecretsInCurrentTxn(callCtx, clientId, entity.getId());
}
// TODO: Also, if an entity contains a storage integration, delete the storage integration
// and other things of that nature.
}