private void completeMultipartUpload0(WriteOptions options, String path, String uploadId,
        List<ObjectStorageCompletedPart> parts, CompletableFuture<Void> cf) {
        TimerUtil timerUtil = new TimerUtil();
        doCompleteMultipartUpload(options, path, uploadId, parts).thenAccept(nil -> {
            S3OperationStats.getInstance().completeMultiPartUploadStats(true).record(timerUtil.elapsedAs(TimeUnit.NANOSECONDS));
            cf.complete(null);
        }).exceptionally(ex -> {
            S3OperationStats.getInstance().completeMultiPartUploadStats(false).record(timerUtil.elapsedAs(TimeUnit.NANOSECONDS));
            Pair<RetryStrategy, Throwable> strategyAndCause = toRetryStrategyAndCause(ex, S3Operation.COMPLETE_MULTI_PART_UPLOAD);
            RetryStrategy retryStrategy = strategyAndCause.getLeft();
            Throwable cause = strategyAndCause.getRight();
            if (retryStrategy == RetryStrategy.ABORT || checkS3ApiMode) {
                logger.error("CompleteMultipartUpload for object {} fail", path, cause);
                cf.completeExceptionally(cause);
            } else if (!checkPartNumbers(parts)) {
                logger.error("CompleteMultipartUpload for object {} fail, part numbers are not continuous", path);
                cf.completeExceptionally(new IllegalArgumentException("Part numbers are not continuous"));
            } else if (retryStrategy == RetryStrategy.VISIBILITY_CHECK) {
                rangeRead(new ReadOptions().throttleStrategy(ThrottleStrategy.BYPASS).bucket(options.bucketId()), path, 0, 1)
                    .whenComplete((nil, t) -> {
                        if (t != null) {
                            int delay = retryDelay(S3Operation.COMPLETE_MULTI_PART_UPLOAD, options.retryCountGetAndAdd());
                            logger.warn("CompleteMultipartUpload for object {} fail, retry in {}ms", path, delay, t);
                            scheduler.schedule(() -> completeMultipartUpload0(options, path, uploadId, parts, cf), delay, TimeUnit.MILLISECONDS);
                        } else {
                            cf.complete(null);
                        }
                    });
            } else {
                int delay = retryDelay(S3Operation.COMPLETE_MULTI_PART_UPLOAD, options.retryCountGetAndAdd());
                logger.warn("CompleteMultipartUpload for object {} fail, retry in {}ms", path, delay, cause);
                scheduler.schedule(() -> completeMultipartUpload0(options, path, uploadId, parts, cf), delay, TimeUnit.MILLISECONDS);
            }
            return null;
        });
    }
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