Skip to content

Commit 7e3a482

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 7e3a482

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ public void testValidateAndUpdateCacheOnOverwriteWithUncommittedBlocks() throws
813813
assertEquals(2, omKeyInfoList.size());
814814
assertThat(key).doesNotEndWith(String.valueOf(omKeyInfoList.get(0).getObjectID()));
815815
}
816-
816+
817817
/**
818818
* This method calls preExecute and verify the modified request.
819819
* @param originalOMRequest

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,28 @@
1919

2020
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.ONE;
2121
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertNotNull;
23+
import static org.junit.jupiter.api.Assertions.assertNull;
2224

2325
import jakarta.annotation.Nonnull;
2426
import java.io.IOException;
2527
import java.util.ArrayList;
2628
import java.util.List;
29+
import java.util.Map;
30+
import java.util.stream.Collectors;
2731
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
2832
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
2933
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
3034
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
3135
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
3236
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
3337
import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
38+
import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo;
3439
import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
40+
import org.apache.hadoop.ozone.om.response.OMClientResponse;
41+
import org.apache.hadoop.ozone.om.response.key.OMKeyCommitResponse;
3542
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
43+
import org.junit.jupiter.api.Test;
3644

3745
/**
3846
* Class tests OMKeyCommitRequest with prefix layout.
@@ -119,4 +127,39 @@ protected void verifyKeyName(OmKeyInfo omKeyInfo) {
119127
assertEquals(fileName, omKeyInfo.getFileName(), "Incorrect FileName");
120128
assertEquals(fileName, omKeyInfo.getKeyName(), "Incorrect KeyName");
121129
}
130+
131+
@Test
132+
public void testPreAllocatedUncommittedBlockForEmptyFile() throws Exception {
133+
dataSize = 0;
134+
List<KeyLocation> emptyKeyLocations = new ArrayList<>();
135+
List<KeyLocation> oneKeyLocations = getKeyLocation(1);
136+
OMRequest omRequest = createCommitKeyRequest(emptyKeyLocations, false);
137+
OMRequest modifiedOmRequest = doPreExecute(omRequest);
138+
OMKeyCommitRequest omKeyCommitRequest = getOmKeyCommitRequest(modifiedOmRequest);
139+
140+
OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
141+
omMetadataManager, omKeyCommitRequest.getBucketLayout());
142+
143+
List<OmKeyLocationInfo> allocatedLocationList =
144+
oneKeyLocations.stream().map(OmKeyLocationInfo::getFromProtobuf).collect(Collectors.toList());
145+
String openKey = addKeyToOpenKeyTable(allocatedLocationList);
146+
OmKeyInfo omKeyInfo = omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
147+
assertNotNull(omKeyInfo);
148+
149+
String ozoneKey = getOzonePathKey();
150+
omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
151+
assertNull(omKeyInfo);
152+
153+
OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L);
154+
assertEquals(OK, omClientResponse.getOMResponse().getStatus());
155+
156+
Map<String, RepeatedOmKeyInfo> toDeleteKeyList = ((OMKeyCommitResponse) omClientResponse).getKeysToDelete();
157+
assertNull(toDeleteKeyList);
158+
159+
omKeyInfo = omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
160+
assertNull(omKeyInfo);
161+
162+
omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
163+
assertNotNull(omKeyInfo);
164+
}
122165
}

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)