DFSAdmin.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:31k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.tools;
  19. import java.io.IOException;
  20. import java.util.List;
  21. import javax.security.auth.login.LoginException;
  22. import org.apache.hadoop.conf.Configuration;
  23. import org.apache.hadoop.hdfs.DistributedFileSystem;
  24. import org.apache.hadoop.hdfs.DistributedFileSystem.DiskStatus;
  25. import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
  26. import org.apache.hadoop.hdfs.protocol.FSConstants;
  27. import org.apache.hadoop.hdfs.protocol.FSConstants.DatanodeReportType;
  28. import org.apache.hadoop.hdfs.protocol.FSConstants.UpgradeAction;
  29. import org.apache.hadoop.hdfs.server.common.UpgradeStatusReport;
  30. import org.apache.hadoop.hdfs.server.namenode.NameNode;
  31. import org.apache.hadoop.fs.FileSystem;
  32. import org.apache.hadoop.fs.FsShell;
  33. import org.apache.hadoop.fs.Path;
  34. import org.apache.hadoop.fs.shell.Command;
  35. import org.apache.hadoop.fs.shell.CommandFormat;
  36. import org.apache.hadoop.ipc.RPC;
  37. import org.apache.hadoop.ipc.RemoteException;
  38. import org.apache.hadoop.net.NetUtils;
  39. import org.apache.hadoop.security.UnixUserGroupInformation;
  40. import org.apache.hadoop.security.authorize.RefreshAuthorizationPolicyProtocol;
  41. import org.apache.hadoop.util.StringUtils;
  42. import org.apache.hadoop.util.ToolRunner;
  43. /**
  44.  * This class provides some DFS administrative access.
  45.  */
  46. public class DFSAdmin extends FsShell {
  47.   /**
  48.    * An abstract class for the execution of a file system command
  49.    */
  50.   abstract private static class DFSAdminCommand extends Command {
  51.     final DistributedFileSystem dfs;
  52.     /** Constructor */
  53.     public DFSAdminCommand(FileSystem fs) {
  54.       super(fs.getConf());
  55.       if (!(fs instanceof DistributedFileSystem)) {
  56.         throw new IllegalArgumentException("FileSystem " + fs.getUri() + 
  57.             " is not a distributed file system");
  58.       }
  59.       this.dfs = (DistributedFileSystem)fs;
  60.     }
  61.   }
  62.   
  63.   /** A class that supports command clearQuota */
  64.   private static class ClearQuotaCommand extends DFSAdminCommand {
  65.     private static final String NAME = "clrQuota";
  66.     private static final String USAGE = "-"+NAME+" <dirname>...<dirname>";
  67.     private static final String DESCRIPTION = USAGE + ": " +
  68.     "Clear the quota for each directory <dirName>.n" +
  69.     "ttBest effort for the directory. with fault reported ifn" +
  70.     "tt1. the directory does not exist or is a file, orn" +
  71.     "tt2. user is not an administrator.n" +
  72.     "ttIt does not fault if the directory has no quota.";
  73.     
  74.     /** Constructor */
  75.     ClearQuotaCommand(String[] args, int pos, FileSystem fs) {
  76.       super(fs);
  77.       CommandFormat c = new CommandFormat(NAME, 1, Integer.MAX_VALUE);
  78.       List<String> parameters = c.parse(args, pos);
  79.       this.args = parameters.toArray(new String[parameters.size()]);
  80.     }
  81.     
  82.     /** Check if a command is the clrQuota command
  83.      * 
  84.      * @param cmd A string representation of a command starting with "-"
  85.      * @return true if this is a clrQuota command; false otherwise
  86.      */
  87.     public static boolean matches(String cmd) {
  88.       return ("-"+NAME).equals(cmd); 
  89.     }
  90.     @Override
  91.     public String getCommandName() {
  92.       return NAME;
  93.     }
  94.     @Override
  95.     public void run(Path path) throws IOException {
  96.       dfs.setQuota(path, FSConstants.QUOTA_RESET, FSConstants.QUOTA_DONT_SET);
  97.     }
  98.   }
  99.   
  100.   /** A class that supports command setQuota */
  101.   private static class SetQuotaCommand extends DFSAdminCommand {
  102.     private static final String NAME = "setQuota";
  103.     private static final String USAGE =
  104.       "-"+NAME+" <quota> <dirname>...<dirname>";
  105.     private static final String DESCRIPTION = 
  106.       "-setQuota <quota> <dirname>...<dirname>: " +
  107.       "Set the quota <quota> for each directory <dirName>.n" + 
  108.       "ttThe directory quota is a long integer that puts a hard limitn" +
  109.       "tton the number of names in the directory treen" +
  110.       "ttBest effort for the directory, with faults reported ifn" +
  111.       "tt1. N is not a positive integer, orn" +
  112.       "tt2. user is not an administrator, orn" +
  113.       "tt3. the directory does not exist or is a file, orn" +
  114.       "tt4. the directory would immediately exceed the new quota.";
  115.     
  116.     private final long quota; // the quota to be set
  117.     
  118.     /** Constructor */
  119.     SetQuotaCommand(String[] args, int pos, FileSystem fs) {
  120.       super(fs);
  121.       CommandFormat c = new CommandFormat(NAME, 2, Integer.MAX_VALUE);
  122.       List<String> parameters = c.parse(args, pos);
  123.       this.quota = Long.parseLong(parameters.remove(0));
  124.       this.args = parameters.toArray(new String[parameters.size()]);
  125.     }
  126.     
  127.     /** Check if a command is the setQuota command
  128.      * 
  129.      * @param cmd A string representation of a command starting with "-"
  130.      * @return true if this is a count command; false otherwise
  131.      */
  132.     public static boolean matches(String cmd) {
  133.       return ("-"+NAME).equals(cmd); 
  134.     }
  135.     @Override
  136.     public String getCommandName() {
  137.       return NAME;
  138.     }
  139.     @Override
  140.     public void run(Path path) throws IOException {
  141.       dfs.setQuota(path, quota, FSConstants.QUOTA_DONT_SET);
  142.     }
  143.   }
  144.   
  145.   /** A class that supports command clearSpaceQuota */
  146.   private static class ClearSpaceQuotaCommand extends DFSAdminCommand {
  147.     private static final String NAME = "clrSpaceQuota";
  148.     private static final String USAGE = "-"+NAME+" <dirname>...<dirname>";
  149.     private static final String DESCRIPTION = USAGE + ": " +
  150.     "Clear the disk space quota for each directory <dirName>.n" +
  151.     "ttBest effort for the directory. with fault reported ifn" +
  152.     "tt1. the directory does not exist or is a file, orn" +
  153.     "tt2. user is not an administrator.n" +
  154.     "ttIt does not fault if the directory has no quota.";
  155.     
  156.     /** Constructor */
  157.     ClearSpaceQuotaCommand(String[] args, int pos, FileSystem fs) {
  158.       super(fs);
  159.       CommandFormat c = new CommandFormat(NAME, 1, Integer.MAX_VALUE);
  160.       List<String> parameters = c.parse(args, pos);
  161.       this.args = parameters.toArray(new String[parameters.size()]);
  162.     }
  163.     
  164.     /** Check if a command is the clrQuota command
  165.      * 
  166.      * @param cmd A string representation of a command starting with "-"
  167.      * @return true if this is a clrQuota command; false otherwise
  168.      */
  169.     public static boolean matches(String cmd) {
  170.       return ("-"+NAME).equals(cmd); 
  171.     }
  172.     @Override
  173.     public String getCommandName() {
  174.       return NAME;
  175.     }
  176.     @Override
  177.     public void run(Path path) throws IOException {
  178.       dfs.setQuota(path, FSConstants.QUOTA_DONT_SET, FSConstants.QUOTA_RESET);
  179.     }
  180.   }
  181.   
  182.   /** A class that supports command setQuota */
  183.   private static class SetSpaceQuotaCommand extends DFSAdminCommand {
  184.     private static final String NAME = "setSpaceQuota";
  185.     private static final String USAGE =
  186.       "-"+NAME+" <quota> <dirname>...<dirname>";
  187.     private static final String DESCRIPTION = USAGE + ": " +
  188.       "Set the disk space quota <quota> for each directory <dirName>.n" + 
  189.       "ttThe directory quota is a long integer that puts a hard limitn" +
  190.       "tton the number of names in the directory tree.n" +
  191.       "ttQuota can also be speciefied with a binary prefix for terabytes,n" +
  192.       "ttpetabytes etc (e.g. 50t is 50TB, 5m is 5MB, 3p is 3PB).n" + 
  193.       "ttBest effort for the directory, with faults reported ifn" +
  194.       "tt1. N is not a positive integer, orn" +
  195.       "tt2. user is not an administrator, orn" +
  196.       "tt3. the directory does not exist or is a file, orn" +
  197.       "tt4. the directory would immediately exceed the new space quota.";
  198.     
  199.     private long quota; // the quota to be set
  200.     
  201.     /** Constructor */
  202.     SetSpaceQuotaCommand(String[] args, int pos, FileSystem fs) {
  203.       super(fs);
  204.       CommandFormat c = new CommandFormat(NAME, 2, Integer.MAX_VALUE);
  205.       List<String> parameters = c.parse(args, pos);
  206.       String str = parameters.remove(0).trim();
  207.       quota = StringUtils.TraditionalBinaryPrefix.string2long(str);
  208.       this.args = parameters.toArray(new String[parameters.size()]);
  209.     }
  210.     
  211.     /** Check if a command is the setQuota command
  212.      * 
  213.      * @param cmd A string representation of a command starting with "-"
  214.      * @return true if this is a count command; false otherwise
  215.      */
  216.     public static boolean matches(String cmd) {
  217.       return ("-"+NAME).equals(cmd); 
  218.     }
  219.     @Override
  220.     public String getCommandName() {
  221.       return NAME;
  222.     }
  223.     @Override
  224.     public void run(Path path) throws IOException {
  225.       dfs.setQuota(path, FSConstants.QUOTA_DONT_SET, quota);
  226.     }
  227.   }
  228.   
  229.   /**
  230.    * Construct a DFSAdmin object.
  231.    */
  232.   public DFSAdmin() {
  233.     this(null);
  234.   }
  235.   /**
  236.    * Construct a DFSAdmin object.
  237.    */
  238.   public DFSAdmin(Configuration conf) {
  239.     super(conf);
  240.   }
  241.   
  242.   /**
  243.    * Gives a report on how the FileSystem is doing.
  244.    * @exception IOException if the filesystem does not exist.
  245.    */
  246.   public void report() throws IOException {
  247.     if (fs instanceof DistributedFileSystem) {
  248.       DistributedFileSystem dfs = (DistributedFileSystem) fs;
  249.       DiskStatus ds = dfs.getDiskStatus();
  250.       long capacity = ds.getCapacity();
  251.       long used = ds.getDfsUsed();
  252.       long remaining = ds.getRemaining();
  253.       long presentCapacity = used + remaining;
  254.       boolean mode = dfs.setSafeMode(FSConstants.SafeModeAction.SAFEMODE_GET);
  255.       UpgradeStatusReport status = 
  256.                       dfs.distributedUpgradeProgress(UpgradeAction.GET_STATUS);
  257.       if (mode) {
  258.         System.out.println("Safe mode is ON");
  259.       }
  260.       if (status != null) {
  261.         System.out.println(status.getStatusText(false));
  262.       }
  263.       System.out.println("Configured Capacity: " + capacity
  264.                          + " (" + StringUtils.byteDesc(capacity) + ")");
  265.       System.out.println("Present Capacity: " + presentCapacity
  266.           + " (" + StringUtils.byteDesc(presentCapacity) + ")");
  267.       System.out.println("DFS Remaining: " + remaining
  268.           + " (" + StringUtils.byteDesc(remaining) + ")");
  269.       System.out.println("DFS Used: " + used
  270.                          + " (" + StringUtils.byteDesc(used) + ")");
  271.       System.out.println("DFS Used%: "
  272.                          + StringUtils.limitDecimalTo2(((1.0 * used) / presentCapacity) * 100)
  273.                          + "%");
  274.       
  275.       /* These counts are not always upto date. They are updated after  
  276.        * iteration of an internal list. Should be updated in a few seconds to 
  277.        * minutes. Use "-metaSave" to list of all such blocks and accurate 
  278.        * counts.
  279.        */
  280.       System.out.println("Under replicated blocks: " + 
  281.                          dfs.getUnderReplicatedBlocksCount());
  282.       System.out.println("Blocks with corrupt replicas: " + 
  283.                          dfs.getCorruptBlocksCount());
  284.       System.out.println("Missing blocks: " + 
  285.                          dfs.getMissingBlocksCount());
  286.                            
  287.       System.out.println();
  288.       System.out.println("-------------------------------------------------");
  289.       
  290.       DatanodeInfo[] live = dfs.getClient().datanodeReport(
  291.                                                    DatanodeReportType.LIVE);
  292.       DatanodeInfo[] dead = dfs.getClient().datanodeReport(
  293.                                                    DatanodeReportType.DEAD);
  294.       System.out.println("Datanodes available: " + live.length +
  295.                          " (" + (live.length + dead.length) + " total, " + 
  296.                          dead.length + " dead)n");
  297.       
  298.       for (DatanodeInfo dn : live) {
  299.         System.out.println(dn.getDatanodeReport());
  300.         System.out.println();
  301.       }
  302.       for (DatanodeInfo dn : dead) {
  303.         System.out.println(dn.getDatanodeReport());
  304.         System.out.println();
  305.       }      
  306.     }
  307.   }
  308.   /**
  309.    * Safe mode maintenance command.
  310.    * Usage: java DFSAdmin -safemode [enter | leave | get]
  311.    * @param argv List of of command line parameters.
  312.    * @param idx The index of the command that is being processed.
  313.    * @exception IOException if the filesystem does not exist.
  314.    */
  315.   public void setSafeMode(String[] argv, int idx) throws IOException {
  316.     if (!(fs instanceof DistributedFileSystem)) {
  317.       System.err.println("FileSystem is " + fs.getUri());
  318.       return;
  319.     }
  320.     if (idx != argv.length - 1) {
  321.       printUsage("-safemode");
  322.       return;
  323.     }
  324.     FSConstants.SafeModeAction action;
  325.     Boolean waitExitSafe = false;
  326.     if ("leave".equalsIgnoreCase(argv[idx])) {
  327.       action = FSConstants.SafeModeAction.SAFEMODE_LEAVE;
  328.     } else if ("enter".equalsIgnoreCase(argv[idx])) {
  329.       action = FSConstants.SafeModeAction.SAFEMODE_ENTER;
  330.     } else if ("get".equalsIgnoreCase(argv[idx])) {
  331.       action = FSConstants.SafeModeAction.SAFEMODE_GET;
  332.     } else if ("wait".equalsIgnoreCase(argv[idx])) {
  333.       action = FSConstants.SafeModeAction.SAFEMODE_GET;
  334.       waitExitSafe = true;
  335.     } else {
  336.       printUsage("-safemode");
  337.       return;
  338.     }
  339.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  340.     boolean inSafeMode = dfs.setSafeMode(action);
  341.     //
  342.     // If we are waiting for safemode to exit, then poll and
  343.     // sleep till we are out of safemode.
  344.     //
  345.     if (waitExitSafe) {
  346.       while (inSafeMode) {
  347.         try {
  348.           Thread.sleep(5000);
  349.         } catch (java.lang.InterruptedException e) {
  350.           throw new IOException("Wait Interrupted");
  351.         }
  352.         inSafeMode = dfs.setSafeMode(action);
  353.       }
  354.     }
  355.     System.out.println("Safe mode is " + (inSafeMode ? "ON" : "OFF"));
  356.   }
  357.   /**
  358.    * Command to ask the namenode to save the namespace.
  359.    * Usage: java DFSAdmin -saveNamespace
  360.    * @exception IOException 
  361.    * @see org.apache.hadoop.hdfs.protocol.ClientProtocol#saveNamespace()
  362.    */
  363.   public int saveNamespace() throws IOException {
  364.     int exitCode = -1;
  365.     if (!(fs instanceof DistributedFileSystem)) {
  366.       System.err.println("FileSystem is " + fs.getUri());
  367.       return exitCode;
  368.     }
  369.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  370.     dfs.saveNamespace();
  371.     exitCode = 0;
  372.    
  373.     return exitCode;
  374.   }
  375.   /**
  376.    * Command to ask the namenode to reread the hosts and excluded hosts 
  377.    * file.
  378.    * Usage: java DFSAdmin -refreshNodes
  379.    * @exception IOException 
  380.    */
  381.   public int refreshNodes() throws IOException {
  382.     int exitCode = -1;
  383.     if (!(fs instanceof DistributedFileSystem)) {
  384.       System.err.println("FileSystem is " + fs.getUri());
  385.       return exitCode;
  386.     }
  387.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  388.     dfs.refreshNodes();
  389.     exitCode = 0;
  390.    
  391.     return exitCode;
  392.   }
  393.   private void printHelp(String cmd) {
  394.     String summary = "hadoop dfsadmin is the command to execute DFS administrative commands.n" +
  395.       "The full syntax is: nn" +
  396.       "hadoop dfsadmin [-report] [-safemode <enter | leave | get | wait>]n" +
  397.       "t[-saveNamespace]n" +
  398.       "t[-refreshNodes]n" +
  399.       "t[" + SetQuotaCommand.USAGE + "]n" +
  400.       "t[" + ClearQuotaCommand.USAGE +"]n" +
  401.       "t[" + SetSpaceQuotaCommand.USAGE + "]n" +
  402.       "t[" + ClearSpaceQuotaCommand.USAGE +"]n" +
  403.       "t[-refreshServiceAcl]n" +
  404.       "t[-help [cmd]]n";
  405.     String report ="-report: tReports basic filesystem information and statistics.n";
  406.         
  407.     String safemode = "-safemode <enter|leave|get|wait>:  Safe mode maintenance command.n" + 
  408.       "ttSafe mode is a Namenode state in which itn" +
  409.       "ttt1.  does not accept changes to the name space (read-only)n" +
  410.       "ttt2.  does not replicate or delete blocks.n" +
  411.       "ttSafe mode is entered automatically at Namenode startup, andn" +
  412.       "ttleaves safe mode automatically when the configured minimumn" +
  413.       "ttpercentage of blocks satisfies the minimum replicationn" +
  414.       "ttcondition.  Safe mode can also be entered manually, but thenn" +
  415.       "ttit can only be turned off manually as well.n";
  416.     String saveNamespace = "-saveNamespace:t" +
  417.     "Save current namespace into storage directories and reset edits log.n" +
  418.     "ttRequires superuser permissions and safe mode.n";
  419.     String refreshNodes = "-refreshNodes: tUpdates the set of hosts allowed " +
  420.                           "to connect to namenode.nn" +
  421.       "ttRe-reads the config file to update values defined by n" +
  422.       "ttdfs.hosts and dfs.host.exclude and reads the n" +
  423.       "ttentires (hostnames) in those files.nn" +
  424.       "ttEach entry not defined in dfs.hosts but in n" + 
  425.       "ttdfs.hosts.exclude is decommissioned. Each entry defined n" +
  426.       "ttin dfs.hosts and also in dfs.host.exclude is stopped from n" +
  427.       "ttdecommissioning if it has aleady been marked for decommission.n" + 
  428.       "ttEntires not present in both the lists are decommissioned.n";
  429.     String finalizeUpgrade = "-finalizeUpgrade: Finalize upgrade of HDFS.n" +
  430.       "ttDatanodes delete their previous version working directories,n" +
  431.       "ttfollowed by Namenode doing the same.n" + 
  432.       "ttThis completes the upgrade process.n";
  433.     String upgradeProgress = "-upgradeProgress <status|details|force>: n" +
  434.       "ttrequest current distributed upgrade status, n" +
  435.       "tta detailed status or force the upgrade to proceed.n";
  436.     String metaSave = "-metasave <filename>: tSave Namenode's primary data structuresn" +
  437.       "ttto <filename> in the directory specified by hadoop.log.dir property.n" +
  438.       "tt<filename> will contain one line for each of the followingn" +
  439.       "ttt1. Datanodes heart beating with Namenoden" +
  440.       "ttt2. Blocks waiting to be replicatedn" +
  441.       "ttt3. Blocks currrently being replicatedn" +
  442.       "ttt4. Blocks waiting to be deletedn";
  443.     String refreshServiceAcl = "-refreshServiceAcl: Reload the service-level authorization policy filen" +
  444.       "ttNamenode will reload the authorization policy file.n";
  445.     
  446.     String help = "-help [cmd]: tDisplays help for the given command or all commands if nonen" +
  447.       "ttis specified.n";
  448.     if ("report".equals(cmd)) {
  449.       System.out.println(report);
  450.     } else if ("safemode".equals(cmd)) {
  451.       System.out.println(safemode);
  452.     } else if ("saveNamespace".equals(cmd)) {
  453.       System.out.println(saveNamespace);
  454.     } else if ("refreshNodes".equals(cmd)) {
  455.       System.out.println(refreshNodes);
  456.     } else if ("finalizeUpgrade".equals(cmd)) {
  457.       System.out.println(finalizeUpgrade);
  458.     } else if ("upgradeProgress".equals(cmd)) {
  459.       System.out.println(upgradeProgress);
  460.     } else if ("metasave".equals(cmd)) {
  461.       System.out.println(metaSave);
  462.     } else if (SetQuotaCommand.matches(cmd)) {
  463.       System.out.println(SetQuotaCommand.DESCRIPTION);
  464.     } else if (ClearQuotaCommand.matches(cmd)) {
  465.       System.out.println(ClearQuotaCommand.DESCRIPTION);
  466.     } else if (SetSpaceQuotaCommand.matches(cmd)) {
  467.       System.out.println(SetSpaceQuotaCommand.DESCRIPTION);
  468.     } else if (ClearSpaceQuotaCommand.matches(cmd)) {
  469.       System.out.println(ClearSpaceQuotaCommand.DESCRIPTION);
  470.     } else if ("refreshServiceAcl".equals(cmd)) {
  471.       System.out.println(refreshServiceAcl);
  472.     } else if ("help".equals(cmd)) {
  473.       System.out.println(help);
  474.     } else {
  475.       System.out.println(summary);
  476.       System.out.println(report);
  477.       System.out.println(safemode);
  478.       System.out.println(saveNamespace);
  479.       System.out.println(refreshNodes);
  480.       System.out.println(finalizeUpgrade);
  481.       System.out.println(upgradeProgress);
  482.       System.out.println(metaSave);
  483.       System.out.println(SetQuotaCommand.DESCRIPTION);
  484.       System.out.println(ClearQuotaCommand.DESCRIPTION);
  485.       System.out.println(SetSpaceQuotaCommand.DESCRIPTION);
  486.       System.out.println(ClearSpaceQuotaCommand.DESCRIPTION);
  487.       System.out.println(refreshServiceAcl);
  488.       System.out.println(help);
  489.       System.out.println();
  490.       ToolRunner.printGenericCommandUsage(System.out);
  491.     }
  492.   }
  493.   /**
  494.    * Command to ask the namenode to finalize previously performed upgrade.
  495.    * Usage: java DFSAdmin -finalizeUpgrade
  496.    * @exception IOException 
  497.    */
  498.   public int finalizeUpgrade() throws IOException {
  499.     int exitCode = -1;
  500.     if (!(fs instanceof DistributedFileSystem)) {
  501.       System.out.println("FileSystem is " + fs.getUri());
  502.       return exitCode;
  503.     }
  504.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  505.     dfs.finalizeUpgrade();
  506.     exitCode = 0;
  507.    
  508.     return exitCode;
  509.   }
  510.   /**
  511.    * Command to request current distributed upgrade status, 
  512.    * a detailed status, or to force the upgrade to proceed.
  513.    * 
  514.    * Usage: java DFSAdmin -upgradeProgress [status | details | force]
  515.    * @exception IOException 
  516.    */
  517.   public int upgradeProgress(String[] argv, int idx) throws IOException {
  518.     if (!(fs instanceof DistributedFileSystem)) {
  519.       System.out.println("FileSystem is " + fs.getUri());
  520.       return -1;
  521.     }
  522.     if (idx != argv.length - 1) {
  523.       printUsage("-upgradeProgress");
  524.       return -1;
  525.     }
  526.     UpgradeAction action;
  527.     if ("status".equalsIgnoreCase(argv[idx])) {
  528.       action = UpgradeAction.GET_STATUS;
  529.     } else if ("details".equalsIgnoreCase(argv[idx])) {
  530.       action = UpgradeAction.DETAILED_STATUS;
  531.     } else if ("force".equalsIgnoreCase(argv[idx])) {
  532.       action = UpgradeAction.FORCE_PROCEED;
  533.     } else {
  534.       printUsage("-upgradeProgress");
  535.       return -1;
  536.     }
  537.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  538.     UpgradeStatusReport status = dfs.distributedUpgradeProgress(action);
  539.     String statusText = (status == null ? 
  540.         "There are no upgrades in progress." :
  541.           status.getStatusText(action == UpgradeAction.DETAILED_STATUS));
  542.     System.out.println(statusText);
  543.     return 0;
  544.   }
  545.   /**
  546.    * Dumps DFS data structures into specified file.
  547.    * Usage: java DFSAdmin -metasave filename
  548.    * @param argv List of of command line parameters.
  549.    * @param idx The index of the command that is being processed.
  550.    * @exception IOException if an error accoured wile accessing
  551.    *            the file or path.
  552.    */
  553.   public int metaSave(String[] argv, int idx) throws IOException {
  554.     String pathname = argv[idx];
  555.     DistributedFileSystem dfs = (DistributedFileSystem) fs;
  556.     dfs.metaSave(pathname);
  557.     System.out.println("Created file " + pathname + " on server " +
  558.                        dfs.getUri());
  559.     return 0;
  560.   }
  561.   private static UnixUserGroupInformation getUGI(Configuration conf) 
  562.   throws IOException {
  563.     UnixUserGroupInformation ugi = null;
  564.     try {
  565.       ugi = UnixUserGroupInformation.login(conf, true);
  566.     } catch (LoginException e) {
  567.       throw (IOException)(new IOException(
  568.           "Failed to get the current user's information.").initCause(e));
  569.     }
  570.     return ugi;
  571.   }
  572.   /**
  573.    * Refresh the authorization policy on the {@link NameNode}.
  574.    * @return exitcode 0 on success, non-zero on failure
  575.    * @throws IOException
  576.    */
  577.   public int refreshServiceAcl() throws IOException {
  578.     // Get the current configuration
  579.     Configuration conf = getConf();
  580.     
  581.     // Create the client
  582.     RefreshAuthorizationPolicyProtocol refreshProtocol = 
  583.       (RefreshAuthorizationPolicyProtocol) 
  584.       RPC.getProxy(RefreshAuthorizationPolicyProtocol.class, 
  585.                    RefreshAuthorizationPolicyProtocol.versionID, 
  586.                    NameNode.getAddress(conf), getUGI(conf), conf,
  587.                    NetUtils.getSocketFactory(conf, 
  588.                                              RefreshAuthorizationPolicyProtocol.class));
  589.     
  590.     // Refresh the authorization policy in-effect
  591.     refreshProtocol.refreshServiceAcl();
  592.     
  593.     return 0;
  594.   }
  595.   
  596.   /**
  597.    * Displays format of commands.
  598.    * @param cmd The command that is being executed.
  599.    */
  600.   private static void printUsage(String cmd) {
  601.     if ("-report".equals(cmd)) {
  602.       System.err.println("Usage: java DFSAdmin"
  603.                          + " [-report]");
  604.     } else if ("-safemode".equals(cmd)) {
  605.       System.err.println("Usage: java DFSAdmin"
  606.                          + " [-safemode enter | leave | get | wait]");
  607.     } else if ("-saveNamespace".equals(cmd)) {
  608.       System.err.println("Usage: java DFSAdmin"
  609.                          + " [-saveNamespace]");
  610.     } else if ("-refreshNodes".equals(cmd)) {
  611.       System.err.println("Usage: java DFSAdmin"
  612.                          + " [-refreshNodes]");
  613.     } else if ("-finalizeUpgrade".equals(cmd)) {
  614.       System.err.println("Usage: java DFSAdmin"
  615.                          + " [-finalizeUpgrade]");
  616.     } else if ("-upgradeProgress".equals(cmd)) {
  617.       System.err.println("Usage: java DFSAdmin"
  618.                          + " [-upgradeProgress status | details | force]");
  619.     } else if ("-metasave".equals(cmd)) {
  620.       System.err.println("Usage: java DFSAdmin"
  621.           + " [-metasave filename]");
  622.     } else if (SetQuotaCommand.matches(cmd)) {
  623.       System.err.println("Usage: java DFSAdmin"
  624.                          + " [" + SetQuotaCommand.USAGE+"]");
  625.     } else if (ClearQuotaCommand.matches(cmd)) {
  626.       System.err.println("Usage: java DFSAdmin"
  627.                          + " ["+ClearQuotaCommand.USAGE+"]");
  628.     } else if (SetSpaceQuotaCommand.matches(cmd)) {
  629.       System.err.println("Usage: java DFSAdmin"
  630.                          + " [" + SetSpaceQuotaCommand.USAGE+"]");
  631.     } else if (ClearSpaceQuotaCommand.matches(cmd)) {
  632.       System.err.println("Usage: java DFSAdmin"
  633.                          + " ["+ClearSpaceQuotaCommand.USAGE+"]");
  634.     } else if ("-refreshServiceAcl".equals(cmd)) {
  635.       System.err.println("Usage: java DFSAdmin"
  636.                          + " [-refreshServiceAcl]");
  637.     } else {
  638.       System.err.println("Usage: java DFSAdmin");
  639.       System.err.println("           [-report]");
  640.       System.err.println("           [-safemode enter | leave | get | wait]");
  641.       System.err.println("           [-saveNamespace]");
  642.       System.err.println("           [-refreshNodes]");
  643.       System.err.println("           [-finalizeUpgrade]");
  644.       System.err.println("           [-upgradeProgress status | details | force]");
  645.       System.err.println("           [-metasave filename]");
  646.       System.err.println("           [-refreshServiceAcl]");
  647.       System.err.println("           ["+SetQuotaCommand.USAGE+"]");
  648.       System.err.println("           ["+ClearQuotaCommand.USAGE+"]");
  649.       System.err.println("           ["+SetSpaceQuotaCommand.USAGE+"]");
  650.       System.err.println("           ["+ClearSpaceQuotaCommand.USAGE+"]");      
  651.       System.err.println("           [-help [cmd]]");
  652.       System.err.println();
  653.       ToolRunner.printGenericCommandUsage(System.err);
  654.     }
  655.   }
  656.   /**
  657.    * @param argv The parameters passed to this program.
  658.    * @exception Exception if the filesystem does not exist.
  659.    * @return 0 on success, non zero on error.
  660.    */
  661.   @Override
  662.   public int run(String[] argv) throws Exception {
  663.     if (argv.length < 1) {
  664.       printUsage("");
  665.       return -1;
  666.     }
  667.     int exitCode = -1;
  668.     int i = 0;
  669.     String cmd = argv[i++];
  670.     //
  671.     // verify that we have enough command line parameters
  672.     //
  673.     if ("-safemode".equals(cmd)) {
  674.       if (argv.length != 2) {
  675.         printUsage(cmd);
  676.         return exitCode;
  677.       }
  678.     } else if ("-report".equals(cmd)) {
  679.       if (argv.length != 1) {
  680.         printUsage(cmd);
  681.         return exitCode;
  682.       }
  683.     } else if ("-saveNamespace".equals(cmd)) {
  684.       if (argv.length != 1) {
  685.         printUsage(cmd);
  686.         return exitCode;
  687.       }
  688.     } else if ("-refreshNodes".equals(cmd)) {
  689.       if (argv.length != 1) {
  690.         printUsage(cmd);
  691.         return exitCode;
  692.       }
  693.     } else if ("-finalizeUpgrade".equals(cmd)) {
  694.       if (argv.length != 1) {
  695.         printUsage(cmd);
  696.         return exitCode;
  697.       }
  698.     } else if ("-upgradeProgress".equals(cmd)) {
  699.         if (argv.length != 2) {
  700.           printUsage(cmd);
  701.           return exitCode;
  702.         }
  703.     } else if ("-metasave".equals(cmd)) {
  704.       if (argv.length != 2) {
  705.         printUsage(cmd);
  706.         return exitCode;
  707.       }
  708.     } else if ("-refreshServiceAcl".equals(cmd)) {
  709.       if (argv.length != 1) {
  710.         printUsage(cmd);
  711.         return exitCode;
  712.       }
  713.     }
  714.     
  715.     // initialize DFSAdmin
  716.     try {
  717.       init();
  718.     } catch (RPC.VersionMismatch v) {
  719.       System.err.println("Version Mismatch between client and server"
  720.                          + "... command aborted.");
  721.       return exitCode;
  722.     } catch (IOException e) {
  723.       System.err.println("Bad connection to DFS... command aborted.");
  724.       return exitCode;
  725.     }
  726.     exitCode = 0;
  727.     try {
  728.       if ("-report".equals(cmd)) {
  729.         report();
  730.       } else if ("-safemode".equals(cmd)) {
  731.         setSafeMode(argv, i);
  732.       } else if ("-saveNamespace".equals(cmd)) {
  733.         exitCode = saveNamespace();
  734.       } else if ("-refreshNodes".equals(cmd)) {
  735.         exitCode = refreshNodes();
  736.       } else if ("-finalizeUpgrade".equals(cmd)) {
  737.         exitCode = finalizeUpgrade();
  738.       } else if ("-upgradeProgress".equals(cmd)) {
  739.         exitCode = upgradeProgress(argv, i);
  740.       } else if ("-metasave".equals(cmd)) {
  741.         exitCode = metaSave(argv, i);
  742.       } else if (ClearQuotaCommand.matches(cmd)) {
  743.         exitCode = new ClearQuotaCommand(argv, i, fs).runAll();
  744.       } else if (SetQuotaCommand.matches(cmd)) {
  745.         exitCode = new SetQuotaCommand(argv, i, fs).runAll();
  746.       } else if (ClearSpaceQuotaCommand.matches(cmd)) {
  747.         exitCode = new ClearSpaceQuotaCommand(argv, i, fs).runAll();
  748.       } else if (SetSpaceQuotaCommand.matches(cmd)) {
  749.         exitCode = new SetSpaceQuotaCommand(argv, i, fs).runAll();
  750.       } else if ("-refreshServiceAcl".equals(cmd)) {
  751.         exitCode = refreshServiceAcl();
  752.       } else if ("-help".equals(cmd)) {
  753.         if (i < argv.length) {
  754.           printHelp(argv[i]);
  755.         } else {
  756.           printHelp("");
  757.         }
  758.       } else {
  759.         exitCode = -1;
  760.         System.err.println(cmd.substring(1) + ": Unknown command");
  761.         printUsage("");
  762.       }
  763.     } catch (IllegalArgumentException arge) {
  764.       exitCode = -1;
  765.       System.err.println(cmd.substring(1) + ": " + arge.getLocalizedMessage());
  766.       printUsage(cmd);
  767.     } catch (RemoteException e) {
  768.       //
  769.       // This is a error returned by hadoop server. Print
  770.       // out the first line of the error mesage, ignore the stack trace.
  771.       exitCode = -1;
  772.       try {
  773.         String[] content;
  774.         content = e.getLocalizedMessage().split("n");
  775.         System.err.println(cmd.substring(1) + ": "
  776.                            + content[0]);
  777.       } catch (Exception ex) {
  778.         System.err.println(cmd.substring(1) + ": "
  779.                            + ex.getLocalizedMessage());
  780.       }
  781.     } catch (Exception e) {
  782.       exitCode = -1;
  783.       System.err.println(cmd.substring(1) + ": "
  784.                          + e.getLocalizedMessage());
  785.     } 
  786.     return exitCode;
  787.   }
  788.   /**
  789.    * main() has some simple utility methods.
  790.    * @param argv Command line parameters.
  791.    * @exception Exception if the filesystem does not exist.
  792.    */
  793.   public static void main(String[] argv) throws Exception {
  794.     int res = ToolRunner.run(new DFSAdmin(), argv);
  795.     System.exit(res);
  796.   }
  797. }