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]