浏览代码

HDFS-13307. RBF: Improve the use of setQuota command. Contributed by liuhongtong.

Yiqun Lin 7 年之前
父节点
当前提交
2c6a7b3607

+ 24 - 11
hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java

@@ -453,7 +453,8 @@ public class RouterAdmin extends Configured implements Tool {
         try {
           nsQuota = Long.parseLong(parameters[i]);
         } catch (Exception e) {
-          System.err.println("Cannot parse nsQuota: " + parameters[i]);
+          throw new IllegalArgumentException(
+              "Cannot parse nsQuota: " + parameters[i]);
         }
       } else if (parameters[i].equals("-ssQuota")) {
         i++;
@@ -461,7 +462,8 @@ public class RouterAdmin extends Configured implements Tool {
           ssQuota = StringUtils.TraditionalBinaryPrefix
               .string2long(parameters[i]);
         } catch (Exception e) {
-          System.err.println("Cannot parse ssQuota: " + parameters[i]);
+          throw new IllegalArgumentException(
+              "Cannot parse ssQuota: " + parameters[i]);
         }
       }
 
@@ -469,8 +471,14 @@ public class RouterAdmin extends Configured implements Tool {
     }
 
     if (nsQuota <= 0 || ssQuota <= 0) {
-      System.err.println("Input quota value should be a positive number.");
-      return false;
+      throw new IllegalArgumentException(
+          "Input quota value should be a positive number.");
+    }
+
+    if (nsQuota == HdfsConstants.QUOTA_DONT_SET &&
+        ssQuota == HdfsConstants.QUOTA_DONT_SET) {
+      throw new IllegalArgumentException(
+          "Must specify at least one of -nsQuota and -ssQuota.");
     }
 
     return updateQuota(mount, nsQuota, ssQuota);
@@ -515,18 +523,23 @@ public class RouterAdmin extends Configured implements Tool {
     }
 
     if (existingEntry == null) {
-      return false;
+      throw new IOException(mount + " doesn't exist in mount table.");
     } else {
       long nsCount = existingEntry.getQuota().getFileAndDirectoryCount();
       long ssCount = existingEntry.getQuota().getSpaceConsumed();
-      // If nsQuota or ssQuota was unset, reset corresponding usage
-      // value to zero.
-      if (nsQuota == HdfsConstants.QUOTA_DONT_SET) {
+      // If nsQuota and ssQuota were unset, clear nsQuota and ssQuota.
+      if (nsQuota == HdfsConstants.QUOTA_DONT_SET &&
+          ssQuota == HdfsConstants.QUOTA_DONT_SET) {
         nsCount = RouterQuotaUsage.QUOTA_USAGE_COUNT_DEFAULT;
-      }
-
-      if (nsQuota == HdfsConstants.QUOTA_DONT_SET) {
         ssCount = RouterQuotaUsage.QUOTA_USAGE_COUNT_DEFAULT;
+      } else {
+        // If nsQuota or ssQuota was unset, use the value in mount table.
+        if (nsQuota == HdfsConstants.QUOTA_DONT_SET) {
+          nsQuota = existingEntry.getQuota().getQuota();
+        }
+        if (ssQuota == HdfsConstants.QUOTA_DONT_SET) {
+          ssQuota = existingEntry.getQuota().getSpaceQuota();
+        }
       }
 
       RouterQuotaUsage updatedQuota = new RouterQuotaUsage.Builder()

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java

@@ -381,6 +381,8 @@ public class TestRouterAdminCLI {
         .getMountTableEntries(getRequest);
     mountTable = getResponse.getEntries().get(0);
     quotaUsage = mountTable.getQuota();
+    // verify if ns quota keeps quondam value
+    assertEquals(nsQuota, quotaUsage.getQuota());
     // verify if ss quota is correctly set
     assertEquals(2 * 1024 * 1024, quotaUsage.getSpaceQuota());