Skip to content

Commit 57358fb

Browse files
committed
HDDS-14417. Skip wrapping allocated but unused blocks for empty file as pseudo file and save in deletedTable
1 parent 6007f86 commit 57358fb

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ protected OzoneLockStrategy getOzoneLockStrategy(OzoneManager ozoneManager) {
11551155
*/
11561156
protected OmKeyInfo wrapUncommittedBlocksAsPseudoKey(
11571157
List<OmKeyLocationInfo> uncommitted, OmKeyInfo omKeyInfo) {
1158-
if (uncommitted.isEmpty()) {
1158+
if (uncommitted.isEmpty() || omKeyInfo.getDataSize() == 0) {
11591159
return null;
11601160
}
11611161
LOG.debug("Detect allocated but uncommitted blocks {} in key {}.",

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,41 @@ public void testValidateAndUpdateCacheOnOverwriteWithUncommittedBlocks() throws
814814
assertThat(key).doesNotEndWith(String.valueOf(omKeyInfoList.get(0).getObjectID()));
815815
}
816816

817+
@Test
818+
public void testPreAllocatedUncommittedBlockForEmptyFile() throws Exception {
819+
dataSize = 0;
820+
List<KeyLocation> emptyKeyLocations = new ArrayList<>();
821+
List<KeyLocation> oneKeyLocations = getKeyLocation(1);
822+
OMRequest omRequest = createCommitKeyRequest(emptyKeyLocations, false);
823+
OMRequest modifiedOmRequest = doPreExecute(omRequest);
824+
OMKeyCommitRequest omKeyCommitRequest = getOmKeyCommitRequest(modifiedOmRequest);
825+
826+
OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
827+
omMetadataManager, omKeyCommitRequest.getBucketLayout());
828+
829+
List<OmKeyLocationInfo> allocatedLocationList =
830+
oneKeyLocations.stream().map(OmKeyLocationInfo::getFromProtobuf).collect(Collectors.toList());
831+
String openKey = addKeyToOpenKeyTable(allocatedLocationList);
832+
OmKeyInfo omKeyInfo = omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
833+
assertNotNull(omKeyInfo);
834+
835+
String ozoneKey = getOzonePathKey();
836+
omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
837+
assertNull(omKeyInfo);
838+
839+
OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L);
840+
assertEquals(OK, omClientResponse.getOMResponse().getStatus());
841+
842+
Map<String, RepeatedOmKeyInfo> toDeleteKeyList = ((OMKeyCommitResponse) omClientResponse).getKeysToDelete();
843+
assertNull(toDeleteKeyList);
844+
845+
omKeyInfo = omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
846+
assertNull(omKeyInfo);
847+
848+
omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
849+
assertNotNull(omKeyInfo);
850+
}
851+
817852
/**
818853
* This method calls preExecute and verify the modified request.
819854
* @param originalOMRequest

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartUploadCommitPartRequest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,65 @@ public void testValidateAndUpdateCacheOnOverWriteWithUncommittedBlocks() throws
556556
assertEquals(2, toDeleteKeyMap.size());
557557
}
558558

559+
@Test
560+
public void testValidateAndUpdateCacheWithUncommittedBlockForEmptyPart() throws Exception {
561+
String volumeName = UUID.randomUUID().toString();
562+
String bucketName = UUID.randomUUID().toString();
563+
String keyName = getKeyName();
564+
565+
OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
566+
omMetadataManager, getBucketLayout());
567+
568+
createParentPath(volumeName, bucketName);
569+
570+
// Create key to be overwritten
571+
OMRequest initiateMPURequest = doPreExecuteInitiateMPU(volumeName,
572+
bucketName, keyName);
573+
574+
S3InitiateMultipartUploadRequest s3InitiateMultipartUploadRequest =
575+
getS3InitiateMultipartUploadReq(initiateMPURequest);
576+
577+
OMClientResponse omClientResponse =
578+
s3InitiateMultipartUploadRequest.validateAndUpdateCache(ozoneManager, 1L);
579+
580+
long clientID = Time.now();
581+
String multipartUploadID = omClientResponse.getOMResponse()
582+
.getInitiateMultiPartUploadResponse().getMultipartUploadID();
583+
584+
List<KeyLocation> emptyKeyLocationInfos = new ArrayList<>();
585+
List<KeyLocation> originalKeyLocationList = getKeyLocation(1);
586+
List<OmKeyLocationInfo> originalKeyLocationInfos = originalKeyLocationList
587+
.stream().map(OmKeyLocationInfo::getFromProtobuf)
588+
.collect(Collectors.toList());
589+
590+
OMRequest commitMultipartRequest = doPreExecuteCommitMPU(volumeName,
591+
bucketName, keyName, clientID, multipartUploadID, 1, emptyKeyLocationInfos);
592+
593+
S3MultipartUploadCommitPartRequest s3MultipartUploadCommitPartRequest =
594+
getS3MultipartUploadCommitReq(commitMultipartRequest);
595+
596+
addKeyToOpenKeyTable(volumeName, bucketName, keyName, clientID, originalKeyLocationInfos);
597+
598+
omClientResponse =
599+
s3MultipartUploadCommitPartRequest.validateAndUpdateCache(ozoneManager, 2L);
600+
601+
assertSame(OzoneManagerProtocolProtos.Status.OK,
602+
omClientResponse.getOMResponse().getStatus());
603+
604+
String multipartKey = omMetadataManager.getMultipartKey(volumeName,
605+
bucketName, keyName, multipartUploadID);
606+
607+
OmMultipartKeyInfo multipartKeyInfo = omMetadataManager.getMultipartInfoTable().get(multipartKey);
608+
assertNotNull(multipartKeyInfo);
609+
assertEquals(1, multipartKeyInfo.getPartKeyInfoMap().size());
610+
PartKeyInfo partKeyInfo = multipartKeyInfo.getPartKeyInfo(1);
611+
assertNotNull(partKeyInfo);
612+
613+
Map<String, RepeatedOmKeyInfo> toDeleteKeyMap =
614+
((S3MultipartUploadCommitPartResponse) omClientResponse).getKeyToDelete();
615+
assertNull(toDeleteKeyMap);
616+
}
617+
559618
protected void addKeyToOpenKeyTable(String volumeName, String bucketName,
560619
String keyName, long clientID) throws Exception {
561620
OMRequestTestUtils.addKeyToTable(true, true, volumeName, bucketName,

0 commit comments

Comments
 (0)