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

hemant 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 f4a3b0e64c HDDS-8165. Implemented snapshot info API and handler (#5578)
f4a3b0e64c is described below

commit f4a3b0e64c0cb3f2debaded68dcc0b7573602837
Author: Hemant Kumar <[email protected]>
AuthorDate: Tue Nov 14 10:05:51 2023 -0800

    HDDS-8165. Implemented snapshot info API and handler (#5578)
---
 .../apache/hadoop/ozone/client/ObjectStore.java    | 14 ++++++
 .../ozone/client/protocol/ClientProtocol.java      | 12 ++++++
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  | 23 ++++++++++
 .../main/java/org/apache/hadoop/ozone/OmUtils.java |  1 +
 .../ozone/om/protocol/OzoneManagerProtocol.java    | 15 +++++++
 ...OzoneManagerProtocolClientSideTranslatorPB.java | 22 ++++++++++
 .../org/apache/hadoop/ozone/om/TestOmSnapshot.java | 50 ++++++++++++++++++++++
 .../src/main/proto/OmClientProtocol.proto          | 13 ++++++
 .../apache/hadoop/ozone/om/OMMetadataManager.java  | 11 +++++
 .../org/apache/hadoop/ozone/audit/OMAction.java    |  1 +
 .../java/org/apache/hadoop/ozone/om/OMMetrics.java |  9 ++++
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     | 21 +++++++++
 .../org/apache/hadoop/ozone/om/OzoneManager.java   | 25 +++++++++++
 .../protocolPB/OzoneManagerRequestHandler.java     | 16 +++++++
 .../hadoop/ozone/client/ClientProtocolStub.java    |  6 +++
 .../shell/snapshot/DeleteSnapshotHandler.java      |  2 +-
 ...apshotHandler.java => InfoSnapshotHandler.java} | 33 +++++++-------
 .../ozone/shell/snapshot/SnapshotCommands.java     |  3 +-
 18 files changed, 260 insertions(+), 17 deletions(-)

diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
index cceb8a9040..481bdbbd5c 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
@@ -577,6 +577,20 @@ public class ObjectStore {
     proxy.deleteSnapshot(volumeName, bucketName, snapshotName);
   }
 
+  /**
+   * Returns snapshot info for volume/bucket snapshot path.
+   * @param volumeName volume name
+   * @param bucketName bucket name
+   * @param snapshotName snapshot name
+   * @return snapshot info for volume/bucket snapshot path.
+   * @throws IOException
+   */
+  public OzoneSnapshot getSnapshotInfo(String volumeName,
+                                       String bucketName,
+                                       String snapshotName) throws IOException 
{
+    return proxy.getSnapshotInfo(volumeName, bucketName, snapshotName);
+  }
+
   /**
    * List snapshots in a volume/bucket.
    * @param volumeName     volume name
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
index bc01d6653b..2503f174e6 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
@@ -1072,6 +1072,18 @@ public interface ClientProtocol {
   void deleteSnapshot(String volumeName,
       String bucketName, String snapshotName) throws IOException;
 
+  /**
+   * Returns snapshot info for volume/bucket snapshot path.
+   * @param volumeName volume name
+   * @param bucketName bucket name
+   * @param snapshotName snapshot name
+   * @return snapshot info for volume/bucket snapshot path.
+   * @throws IOException
+   */
+  OzoneSnapshot getSnapshotInfo(String volumeName,
+                                String bucketName,
+                                String snapshotName) throws IOException;
+
   /**
    * Create an image of the current compaction log DAG in the OM.
    * @param fileNamePrefix  file name prefix of the image file.
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 5d70bdfb86..7bc92e63b9 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
@@ -120,6 +120,7 @@ import org.apache.hadoop.ozone.om.helpers.S3SecretValue;
 import org.apache.hadoop.ozone.om.helpers.S3VolumeContext;
 import org.apache.hadoop.ozone.om.helpers.ServiceInfo;
 import org.apache.hadoop.ozone.om.helpers.ServiceInfoEx;
+import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
 import org.apache.hadoop.ozone.om.helpers.TenantStateList;
 import org.apache.hadoop.ozone.om.helpers.TenantUserInfoValue;
 import org.apache.hadoop.ozone.om.helpers.TenantUserList;
@@ -991,6 +992,28 @@ public class RpcClient implements ClientProtocol {
     ozoneManagerClient.deleteSnapshot(volumeName, bucketName, snapshotName);
   }
 
+  /**
+   * Returns snapshot info for volume/bucket snapshot path.
+   * @param volumeName volume name
+   * @param bucketName bucket name
+   * @param snapshotName snapshot name
+   * @return snapshot info for volume/bucket snapshot path.
+   * @throws IOException
+   */
+  public OzoneSnapshot getSnapshotInfo(String volumeName,
+                                       String bucketName,
+                                       String snapshotName) throws IOException 
{
+    Preconditions.checkArgument(StringUtils.isNotBlank(volumeName),
+        "volume can't be null or empty.");
+    Preconditions.checkArgument(StringUtils.isNotBlank(bucketName),
+        "bucket can't be null or empty.");
+    Preconditions.checkArgument(StringUtils.isNotBlank(snapshotName),
+        "snapshot name can't be null or empty.");
+    SnapshotInfo snapshotInfo = ozoneManagerClient.getSnapshotInfo(volumeName,
+        bucketName, snapshotName);
+    return OzoneSnapshot.fromSnapshotInfo(snapshotInfo);
+  }
+
   /**
    * Create an image of the current compaction log DAG in the OM.
    * @param fileNamePrefix  file name prefix of the image file.
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 c7cb996fdc..f5cddf6669 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
@@ -272,6 +272,7 @@ public final class OmUtils {
     case TransferLeadership:
     case SetSafeMode:
     case PrintCompactionLogDag:
+    case GetSnapshotInfo:
       return true;
     case CreateVolume:
     case SetVolumeProperty:
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
index 7d710ae871..ad394bf4d1 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
@@ -694,6 +694,21 @@ public interface OzoneManagerProtocol
         "this to be implemented");
   }
 
+  /**
+   * Returns snapshot info for volume/bucket snapshot path.
+   * @param volumeName volume name
+   * @param bucketName bucket name
+   * @param snapshotName snapshot name
+   * @return snapshot info for volume/bucket snapshot path.
+   * @throws IOException
+   */
+  default SnapshotInfo getSnapshotInfo(String volumeName,
+                                       String bucketName,
+                                       String snapshotName) throws IOException 
{
+    throw new UnsupportedOperationException("OzoneManager does not require " +
+        "this to be implemented");
+  }
+
   /**
    * Create an image of the current compaction log DAG in the OM.
    * @param fileNamePrefix  file name prefix of the image file.
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 9daa39db20..a179ca5c40 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
@@ -121,6 +121,7 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetS3Se
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetS3SecretResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetS3VolumeContextRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetS3VolumeContextResponse;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotInfoRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.InfoBucketRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.InfoBucketResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.InfoVolumeRequest;
@@ -1239,6 +1240,27 @@ public final class 
OzoneManagerProtocolClientSideTranslatorPB
     handleError(omResponse);
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public SnapshotInfo getSnapshotInfo(String volumeName, String bucketName,
+                                      String snapshotName) throws IOException {
+    final SnapshotInfoRequest.Builder requestBuilder =
+        SnapshotInfoRequest.newBuilder()
+            .setVolumeName(volumeName)
+            .setBucketName(bucketName)
+            .setSnapshotName(snapshotName);
+
+    final OMRequest omRequest = createOMRequest(Type.GetSnapshotInfo)
+        .setSnapshotInfoRequest(requestBuilder)
+        .build();
+    final OMResponse omResponse = submitRequest(omRequest);
+    handleError(omResponse);
+    return SnapshotInfo.getFromProtobuf(omResponse.getSnapshotInfoResponse()
+        .getSnapshotInfo());
+  }
+
   /**
    * {@inheritDoc}
    */
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
index 8d33ab999a..97cbec94bd 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
@@ -52,6 +52,7 @@ import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneKey;
 import org.apache.hadoop.ozone.client.OzoneKeyDetails;
+import org.apache.hadoop.ozone.client.OzoneSnapshot;
 import org.apache.hadoop.ozone.client.OzoneVolume;
 import org.apache.hadoop.ozone.client.io.OzoneInputStream;
 import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
@@ -1301,6 +1302,55 @@ public class TestOmSnapshot {
     volume.deleteBucket(bucket2);
   }
 
+  @Test
+  public void testGetSnapshotInfo() throws Exception {
+    String volume = "vol-" + counter.incrementAndGet();
+    String bucket = "buck-" + counter.incrementAndGet();
+    store.createVolume(volume);
+    OzoneVolume volume1 = store.getVolume(volume);
+    volume1.createBucket(bucket);
+    OzoneBucket bucket1 = volume1.getBucket(bucket);
+
+    createFileKey(bucket1, "key-1");
+    String snap1 = "snap-" + counter.incrementAndGet();
+    createSnapshot(volume, bucket, snap1);
+
+    createFileKey(bucket1, "key-2");
+    String snap2 = "snap-" + counter.incrementAndGet();
+    createSnapshot(volume, bucket, snap2);
+
+    OzoneSnapshot snapshot1 = store.getSnapshotInfo(volume, bucket, snap1);
+
+    Assertions.assertEquals(snap1, snapshot1.getName());
+    Assertions.assertEquals(volume, snapshot1.getVolumeName());
+    Assertions.assertEquals(bucket, snapshot1.getBucketName());
+
+    OzoneSnapshot snapshot2 = store.getSnapshotInfo(volume, bucket, snap2);
+    Assertions.assertEquals(snap2, snapshot2.getName());
+    Assertions.assertEquals(volume, snapshot2.getVolumeName());
+    Assertions.assertEquals(bucket, snapshot2.getBucketName());
+
+    testGetSnapshotInfoFailure(null, bucket, "snapshotName",
+        "volume can't be null or empty.");
+    testGetSnapshotInfoFailure(volume, null, "snapshotName",
+        "bucket can't be null or empty.");
+    testGetSnapshotInfoFailure(volume, bucket, null,
+        "snapshot name can't be null or empty.");
+    testGetSnapshotInfoFailure(volume, bucket, "snapshotName",
+        "Snapshot '/" + volume + "/" + bucket + "/snapshotName' is not 
found.");
+    testGetSnapshotInfoFailure(volume, "bucketName", "snapshotName",
+        "Snapshot '/" + volume + "/bucketName/snapshotName' is not found.");
+  }
+
+  public void testGetSnapshotInfoFailure(String volName,
+                                         String buckName,
+                                         String snapName,
+                                         String expectedMessage) {
+    Exception ioException = Assertions.assertThrows(Exception.class,
+        () -> store.getSnapshotInfo(volName, buckName, snapName));
+    Assertions.assertEquals(expectedMessage, ioException.getMessage());
+  }
+
   @Test
   public void testSnapDiffWithDirRename() throws Exception {
     Assume.assumeTrue(bucketLayout.isFileSystemOptimized());
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index e460474316..fc6ef0f191 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -145,6 +145,7 @@ enum Type {
   AbortExpiredMultiPartUploads = 127;
   SetSnapshotProperty = 128;
   ListStatusLight = 129;
+  GetSnapshotInfo = 130;
 }
 
 enum SafeMode {
@@ -279,6 +280,7 @@ message OMRequest {
 
   optional MultipartUploadsExpiredAbortRequest 
multipartUploadsExpiredAbortRequest = 126;
   optional SetSnapshotPropertyRequest       SetSnapshotPropertyRequest     = 
127;
+  optional SnapshotInfoRequest              SnapshotInfoRequest            = 
128;
 }
 
 message OMResponse {
@@ -399,6 +401,7 @@ message OMResponse {
   optional MultipartUploadsExpiredAbortResponse 
multipartUploadsExpiredAbortResponse = 127;
   optional SetSnapshotPropertyResponse       SetSnapshotPropertyResponse   = 
128;
   optional ListStatusLightResponse           listStatusLightResponse       = 
129;
+  optional SnapshotInfoResponse              SnapshotInfoResponse          = 
130;
 }
 
 enum Status {
@@ -1859,6 +1862,12 @@ message DeleteSnapshotRequest {
   optional uint64 deletionTime = 4;
 }
 
+message SnapshotInfoRequest {
+  optional string volumeName = 1;
+  optional string bucketName = 2;
+  optional string snapshotName = 3;
+}
+
 message PrintCompactionLogDagRequest {
   optional string fileNamePrefix = 1;
   optional string graphType = 2;
@@ -1965,6 +1974,10 @@ message DeleteSnapshotResponse {
 
 }
 
+message SnapshotInfoResponse {
+  optional SnapshotInfo snapshotInfo = 1;
+}
+
 message PrintCompactionLogDagResponse {
   optional string message = 1;
 }
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 6ce7e31764..68c5cf758e 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
@@ -227,6 +227,17 @@ public interface OMMetadataManager extends 
DBStoreHAManager {
   List<RepeatedOmKeyInfo> listTrash(String volumeName, String bucketName,
       String startKeyName, String keyPrefix, int maxKeys) throws IOException;
 
+  /**
+   * Returns snapshot info for volume/bucket snapshot path.
+   * @param volumeName volume name
+   * @param bucketName bucket name
+   * @param snapshotName snapshot name
+   * @return snapshot info for volume/bucket snapshot path.
+   * @throws IOException
+   */
+  SnapshotInfo getSnapshotInfo(String volumeName, String bucketName,
+                               String snapshotName) throws IOException;
+
   /**
    * List snapshots in a volume/bucket.
    * @param volumeName     volume name
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java
index ed37313f1c..4e9039252f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java
@@ -99,6 +99,7 @@ public enum OMAction implements AuditAction {
   LIST_SNAPSHOT,
   DELETE_SNAPSHOT,
   SNAPSHOT_MOVE_DELETED_KEYS,
+  SNAPSHOT_INFO,
   SET_TIMES,
 
   ABORT_EXPIRED_MULTIPART_UPLOAD;
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
index ccb0fae6fb..ed5efbefe5 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
@@ -73,6 +73,7 @@ public class OMMetrics implements OmMetadataReaderMetrics {
   private @Metric MutableCounterLong numSnapshotDeletes;
   private @Metric MutableCounterLong numSnapshotLists;
   private @Metric MutableCounterLong numSnapshotDiffJobs;
+  private @Metric MutableCounterLong numSnapshotInfos;
 
   private @Metric MutableCounterLong numGetFileStatus;
   private @Metric MutableCounterLong numCreateDirectory;
@@ -134,6 +135,7 @@ public class OMMetrics implements OmMetadataReaderMetrics {
   private @Metric MutableCounterLong numSnapshotDeleteFails;
   private @Metric MutableCounterLong numSnapshotListFails;
   private @Metric MutableCounterLong numSnapshotDiffJobFails;
+  private @Metric MutableCounterLong numSnapshotInfoFails;
 
   private @Metric MutableCounterLong numSnapshotActive;
   private @Metric MutableCounterLong numSnapshotDeleted;
@@ -473,6 +475,10 @@ public class OMMetrics implements OmMetadataReaderMetrics {
     numSnapshotLists.incr();
   }
 
+  public void incNumSnapshotInfos() {
+    numSnapshotInfos.incr();
+  }
+
   public void incNumSnapshotDiffJobs() {
     numSnapshotDiffJobs.incr();
   }
@@ -485,6 +491,9 @@ public class OMMetrics implements OmMetadataReaderMetrics {
     numSnapshotDiffJobFails.incr();
   }
 
+  public void incNumSnapshotInfoFails() {
+    numSnapshotInfoFails.incr();
+  }
   public void setNumSnapshotActive(long num) {
     long currVal = numSnapshotActive.value();
     numSnapshotActive.incr(num - currVal);
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 950a17829b..6685e9a2ec 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
@@ -87,6 +87,7 @@ import 
org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolClientSideTrans
 import org.apache.hadoop.ozone.om.request.util.OMMultipartUploadUtils;
 import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted;
 import org.apache.hadoop.ozone.om.snapshot.SnapshotCache;
+import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ExpiredMultipartUploadInfo;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ExpiredMultipartUploadsBucket;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
@@ -107,6 +108,7 @@ import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_DIR_CREATION_POLL_TIMEOUT_DEFAULT;
 import static org.apache.hadoop.ozone.om.OmSnapshotManager.getSnapshotPrefix;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND;
+import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_CHECKPOINT_DIR;
 import static 
org.apache.hadoop.ozone.om.service.SnapshotDeletingService.isBlockLocationInfoSame;
@@ -1308,6 +1310,25 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
     return deletedKeys;
   }
 
+  @Override
+  public SnapshotInfo getSnapshotInfo(String volumeName, String bucketName,
+                                      String snapshotName) throws IOException {
+    if (Strings.isNullOrEmpty(volumeName)) {
+      throw new OMException("Volume name is required.", VOLUME_NOT_FOUND);
+    }
+
+    if (Strings.isNullOrEmpty(bucketName)) {
+      throw new OMException("Bucket name is required.", BUCKET_NOT_FOUND);
+    }
+
+    if (Strings.isNullOrEmpty(snapshotName)) {
+      throw new OMException("Snapshot name is required.", FILE_NOT_FOUND);
+    }
+
+    return SnapshotUtils.getSnapshotInfo(ozoneManager, volumeName, bucketName,
+        snapshotName);
+  }
+
   @Override
   public List<SnapshotInfo> listSnapshot(
       String volumeName, String bucketName, String snapshotPrefix,
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 043ca7d32c..387b06f9be 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
@@ -2941,6 +2941,31 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
     }
   }
 
+  @Override
+  public SnapshotInfo getSnapshotInfo(String volumeName, String bucketName,
+                                      String snapshotName) throws IOException {
+    metrics.incNumSnapshotInfos();
+    Map<String, String> auditMap = buildAuditMap(volumeName);
+    auditMap.put(OzoneConsts.BUCKET, bucketName);
+    try {
+      if (isAclEnabled) {
+        omMetadataReader.checkAcls(ResourceType.BUCKET, StoreType.OZONE,
+            ACLType.READ, volumeName, bucketName, null);
+      }
+      SnapshotInfo snapshotInfo =
+          metadataManager.getSnapshotInfo(volumeName, bucketName, 
snapshotName);
+
+      AUDIT.logReadSuccess(buildAuditMessageForSuccess(
+          OMAction.SNAPSHOT_INFO, auditMap));
+      return snapshotInfo;
+    } catch (Exception ex) {
+      metrics.incNumSnapshotInfoFails();
+      AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.SNAPSHOT_INFO,
+          auditMap, ex));
+      throw ex;
+    }
+  }
+
   @Override
   public List<SnapshotInfo> listSnapshot(
       String volumeName, String bucketName, String snapshotPrefix,
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 0e80632bd7..1295ca6e55 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
@@ -364,6 +364,11 @@ public class OzoneManagerRequestHandler implements 
RequestHandler {
         responseBuilder
             .setPrintCompactionLogDagResponse(printCompactionLogDagResponse);
         break;
+      case GetSnapshotInfo:
+        OzoneManagerProtocolProtos.SnapshotInfoResponse snapshotInfoResponse =
+            getSnapshotInfo(request.getSnapshotInfoRequest());
+        responseBuilder.setSnapshotInfoResponse(snapshotInfoResponse);
+        break;
       default:
         responseBuilder.setSuccess(false);
         responseBuilder.setMessage("Unrecognized Command Type: " + cmdType);
@@ -1413,6 +1418,17 @@ public class OzoneManagerRequestHandler implements 
RequestHandler {
     return builder.build();
   }
 
+  @DisallowedUntilLayoutVersion(FILESYSTEM_SNAPSHOT)
+  private OzoneManagerProtocolProtos.SnapshotInfoResponse getSnapshotInfo(
+      OzoneManagerProtocolProtos.SnapshotInfoRequest request)
+      throws IOException {
+    SnapshotInfo snapshotInfo = impl.getSnapshotInfo(request.getVolumeName(),
+        request.getBucketName(), request.getSnapshotName());
+
+    return OzoneManagerProtocolProtos.SnapshotInfoResponse.newBuilder()
+        .setSnapshotInfo(snapshotInfo.getProtobuf()).build();
+  }
+
   @DisallowedUntilLayoutVersion(FILESYSTEM_SNAPSHOT)
   private OzoneManagerProtocolProtos.ListSnapshotResponse getSnapshots(
       OzoneManagerProtocolProtos.ListSnapshotRequest request)
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
index 71f4784350..44698a3649 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
@@ -648,6 +648,12 @@ public class ClientProtocolStub implements ClientProtocol {
 
   }
 
+  @Override
+  public OzoneSnapshot getSnapshotInfo(String volumeName, String bucketName,
+                                       String snapshotName) throws IOException 
{
+    return null;
+  }
+
   public String printCompactionLogDag(String fileNamePrefix,
                                       String graphType) throws IOException {
     return null;
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
index 86faac229f..8fc32fb9e6 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
@@ -26,7 +26,7 @@ import picocli.CommandLine;
 import java.io.IOException;
 
 /**
- * ozone snapshot delete.
+ * ozone sh snapshot delete.
  */
 @CommandLine.Command(name = "delete",
     description = "Delete a snapshot")
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/InfoSnapshotHandler.java
similarity index 58%
copy from 
hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
copy to 
hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/InfoSnapshotHandler.java
index 86faac229f..ef75e2c84d 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/DeleteSnapshotHandler.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/InfoSnapshotHandler.java
@@ -5,19 +5,21 @@
  * 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
+ * with the License.  You may obtain a copy of the License at
  *
- *      http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- *  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.
+ * 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.shell.snapshot;
 
 import org.apache.hadoop.ozone.client.OzoneClient;
+import org.apache.hadoop.ozone.client.OzoneSnapshot;
 import org.apache.hadoop.ozone.shell.Handler;
 import org.apache.hadoop.ozone.shell.OzoneAddress;
 import org.apache.hadoop.ozone.shell.bucket.BucketUri;
@@ -26,11 +28,11 @@ import picocli.CommandLine;
 import java.io.IOException;
 
 /**
- * ozone snapshot delete.
+ * ozone sh snapshot info.
  */
[email protected](name = "delete",
-    description = "Delete a snapshot")
-public class DeleteSnapshotHandler extends Handler {
[email protected](name = "info",
+    description = "returns information about an existing snapshot")
+public class InfoSnapshotHandler extends Handler {
 
   @CommandLine.Mixin
   private BucketUri snapshotPath;
@@ -47,15 +49,16 @@ public class DeleteSnapshotHandler extends Handler {
   @Override
   protected void execute(OzoneClient client, OzoneAddress address)
       throws IOException {
-
     String volumeName = snapshotPath.getValue().getVolumeName();
     String bucketName = snapshotPath.getValue().getBucketName();
 
-    client.getObjectStore()
-        .deleteSnapshot(volumeName, bucketName, snapshotName);
+    OzoneSnapshot ozoneSnapshot = client.getObjectStore()
+        .getSnapshotInfo(volumeName, bucketName, snapshotName);
+
     if (isVerbose()) {
-      out().format("Deleted snapshot '%s' under '%s/%s'.%n",
+      err().printf("Snapshot info for snapshot: %d under o3://%s/ %s ",
           snapshotName, volumeName, bucketName);
     }
+    printObjectAsJson(ozoneSnapshot);
   }
 }
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/SnapshotCommands.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/SnapshotCommands.java
index 0b3daab6a3..cf513b9e91 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/SnapshotCommands.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/SnapshotCommands.java
@@ -42,7 +42,8 @@ import picocli.CommandLine.ParentCommand;
         DeleteSnapshotHandler.class,
         ListSnapshotHandler.class,
         SnapshotDiffHandler.class,
-        ListSnapshotDiffHandler.class
+        ListSnapshotDiffHandler.class,
+        InfoSnapshotHandler.class
     },
     mixinStandardHelpOptions = true,
     versionProvider = HddsVersionProvider.class)


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

Reply via email to