ivandika3 commented on code in PR #7558:
URL: https://github.com/apache/ozone/pull/7558#discussion_r1898264027
##########
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java:
##########
@@ -509,6 +509,33 @@ private OmKeyInfo readKeyInfo(OmKeyArgs args, BucketLayout
bucketLayout)
if (args.getLatestVersionLocation()) {
slimLocationVersion(value);
}
+ int partNumberParam = args.getMultipartUploadPartNumber();
+ if (partNumberParam > 0) {
+ OmKeyLocationInfoGroup latestLocationVersion =
value.getLatestVersionLocations();
+ if (latestLocationVersion != null &&
latestLocationVersion.isMultipartKey()) {
+ List<OmKeyLocationInfo> currentLocations =
+
value.getKeyLocationVersions().get(value.getKeyLocationVersions().size() - 1)
+ .getLocationList()
+ .stream()
+ .filter(it -> it.getPartNumber() == partNumberParam)
+ .collect(Collectors.toList());
+
+ value.setKeyLocationVersions(
+ Collections.singletonList(
+ new OmKeyLocationInfoGroup(
+ latestLocationVersion.getVersion(),
+ currentLocations,
+ true
+ )
+ )
+ );
+
+ long dataLength = currentLocations.stream()
+ .mapToLong(BlockLocationInfo::getLength)
+ .sum();
+ value.setDataSize(dataLength);
Review Comment:
I think there is no need to create a new `OmKeyLocationInfoGroup`, can be
made identical to the `RpcClient#getS3KeyDetails` filtering implementation.
##########
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneClientMultipartUploadWithFSO.java:
##########
@@ -854,6 +856,103 @@ public void testListMultipartUpload() throws Exception {
assertEquals(0, expectedList.size());
}
+ @Test
+ void testGetAllPartsWhenZeroPartNumber() throws Exception {
+ String parentDir = "a/b/c/d/e/f/";
+ keyName = parentDir + "file-ABC";
+ OzoneVolume s3volume = store.getVolume("s3v");
+ s3volume.createBucket(bucketName);
+ OzoneBucket s3Bucket = s3volume.getBucket(bucketName);
+
+ Map<Integer, String> partsMap = new TreeMap<>();
+ String uploadID = initiateMultipartUpload(s3Bucket, keyName, RATIS,
+ ONE);
+ Pair<String, String> partNameAndETag1 = uploadPart(s3Bucket, keyName,
+ uploadID, 1, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(1, partNameAndETag1.getKey());
+
+ Pair<String, String> partNameAndETag2 = uploadPart(s3Bucket, keyName,
+ uploadID, 2, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(2, partNameAndETag2.getKey());
+
+ Pair<String, String> partNameAndETag3 = uploadPart(s3Bucket, keyName,
+ uploadID, 3, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(3, partNameAndETag3.getKey());
+
+ s3Bucket.completeMultipartUpload(keyName, uploadID, partsMap);
+
+ OzoneKeyDetails s3KeyDetailsWithAllParts = ozClient.getProxy()
+ .getS3KeyDetails(s3Bucket.getName(), keyName, 0);
+ List<OzoneKeyLocation> ozoneKeyLocations =
s3KeyDetailsWithAllParts.getOzoneKeyLocations();
+ assertEquals(6, ozoneKeyLocations.size());
+ }
+
+ @Test
+ void testGetParticularPart() throws Exception {
+ String parentDir = "a/b/c/d/e/f/";
+ keyName = parentDir + "file-ABC";
+ OzoneVolume s3volume = store.getVolume("s3v");
+ s3volume.createBucket(bucketName);
+ OzoneBucket s3Bucket = s3volume.getBucket(bucketName);
+
+ Map<Integer, String> partsMap = new TreeMap<>();
+ String uploadID = initiateMultipartUpload(s3Bucket, keyName, RATIS,
+ ONE);
+ Pair<String, String> partNameAndETag1 = uploadPart(s3Bucket, keyName,
+ uploadID, 1, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(1, partNameAndETag1.getKey());
+
+ Pair<String, String> partNameAndETag2 = uploadPart(s3Bucket, keyName,
+ uploadID, 2, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(2, partNameAndETag2.getKey());
+
+ Pair<String, String> partNameAndETag3 = uploadPart(s3Bucket, keyName,
+ uploadID, 3, generateData(OzoneConsts.OM_MULTIPART_MIN_SIZE,
(byte) 97));
+ partsMap.put(3, partNameAndETag3.getKey());
+
+ s3Bucket.completeMultipartUpload(keyName, uploadID, partsMap);
+
+ OzoneKeyDetails s3KeyDetailsOneParts =
ozClient.getProxy().getS3KeyDetails(bucketName, keyName, 1);
+ assertEquals(2, s3KeyDetailsOneParts.getOzoneKeyLocations().size());
+
+ OzoneKeyDetails s3KeyDetailsTwoParts =
ozClient.getProxy().getS3KeyDetails(bucketName, keyName, 2);
+ assertEquals(2, s3KeyDetailsTwoParts.getOzoneKeyLocations().size());
+
+ OzoneKeyDetails s3KeyDetailsThreeParts =
ozClient.getProxy().getS3KeyDetails(bucketName, keyName, 3);
+ assertEquals(2, s3KeyDetailsThreeParts.getOzoneKeyLocations().size());
Review Comment:
I was expecting only one `OzoneKeyLocationInfo` (Ozone SCM block) created
per part since each part is only 5MB and the Ozone SCM block is 256MB. Not sure
why there are 2 `OzoneKeyLocation` per part here.
Could you help to check why is this so?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]