public static CompletableFuture<Void> delete(S3ObjectMetadata objectMetadata, ObjectStorage objectStorage) {
        @SuppressWarnings("resource")
        CompositeObjectReader reader = reader(objectMetadata, objectStorage);
        return deleteWithCompositeObjectReader(objectMetadata, objectStorage, reader)
            .whenComplete((rst, ex) -> {
                reader.release();
                if (ex != null) {
                    LOGGER.error("Delete composite object {} fail", objectMetadata, ex);
                }
            });
    }
CompositeObject is a logic object which soft links multiple objects together.
<p>
v0 format:
objects
object_count u32
objects (
object_id u64
block_start_index u32
bucket_index u16
)*
indexes
index_count u32
(
stream_id u64
start_offset u64
end_offset_delta u32
record_count u32
block_start_position u64
block_size u32
)*
index_handle
position u64
length u32
padding 40byte - 8 - 8 - 4
magic u64
s3stream/src/main/java/com/automq/stream/s3/CompositeObject.java