in service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java [78:150]
public boolean handleTask(TaskEntity cleanupTask, CallContext callContext) {
PolarisBaseEntity entity = cleanupTask.readData(PolarisBaseEntity.class);
PolarisMetaStoreManager metaStoreManager =
metaStoreManagerFactory.getOrCreateMetaStoreManager(callContext.getRealmContext());
IcebergTableLikeEntity tableEntity = IcebergTableLikeEntity.of(entity);
PolarisCallContext polarisCallContext = callContext.getPolarisCallContext();
LOGGER
.atInfo()
.addKeyValue("tableIdentifier", tableEntity.getTableIdentifier())
.addKeyValue("metadataLocation", tableEntity.getMetadataLocation())
.log("Handling table metadata cleanup task");
// It's likely the cleanupTask has already been completed, but wasn't dropped successfully.
// Log a
// warning and move on
try (FileIO fileIO = fileIOSupplier.apply(cleanupTask, callContext)) {
if (!TaskUtils.exists(tableEntity.getMetadataLocation(), fileIO)) {
LOGGER
.atWarn()
.addKeyValue("tableIdentifier", tableEntity.getTableIdentifier())
.addKeyValue("metadataLocation", tableEntity.getMetadataLocation())
.log("Table metadata cleanup scheduled, but metadata file does not exist");
return true;
}
TableMetadata tableMetadata =
TableMetadataParser.read(fileIO, tableEntity.getMetadataLocation());
Stream<TaskEntity> manifestCleanupTasks =
getManifestTaskStream(
cleanupTask,
tableMetadata,
fileIO,
tableEntity,
metaStoreManager,
polarisCallContext);
// TODO: handle partition statistics files
Stream<TaskEntity> metadataFileCleanupTasks =
getMetadataTaskStream(
cleanupTask,
tableMetadata,
fileIO,
tableEntity,
metaStoreManager,
polarisCallContext);
List<TaskEntity> taskEntities =
Stream.concat(manifestCleanupTasks, metadataFileCleanupTasks).toList();
List<PolarisBaseEntity> createdTasks =
metaStoreManager
.createEntitiesIfNotExist(polarisCallContext, null, taskEntities)
.getEntities();
if (createdTasks != null) {
LOGGER
.atInfo()
.addKeyValue("tableIdentifier", tableEntity.getTableIdentifier())
.addKeyValue("metadataLocation", tableEntity.getMetadataLocation())
.addKeyValue("taskCount", taskEntities.size())
.log(
"Successfully queued tasks to delete manifests, previous metadata, and statistics files - deleting table metadata file");
for (PolarisBaseEntity createdTask : createdTasks) {
taskExecutor.addTaskHandlerContext(createdTask.getId(), CallContext.getCurrentContext());
}
fileIO.deleteFile(tableEntity.getMetadataLocation());
return true;
}
}
return false;
}