@Override
    public CompletableFuture<Void> delete(List<ObjectPath> objectPaths) {
        if (objectPaths.isEmpty()) {
            return CompletableFuture.completedFuture(null);
        }
        CompletableFuture<Void> cf = new CompletableFuture<>();
        for (ObjectPath objectPath : objectPaths) {
            if (!bucketCheck(objectPath.bucketId(), cf)) {
                logger.error("[BUG] {} bucket check fail, expect {}", objectPath, bucketURI.bucketId());
                return cf;
            }
        }

        deleteObjectsAccumulator.batchDeleteObjects(objectPaths, cf);

        return cf;
    }
Upload a part of an object to the specified path.

@param options    options (or context) about the write operation
@param path       the path of the object where the part will be uploaded
@param uploadId   the upload ID of the multipart upload
@param partNumber the part number of the part to be uploaded
@param data       the data to be uploaded, it will be released once the finalCf is done
@param attemptCf  the CompletableFuture to complete when a single attempt is done
@param finalCf    the CompletableFuture to complete when the upload operation is done
s3stream/src/main/java/com/automq/stream/s3/operator/AbstractObjectStorage.java