This is an automated email from the ASF dual-hosted git repository.

gaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git


The following commit(s) were added to refs/heads/master by this push:
     new 47f34770c9 JCLOUDS-1606: JCLOUDS-1608: Fix MPU off-by-one
47f34770c9 is described below

commit 47f34770c9daaa5fe0224ce5bc1adbb7332d9aea
Author: Jan Vermeulen <[email protected]>
AuthorDate: Tue Feb 20 21:41:47 2024 +0900

    JCLOUDS-1606: JCLOUDS-1608: Fix MPU off-by-one
    
    Previously GCS could not upload large objects due to its 32 part
    limit.
---
 .../strategy/internal/MultipartUploadSlicingAlgorithm.java          | 5 +++++
 .../blobstore/strategy/internal/MpuPartitioningAlgorithmTest.java   | 6 +++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git 
a/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/MultipartUploadSlicingAlgorithm.java
 
b/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/MultipartUploadSlicingAlgorithm.java
index f8cc9f3f0b..92ee96cacb 100644
--- 
a/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/MultipartUploadSlicingAlgorithm.java
+++ 
b/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/MultipartUploadSlicingAlgorithm.java
@@ -72,6 +72,7 @@ public final class MultipartUploadSlicingAlgorithm {
       this.maximumNumberOfParts = maximumNumberOfParts;
    }
 
+   // TODO: This algorithm is needlessly complicated.
    public long calculateChunkSize(long length) {
       long unitPartSize = defaultPartSize; // first try with default part size
       int parts = (int)(length / unitPartSize);
@@ -112,6 +113,10 @@ public final class MultipartUploadSlicingAlgorithm {
       if (remainder == 0 && parts > 0) {
          parts -= 1;
       }
+      if (remainder > 0 && parts == maximumNumberOfParts) {
+          parts -= 1;
+          partSize = length / parts;
+      }
       this.chunkSize = partSize;
       this.parts = parts;
       this.remaining = length - partSize * parts;
diff --git 
a/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/MpuPartitioningAlgorithmTest.java
 
b/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/MpuPartitioningAlgorithmTest.java
index 423e91a064..fab35981da 100644
--- 
a/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/MpuPartitioningAlgorithmTest.java
+++ 
b/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/MpuPartitioningAlgorithmTest.java
@@ -137,9 +137,9 @@ public final class MpuPartitioningAlgorithmTest {
       // then the number of parts is increasing
       length += 1;
       chunkSize = strategy.calculateChunkSize(length);
-      assertEquals(chunkSize, MAX_PART_SIZE);
-      assertEquals(strategy.getParts(), MAX_NUMBER_OF_PARTS);
-      assertEquals(strategy.getRemaining(), 1);
+      assertEquals(chunkSize, 5369246044L);
+      assertEquals(strategy.getParts(), MAX_NUMBER_OF_PARTS - 1);
+      assertEquals(strategy.getRemaining(), 6045);
       assertEquals(chunkSize * strategy.getParts() + strategy.getRemaining(), 
length);
    }
 }

Reply via email to