@@ -252,7 +252,7 @@ public void testSingleUpload() throws Exception {
252252 // was interpreted as an inconsistent write.
253253 MultipartUploader completer = uploader0 ;
254254 // and upload with uploader 1 to validate cross-uploader uploads
255- PartHandle partHandle = putPart (file , uploadHandle , 1 , payload );
255+ PartHandle partHandle = putPart (file , uploadHandle , 1 , true , payload );
256256 partHandles .put (1 , partHandle );
257257 PathHandle fd = complete (completer , uploadHandle , file ,
258258 partHandles );
@@ -321,12 +321,13 @@ protected PartHandle buildAndPutPart(
321321 final Path file ,
322322 final UploadHandle uploadHandle ,
323323 final int index ,
324+ final boolean isLastPart ,
324325 final MessageDigest origDigest ) throws IOException {
325326 byte [] payload = generatePayload (index );
326327 if (origDigest != null ) {
327328 origDigest .update (payload );
328329 }
329- return putPart (file , uploadHandle , index , payload );
330+ return putPart (file , uploadHandle , index , isLastPart , payload );
330331 }
331332
332333 /**
@@ -335,13 +336,15 @@ protected PartHandle buildAndPutPart(
335336 * @param file destination
336337 * @param uploadHandle handle
337338 * @param index index of part
339+ * @param isLastPart is last part of the upload ?
338340 * @param payload byte array of payload
339341 * @return the part handle
340342 * @throws IOException IO failure.
341343 */
342344 protected PartHandle putPart (final Path file ,
343345 final UploadHandle uploadHandle ,
344346 final int index ,
347+ final boolean isLastPart ,
345348 final byte [] payload ) throws IOException {
346349 ContractTestUtils .NanoTimer timer = new ContractTestUtils .NanoTimer ();
347350 PartHandle partHandle ;
@@ -351,7 +354,7 @@ protected PartHandle putPart(final Path file,
351354 payload .length ,
352355 file )) {
353356 partHandle = awaitFuture (getUploader (index )
354- .putPart (uploadHandle , index , file ,
357+ .putPart (uploadHandle , index , isLastPart , file ,
355358 new ByteArrayInputStream (payload ),
356359 payload .length ));
357360 }
@@ -492,7 +495,7 @@ public void testMultipartUpload() throws Exception {
492495 MessageDigest origDigest = DigestUtils .getMd5Digest ();
493496 int payloadCount = getTestPayloadCount ();
494497 for (int i = 1 ; i <= payloadCount ; ++i ) {
495- PartHandle partHandle = buildAndPutPart (file , uploadHandle , i ,
498+ PartHandle partHandle = buildAndPutPart (file , uploadHandle , i , i == payloadCount ,
496499 origDigest );
497500 partHandles .put (i , partHandle );
498501 }
@@ -508,7 +511,7 @@ public void testMultipartUpload() throws Exception {
508511 @ Test
509512 public void testMultipartUploadEmptyPart () throws Exception {
510513 FileSystem fs = getFileSystem ();
511- Path file = path ("testMultipartUpload " );
514+ Path file = path ("testMultipartUploadEmptyPart " );
512515 try (MultipartUploader uploader =
513516 fs .createMultipartUploader (file ).build ()) {
514517 UploadHandle uploadHandle = uploader .startUpload (file ).get ();
@@ -519,7 +522,7 @@ public void testMultipartUploadEmptyPart() throws Exception {
519522 origDigest .update (payload );
520523 InputStream is = new ByteArrayInputStream (payload );
521524 PartHandle partHandle = awaitFuture (
522- uploader .putPart (uploadHandle , 1 , file , is , payload .length ));
525+ uploader .putPart (uploadHandle , 1 , true , file , is , payload .length ));
523526 partHandles .put (1 , partHandle );
524527 completeUpload (file , uploadHandle , partHandles , origDigest , 0 );
525528 }
@@ -534,7 +537,7 @@ public void testUploadEmptyBlock() throws Exception {
534537 Path file = methodPath ();
535538 UploadHandle uploadHandle = startUpload (file );
536539 Map <Integer , PartHandle > partHandles = new HashMap <>();
537- partHandles .put (1 , putPart (file , uploadHandle , 1 , new byte [0 ]));
540+ partHandles .put (1 , putPart (file , uploadHandle , 1 , true , new byte [0 ]));
538541 completeUpload (file , uploadHandle , partHandles , null , 0 );
539542 }
540543
@@ -554,7 +557,8 @@ public void testMultipartUploadReverseOrder() throws Exception {
554557 origDigest .update (payload );
555558 }
556559 for (int i = payloadCount ; i > 0 ; --i ) {
557- partHandles .put (i , buildAndPutPart (file , uploadHandle , i , null ));
560+ partHandles .put (i , buildAndPutPart (file , uploadHandle , i , i == payloadCount ,
561+ null ));
558562 }
559563 completeUpload (file , uploadHandle , partHandles , origDigest ,
560564 payloadCount * partSizeInBytes ());
@@ -578,7 +582,8 @@ public void testMultipartUploadReverseOrderNonContiguousPartNumbers()
578582 }
579583 Map <Integer , PartHandle > partHandles = new HashMap <>();
580584 for (int i = payloadCount ; i > 0 ; i -= 2 ) {
581- partHandles .put (i , buildAndPutPart (file , uploadHandle , i , null ));
585+ partHandles .put (i , buildAndPutPart (file , uploadHandle , i , i == payloadCount ,
586+ null ));
582587 }
583588 completeUpload (file , uploadHandle , partHandles , origDigest ,
584589 getTestPayloadCount () * partSizeInBytes ());
@@ -595,7 +600,7 @@ public void testMultipartUploadAbort() throws Exception {
595600 UploadHandle uploadHandle = startUpload (file );
596601 Map <Integer , PartHandle > partHandles = new HashMap <>();
597602 for (int i = 12 ; i > 10 ; i --) {
598- partHandles .put (i , buildAndPutPart (file , uploadHandle , i , null ));
603+ partHandles .put (i , buildAndPutPart (file , uploadHandle , i , i == 12 , null ));
599604 }
600605 abortUpload (uploadHandle , file );
601606
@@ -605,7 +610,7 @@ public void testMultipartUploadAbort() throws Exception {
605610
606611 intercept (IOException .class ,
607612 () -> awaitFuture (
608- uploader0 .putPart (uploadHandle , 49 , file , is , len )));
613+ uploader0 .putPart (uploadHandle , 49 , true , file , is , len )));
609614 intercept (IOException .class ,
610615 () -> complete (uploader0 , uploadHandle , file , partHandles ));
611616
@@ -705,7 +710,8 @@ public void testPutPartEmptyUploadID() throws Exception {
705710 byte [] payload = generatePayload (1 );
706711 InputStream is = new ByteArrayInputStream (payload );
707712 intercept (IllegalArgumentException .class ,
708- () -> uploader0 .putPart (emptyHandle , 1 , dest , is , payload .length ));
713+ () -> uploader0 .putPart (emptyHandle , 1 , true , dest , is ,
714+ payload .length ));
709715 }
710716
711717 /**
@@ -719,7 +725,7 @@ public void testCompleteEmptyUploadID() throws Exception {
719725 UploadHandle emptyHandle =
720726 BBUploadHandle .from (ByteBuffer .wrap (new byte [0 ]));
721727 Map <Integer , PartHandle > partHandles = new HashMap <>();
722- PartHandle partHandle = putPart (dest , realHandle , 1 ,
728+ PartHandle partHandle = putPart (dest , realHandle , 1 , true ,
723729 generatePayload (1 , SMALL_FILE ));
724730 partHandles .put (1 , partHandle );
725731
@@ -747,7 +753,7 @@ public void testDirectoryInTheWay() throws Exception {
747753 UploadHandle uploadHandle = startUpload (file );
748754 Map <Integer , PartHandle > partHandles = new HashMap <>();
749755 int size = SMALL_FILE ;
750- PartHandle partHandle = putPart (file , uploadHandle , 1 ,
756+ PartHandle partHandle = putPart (file , uploadHandle , 1 , true ,
751757 generatePayload (1 , size ));
752758 partHandles .put (1 , partHandle );
753759
@@ -808,10 +814,10 @@ public void testConcurrentUploads() throws Throwable {
808814 .isNotEqualTo (upload1 );
809815
810816 // put part 1
811- partHandles1 .put (partId1 , putPart (file , upload1 , partId1 , payload1 ));
817+ partHandles1 .put (partId1 , putPart (file , upload1 , partId1 , false , payload1 ));
812818
813819 // put part2
814- partHandles2 .put (partId2 , putPart (file , upload2 , partId2 , payload2 ));
820+ partHandles2 .put (partId2 , putPart (file , upload2 , partId2 , true , payload2 ));
815821
816822 // complete part u1. expect its size and digest to
817823 // be as expected.
0 commit comments