private CompletableFuture<Void> deepDelete(List<S3Object> s3Objects) {
            if (s3Objects.isEmpty()) {
                return CompletableFuture.completedFuture(null);
            }
            List<CompletableFuture<Void>> cfList = new LinkedList<>();
            for (S3Object object : s3Objects) {
                S3ObjectMetadata metadata = new S3ObjectMetadata(object.getObjectId(), object.getAttributes());
                cfList.add(CompositeObject.delete(metadata, objectStorage));
            }
            CompletableFuture<Void> allCf = CompletableFuture.allOf(cfList.toArray(new CompletableFuture[0]));
            allCf.thenAccept(rst -> {
                List<Long> deletedObjectIds = s3Objects.stream().map(S3Object::getObjectId).collect(Collectors.toList());
                notifyS3ObjectDeleted(deletedObjectIds);
            });
            return allCf;
        }
Generate RemoveS3ObjectRecord for the deleted S3Objects.

@param deletedObjectIds the deleted S3Objects' ids
@return the result of the generation, contains the records which should be applied to the raft.
metadata/src/main/java/org/apache/kafka/controller/stream/S3ObjectControlManager.java