hemantk-12 commented on code in PR #4042:
URL: https://github.com/apache/ozone/pull/4042#discussion_r1041619243
##########
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java:
##########
@@ -128,8 +128,8 @@ public void testNamespaceSummaryAPI() throws Exception {
NamespaceSummaryResponse entity =
(NamespaceSummaryResponse) basicInfo.getEntity();
Assert.assertSame(entity.getEntityType(), EntityType.DIRECTORY);
- Assert.assertEquals(1, entity.getNumTotalKey());
- Assert.assertEquals(0, entity.getNumTotalDir());
+ Assert.assertEquals(1, entity.getCountStats().getNumTotalKey());
Review Comment:
Why aren't we asserting `getNumVolume()` and `getNumBucket()` here?
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/DirectoryEntityHandler.java:
##########
@@ -55,15 +58,34 @@ public NamespaceSummaryResponse getSummaryResponse()
throws IOException {
// path should exist so we don't need any extra verification/null check
long dirObjectId = getBucketHandler().getDirObjectId(getNames());
+ CountStats countStats = new CountStats(
+ -1, -1,
+ getTotalDirCount(dirObjectId), getTotalKeyCount(dirObjectId));
NamespaceSummaryResponse namespaceSummaryResponse =
- new NamespaceSummaryResponse(EntityType.DIRECTORY);
- namespaceSummaryResponse
- .setNumTotalDir(getTotalDirCount(dirObjectId));
- namespaceSummaryResponse.setNumTotalKey(getTotalKeyCount(dirObjectId));
+ NamespaceSummaryResponse.newBuilder()
+ .setEntityType(EntityType.DIRECTORY)
+ .setCountStats(countStats)
+ .setObjectDBInfo(getDirectoryObjDbInfo(getNames()))
+ .setStatus(ResponseStatus.OK)
+ .build();
return namespaceSummaryResponse;
}
+ private ObjectDBInfo getDirectoryObjDbInfo(String[] names)
+ throws IOException {
+ OmDirectoryInfo dirInfo = getBucketHandler().getDirInfo(names);
+ ObjectDBInfo objectDBInfo = new ObjectDBInfo();
Review Comment:
Same as `BucketObjectDBInfo`, create constructor or builder which takes
`OmDirectoryInfo` and create `ObjectDBInfo` object.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/VolumeEntityHandler.java:
##########
@@ -63,12 +64,41 @@ public NamespaceSummaryResponse getSummaryResponse()
totalKey += getTotalKeyCount(bucketObjectId);
}
- namespaceSummaryResponse.setNumTotalDir(totalDir);
- namespaceSummaryResponse.setNumTotalKey(totalKey);
+ CountStats countStats = new CountStats(
+ -1, buckets.size(), totalDir, totalKey);
+
+ NamespaceSummaryResponse namespaceSummaryResponse =
+ NamespaceSummaryResponse.newBuilder()
+ .setEntityType(EntityType.VOLUME)
+ .setCountStats(countStats)
+ .setObjectDBInfo(getVolumeObjDbInfo(names))
+ .setStatus(ResponseStatus.OK)
+ .build();
return namespaceSummaryResponse;
}
+ private VolumeObjectDBInfo getVolumeObjDbInfo(String[] names)
+ throws IOException {
+ String dbVolumeKey = getOmMetadataManager().getVolumeKey(names[0]);
+ OmVolumeArgs volumeArgs =
+ getOmMetadataManager().getVolumeTable().getSkipCache(dbVolumeKey);
+ VolumeObjectDBInfo objectDBInfo = new VolumeObjectDBInfo();
Review Comment:
Same as `BucketObjectDBInfo`, create constructor or builder which takes
`OmVolumeArgs` and create `VolumeObjectDBInfo` object.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java:
##########
@@ -49,18 +52,60 @@ public BucketEntityHandler(
@Override
public NamespaceSummaryResponse getSummaryResponse()
throws IOException {
- NamespaceSummaryResponse namespaceSummaryResponse =
- new NamespaceSummaryResponse(EntityType.BUCKET);
+
String[] names = getNames();
assert (names.length == 2);
long bucketObjectId = getBucketHandler().getBucketObjectId(names);
- namespaceSummaryResponse
- .setNumTotalDir(getTotalDirCount(bucketObjectId));
- namespaceSummaryResponse.setNumTotalKey(getTotalKeyCount(bucketObjectId));
+
+ CountStats countStats = new CountStats(
+ -1, -1,
+ getTotalDirCount(bucketObjectId), getTotalKeyCount(bucketObjectId));
+ NamespaceSummaryResponse namespaceSummaryResponse =
+ NamespaceSummaryResponse.newBuilder()
+ .setEntityType(EntityType.BUCKET)
+ .setCountStats(countStats)
+ .setObjectDBInfo(getBucketObjDbInfo(names))
+ .setStatus(ResponseStatus.OK)
+ .build();
return namespaceSummaryResponse;
}
+ private BucketObjectDBInfo getBucketObjDbInfo(String[] names)
+ throws IOException {
+ String volName = names[0];
+ String bucketName = names[1];
+ String bucketKey = getOmMetadataManager().
+ getBucketKey(volName, bucketName);
+ OmBucketInfo omBucketInfo =
+ getOmMetadataManager().getBucketTable().getSkipCache(bucketKey);
+ BucketObjectDBInfo bucketObjectDBInfo = new BucketObjectDBInfo();
Review Comment:
Create a constructor or a builder which takes `OmBucketInfo` in
`BucketObjectDBInfo`. Something like this. This way encapsulation will be
preserved.
```
public BucketObjectDBInfo(OmBucketInfo omBucketInfo) {
this.metadata = omBucketInfo.getMetadata();
this.volumeName = omBucketInfo.getVolumeName();
this.name = omBucketInfo.getBucketName();
this.quotaInBytes = omBucketInfo.getQuotaInBytes();
this.quotaInNamespace = omBucketInfo.getQuotaInNamespace();
this.usedNamespace = omBucketInfo.getUsedNamespace();
this.creationTime = omBucketInfo.getCreationTime();
this.modificationTime = omBucketInfo.getModificationTime();
this.acls = omBucketInfo.getAcls();
this.sourceBucket = omBucketInfo.getSourceBucket();
this.sourceVolume = omBucketInfo.getSourceVolume();
this.encryptionKeyInfo = omBucketInfo.getEncryptionKeyInfo();
this.versioningEnabled = omBucketInfo.getIsVersionEnabled();
this.storageType = omBucketInfo.getStorageType();
this.defaultReplicationConfig =
omBucketInfo.getDefaultReplicationConfig();
this.bucketLayout = omBucketInfo.getBucketLayout();
this.owner = omBucketInfo.getOwner();
}
```
Builder would be preferred tho.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/BucketObjectDBInfo.java:
##########
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
+import org.apache.hadoop.hdds.protocol.StorageType;
+import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+
+/**
+ * Encapsulates the low level bucket info.
+ */
+public class BucketObjectDBInfo extends ObjectDBInfo {
+ /** volume name from om db. */
+ @JsonProperty("volumeName")
+ private String volumeName;
+
+ /** storage type for the object. */
+ @JsonProperty("storageType")
+ private StorageType storageType;
+
+ /** is versioning enabled for the object. */
+ @JsonProperty("versioning")
+ private boolean isVersioningEnabled;
+
+ /** used bytes for the object. */
+ @JsonProperty("usedBytes")
+ private String usedBytes;
+
+ /**
+ * Bucket encryption key info if encryption is enabled.
+ */
+ @JsonProperty("encryptionInfo")
+ private BucketEncryptionKeyInfo bekInfo;
+
+ /**
+ * Optional default replication for bucket.
+ */
+ @JsonProperty("replicationConfigInfo")
+ private DefaultReplicationConfig defaultReplicationConfig;
+
+ /** source volume. */
Review Comment:
Java doc comments, like this, don't provide any information as such. I would
recommend to remove obvious comments like this everywhere.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/KeyEntityHandler.java:
##########
@@ -46,10 +49,39 @@ public KeyEntityHandler(
@Override
public NamespaceSummaryResponse getSummaryResponse()
throws IOException {
- NamespaceSummaryResponse namespaceSummaryResponse =
- new NamespaceSummaryResponse(EntityType.KEY);
+ CountStats countStats = new CountStats(
+ -1, -1,
+ -1, 0);
+ return NamespaceSummaryResponse.newBuilder()
+ .setEntityType(EntityType.KEY)
+ .setCountStats(countStats)
+ .setObjectDBInfo(getKeyDbObjectInfo(getNames()))
+ .setStatus(ResponseStatus.OK)
+ .build();
- return namespaceSummaryResponse;
+ }
+
+ private ObjectDBInfo getKeyDbObjectInfo(String[] names)
+ throws IOException {
+ OmKeyInfo keyInfo = getBucketHandler().getKeyInfo(names);
+ KeyObjectDBInfo keyObjectDBInfo = new KeyObjectDBInfo();
Review Comment:
Same as `BucketObjectDBInfo`, create constructor or builder which takes
`OmKeyInfo` and create `KeyObjectDBInfo` object.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/RootEntityHandler.java:
##########
@@ -48,26 +53,44 @@ public RootEntityHandler(
@Override
public NamespaceSummaryResponse getSummaryResponse()
throws IOException {
- NamespaceSummaryResponse namespaceSummaryResponse =
- new NamespaceSummaryResponse(EntityType.ROOT);
+
List<OmVolumeArgs> volumes = listVolumes();
- namespaceSummaryResponse.setNumVolume(volumes.size());
List<OmBucketInfo> allBuckets = listBucketsUnderVolume(null);
- namespaceSummaryResponse.setNumBucket(allBuckets.size());
int totalNumDir = 0;
long totalNumKey = 0L;
for (OmBucketInfo bucket : allBuckets) {
long bucketObjectId = bucket.getObjectID();
totalNumDir += getTotalDirCount(bucketObjectId);
totalNumKey += getTotalKeyCount(bucketObjectId);
}
+ CountStats countStats = new CountStats(
+ volumes.size(), allBuckets.size(), totalNumDir, totalNumKey);
- namespaceSummaryResponse.setNumTotalDir(totalNumDir);
- namespaceSummaryResponse.setNumTotalKey(totalNumKey);
+ NamespaceSummaryResponse namespaceSummaryResponse =
+ NamespaceSummaryResponse.newBuilder()
+ .setEntityType(EntityType.ROOT)
+ .setCountStats(countStats)
+ .setObjectDBInfo(getPrefixObjDbInfo())
+ .setStatus(ResponseStatus.OK)
+ .build();
return namespaceSummaryResponse;
}
+ private ObjectDBInfo getPrefixObjDbInfo()
+ throws IOException {
+ OmPrefixInfo omPrefixInfo =
+ getOmMetadataManager().getPrefixTable().
+ getSkipCache(OzoneConsts.OM_KEY_PREFIX);
+ ObjectDBInfo objectDBInfo = new ObjectDBInfo();
Review Comment:
Same as `BucketObjectDBInfo`, create constructor or builder which takes
`OmPrefixInfo` and create `ObjectDBInfo` object.
##########
hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithLegacy.java:
##########
@@ -389,15 +399,47 @@ public void testUtility() {
@Test
public void testGetBasicInfoRoot() throws Exception {
+ String username = "myuser";
+ OmPrefixInfo omPrefixInfo = getOmPrefixInfoForTest(ROOT_PATH,
+ IAccessAuthorizer.ACLIdentityType.USER,
+ username,
+ IAccessAuthorizer.ACLType.WRITE,
+ ACCESS);
+ omPrefixInfo.getMetadata().put("key", "value");
+ reconOMMetadataManager.getPrefixTable()
+ .put(OzoneConsts.OM_KEY_PREFIX, omPrefixInfo);
// Test root basics
Response rootResponse = nsSummaryEndpoint.getBasicInfo(ROOT_PATH);
NamespaceSummaryResponse rootResponseObj =
(NamespaceSummaryResponse) rootResponse.getEntity();
Assert.assertEquals(EntityType.ROOT, rootResponseObj.getEntityType());
- Assert.assertEquals(2, rootResponseObj.getNumVolume());
- Assert.assertEquals(4, rootResponseObj.getNumBucket());
- Assert.assertEquals(5, rootResponseObj.getNumTotalDir());
- Assert.assertEquals(10, rootResponseObj.getNumTotalKey());
+ Assert.assertEquals(2, rootResponseObj.getCountStats().getNumVolume());
+ Assert.assertEquals(4, rootResponseObj.getCountStats().getNumBucket());
+ Assert.assertEquals(5, rootResponseObj.getCountStats().getNumTotalDir());
+ Assert.assertEquals(10, rootResponseObj.getCountStats().getNumTotalKey());
Review Comment:
This is a repetitive code. I think moving this to a function would be nicer.
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java:
##########
@@ -49,18 +52,60 @@ public BucketEntityHandler(
@Override
public NamespaceSummaryResponse getSummaryResponse()
throws IOException {
- NamespaceSummaryResponse namespaceSummaryResponse =
- new NamespaceSummaryResponse(EntityType.BUCKET);
+
String[] names = getNames();
assert (names.length == 2);
long bucketObjectId = getBucketHandler().getBucketObjectId(names);
- namespaceSummaryResponse
- .setNumTotalDir(getTotalDirCount(bucketObjectId));
- namespaceSummaryResponse.setNumTotalKey(getTotalKeyCount(bucketObjectId));
+
+ CountStats countStats = new CountStats(
+ -1, -1,
+ getTotalDirCount(bucketObjectId), getTotalKeyCount(bucketObjectId));
+ NamespaceSummaryResponse namespaceSummaryResponse =
Review Comment:
```suggestion
return NamespaceSummaryResponse.newBuilder()
.setEntityType(EntityType.BUCKET)
.setCountStats(countStats)
.setObjectDBInfo(getBucketObjDbInfo(names))
.setStatus(ResponseStatus.OK)
.build();
```
--
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]