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 f8cc9f3f0b9..92ee96cacb5 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 MultipartUploadSlicingAlgorithm(long minimumPartSize, long maximumPartSiz 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 long calculateChunkSize(long length) { 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 423e91a0646..fab35981da4 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 void testWhenPartsExceedsMaxNumberOfParts() { // 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); } }