From 29f71c10a7e3321eb94831f6b102c8f539a11e6a Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Mon, 12 Dec 2022 10:38:23 +0800 Subject: [PATCH 1/9] HDDS-7507. [Snapshot] Implement List Snapshot API Pagination --- .../hadoop/ozone/client/ObjectStore.java | 79 +++++++++++++++++-- .../ozone/client/protocol/ClientProtocol.java | 12 ++- .../hadoop/ozone/client/rpc/RpcClient.java | 15 ++-- .../om/protocol/OzoneManagerProtocol.java | 12 ++- ...ManagerProtocolClientSideTranslatorPB.java | 16 +++- .../smoketest/basic/ozone-shell-lib.robot | 5 ++ .../src/main/proto/OmClientProtocol.proto | 3 + .../hadoop/ozone/om/OMMetadataManager.java | 12 ++- .../ozone/om/OmMetadataManagerImpl.java | 58 +++++++++++--- .../apache/hadoop/ozone/om/OzoneManager.java | 8 +- .../OzoneManagerRequestHandler.java | 3 +- .../ozone/om/TestOmMetadataManager.java | 54 +++++++++++-- .../ozone/client/ClientProtocolStub.java | 5 +- .../shell/snapshot/ListSnapshotHandler.java | 9 +-- 14 files changed, 233 insertions(+), 58 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 cc267d696a58..4a569adbb08b 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 @@ -552,14 +552,81 @@ public String createSnapshot(String volumeName, /** * List snapshots in a volume/bucket. - * @param volumeName volume name - * @param bucketName bucket name - * @return list of snapshots for volume/bucket snapshotpath. + * @param volumeName volume name + * @param bucketName bucket name + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot snapshots will be listed after this snapshot name * @throws IOException */ - public List listSnapshot(String volumeName, String bucketName) - throws IOException { - return proxy.listSnapshot(volumeName, bucketName); + public Iterator listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot) throws IOException { + return new SnapshotIterator( + volumeName, bucketName, snapshotPrefix, prevSnapshot); + } + + /** + * An Iterator to iterate over {@link OzoneSnapshot} list. + */ + private class SnapshotIterator implements Iterator { + + private String volumeName = null; + private String bucketName = null; + private String snapshotPrefix = null; + + private Iterator currentIterator; + private OzoneSnapshot currentValue; + + /** + * Creates an Iterator to iterate over all snapshots after + * prevSnapshot of specified bucket. If prevSnapshot is null it iterates + * from the first snapshot. The returned snapshots match snapshot prefix. + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot snapshots will be listed after this snapshot name + */ + SnapshotIterator(String volumeName, String bucketName, + String snapshotPrefix, String prevSnapshot) { + this.volumeName = volumeName; + this.bucketName = bucketName; + this.snapshotPrefix = snapshotPrefix; + this.currentValue = null; + this.currentIterator = getNextListOfSnapshots(prevSnapshot).iterator(); + } + + @Override + public boolean hasNext() { + // IMPORTANT: Without this logic, remote iteration will not work. + // Removing this will break the listSnapshot call if we try to + // list more than 1000 (ozone.client.list.cache ) snapshots. + if (!currentIterator.hasNext() && currentValue != null) { + currentIterator = getNextListOfSnapshots(currentValue.getName()) + .iterator(); + } + return currentIterator.hasNext(); + } + + @Override + public OzoneSnapshot next() { + if (hasNext()) { + currentValue = currentIterator.next(); + return currentValue; + } + throw new NoSuchElementException(); + } + + /** + * Returns the next set of snapshot list using proxy. + * @param prevSnapshot previous snapshot, this will be excluded from result + * @return {@code List} + */ + private List getNextListOfSnapshots(String prevSnapshot) { + try { + return proxy.listSnapshot(volumeName, bucketName, snapshotPrefix, + prevSnapshot, listCacheSize); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } public SnapshotDiffReport snapshotDiff(String volumeName, String bucketName, String fromSnapshot, String toSnapshot) 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 9ecf071b55e8..58f0b0210fac 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 @@ -973,13 +973,17 @@ String createSnapshot(String volumeName, /** * List snapshots in a volume/bucket. - * @param volumeName volume name - * @param bucketName bucket name + * @param volumeName volume name + * @param bucketName bucket name + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot start of the list, this snapshot is excluded + * @param maxListResult max numbet of snapshots to return * @return list of snapshots for volume/bucket snapshotpath. * @throws IOException */ - List listSnapshot(String volumeName, String bucketName) - throws IOException; + List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException; /** 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 f42bdfe71138..be1f440bc0a4 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 @@ -947,19 +947,24 @@ public SnapshotDiffReport snapshotDiff(String volumeName, String bucketName, /** * List snapshots in a volume/bucket. - * @param volumeName volume name - * @param bucketName bucket name + * @param volumeName volume name + * @param bucketName bucket name + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot start of the list, this snapshot is excluded + * @param maxListResult max numbet of snapshots to return * @return list of snapshots for volume/bucket snapshotpath. * @throws IOException */ @Override - public List listSnapshot(String volumeName, String bucketName) - throws IOException { + public List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { Preconditions.checkArgument(Strings.isNotBlank(volumeName), "volume can't be null or empty."); Preconditions.checkArgument(Strings.isNotBlank(bucketName), "bucket can't be null or empty."); - return ozoneManagerClient.listSnapshot(volumeName, bucketName).stream() + return ozoneManagerClient.listSnapshot(volumeName, bucketName, + snapshotPrefix, prevSnapshot, maxListResult).stream() .map(snapshotInfo -> OzoneSnapshot.fromSnapshotInfo(snapshotInfo)) .collect(Collectors.toList()); } 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 948a302c2963..ab124242ebb8 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 @@ -625,13 +625,17 @@ default String createSnapshot(String volumeName, /** * List snapshots in a volume/bucket. - * @param volumeName volume name - * @param bucketName bucket name + * @param volumeName volume name + * @param bucketName bucket name + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot start of the list, this snapshot is excluded + * @param maxListResult max numbet of snapshots to return * @return list of snapshots for volume/bucket snapshotpath. * @throws IOException */ - default List listSnapshot(String volumeName, String bucketName) - throws IOException { + default List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { throw new UnsupportedOperationException("OzoneManager does not require " + "this to be implemented"); } 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 e0ce9d6dceb0..8c3d7b7df0b0 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 @@ -1118,13 +1118,23 @@ public String createSnapshot(String volumeName, } @Override - public List listSnapshot(String volumeName, String bucketName) - throws IOException { + public List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { final OzoneManagerProtocolProtos.ListSnapshotRequest.Builder requestBuilder = OzoneManagerProtocolProtos.ListSnapshotRequest.newBuilder() .setVolumeName(volumeName) - .setBucketName(bucketName); + .setBucketName(bucketName) + .setMaxListResult(maxListResult); + + if (prevSnapshot != null) { + requestBuilder.setPrevSnapshot(prevSnapshot); + } + + if (snapshotPrefix != null) { + requestBuilder.setPrefix(snapshotPrefix); + } final OMRequest omRequest = createOMRequest(Type.ListSnapshot) .setListSnapshotRequest(requestBuilder) diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot index 79a0699d0527..5d9604992edd 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot @@ -59,6 +59,11 @@ Test ozone shell ${result} = Execute ozone sh bucket list ${protocol}${server}/${volume}/ | jq -r '.[] | select(.name=="bb1") | .volumeName' Should Be Equal ${result} ${volume} Run Keyword Test key handling ${protocol} ${server} ${volume} + Execute ozone sh snapshot create ${protocol}${server}/${volume}/bb1 snapshot1 + ${result} = Execute ozone sh snapshot list ${protocol}${server}/${volume}/bb1 | jq -r '.[] | select(.name=="snapshot1") | .snapshotPath' + Should Be Equal ${result} ${volume}/bb1 + ${result} = Execute ozone sh snapshot list ${protocol}${server}/${volume}/bb1 | jq -r '.[] | select(.name=="snapshot1") | .snapshotStatus' + Should Be Equal ${result} SNAPSHOT_ACTIVE Execute ozone sh volume clrquota --space-quota ${protocol}${server}/${volume} ${result} = Execute ozone sh volume info ${protocol}${server}/${volume} | jq -r '. | select(.name=="${volume}") | .quotaInBytes' Should Be Equal ${result} -1 diff --git a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto index 49ea0cf6b3a1..1e5a21483df7 100644 --- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto +++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto @@ -1652,6 +1652,9 @@ message CreateSnapshotRequest { message ListSnapshotRequest { required string volumeName = 1; required string bucketName = 2; + optional string prefix = 3; + optional string prevSnapshot = 4; + optional uint32 maxListResult = 5; } message SnapshotDiffRequest { 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 b4ac54f44a36..0d22cc8e81a5 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 @@ -224,12 +224,16 @@ List listTrash(String volumeName, String bucketName, /** * List snapshots in a volume/bucket. - * @param volumeName volume name - * @param bucketName bucket name + * @param volumeName volume name + * @param bucketName bucket name + * @param snapshotPrefix snapshot prefix to match + * @param prevSnapshot start of the list, this snapshot is excluded + * @param maxListResult max numbet of snapshots to return * @return list of snapshot */ - List listSnapshot(String volumeName, String bucketName) - throws IOException; + List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException; /** * Recover trash allows the user to recover the keys 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 b1929887f174..782da7278555 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 @@ -1166,8 +1166,9 @@ public List listTrash(String volumeName, String bucketName, } @Override - public List listSnapshot(String volumeName, String bucketName) - throws IOException { + public List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { if (Strings.isNullOrEmpty(volumeName)) { throw new OMException("Volume name is required.", VOLUME_NOT_FOUND); } @@ -1182,39 +1183,69 @@ public List listSnapshot(String volumeName, String bucketName) BUCKET_NOT_FOUND); } - String prefix = getBucketKey(volumeName, bucketName + OM_KEY_PREFIX); + String prefix; + if (StringUtil.isNotBlank(snapshotPrefix)) { + prefix = getOzoneKey(volumeName, bucketName, snapshotPrefix); + } else { + prefix = getBucketKey(volumeName, bucketName + OM_KEY_PREFIX); + } + + String seek; + if (StringUtil.isNotBlank(prevSnapshot)) { + // Seek to the specified snapshot. + seek = getOzoneKey(volumeName, bucketName, prevSnapshot); + } else { + // This allows us to seek directly to the first key with the right prefix. + seek = getOzoneKey(volumeName, bucketName, + StringUtil.isNotBlank( + snapshotPrefix) ? snapshotPrefix : OM_KEY_PREFIX); + } + TreeMap snapshotInfoMap = new TreeMap<>(); - appendSnapshotFromCacheToMap(snapshotInfoMap, prefix); - appendSnapshotFromDBToMap(snapshotInfoMap, prefix); + int count = appendSnapshotFromCacheToMap( + snapshotInfoMap, prefix, seek, maxListResult); + appendSnapshotFromDBToMap( + snapshotInfoMap, prefix, seek, count, maxListResult); return new ArrayList<>(snapshotInfoMap.values()); } - private void appendSnapshotFromCacheToMap( - TreeMap snapshotInfoMap, String prefix) { + private int appendSnapshotFromCacheToMap( + TreeMap snapshotInfoMap, String prefix, + String previous, int maxListResult) { + int count = 0; Iterator, CacheValue>> iterator = snapshotInfoTable.cacheIterator(); - while (iterator.hasNext()) { + while (iterator.hasNext() && count < maxListResult) { Map.Entry, CacheValue> entry = iterator.next(); String snapshotKey = entry.getKey().getCacheKey(); SnapshotInfo snapshotInfo = entry.getValue().getCacheValue(); - if (snapshotInfo != null && snapshotKey.startsWith(prefix)) { + if (snapshotInfo != null && snapshotKey.startsWith(prefix) && + snapshotKey.compareTo(previous) > 0) { snapshotInfoMap.put(snapshotKey, snapshotInfo); + count++; } } + return count; } - private void appendSnapshotFromDBToMap(TreeMap snapshotInfoMap, String prefix) + private void appendSnapshotFromDBToMap(TreeMap snapshotInfoMap, + String prefix, String previous, + int count, int maxListResult) throws IOException { try (TableIterator> snapshotIter = snapshotInfoTable.iterator()) { KeyValue< String, SnapshotInfo> snapshotinfo; - snapshotIter.seek(prefix); - while (snapshotIter.hasNext()) { + snapshotIter.seek(previous); + while (snapshotIter.hasNext() && count < maxListResult) { snapshotinfo = snapshotIter.next(); - if (snapshotinfo != null && snapshotinfo.getKey().startsWith(prefix)) { + if (snapshotinfo != null && + snapshotinfo.getKey().compareTo(previous) == 0) { + continue; + } + if (snapshotinfo != null && snapshotinfo.getKey().startsWith(prefix)) { CacheValue cacheValue = snapshotInfoTable.getCacheValue( new CacheKey<>(snapshotinfo.getKey())); @@ -1223,6 +1254,7 @@ private void appendSnapshotFromDBToMap(TreeMap snapshotInfoMap, String prefix) // in cache. if (cacheValue == null) { snapshotInfoMap.put(snapshotinfo.getKey(), snapshotinfo.getValue()); + count++; } } else { break; 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 3ec7fb8c55cd..d9b67645ec4f 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 @@ -2799,8 +2799,9 @@ public List listTrash(String volumeName, } @Override - public List listSnapshot(String volumeName, String bucketName) - throws IOException { + public List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { if (isAclEnabled) { omMetadataReader.checkAcls(ResourceType.BUCKET, StoreType.OZONE, ACLType.LIST, volumeName, bucketName, null); @@ -2810,7 +2811,8 @@ public List listSnapshot(String volumeName, String bucketName) auditMap.put(OzoneConsts.BUCKET, bucketName); try { metrics.incNumSnapshotLists(); - return metadataManager.listSnapshot(volumeName, bucketName); + return metadataManager.listSnapshot(volumeName, bucketName, prevSnapshot, + prevSnapshot, maxListResult); } catch (Exception ex) { metrics.incNumSnapshotListFails(); auditSuccess = false; 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 932196b54c00..feb9f5a6fac1 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 @@ -1223,7 +1223,8 @@ private OzoneManagerProtocolProtos.ListSnapshotResponse getSnapshots( OzoneManagerProtocolProtos.ListSnapshotRequest request) throws IOException { List snapshotInfos = impl.listSnapshot( - request.getVolumeName(), request.getBucketName()); + request.getVolumeName(), request.getBucketName(), request.getPrefix(), + request.getPrevSnapshot(), request.getMaxListResult()); List snapshotInfoList = snapshotInfos.stream().map(SnapshotInfo::getProtobuf) .collect(Collectors.toList()); 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 84dc51464964..d909d4ef919c 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 @@ -686,26 +686,64 @@ public void testListSnapshot() throws Exception { OMRequestTestUtils.addVolumeToDB(vol1, omMetadataManager); addBucketsToCache(vol1, bucket1); - String snapshotName = "snapshot"; + String prefixA = "snapshotA"; + String prefixB = "snapshotB"; + TreeSet snapshotsASet = new TreeSet<>(); - for (int i = 1; i <= 10; i++) { + for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { + snapshotsASet.add(prefixA + i); OMRequestTestUtils.addSnapshotToTable(vol1, bucket1, - snapshotName + i, omMetadataManager); + prefixA + i, omMetadataManager); } else { OMRequestTestUtils.addSnapshotToTableCache(vol1, bucket1, - snapshotName + i, omMetadataManager); + prefixB + i, omMetadataManager); } } //Test listing all snapshots. List snapshotInfos = omMetadataManager.listSnapshot(vol1, - bucket1); - assertEquals(10, snapshotInfos.size()); + bucket1, null, null, 100); + assertEquals(100, snapshotInfos.size()); + + snapshotInfos = omMetadataManager.listSnapshot(vol1, + bucket1, prefixA, null, 50); + assertEquals(50, snapshotInfos.size()); + for (SnapshotInfo snapshotInfo : snapshotInfos) { + assertTrue(snapshotInfo.getName().startsWith(prefixA)); + } + + String startSnapshot = prefixA + 38; + snapshotInfos = omMetadataManager.listSnapshot(vol1, + bucket1, prefixA, startSnapshot, 50); + assertEquals(snapshotsASet.tailSet(startSnapshot).size() - 1, + snapshotInfos.size()); for (SnapshotInfo snapshotInfo : snapshotInfos) { - assertTrue(snapshotInfo.getName().startsWith(snapshotName)); + assertTrue(snapshotInfo.getName().startsWith(prefixA)); + assertTrue(snapshotInfo.getName().compareTo(startSnapshot) > 0); } + startSnapshot = null; + TreeSet expectedSnapshot = new TreeSet<>(); + for (int i = 1; i <= 5; i++) { + snapshotInfos = omMetadataManager.listSnapshot( + vol1, bucket1, prefixA, startSnapshot, 10); + assertEquals(10, snapshotInfos.size()); + + for (SnapshotInfo snapshotInfo : snapshotInfos) { + expectedSnapshot.add(snapshotInfo.getName()); + assertTrue(snapshotInfo.getName().startsWith(prefixA)); + startSnapshot = snapshotInfo.getName(); + } + } + assertEquals(snapshotsASet, expectedSnapshot); + + // As now we have iterated all 50 snapshots, calling next time should + // return empty list. + snapshotInfos = omMetadataManager.listSnapshot(vol1, bucket1, + startSnapshot, prefixA, 10); + + assertEquals(snapshotInfos.size(), 0); } @ParameterizedTest @@ -721,7 +759,7 @@ public void testListSnapshotWithInvalidPath(String volume, addBucketsToCache(vol1, bucket1); OMException oe = assertThrows(OMException.class, - () -> omMetadataManager.listSnapshot(volume, bucket)); + () -> omMetadataManager.listSnapshot(volume, bucket, null, null, 100)); assertEquals(expectedResultCode, oe.getResult()); } 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 53c3cb9a229d..72d60e05b3da 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 @@ -580,8 +580,9 @@ public String createSnapshot(String volumeName, } @Override - public List listSnapshot(String volumeName, String bucketName) - throws IOException { + public List listSnapshot( + String volumeName, String bucketName, String snapshotPrefix, + String prevSnapshot, int maxListResult) throws IOException { return null; } diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java index e3440d04e5ee..2af324f96aca 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java @@ -25,7 +25,7 @@ import picocli.CommandLine; import java.io.IOException; -import java.util.List; +import java.util.Iterator; /** * a handler for Ozone shell CLI command 'list snapshot'. @@ -49,10 +49,9 @@ protected void execute(OzoneClient client, OzoneAddress address) String volumeName = snapshotPath.getValue().getVolumeName(); String bucketName = snapshotPath.getValue().getBucketName(); - List snapshotInfos = client.getObjectStore() - .listSnapshot(volumeName, bucketName); - int counter = printAsJsonArray(snapshotInfos.iterator(), - snapshotInfos.size()); + Iterator snapshotInfos = client.getObjectStore() + .listSnapshot(volumeName, bucketName, null, null); + int counter = printAsJsonArray(snapshotInfos, Integer.MAX_VALUE); if (isVerbose()) { out().printf("Found : %d snapshots for o3://%s/ %s ", counter, volumeName, bucketName); From e8eac2e1b62cce148d32986fdf23adedcfecea1e Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Wed, 1 Feb 2023 14:31:17 +0800 Subject: [PATCH 2/9] fix conficts --- .../org/apache/hadoop/ozone/om/TestOmMetadataManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 deacb5786950..8d3e5ddc0a46 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 @@ -796,14 +796,14 @@ public void testListSnapshotDoesNotListOtherBucketSnapshots() //Test listing snapshots only lists snapshots of specified bucket List snapshotInfos1 = omMetadataManager.listSnapshot(vol1, - bucket1); + bucket1, null, null, Integer.MAX_VALUE); assertEquals(2, snapshotInfos1.size()); for (SnapshotInfo snapshotInfo : snapshotInfos1) { assertTrue(snapshotInfo.getName().startsWith(snapshotName1)); } List snapshotInfos2 = omMetadataManager.listSnapshot(vol1, - bucket2); + bucket2, null, null, Integer.MAX_VALUE); assertEquals(5, snapshotInfos2.size()); for (SnapshotInfo snapshotInfo : snapshotInfos2) { assertTrue(snapshotInfo.getName().startsWith(snapshotName2)); From fb618916f035119144e5f75b7ff8481b4b9076b8 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Wed, 1 Feb 2023 14:37:56 +0800 Subject: [PATCH 3/9] fix checkstyle --- .../java/org/apache/hadoop/ozone/client/ClientProtocolStub.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 60624fa81349..3bb232f3384b 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 @@ -620,7 +620,7 @@ public String createSnapshot(String volumeName, public List listSnapshot( String volumeName, String bucketName, String snapshotPrefix, String prevSnapshot, int maxListResult) throws IOException { - return null; + return null; } public void deleteSnapshot(String volumeName, From c6965405db3a2fb97778ff32531bb5724f9210d0 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Wed, 1 Feb 2023 14:39:47 +0800 Subject: [PATCH 4/9] fix bug --- .../src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java index 8bd09f543ad9..e73954e687d1 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java @@ -430,7 +430,7 @@ public void testSnapshotOps() throws Exception { writeClient.createSnapshot(volumeName, bucketName, snapshot2); // List snapshots - writeClient.listSnapshot(volumeName, bucketName); + writeClient.listSnapshot(volumeName, bucketName, null, null, Integer.MAX_VALUE); omMetrics = getMetrics("OMMetrics"); assertCounter("NumSnapshotActive", 2L, omMetrics); From 99b78b438607e655b727ed41de85aa20441a5e11 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Thu, 2 Feb 2023 10:32:44 +0800 Subject: [PATCH 5/9] fix checkstyle --- .../test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java index e73954e687d1..bd43b46b3f5a 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java @@ -430,7 +430,8 @@ public void testSnapshotOps() throws Exception { writeClient.createSnapshot(volumeName, bucketName, snapshot2); // List snapshots - writeClient.listSnapshot(volumeName, bucketName, null, null, Integer.MAX_VALUE); + writeClient.listSnapshot( + volumeName, bucketName, null, null, Integer.MAX_VALUE); omMetrics = getMetrics("OMMetrics"); assertCounter("NumSnapshotActive", 2L, omMetrics); From da0b75edebf95cf907ee9fa6676778cc0a0aaea0 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Tue, 14 Feb 2023 14:45:20 +0800 Subject: [PATCH 6/9] HDDS-7507. [Snapshot] Implement List Snapshot API Pagination --- .../dist/src/main/smoketest/basic/ozone-shell-lib.robot | 5 ----- 1 file changed, 5 deletions(-) diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot index be9703d93b26..52994f5dec34 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot @@ -60,11 +60,6 @@ Test ozone shell ${result} = Execute ozone sh bucket list ${protocol}${server}/${volume}/ | jq -r '.[] | select(.name=="bb1") | .volumeName' Should Be Equal ${result} ${volume} Run Keyword Test key handling ${protocol} ${server} ${volume} - Execute ozone sh snapshot create ${protocol}${server}/${volume}/bb1 snapshot1 - ${result} = Execute ozone sh snapshot list ${protocol}${server}/${volume}/bb1 | jq -r '.[] | select(.name=="snapshot1") | .snapshotPath' - Should Be Equal ${result} ${volume}/bb1 - ${result} = Execute ozone sh snapshot list ${protocol}${server}/${volume}/bb1 | jq -r '.[] | select(.name=="snapshot1") | .snapshotStatus' - Should Be Equal ${result} SNAPSHOT_ACTIVE Execute ozone sh volume clrquota --space-quota ${protocol}${server}/${volume} ${result} = Execute ozone sh volume info ${protocol}${server}/${volume} | jq -r '. | select(.name=="${volume}") | .quotaInBytes' Should Be Equal ${result} -1 From d87ac3fe2c34fe49d78557300df72b97d28f2c68 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Thu, 2 Mar 2023 06:58:50 +0800 Subject: [PATCH 7/9] add integration-test --- .../rpc/TestOzoneRpcClientAbstract.java | 74 +++++++++++++++++++ .../ozone/om/OmMetadataManagerImpl.java | 2 +- .../apache/hadoop/ozone/om/OzoneManager.java | 2 +- 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java index 029768bfdaa7..256f65fb85a0 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java @@ -76,6 +76,7 @@ import org.apache.hadoop.ozone.client.OzoneKeyDetails; import org.apache.hadoop.ozone.client.OzoneKeyLocation; import org.apache.hadoop.ozone.client.OzoneMultipartUploadPartListParts; +import org.apache.hadoop.ozone.client.OzoneSnapshot; import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.client.VolumeArgs; import org.apache.hadoop.ozone.client.io.OzoneInputStream; @@ -4117,4 +4118,77 @@ private OzoneBucket getBucket(OzoneVolume volume) throws IOException { private static ReplicationConfig anyReplication() { return RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.ONE); } + + @Test + public void testListSnapshot() throws IOException { + String volumeA = "vol-a-" + RandomStringUtils.randomNumeric(5); + String volumeB = "vol-b-" + RandomStringUtils.randomNumeric(5); + String bucketA = "buc-a-" + RandomStringUtils.randomNumeric(5); + String bucketB = "buc-b-" + RandomStringUtils.randomNumeric(5); + store.createVolume(volumeA); + store.createVolume(volumeB); + OzoneVolume volA = store.getVolume(volumeA); + OzoneVolume volB = store.getVolume(volumeB); + volA.createBucket(bucketA); + volA.createBucket(bucketB); + volB.createBucket(bucketA); + volB.createBucket(bucketB); + String snapshotPrefixA = "snapshot-a-"; + String snapshotPrefixB = "snapshot-b-"; + for (int i = 0; i < 10; i++) { + store.createSnapshot(volumeA, bucketA, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketB, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketA, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketB, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + } + for (int i = 0; i < 10; i++) { + store.createSnapshot(volumeA, bucketA, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketB, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketA, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketB, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + } + + Iterator snapshotIter = store.listSnapshot(volumeA, bucketA, null, null); + int volABucketASnapshotCount = 0; + while (snapshotIter.hasNext()){ + OzoneSnapshot snapshot = snapshotIter.next(); + volABucketASnapshotCount++; + } + Assert.assertEquals(20, volABucketASnapshotCount); + + snapshotIter = store.listSnapshot(volumeA, bucketB, null, null); + int volABucketBSnapshotCount = 0; + while (snapshotIter.hasNext()){ + OzoneSnapshot snapshot = snapshotIter.next(); + volABucketBSnapshotCount++; + } + Assert.assertEquals(20, volABucketASnapshotCount); + + snapshotIter = store.listSnapshot(volumeB, bucketA, null, null); + int volBBucketASnapshotCount = 0; + while (snapshotIter.hasNext()){ + OzoneSnapshot snapshot = snapshotIter.next(); + volBBucketASnapshotCount++; + } + Assert.assertEquals(20, volABucketASnapshotCount); + + snapshotIter = store.listSnapshot(volumeB, bucketB, null, null); + int volBBucketBSnapshotCount = 0; + while (snapshotIter.hasNext()){ + OzoneSnapshot snapshot = snapshotIter.next(); + volBBucketBSnapshotCount++; + } + Assert.assertEquals(20, volABucketASnapshotCount); + + int volABucketASnapshotACount = 0; + snapshotIter = store.listSnapshot(volumeA, bucketA, snapshotPrefixA, null); + while (snapshotIter.hasNext()) { + OzoneSnapshot snapshot = snapshotIter.next(); + Assert.assertTrue(snapshot.getName().startsWith(snapshotPrefixA)); + volABucketASnapshotACount++; + } + Assert.assertEquals(10, volABucketASnapshotACount); + Assert.assertFalse(snapshotIter.hasNext()); + + } } 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 c3855bab33c6..f9e5e3518931 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 @@ -1088,7 +1088,7 @@ public List listKeys(String volumeName, String bucketName, if (StringUtil.isNotBlank(keyPrefix)) { seekPrefix = getOzoneKey(volumeName, bucketName, keyPrefix); } else { - seekPrefix = getBucketKey(volumeName, bucketName + OM_KEY_PREFIX); + seekPrefix = getBucketKey(volumeName, bucketName) + OM_KEY_PREFIX; } int currentCount = 0; 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 461c1d08a7ba..59becff365e2 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 @@ -2789,7 +2789,7 @@ public List listSnapshot( auditMap.put(OzoneConsts.BUCKET, bucketName); try { metrics.incNumSnapshotLists(); - return metadataManager.listSnapshot(volumeName, bucketName, prevSnapshot, + return metadataManager.listSnapshot(volumeName, bucketName, snapshotPrefix, prevSnapshot, maxListResult); } catch (Exception ex) { metrics.incNumSnapshotListFails(); From 85def613f19a956e2898e1a0158922a28b589af5 Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Thu, 2 Mar 2023 08:16:16 +0800 Subject: [PATCH 8/9] fix checkstyle --- .../rpc/TestOzoneRpcClientAbstract.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java index 256f65fb85a0..9382ceff9149 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java @@ -4136,21 +4136,29 @@ public void testListSnapshot() throws IOException { String snapshotPrefixA = "snapshot-a-"; String snapshotPrefixB = "snapshot-b-"; for (int i = 0; i < 10; i++) { - store.createSnapshot(volumeA, bucketA, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeA, bucketB, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeB, bucketA, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeB, bucketB, snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketA, + snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketB, + snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketA, + snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketB, + snapshotPrefixA + i + "-" + RandomStringUtils.randomNumeric(5)); } for (int i = 0; i < 10; i++) { - store.createSnapshot(volumeA, bucketA, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeA, bucketB, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeB, bucketA, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); - store.createSnapshot(volumeB, bucketB, snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketA, + snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeA, bucketB, + snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketA, + snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); + store.createSnapshot(volumeB, bucketB, + snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); } Iterator snapshotIter = store.listSnapshot(volumeA, bucketA, null, null); int volABucketASnapshotCount = 0; - while (snapshotIter.hasNext()){ + while (snapshotIter.hasNext()) { OzoneSnapshot snapshot = snapshotIter.next(); volABucketASnapshotCount++; } @@ -4158,7 +4166,7 @@ public void testListSnapshot() throws IOException { snapshotIter = store.listSnapshot(volumeA, bucketB, null, null); int volABucketBSnapshotCount = 0; - while (snapshotIter.hasNext()){ + while (snapshotIter.hasNext()) { OzoneSnapshot snapshot = snapshotIter.next(); volABucketBSnapshotCount++; } @@ -4166,7 +4174,7 @@ public void testListSnapshot() throws IOException { snapshotIter = store.listSnapshot(volumeB, bucketA, null, null); int volBBucketASnapshotCount = 0; - while (snapshotIter.hasNext()){ + while (snapshotIter.hasNext()) { OzoneSnapshot snapshot = snapshotIter.next(); volBBucketASnapshotCount++; } @@ -4174,7 +4182,7 @@ public void testListSnapshot() throws IOException { snapshotIter = store.listSnapshot(volumeB, bucketB, null, null); int volBBucketBSnapshotCount = 0; - while (snapshotIter.hasNext()){ + while (snapshotIter.hasNext()) { OzoneSnapshot snapshot = snapshotIter.next(); volBBucketBSnapshotCount++; } From ba4a91279db77b13a96674a87498367008e8f17c Mon Sep 17 00:00:00 2001 From: chungen0126 Date: Thu, 2 Mar 2023 08:22:51 +0800 Subject: [PATCH 9/9] fix checkstyle --- .../hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java | 3 ++- .../main/java/org/apache/hadoop/ozone/om/OzoneManager.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java index 9382ceff9149..92d3b2cee758 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java @@ -4156,7 +4156,8 @@ public void testListSnapshot() throws IOException { snapshotPrefixB + i + "-" + RandomStringUtils.randomNumeric(5)); } - Iterator snapshotIter = store.listSnapshot(volumeA, bucketA, null, null); + Iterator snapshotIter = + store.listSnapshot(volumeA, bucketA, null, null); int volABucketASnapshotCount = 0; while (snapshotIter.hasNext()) { OzoneSnapshot snapshot = snapshotIter.next(); 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 59becff365e2..52fa7ac9b10c 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 @@ -2789,8 +2789,8 @@ public List listSnapshot( auditMap.put(OzoneConsts.BUCKET, bucketName); try { metrics.incNumSnapshotLists(); - return metadataManager.listSnapshot(volumeName, bucketName, snapshotPrefix, - prevSnapshot, maxListResult); + return metadataManager.listSnapshot(volumeName, bucketName, + snapshotPrefix, prevSnapshot, maxListResult); } catch (Exception ex) { metrics.incNumSnapshotListFails(); auditSuccess = false;