in service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java [1734:1834]
public void doCommit(ViewMetadata base, ViewMetadata metadata) {
polarisEventListener.onBeforeViewCommited(
new BeforeViewCommitedEvent(identifier, base, metadata));
// TODO: Maybe avoid writing metadata if there's definitely a transaction conflict
LOGGER.debug("doCommit for view {} with base {}, metadata {}", identifier, base, metadata);
if (null == base && !namespaceExists(identifier.namespace())) {
throw new NoSuchNamespaceException(
"Cannot create view '%s'. Namespace does not exist: '%s'",
identifier, identifier.namespace());
}
PolarisResolvedPathWrapper resolvedTable =
resolvedEntityView.getPassthroughResolvedPath(
identifier, PolarisEntityType.TABLE_LIKE, PolarisEntitySubType.ICEBERG_TABLE);
if (resolvedTable != null) {
throw new AlreadyExistsException("Table with same name already exists: %s", identifier);
}
PolarisResolvedPathWrapper resolvedEntities =
resolvedEntityView.getPassthroughResolvedPath(
identifier, PolarisEntityType.TABLE_LIKE, PolarisEntitySubType.ICEBERG_VIEW);
// Fetch credentials for the resolved entity. The entity could be the view itself (if it has
// already been stored and credentials have been configured directly) or it could be the
// table's namespace or catalog.
PolarisResolvedPathWrapper resolvedStorageEntity =
resolvedEntities == null
? resolvedEntityView.getResolvedPath(identifier.namespace())
: resolvedEntities;
List<PolarisEntity> resolvedNamespace =
resolvedEntities == null
? resolvedEntityView.getResolvedPath(identifier.namespace()).getRawFullPath()
: resolvedEntities.getRawParentPath();
if (base == null || !metadata.location().equals(base.location())) {
// If location is changing then we must validate that the requested location is valid
// for the storage configuration inherited under this entity's path.
validateLocationForTableLike(identifier, metadata.location(), resolvedStorageEntity);
validateNoLocationOverlap(
catalogEntity,
identifier,
resolvedNamespace,
metadata.location(),
resolvedStorageEntity.getRawLeafEntity());
}
Map<String, String> tableProperties = new HashMap<>(metadata.properties());
viewFileIO =
loadFileIOForTableLike(
identifier,
getLocationsAllowedToBeAccessed(metadata),
resolvedStorageEntity,
tableProperties,
Set.of(PolarisStorageActions.READ, PolarisStorageActions.WRITE));
String newLocation = writeNewMetadataIfRequired(metadata);
String oldLocation = base == null ? null : currentMetadataLocation;
IcebergTableLikeEntity entity =
IcebergTableLikeEntity.of(
resolvedEntities == null ? null : resolvedEntities.getRawLeafEntity());
String existingLocation;
if (null == entity) {
existingLocation = null;
entity =
new IcebergTableLikeEntity.Builder(identifier, newLocation)
.setCatalogId(getCatalogId())
.setSubType(PolarisEntitySubType.ICEBERG_VIEW)
.setId(
getMetaStoreManager().generateNewEntityId(getCurrentPolarisContext()).getId())
.build();
} else {
existingLocation = entity.getMetadataLocation();
entity =
new IcebergTableLikeEntity.Builder(entity).setMetadataLocation(newLocation).build();
}
if (!Objects.equal(existingLocation, oldLocation)) {
if (null == base) {
throw new AlreadyExistsException("View already exists: %s", identifier);
}
if (null == existingLocation) {
throw new NoSuchViewException("View does not exist: %s", identifier);
}
throw new CommitFailedException(
"Cannot commit to view %s metadata location from %s to %s "
+ "because it has been concurrently modified to %s",
identifier, oldLocation, newLocation, existingLocation);
}
if (null == existingLocation) {
createTableLike(identifier, entity);
} else {
updateTableLike(identifier, entity);
}
polarisEventListener.onAfterViewCommited(
new AfterViewCommitedEvent(identifier, base, metadata));
}