This is an automated email from the ASF dual-hosted git repository.

ritesh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new ad176eb0c1 HDDS-9079. Implement a lightweight listKeys API (#5115)
ad176eb0c1 is described below

commit ad176eb0c10ced990d2063cb1b6d4004c77dbe55
Author: tanvipenumudy <[email protected]>
AuthorDate: Wed Sep 27 01:29:02 2023 +0530

    HDDS-9079. Implement a lightweight listKeys API (#5115)
---
 .../apache/hadoop/ozone/OzoneManagerVersion.java   |   3 +
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |  42 ++--
 .../main/java/org/apache/hadoop/ozone/OmUtils.java |   1 +
 .../apache/hadoop/ozone/om/IOmMetadataReader.java  |  30 ++-
 .../hadoop/ozone/om/helpers/BasicOmKeyInfo.java    | 222 +++++++++++++++++++++
 .../ozone/om/helpers/ListKeysLightResult.java      |  43 ++++
 .../hadoop/ozone/om/helpers/ListKeysResult.java    |  42 ++++
 ...OzoneManagerProtocolClientSideTranslatorPB.java |  47 ++++-
 .../apache/hadoop/ozone/om/TestKeyManagerImpl.java |   5 +-
 .../hadoop/ozone/om/TestOzoneManagerPrepare.java   |   2 +-
 .../src/main/proto/OmClientProtocol.proto          |  18 ++
 .../apache/hadoop/ozone/om/OMMetadataManager.java  |   6 +-
 .../org/apache/hadoop/ozone/om/KeyManager.java     |   5 +-
 .../org/apache/hadoop/ozone/om/KeyManagerImpl.java |  11 +-
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     |  12 +-
 .../apache/hadoop/ozone/om/OmMetadataReader.java   |  21 +-
 .../org/apache/hadoop/ozone/om/OmSnapshot.java     |  30 ++-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  25 ++-
 .../protocolPB/OzoneManagerRequestHandler.java     |  31 ++-
 .../hadoop/ozone/om/TestOmMetadataManager.java     |  20 +-
 .../hadoop/ozone/om/TestSstFilteringService.java   |   2 +-
 .../hadoop/ozone/freon/OmMetadataGenerator.java    |   5 +-
 22 files changed, 568 insertions(+), 55 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java
index a91885e25d..00f2e55f97 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java
@@ -37,6 +37,9 @@ public enum OzoneManagerVersion implements ComponentVersion {
   OPTIMIZED_GET_KEY_INFO(3, "OzoneManager version that supports optimized"
       + " key lookups using cached container locations."),
 
+  LIGHTWEIGHT_LIST_KEYS(4, "OzoneManager version that supports lightweight"
+      + " listKeys API."),
+
   FUTURE_VERSION(-1, "Used internally in the client when the server side is "
       + " newer and an unknown server version has arrived to the client.");
 
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index 183a62c1ea..d3a3106934 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -107,6 +107,7 @@ import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
 import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.DeleteTenantState;
@@ -1558,18 +1559,35 @@ public class RpcClient implements ClientProtocol {
                                  String keyPrefix, String prevKey,
                                  int maxListResult)
       throws IOException {
-    List<OmKeyInfo> keys = ozoneManagerClient.listKeys(
-        volumeName, bucketName, prevKey, keyPrefix, maxListResult);
-    return keys.stream().map(key -> new OzoneKey(
-        key.getVolumeName(),
-        key.getBucketName(),
-        key.getKeyName(),
-        key.getDataSize(),
-        key.getCreationTime(),
-        key.getModificationTime(),
-        key.getReplicationConfig(),
-        key.isFile()))
-        .collect(Collectors.toList());
+
+    if (omVersion.compareTo(OzoneManagerVersion.LIGHTWEIGHT_LIST_KEYS) >= 0) {
+      List<BasicOmKeyInfo> keys = ozoneManagerClient.listKeysLight(
+          volumeName, bucketName, prevKey, keyPrefix, maxListResult).getKeys();
+
+      return keys.stream().map(key -> new OzoneKey(
+              key.getVolumeName(),
+              key.getBucketName(),
+              key.getKeyName(),
+              key.getDataSize(),
+              key.getCreationTime(),
+              key.getModificationTime(),
+              key.getReplicationConfig(),
+              key.isFile()))
+          .collect(Collectors.toList());
+    } else {
+      List<OmKeyInfo> keys = ozoneManagerClient.listKeys(
+          volumeName, bucketName, prevKey, keyPrefix, maxListResult).getKeys();
+      return keys.stream().map(key -> new OzoneKey(
+              key.getVolumeName(),
+              key.getBucketName(),
+              key.getKeyName(),
+              key.getDataSize(),
+              key.getCreationTime(),
+              key.getModificationTime(),
+              key.getReplicationConfig(),
+              key.isFile()))
+          .collect(Collectors.toList());
+    }
   }
 
   @Override
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
index 5a293d3256..0e0a89a7a2 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
@@ -241,6 +241,7 @@ public final class OmUtils {
     case ListBuckets:
     case LookupKey:
     case ListKeys:
+    case ListKeysLight:
     case ListTrash:
     case ServiceList:
     case ListMultiPartUploadParts:
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/IOmMetadataReader.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/IOmMetadataReader.java
index 9bdc4772aa..c0a920aca9 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/IOmMetadataReader.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/IOmMetadataReader.java
@@ -22,6 +22,8 @@ import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus;
 import org.apache.hadoop.ozone.security.acl.OzoneObj;
 
@@ -109,8 +111,32 @@ public interface IOmMetadataReader {
    *   the size of the result will not exceed this limit.
    * @return a list of keys.
    */
-  List<OmKeyInfo> listKeys(String volumeName, String bucketName,
-                           String startKey, String keyPrefix, int maxKeys)
+  ListKeysResult listKeys(String volumeName, String bucketName,
+                          String startKey, String keyPrefix, int maxKeys)
+      throws IOException;
+
+  /**
+   * Lightweight listKeys implementation.
+   *
+   * @param volumeName
+   *   the name of the volume.
+   * @param bucketName
+   *   the name of the bucket.
+   * @param startKey
+   *   the start key name, only the keys whose name is
+   *   after this value will be included in the result.
+   * @param keyPrefix
+   *   key name prefix, only the keys whose name has
+   *   this prefix will be included in the result.
+   * @param maxKeys
+   *   the maximum number of keys to return. It ensures
+   *   the size of the result will not exceed this limit.
+   * @return a list of keys.
+   * @throws IOException
+   */
+  ListKeysLightResult listKeysLight(String volumeName, String bucketName,
+                                     String startKey, String keyPrefix,
+                                     int maxKeys)
       throws IOException;
 
   /**
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/BasicOmKeyInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/BasicOmKeyInfo.java
new file mode 100644
index 0000000000..2d7d859832
--- /dev/null
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/BasicOmKeyInfo.java
@@ -0,0 +1,222 @@
+/**
+ * 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.om.helpers;
+
+import java.io.IOException;
+import java.util.Objects;
+
+import org.apache.hadoop.hdds.client.ECReplicationConfig;
+import org.apache.hadoop.hdds.client.ReplicationConfig;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.BasicKeyInfo;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysRequest;
+
+/**
+ * Lightweight OmKeyInfo class.
+ */
+public class BasicOmKeyInfo {
+
+  private String volumeName;
+  private String bucketName;
+  private String keyName;
+  private long dataSize;
+  private long creationTime;
+  private long modificationTime;
+  private ReplicationConfig replicationConfig;
+  private boolean isFile;
+
+  @SuppressWarnings("parameternumber")
+  public BasicOmKeyInfo(String volumeName, String bucketName, String keyName,
+                        long dataSize, long creationTime, long 
modificationTime,
+                        ReplicationConfig replicationConfig, boolean isFile) {
+    this.volumeName = volumeName;
+    this.bucketName = bucketName;
+    this.keyName = keyName;
+    this.dataSize = dataSize;
+    this.creationTime = creationTime;
+    this.modificationTime = modificationTime;
+    this.replicationConfig = replicationConfig;
+    this.isFile = isFile;
+  }
+
+  public String getVolumeName() {
+    return volumeName;
+  }
+
+  public String getBucketName() {
+    return bucketName;
+  }
+
+  public String getKeyName() {
+    return keyName;
+  }
+
+  public long getDataSize() {
+    return dataSize;
+  }
+
+  public long getCreationTime() {
+    return creationTime;
+  }
+
+  public long getModificationTime() {
+    return modificationTime;
+  }
+
+  public ReplicationConfig getReplicationConfig() {
+    return replicationConfig;
+  }
+
+  public boolean isFile() {
+    return isFile;
+  }
+
+  /**
+   * Builder of BasicOmKeyInfo.
+   */
+  public static class Builder {
+    private String volumeName;
+    private String bucketName;
+    private String keyName;
+    private long dataSize;
+    private long creationTime;
+    private long modificationTime;
+    private ReplicationConfig replicationConfig;
+    private boolean isFile;
+
+    public Builder setVolumeName(String volumeName) {
+      this.volumeName = volumeName;
+      return this;
+    }
+
+    public Builder setBucketName(String bucketName) {
+      this.bucketName = bucketName;
+      return this;
+    }
+
+    public Builder setKeyName(String keyName) {
+      this.keyName = keyName;
+      return this;
+    }
+
+    public Builder setDataSize(long dataSize) {
+      this.dataSize = dataSize;
+      return this;
+    }
+
+    public Builder setCreationTime(long creationTime) {
+      this.creationTime = creationTime;
+      return this;
+    }
+
+    public Builder setModificationTime(long modificationTime) {
+      this.modificationTime = modificationTime;
+      return this;
+    }
+
+    public Builder setReplicationConfig(ReplicationConfig replicationConfig) {
+      this.replicationConfig = replicationConfig;
+      return this;
+    }
+
+    public Builder setIsFile(boolean isFile) {
+      this.isFile = isFile;
+      return this;
+    }
+
+    public BasicOmKeyInfo build() {
+      return new BasicOmKeyInfo(volumeName, bucketName, keyName, dataSize,
+          creationTime, modificationTime, replicationConfig, isFile);
+    }
+  }
+
+  public BasicKeyInfo getProtobuf() {
+    BasicKeyInfo.Builder builder = BasicKeyInfo.newBuilder()
+        .setKeyName(keyName)
+        .setDataSize(dataSize)
+        .setCreationTime(creationTime)
+        .setModificationTime(modificationTime)
+        .setType(replicationConfig.getReplicationType());
+    if (replicationConfig instanceof ECReplicationConfig) {
+      builder.setEcReplicationConfig(
+          ((ECReplicationConfig) replicationConfig).toProto());
+    } else {
+      builder.setFactor(ReplicationConfig.getLegacyFactor(replicationConfig));
+    }
+
+    return builder.build();
+  }
+
+  public static BasicOmKeyInfo getFromProtobuf(BasicKeyInfo basicKeyInfo,
+                                               ListKeysRequest request)
+      throws IOException {
+    if (basicKeyInfo == null || request == null) {
+      return null;
+    }
+
+    String keyName = basicKeyInfo.getKeyName();
+
+    Builder builder = new Builder()
+        .setVolumeName(request.getVolumeName())
+        .setBucketName(request.getBucketName())
+        .setKeyName(keyName)
+        .setDataSize(basicKeyInfo.getDataSize())
+        .setCreationTime(basicKeyInfo.getCreationTime())
+        .setModificationTime(basicKeyInfo.getModificationTime())
+        .setReplicationConfig(ReplicationConfig.fromProto(
+            basicKeyInfo.getType(),
+            basicKeyInfo.getFactor(),
+            basicKeyInfo.getEcReplicationConfig()))
+        .setIsFile(!keyName.endsWith("/"));
+
+    return builder.build();
+  }
+
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    BasicOmKeyInfo basicOmKeyInfo = (BasicOmKeyInfo) o;
+    return volumeName.equals(basicOmKeyInfo.volumeName) &&
+        bucketName.equals(basicOmKeyInfo.bucketName) &&
+        keyName.equals(basicOmKeyInfo.keyName) &&
+        dataSize == basicOmKeyInfo.dataSize &&
+        creationTime == basicOmKeyInfo.creationTime &&
+        modificationTime == basicOmKeyInfo.modificationTime &&
+        replicationConfig.equals(basicOmKeyInfo.replicationConfig) &&
+        isFile == basicOmKeyInfo.isFile;
+  }
+
+  public int hashCode() {
+    return Objects.hash(volumeName, bucketName, keyName);
+  }
+
+  public static BasicOmKeyInfo fromOmKeyInfo(OmKeyInfo omKeyInfo) {
+    return new BasicOmKeyInfo(
+        omKeyInfo.getVolumeName(),
+        omKeyInfo.getBucketName(),
+        omKeyInfo.getKeyName(),
+        omKeyInfo.getDataSize(),
+        omKeyInfo.getCreationTime(),
+        omKeyInfo.getModificationTime(),
+        omKeyInfo.getReplicationConfig(),
+        omKeyInfo.isFile());
+  }
+}
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysLightResult.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysLightResult.java
new file mode 100644
index 0000000000..47a0669cc3
--- /dev/null
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysLightResult.java
@@ -0,0 +1,43 @@
+/**
+ * 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.om.helpers;
+
+import java.util.List;
+
+/**
+ * Encapsulates the result of listKeys. It contains a list of
+ * {@link BasicOmKeyInfo} and a boolean flag indicating if the listing is
+ * truncated.
+ */
+public class ListKeysLightResult {
+  private List<BasicOmKeyInfo> keys;
+  private boolean isTruncated;
+
+  public ListKeysLightResult(List<BasicOmKeyInfo> keys, boolean isTruncated) {
+    this.keys = keys;
+    this.isTruncated = isTruncated;
+  }
+
+  public List<BasicOmKeyInfo> getKeys() {
+    return keys;
+  }
+
+  public boolean isTruncated() {
+    return isTruncated;
+  }
+}
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysResult.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysResult.java
new file mode 100644
index 0000000000..679e1a25e9
--- /dev/null
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/ListKeysResult.java
@@ -0,0 +1,42 @@
+/**
+ * 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.om.helpers;
+
+import java.util.List;
+
+/**
+ * Encapsulates the result of listKeys. It contains a list of {@link OmKeyInfo}
+ * and a boolean flag indicating if the listing is truncated.
+ */
+public class ListKeysResult {
+  private List<OmKeyInfo> keys;
+  private boolean isTruncated;
+
+  public ListKeysResult(List<OmKeyInfo> keys, boolean isTruncated) {
+    this.keys = keys;
+    this.isTruncated = isTruncated;
+  }
+
+  public List<OmKeyInfo> getKeys() {
+    return keys;
+  }
+
+  public boolean isTruncated() {
+    return isTruncated;
+  }
+}
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
index a4820817c0..7133ae03e4 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
@@ -40,6 +40,9 @@ import org.apache.hadoop.ipc.CallerContext;
 import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.DBUpdates;
 import org.apache.hadoop.ozone.om.helpers.DeleteTenantState;
 import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
@@ -126,6 +129,7 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListBuc
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListBucketsResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysResponse;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysLightResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListMultipartUploadsRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListMultipartUploadsResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListStatusRequest;
@@ -971,7 +975,7 @@ public final class 
OzoneManagerProtocolClientSideTranslatorPB
    * List keys in a bucket.
    */
   @Override
-  public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
+  public ListKeysResult listKeys(String volumeName, String bucketName,
       String startKey, String prefix, int maxKeys) throws IOException {
     List<OmKeyInfo> keys = new ArrayList<>();
     ListKeysRequest.Builder reqBuilder = ListKeysRequest.newBuilder();
@@ -1001,10 +1005,49 @@ public final class 
OzoneManagerProtocolClientSideTranslatorPB
       list.add(fromProtobuf);
     }
     keys.addAll(list);
-    return keys;
+    return new ListKeysResult(keys, resp.getIsTruncated());
 
   }
 
+  /**
+   * Lightweight listKeys implementation.
+   */
+  @Override
+  public ListKeysLightResult listKeysLight(String volumeName,
+                                           String bucketName, String startKey,
+                                           String prefix,
+                                           int maxKeys) throws IOException {
+    List<BasicOmKeyInfo> keys = new ArrayList<>();
+    ListKeysRequest.Builder reqBuilder = ListKeysRequest.newBuilder();
+    reqBuilder.setVolumeName(volumeName);
+    reqBuilder.setBucketName(bucketName);
+    reqBuilder.setCount(maxKeys);
+
+    if (StringUtils.isNotEmpty(startKey)) {
+      reqBuilder.setStartKey(startKey);
+    }
+
+    if (prefix != null) {
+      reqBuilder.setPrefix(prefix);
+    }
+
+    ListKeysRequest req = reqBuilder.build();
+
+    OMRequest omRequest = createOMRequest(Type.ListKeysLight)
+        .setListKeysRequest(req)
+        .build();
+
+    ListKeysLightResponse resp =
+        handleError(submitRequest(omRequest)).getListKeysLightResponse();
+    for (OzoneManagerProtocolProtos.BasicKeyInfo
+        basicKeyInfo : resp.getBasicKeyInfoList()) {
+      BasicOmKeyInfo fromProtobuf =
+          BasicOmKeyInfo.getFromProtobuf(basicKeyInfo, req);
+      keys.add(fromProtobuf);
+    }
+    return new ListKeysLightResult(keys, resp.getIsTruncated());
+  }
+
   @Override
   @Nonnull
   public S3SecretValue getS3Secret(String kerberosID) throws IOException {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
index f9d83c8390..e2ce4e9ba5 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
@@ -953,8 +953,9 @@ public class TestKeyManagerImpl {
     assertEquals(key.getKeyLocationVersions().size(), 2);
 
     // Test ListKeys (latestLocationVersion is always true for ListKeys)
-    List<OmKeyInfo> keyInfos = keyManager.listKeys(keyArgs.getVolumeName(),
-        keyArgs.getBucketName(), "", keyArgs.getKeyName(), 100);
+    List<OmKeyInfo> keyInfos =
+        keyManager.listKeys(keyArgs.getVolumeName(), keyArgs.getBucketName(),
+            "", keyArgs.getKeyName(), 100).getKeys();
     assertEquals(keyInfos.size(), 1);
     assertEquals(keyInfos.get(0).getKeyLocationVersions().size(), 1);
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
index 15f2bd9031..20b343dbf9 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
@@ -411,7 +411,7 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
       // Wait for a potentially slow follower to apply all key writes.
       LambdaTestUtils.await(WAIT_TIMEOUT_MILLIS, 1000, () -> {
         List<OmKeyInfo> keys = om.getMetadataManager().listKeys(volumeName,
-            BUCKET, null, KEY_PREFIX, 100);
+            BUCKET, null, KEY_PREFIX, 100).getKeys();
 
         boolean allKeysFound = (expectedKeys.size() == keys.size());
         if (!allKeysFound) {
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 85a6af4d35..01d384d5c2 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -141,6 +141,7 @@ enum Type {
   CancelSnapshotDiff = 123;
   SetSafeMode = 124;
   PrintCompactionLogDag = 125;
+  ListKeysLight = 126;
 }
 
 enum SafeMode {
@@ -388,6 +389,7 @@ message OMResponse {
   optional CancelSnapshotDiffResponse        cancelSnapshotDiffResponse    = 
123;
   optional SetSafeModeResponse               SetSafeModeResponse           = 
124;
   optional PrintCompactionLogDagResponse     PrintCompactionLogDagResponse = 
125;
+  optional ListKeysLightResponse             listKeysLightResponse         = 
126;
 }
 
 enum Status {
@@ -1085,6 +1087,16 @@ message KeyInfo {
     optional bool isFile = 19;
 }
 
+message BasicKeyInfo {
+    optional string keyName = 1;
+    optional uint64 dataSize = 2;
+    optional uint64 creationTime = 3;
+    optional uint64 modificationTime = 4;
+    optional hadoop.hdds.ReplicationType type = 5;
+    optional hadoop.hdds.ReplicationFactor factor = 6;
+    optional hadoop.hdds.ECReplicationConfig ecReplicationConfig = 7;
+}
+
 message DirectoryInfo {
     required string name = 1;
     required uint64 creationTime = 2;
@@ -1358,6 +1370,12 @@ message ListKeysRequest {
 
 message ListKeysResponse {
     repeated KeyInfo keyInfo = 2;
+    optional bool isTruncated = 3;
+}
+
+message ListKeysLightResponse {
+    repeated BasicKeyInfo basicKeyInfo = 1;
+    optional bool isTruncated = 2;
 }
 
 message CommitKeyRequest {
diff --git 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
index 0832344dce..66baf41184 100644
--- 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
+++ 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hdds.utils.db.TableIterator;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.common.BlockGroup;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBAccessIdInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBUserPrincipalInfo;
@@ -202,8 +203,9 @@ public interface OMMetadataManager extends DBStoreHAManager 
{
    * @return a list of keys.
    * @throws IOException
    */
-  List<OmKeyInfo> listKeys(String volumeName,
-      String bucketName, String startKey, String keyPrefix, int maxKeys)
+  ListKeysResult listKeys(String volumeName,
+                          String bucketName, String startKey, String keyPrefix,
+                          int maxKeys)
       throws IOException;
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
index 0bcc7f8231..6ba98cbde0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
@@ -21,6 +21,7 @@ import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.ozone.common.BlockGroup;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OmMultipartUploadList;
@@ -98,8 +99,8 @@ public interface KeyManager extends OzoneManagerFS, IOzoneAcl 
{
    * @return a list of keys.
    * @throws IOException
    */
-  List<OmKeyInfo> listKeys(String volumeName,
-      String bucketName, String startKey, String keyPrefix, int maxKeys)
+  ListKeysResult listKeys(String volumeName, String bucketName, String 
startKey,
+                          String keyPrefix, int maxKeys)
       throws IOException;
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
index 918cb3ec56..33ea1f779b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
@@ -63,6 +63,7 @@ import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
 import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
@@ -556,7 +557,7 @@ public class KeyManagerImpl implements KeyManager {
   }
 
   @Override
-  public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
+  public ListKeysResult listKeys(String volumeName, String bucketName,
       String startKey, String keyPrefix,
       int maxKeys) throws IOException {
     Preconditions.checkNotNull(volumeName);
@@ -572,15 +573,17 @@ public class KeyManagerImpl implements KeyManager {
       keyPrefix = OmUtils.normalizeKey(keyPrefix, true);
     }
 
-    List<OmKeyInfo> keyList = metadataManager.listKeys(volumeName, bucketName,
-        startKey, keyPrefix, maxKeys);
+    ListKeysResult listKeysResult =
+        metadataManager.listKeys(volumeName, bucketName, startKey, keyPrefix,
+            maxKeys);
+    List<OmKeyInfo> keyList = listKeysResult.getKeys();
 
     // For listKeys, we return the latest Key Location by default
     for (OmKeyInfo omKeyInfo : keyList) {
       slimLocationVersion(omKeyInfo);
     }
 
-    return keyList;
+    return listKeysResult;
   }
 
   @Override
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index 512ff167b6..6f0fafcff2 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -60,6 +60,7 @@ import org.apache.hadoop.ozone.common.BlockGroup;
 import org.apache.hadoop.ozone.om.codec.TokenIdentifierCodec;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBAccessIdInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBUserPrincipalInfo;
@@ -1168,12 +1169,13 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
   }
 
   @Override
-  public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
-      String startKey, String keyPrefix, int maxKeys) throws IOException {
+  public ListKeysResult listKeys(String volumeName, String bucketName,
+                                 String startKey, String keyPrefix, int 
maxKeys)
+      throws IOException {
 
     List<OmKeyInfo> result = new ArrayList<>();
     if (maxKeys <= 0) {
-      return result;
+      return new ListKeysResult(result, false);
     }
 
     if (Strings.isNullOrEmpty(volumeName)) {
@@ -1268,6 +1270,8 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
       }
     }
 
+    boolean isTruncated = cacheKeyMap.size() > maxKeys;
+
     // Finally DB entries and cache entries are merged, then return the count
     // of maxKeys from the sorted map.
     currentCount = 0;
@@ -1288,7 +1292,7 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
     // Clear map and set.
     cacheKeyMap.clear();
 
-    return result;
+    return new ListKeysResult(result, isTruncated);
   }
 
   // TODO: HDDS-2419 - Complete stub below for core logic
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
index 72506d9821..467b23df52 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
@@ -30,6 +30,9 @@ import org.apache.hadoop.ozone.audit.AuditMessage;
 import org.apache.hadoop.ozone.audit.Auditor;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
@@ -43,6 +46,7 @@ import org.slf4j.Logger;
 import java.net.InetAddress;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static org.apache.hadoop.hdds.server.ServerUtils.getRemoteUserName;
 import static org.apache.hadoop.hdds.utils.HddsServerUtil.getRemoteUser;
@@ -305,7 +309,7 @@ public class OmMetadataReader implements IOmMetadataReader, 
Auditor {
   }
 
   @Override
-  public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
+  public ListKeysResult listKeys(String volumeName, String bucketName,
       String startKey, String keyPrefix, int maxKeys) throws IOException {
     long startNanos = Time.monotonicNowNanos();
     ResolvedBucket bucket = ozoneManager.resolveBucketLink(
@@ -340,6 +344,21 @@ public class OmMetadataReader implements 
IOmMetadataReader, Auditor {
     }
   }
 
+  @Override
+  public ListKeysLightResult listKeysLight(String volumeName,
+                                            String bucketName,
+                                            String startKey, String keyPrefix,
+                                            int maxKeys) throws IOException {
+    ListKeysResult listKeysResult =
+        listKeys(volumeName, bucketName, startKey, keyPrefix, maxKeys);
+    List<OmKeyInfo> keys = listKeysResult.getKeys();
+    List<BasicOmKeyInfo> basicKeysList =
+        keys.stream().map(BasicOmKeyInfo::fromOmKeyInfo)
+            .collect(Collectors.toList());
+
+    return new ListKeysLightResult(basicKeysList, 
listKeysResult.isTruncated());
+  }
+
   /**
    * Returns list of ACLs for given Ozone object.
    *
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshot.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshot.java
index 8fa9bc25f1..a8e3f5c5d3 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshot.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshot.java
@@ -23,6 +23,9 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.AuditLoggerType;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
@@ -133,12 +136,29 @@ public class OmSnapshot implements IOmMetadataReader, 
Closeable {
   }
 
   @Override
-  public List<OmKeyInfo> listKeys(String vname, String bname,
-      String startKey, String keyPrefix, int maxKeys) throws IOException {
-    List<OmKeyInfo> l = omMetadataReader.listKeys(vname, bname,
+  public ListKeysResult listKeys(String vname, String bname,
+                                 String startKey, String keyPrefix, int 
maxKeys)
+      throws IOException {
+    ListKeysResult listKeysResult = omMetadataReader.listKeys(vname, bname,
         normalizeKeyName(startKey), normalizeKeyName(keyPrefix), maxKeys);
-    return l.stream().map(this::denormalizeOmKeyInfo)
-        .collect(Collectors.toList());
+    return new ListKeysResult(
+        listKeysResult.getKeys().stream().map(this::denormalizeOmKeyInfo)
+            .collect(Collectors.toList()), listKeysResult.isTruncated());
+  }
+
+  @Override
+  public ListKeysLightResult listKeysLight(String volName,
+                                            String buckName,
+                                            String startKey, String keyPrefix,
+                                            int maxKeys) throws IOException {
+    ListKeysResult listKeysResult =
+        listKeys(volumeName, bucketName, startKey, keyPrefix, maxKeys);
+    List<OmKeyInfo> keys = listKeysResult.getKeys();
+    List<BasicOmKeyInfo> basicKeysList =
+        keys.stream().map(BasicOmKeyInfo::fromOmKeyInfo)
+            .collect(Collectors.toList());
+
+    return new ListKeysLightResult(basicKeysList, 
listKeysResult.isTruncated());
   }
 
   @Override
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 40b8e94c74..e627d97bc6 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -154,6 +154,9 @@ import org.apache.hadoop.ozone.om.helpers.OmDBAccessIdInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBUserPrincipalInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDBTenantState;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OmMultipartUploadList;
 import org.apache.hadoop.ozone.om.helpers.OmMultipartUploadListParts;
@@ -2835,15 +2838,31 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
    * {@inheritDoc}
    */
   @Override
-  public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
-      String startKey, String keyPrefix, int maxKeys) throws IOException {
+  public ListKeysResult listKeys(String volumeName, String bucketName,
+                                 String startKey, String keyPrefix, int 
maxKeys)
+      throws IOException {
     try (ReferenceCounted<IOmMetadataReader, SnapshotCache> rcReader =
-        getReader(volumeName, bucketName, keyPrefix)) {
+             getReader(volumeName, bucketName, keyPrefix)) {
       return rcReader.get().listKeys(
           volumeName, bucketName, startKey, keyPrefix, maxKeys);
     }
   }
 
+  @Override
+  public ListKeysLightResult listKeysLight(String volumeName,
+                                           String bucketName,
+                                           String startKey, String keyPrefix,
+                                           int maxKeys) throws IOException {
+    ListKeysResult listKeysResult =
+        listKeys(volumeName, bucketName, startKey, keyPrefix, maxKeys);
+    List<OmKeyInfo> keys = listKeysResult.getKeys();
+    List<BasicOmKeyInfo> basicKeysList =
+        keys.stream().map(BasicOmKeyInfo::fromOmKeyInfo)
+            .collect(Collectors.toList());
+
+    return new ListKeysLightResult(basicKeysList, 
listKeysResult.isTruncated());
+  }
+
   @Override
   public List<RepeatedOmKeyInfo> listTrash(String volumeName,
       String bucketName, String startKeyName, String keyPrefix, int maxKeys)
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
index 08ba705495..080f48cfcc 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
@@ -42,6 +42,9 @@ import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.OzoneManagerPrepareState;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.BasicOmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.ListKeysLightResult;
+import org.apache.hadoop.ozone.om.helpers.ListKeysResult;
 import org.apache.hadoop.ozone.om.helpers.DBUpdates;
 import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
@@ -98,6 +101,7 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListBuc
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListBucketsResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysResponse;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListKeysLightResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListTenantRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListTenantResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ListTrashRequest;
@@ -216,6 +220,11 @@ public class OzoneManagerRequestHandler implements 
RequestHandler {
             request.getListKeysRequest(), request.getVersion());
         responseBuilder.setListKeysResponse(listKeysResponse);
         break;
+      case ListKeysLight:
+        ListKeysLightResponse listKeysLightResponse = listKeysLight(
+            request.getListKeysRequest());
+        responseBuilder.setListKeysLightResponse(listKeysLightResponse);
+        break;
       case ListTrash:
         ListTrashResponse listTrashResponse = listTrash(
             request.getListTrashRequest(), request.getVersion());
@@ -671,16 +680,34 @@ public class OzoneManagerRequestHandler implements 
RequestHandler {
     ListKeysResponse.Builder resp =
         ListKeysResponse.newBuilder();
 
-    List<OmKeyInfo> keys = impl.listKeys(
+    ListKeysResult listKeysResult = impl.listKeys(
         request.getVolumeName(),
         request.getBucketName(),
         request.getStartKey(),
         request.getPrefix(),
         request.getCount());
-    for (OmKeyInfo key : keys) {
+    for (OmKeyInfo key : listKeysResult.getKeys()) {
       resp.addKeyInfo(key.getProtobuf(true, clientVersion));
     }
+    resp.setIsTruncated(listKeysResult.isTruncated());
+    return resp.build();
+  }
 
+  private ListKeysLightResponse listKeysLight(ListKeysRequest request)
+      throws IOException {
+    ListKeysLightResponse.Builder resp =
+        ListKeysLightResponse.newBuilder();
+
+    ListKeysLightResult listKeysLightResult = impl.listKeysLight(
+        request.getVolumeName(),
+        request.getBucketName(),
+        request.getStartKey(),
+        request.getPrefix(),
+        request.getCount());
+    for (BasicOmKeyInfo key : listKeysLightResult.getKeys()) {
+      resp.addBasicKeyInfo(key.getProtobuf());
+    }
+    resp.setIsTruncated(listKeysLightResult.isTruncated());
     return resp.build();
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
index c2a334e20b..34bd721602 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
@@ -390,7 +390,7 @@ public class TestOmMetadataManager {
     // List all keys which have prefix "key-a"
     List<OmKeyInfo> omKeyInfoList =
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-            null, prefixKeyA, 100);
+            null, prefixKeyA, 100).getKeys();
 
     assertEquals(omKeyInfoList.size(),  50);
 
@@ -403,7 +403,7 @@ public class TestOmMetadataManager {
     String startKey = prefixKeyA + 10;
     omKeyInfoList =
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-            startKey, prefixKeyA, 100);
+            startKey, prefixKeyA, 100).getKeys();
 
     assertEquals(keysASet.tailSet(
         startKey).size() - 1, omKeyInfoList.size());
@@ -411,7 +411,7 @@ public class TestOmMetadataManager {
     startKey = prefixKeyA + 38;
     omKeyInfoList =
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-            startKey, prefixKeyA, 100);
+            startKey, prefixKeyA, 100).getKeys();
 
     assertEquals(keysASet.tailSet(
         startKey).size() - 1, omKeyInfoList.size());
@@ -426,7 +426,7 @@ public class TestOmMetadataManager {
 
 
     omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
-        null, prefixKeyB, 100);
+        null, prefixKeyB, 100).getKeys();
 
     assertEquals(omKeyInfoList.size(),  50);
 
@@ -442,7 +442,7 @@ public class TestOmMetadataManager {
     for (int i = 0; i < 5; i++) {
 
       omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
-          startKey, prefixKeyB, 10);
+          startKey, prefixKeyB, 10).getKeys();
 
       assertEquals(10, omKeyInfoList.size());
 
@@ -460,13 +460,13 @@ public class TestOmMetadataManager {
     // As now we have iterated all 50 buckets, calling next time should
     // return empty list.
     omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
-        startKey, prefixKeyB, 10);
+        startKey, prefixKeyB, 10).getKeys();
 
     assertEquals(omKeyInfoList.size(), 0);
 
     // List all keys with empty prefix
     omKeyInfoList = omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-        null, null, 100);
+        null, null, 100).getKeys();
     assertEquals(50, omKeyInfoList.size());
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
       assertTrue(omKeyInfo.getKeyName().startsWith(
@@ -509,7 +509,7 @@ public class TestOmMetadataManager {
     // Now list keys which match with prefixKeyA.
     List<OmKeyInfo> omKeyInfoList =
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-            null, prefixKeyA, 100);
+            null, prefixKeyA, 100).getKeys();
 
     // As in total 100, 50 are marked for delete. It should list only 50 keys.
     assertEquals(50, omKeyInfoList.size());
@@ -530,7 +530,7 @@ public class TestOmMetadataManager {
     for (int i = 0; i < 5; i++) {
 
       omKeyInfoList = omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-          startKey, prefixKeyA, 10);
+          startKey, prefixKeyA, 10).getKeys();
 
       System.out.println(i);
       assertEquals(10, omKeyInfoList.size());
@@ -549,7 +549,7 @@ public class TestOmMetadataManager {
     // As now we have iterated all 50 buckets, calling next time should
     // return empty list.
     omKeyInfoList = omMetadataManager.listKeys(volumeNameA, ozoneBucket,
-        startKey, prefixKeyA, 10);
+        startKey, prefixKeyA, 10).getKeys();
 
     assertEquals(omKeyInfoList.size(), 0);
 
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
index a8c126f43b..7a17c70ef7 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
@@ -482,7 +482,7 @@ public class TestSstFilteringService {
     String startKey = null;
     while (true) {
       List<OmKeyInfo> omKeyInfoList = omMetadataReader.listKeys(volume, bucket,
-          startKey, null, 1000);
+          startKey, null, 1000).getKeys();
       if (omKeyInfoList.isEmpty()) {
         break;
       }
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/OmMetadataGenerator.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/OmMetadataGenerator.java
index 6ce460563f..106bf9d2ec 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/OmMetadataGenerator.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/OmMetadataGenerator.java
@@ -396,8 +396,9 @@ public class OmMetadataGenerator extends BaseFreonGenerator
       threadSeqId = getThreadSequenceId();
       startKeyName = getPath(threadSeqId * batchSize);
       getMetrics().timer(operation.name()).time(() -> {
-        List<OmKeyInfo> keyInfoList = ozoneManagerClient.listKeys(
-            volumeName, bucketName, startKeyName, "", batchSize);
+        List<OmKeyInfo> keyInfoList =
+            ozoneManagerClient.listKeys(volumeName, bucketName, startKeyName,
+                "", batchSize).getKeys();
         if (keyInfoList.size() + 1 < batchSize) {
           throw new NoSuchFileException(
               "There are not enough files for testing you should use "


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to