From 8d5cc98b4271dc1dca2e69cb02e4ed87c16361ad Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Mon, 10 May 2021 12:41:07 -0700 Subject: [PATCH] HDFS-15997. Implement dfsadmin -provisionSnapshotTrash -all (#2958) --- .../apache/hadoop/hdfs/tools/DFSAdmin.java | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java index c874d9290f..4f57040867 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java @@ -38,6 +38,7 @@ import java.util.Optional; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import org.apache.hadoop.hdfs.protocol.SnapshottableDirectoryStatus; import org.apache.hadoop.thirdparty.com.google.common.base.Joiner; import org.apache.hadoop.hdfs.client.HdfsAdmin; @@ -461,7 +462,7 @@ public class DFSAdmin extends FsShell { "\t[-fetchImage ]\n" + "\t[-allowSnapshot ]\n" + "\t[-disallowSnapshot ]\n" + - "\t[-provisionSnapshotTrash ]\n" + + "\t[-provisionSnapshotTrash [-all]]\n" + "\t[-shutdownDatanode [upgrade]]\n" + "\t[-evictWriters ]\n" + "\t[-getDatanodeInfo ]\n" + @@ -793,14 +794,7 @@ public class DFSAdmin extends FsShell { System.out.println("Disallowing snapshot on " + argv[1] + " succeeded"); } - /** - * Provision trash root in a snapshottable directory. - * Usage: hdfs dfsadmin -provisionSnapshotTrash snapshotDir - * @param argv List of of command line parameters. - * @exception IOException - */ - public void provisionSnapshotTrash(String[] argv) throws IOException { - Path p = new Path(argv[1]); + private void provisionSnapshotTrashInternal(Path p) throws IOException { final HdfsAdmin admin = new HdfsAdmin(p.toUri(), getConf()); Path trashRoot; try { @@ -809,7 +803,35 @@ public class DFSAdmin extends FsShell { throw new RemoteException(e.getClass().getName(), e.getMessage()); } System.out.println("Successfully provisioned snapshot trash at " + - trashRoot); + trashRoot); + } + + private void provisionSnapshotTrashAll() throws IOException { + // Get all snapshottable directories + final DistributedFileSystem dfs = getDFS(); + SnapshottableDirectoryStatus[] lst = dfs.getSnapshottableDirListing(); + if (lst != null) { + for (SnapshottableDirectoryStatus dirStatus : lst) { + final Path p = dirStatus.getFullPath(); + provisionSnapshotTrashInternal(p); + } + } + } + + /** + * Provision trash root in a snapshottable directory. + * Usage: hdfs dfsadmin -provisionSnapshotTrash snapshotDir + * hdfs dfsadmin -provisionSnapshotTrash -all + * @param argv List of of command line parameters. + * @exception IOException + */ + public void provisionSnapshotTrash(String[] argv) throws IOException { + if (argv[1].equals("-all")) { + provisionSnapshotTrashAll(); + return; + } + Path p = new Path(argv[1]); + provisionSnapshotTrashInternal(p); } /** @@ -1266,9 +1288,10 @@ public class DFSAdmin extends FsShell { String disallowSnapshot = "-disallowSnapshot :\n" + "\tDo not allow snapshots to be taken on a directory any more.\n"; - String provisionSnapshotTrash = "-provisionSnapshotTrash :\n" + - "\tProvision trash root in a snapshottable directory with permission" - + "\t" + HdfsAdmin.TRASH_PERMISSION + ".\n"; + String provisionSnapshotTrash = + "-provisionSnapshotTrash [-all]:\n" + + "\tProvision trash root in one or all snapshottable directories." + + "\tTrash permission is " + HdfsAdmin.TRASH_PERMISSION + ".\n"; String shutdownDatanode = "-shutdownDatanode [upgrade]\n" + "\tSubmit a shutdown request for the given datanode. If an optional\n" @@ -2115,7 +2138,7 @@ public class DFSAdmin extends FsShell { + " [-disallowSnapshot ]"); } else if ("-provisionSnapshotTrash".equalsIgnoreCase(cmd)) { System.err.println("Usage: hdfs dfsadmin" - + " [-provisionSnapshotTrash ]"); + + " [-provisionSnapshotTrash [-all]]"); } else if ("-saveNamespace".equals(cmd)) { System.err.println("Usage: hdfs dfsadmin" + " [-saveNamespace [-beforeShutdown]]");