public CompletableFuture<ObjectStorageCompletedPart> uploadPart(WriteOptions options, String path, String uploadId,
        int partNumber, ByteBuf data) {
        CompletableFuture<ObjectStorageCompletedPart> cf = new CompletableFuture<>();
        CompletableFuture<ObjectStorageCompletedPart> refCf = acquireWritePermit(cf);
        refCf = refCf.whenComplete((v, ex) -> data.release());
        if (refCf.isDone()) {
            return refCf;
        }
        networkOutboundBandwidthLimiter
            .consume(options.throttleStrategy(), data.readableBytes())
            .whenCompleteAsync((v, ex) -> {
                if (ex != null) {
                    cf.completeExceptionally(ex);
                    return;
                }
                if (checkTimeout(options, cf)) {
                    return;
                }
                queuedUploadPart0(options, path, uploadId, partNumber, data, cf);
            }, writeLimiterCallbackExecutor);
        return refCf;
    }
Put an object to the specified path.

@param options   options (or context) about the write operation
@param path      the path to put the object
@param data      the data to put, 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 write operation is done
s3stream/src/main/java/com/automq/stream/s3/operator/AbstractObjectStorage.java