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

网格计算

开发平台:

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;
  19. import java.io.OutputStream;
  20. import org.apache.hadoop.conf.Configuration;
  21. import org.apache.hadoop.fs.ContentSummary;
  22. import org.apache.hadoop.fs.FileSystem;
  23. import org.apache.hadoop.fs.Path;
  24. import org.apache.hadoop.hdfs.protocol.FSConstants;
  25. import org.apache.hadoop.hdfs.protocol.QuotaExceededException;
  26. import org.apache.hadoop.hdfs.tools.DFSAdmin;
  27. import org.apache.hadoop.io.IOUtils;
  28. import org.apache.hadoop.security.UnixUserGroupInformation;
  29. import junit.framework.TestCase;
  30. /** A class for testing quota-related commands */
  31. public class TestQuota extends TestCase {
  32.   
  33.   private void runCommand(DFSAdmin admin, boolean expectError, String... args) 
  34.                          throws Exception {
  35.     runCommand(admin, args, expectError);
  36.   }
  37.   
  38.   private void runCommand(DFSAdmin admin, String args[], boolean expectEror)
  39.   throws Exception {
  40.     int val = admin.run(args);
  41.     if (expectEror) {
  42.       assertEquals(val, -1);
  43.     } else {
  44.       assertTrue(val>=0);
  45.     }
  46.   }
  47.   
  48.   /** Test quota related commands: 
  49.    *    setQuota, clrQuota, setSpaceQuota, clrSpaceQuota, and count 
  50.    */
  51.   public void testQuotaCommands() throws Exception {
  52.     final Configuration conf = new Configuration();
  53.     // set a smaller block size so that we can test with smaller 
  54.     // Space quotas
  55.     conf.set("dfs.block.size", "512");
  56.     conf.setBoolean("dfs.support.append", true);
  57.     final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  58.     final FileSystem fs = cluster.getFileSystem();
  59.     assertTrue("Not a HDFS: "+fs.getUri(),
  60.                 fs instanceof DistributedFileSystem);
  61.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  62.     DFSAdmin admin = new DFSAdmin(conf);
  63.     
  64.     try {
  65.       final int fileLen = 1024;
  66.       final short replication = 5;
  67.       final long spaceQuota = fileLen * replication * 15 / 8;
  68.       // 1: create a directory /test and set its quota to be 3
  69.       final Path parent = new Path("/test");
  70.       assertTrue(dfs.mkdirs(parent));
  71.       String[] args = new String[]{"-setQuota", "3", parent.toString()};
  72.       runCommand(admin, args, false);
  73.       //try setting space quota with a 'binary prefix'
  74.       runCommand(admin, false, "-setSpaceQuota", "2t", parent.toString());
  75.       assertEquals(2L<<40, dfs.getContentSummary(parent).getSpaceQuota());
  76.       
  77.       // set diskspace quota to 10000 
  78.       runCommand(admin, false, "-setSpaceQuota", 
  79.                  Long.toString(spaceQuota), parent.toString());
  80.       
  81.       // 2: create directory /test/data0
  82.       final Path childDir0 = new Path(parent, "data0");
  83.       assertTrue(dfs.mkdirs(childDir0));
  84.       // 3: create a file /test/datafile0
  85.       final Path childFile0 = new Path(parent, "datafile0");
  86.       DFSTestUtil.createFile(fs, childFile0, fileLen, replication, 0);
  87.       
  88.       // 4: count -q /test
  89.       ContentSummary c = dfs.getContentSummary(parent);
  90.       assertEquals(c.getFileCount()+c.getDirectoryCount(), 3);
  91.       assertEquals(c.getQuota(), 3);
  92.       assertEquals(c.getSpaceConsumed(), fileLen*replication);
  93.       assertEquals(c.getSpaceQuota(), spaceQuota);
  94.       
  95.       // 5: count -q /test/data0
  96.       c = dfs.getContentSummary(childDir0);
  97.       assertEquals(c.getFileCount()+c.getDirectoryCount(), 1);
  98.       assertEquals(c.getQuota(), -1);
  99.       // check disk space consumed
  100.       c = dfs.getContentSummary(parent);
  101.       assertEquals(c.getSpaceConsumed(), fileLen*replication);
  102.       // 6: create a directory /test/data1
  103.       final Path childDir1 = new Path(parent, "data1");
  104.       boolean hasException = false;
  105.       try {
  106.         assertFalse(dfs.mkdirs(childDir1));
  107.       } catch (QuotaExceededException e) {
  108.         hasException = true;
  109.       }
  110.       assertTrue(hasException);
  111.       
  112.       OutputStream fout;
  113.       
  114.       // 7: create a file /test/datafile1
  115.       final Path childFile1 = new Path(parent, "datafile1");
  116.       hasException = false;
  117.       try {
  118.         fout = dfs.create(childFile1);
  119.       } catch (QuotaExceededException e) {
  120.         hasException = true;
  121.       }
  122.       assertTrue(hasException);
  123.       
  124.       // 8: clear quota /test
  125.       runCommand(admin, new String[]{"-clrQuota", parent.toString()}, false);
  126.       c = dfs.getContentSummary(parent);
  127.       assertEquals(c.getQuota(), -1);
  128.       assertEquals(c.getSpaceQuota(), spaceQuota);
  129.       
  130.       // 9: clear quota /test/data0
  131.       runCommand(admin, new String[]{"-clrQuota", childDir0.toString()}, false);
  132.       c = dfs.getContentSummary(childDir0);
  133.       assertEquals(c.getQuota(), -1);
  134.       
  135.       // 10: create a file /test/datafile1
  136.       fout = dfs.create(childFile1, replication);
  137.       
  138.       // 10.s: but writing fileLen bytes should result in an quota exception
  139.       hasException = false;
  140.       try {
  141.         fout.write(new byte[fileLen]);
  142.         fout.close();
  143.       } catch (QuotaExceededException e) {
  144.         hasException = true;
  145.         IOUtils.closeStream(fout);
  146.       }
  147.       assertTrue(hasException);
  148.       
  149.       //delete the file
  150.       dfs.delete(childFile1, false);
  151.       
  152.       // 9.s: clear diskspace quota
  153.       runCommand(admin, false, "-clrSpaceQuota", parent.toString());
  154.       c = dfs.getContentSummary(parent);
  155.       assertEquals(c.getQuota(), -1);
  156.       assertEquals(c.getSpaceQuota(), -1);       
  157.       
  158.       // now creating childFile1 should succeed
  159.       DFSTestUtil.createFile(dfs, childFile1, fileLen, replication, 0);
  160.       
  161.       // 11: set the quota of /test to be 1
  162.       args = new String[]{"-setQuota", "1", parent.toString()};
  163.       runCommand(admin, args, true);
  164.       runCommand(admin, true, "-setSpaceQuota",  // for space quota
  165.                  Integer.toString(fileLen), args[2]);
  166.       
  167.       // 12: set the quota of /test/data0 to be 1
  168.       args = new String[]{"-setQuota", "1", childDir0.toString()};
  169.       runCommand(admin, args, false);
  170.       
  171.       // 13: not able create a directory under data0
  172.       hasException = false;
  173.       try {
  174.         assertFalse(dfs.mkdirs(new Path(childDir0, "in")));
  175.       } catch (QuotaExceededException e) {
  176.         hasException = true;
  177.       }
  178.       assertTrue(hasException);
  179.       c = dfs.getContentSummary(childDir0);
  180.       assertEquals(c.getDirectoryCount()+c.getFileCount(), 1);
  181.       assertEquals(c.getQuota(), 1);
  182.       
  183.       // 14a: set quota on a non-existent directory
  184.       Path nonExistentPath = new Path("/test1");
  185.       assertFalse(dfs.exists(nonExistentPath));
  186.       args = new String[]{"-setQuota", "1", nonExistentPath.toString()};
  187.       runCommand(admin, args, true);
  188.       runCommand(admin, true, "-setSpaceQuota", "1g", // for space quota
  189.                  nonExistentPath.toString());
  190.       
  191.       // 14b: set quota on a file
  192.       assertTrue(dfs.isFile(childFile0));
  193.       args[1] = childFile0.toString();
  194.       runCommand(admin, args, true);
  195.       // same for space quota
  196.       runCommand(admin, true, "-setSpaceQuota", "1t", args[1]);
  197.       
  198.       // 15a: clear quota on a file
  199.       args[0] = "-clrQuota";
  200.       runCommand(admin, args, true);
  201.       runCommand(admin, true, "-clrSpaceQuota", args[1]);
  202.       
  203.       // 15b: clear quota on a non-existent directory
  204.       args[1] = nonExistentPath.toString();
  205.       runCommand(admin, args, true);
  206.       runCommand(admin, true, "-clrSpaceQuota", args[1]);
  207.       
  208.       // 16a: set the quota of /test to be 0
  209.       args = new String[]{"-setQuota", "0", parent.toString()};
  210.       runCommand(admin, args, true);
  211.       runCommand(admin, true, "-setSpaceQuota", "0", args[2]);
  212.       
  213.       // 16b: set the quota of /test to be -1
  214.       args[1] = "-1";
  215.       runCommand(admin, args, true);
  216.       runCommand(admin, true, "-setSpaceQuota", args[1], args[2]);
  217.       
  218.       // 16c: set the quota of /test to be Long.MAX_VALUE+1
  219.       args[1] = String.valueOf(Long.MAX_VALUE+1L);
  220.       runCommand(admin, args, true);
  221.       runCommand(admin, true, "-setSpaceQuota", args[1], args[2]);
  222.       
  223.       // 16d: set the quota of /test to be a non integer
  224.       args[1] = "33aa1.5";
  225.       runCommand(admin, args, true);
  226.       runCommand(admin, true, "-setSpaceQuota", args[1], args[2]);
  227.       
  228.       // 16e: set space quota with a value larger than Long.MAX_VALUE
  229.       runCommand(admin, true, "-setSpaceQuota", 
  230.                  (Long.MAX_VALUE/1024/1024 + 1024) + "m", args[2]);
  231.       
  232.       // 17:  setQuota by a non-administrator
  233.       UnixUserGroupInformation.saveToConf(conf, 
  234.           UnixUserGroupInformation.UGI_PROPERTY_NAME, 
  235.           new UnixUserGroupInformation(new String[]{"userxxn", "groupyyn"}));
  236.       DFSAdmin userAdmin = new DFSAdmin(conf);
  237.       args[1] = "100";
  238.       runCommand(userAdmin, args, true);
  239.       runCommand(userAdmin, true, "-setSpaceQuota", "1g", args[2]);
  240.       
  241.       // 18: clrQuota by a non-administrator
  242.       args = new String[] {"-clrQuota", parent.toString()};
  243.       runCommand(userAdmin, args, true);
  244.       runCommand(userAdmin, true, "-clrSpaceQuota",  args[1]);      
  245.     } finally {
  246.       cluster.shutdown();
  247.     }
  248.   }
  249.   
  250.   /** Test commands that change the size of the name space:
  251.    *  mkdirs, rename, and delete */
  252.   public void testNamespaceCommands() throws Exception {
  253.     final Configuration conf = new Configuration();
  254.     final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  255.     final FileSystem fs = cluster.getFileSystem();
  256.     assertTrue("Not a HDFS: "+fs.getUri(),
  257.                 fs instanceof DistributedFileSystem);
  258.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  259.     
  260.     try {
  261.       // 1: create directory /nqdir0/qdir1/qdir20/nqdir30
  262.       assertTrue(dfs.mkdirs(new Path("/nqdir0/qdir1/qdir20/nqdir30")));
  263.       // 2: set the quota of /nqdir0/qdir1 to be 6
  264.       final Path quotaDir1 = new Path("/nqdir0/qdir1");
  265.       dfs.setQuota(quotaDir1, 6, FSConstants.QUOTA_DONT_SET);
  266.       ContentSummary c = dfs.getContentSummary(quotaDir1);
  267.       assertEquals(c.getDirectoryCount(), 3);
  268.       assertEquals(c.getQuota(), 6);
  269.       // 3: set the quota of /nqdir0/qdir1/qdir20 to be 7
  270.       final Path quotaDir2 = new Path("/nqdir0/qdir1/qdir20");
  271.       dfs.setQuota(quotaDir2, 7, FSConstants.QUOTA_DONT_SET);
  272.       c = dfs.getContentSummary(quotaDir2);
  273.       assertEquals(c.getDirectoryCount(), 2);
  274.       assertEquals(c.getQuota(), 7);
  275.       // 4: Create directory /nqdir0/qdir1/qdir21 and set its quota to 2
  276.       final Path quotaDir3 = new Path("/nqdir0/qdir1/qdir21");
  277.       assertTrue(dfs.mkdirs(quotaDir3));
  278.       dfs.setQuota(quotaDir3, 2, FSConstants.QUOTA_DONT_SET);
  279.       c = dfs.getContentSummary(quotaDir3);
  280.       assertEquals(c.getDirectoryCount(), 1);
  281.       assertEquals(c.getQuota(), 2);
  282.       // 5: Create directory /nqdir0/qdir1/qdir21/nqdir32
  283.       Path tempPath = new Path(quotaDir3, "nqdir32");
  284.       assertTrue(dfs.mkdirs(tempPath));
  285.       c = dfs.getContentSummary(quotaDir3);
  286.       assertEquals(c.getDirectoryCount(), 2);
  287.       assertEquals(c.getQuota(), 2);
  288.       // 6: Create directory /nqdir0/qdir1/qdir21/nqdir33
  289.       tempPath = new Path(quotaDir3, "nqdir33");
  290.       boolean hasException = false;
  291.       try {
  292.         assertFalse(dfs.mkdirs(tempPath));
  293.       } catch (QuotaExceededException e) {
  294.         hasException = true;
  295.       }
  296.       assertTrue(hasException);
  297.       c = dfs.getContentSummary(quotaDir3);
  298.       assertEquals(c.getDirectoryCount(), 2);
  299.       assertEquals(c.getQuota(), 2);
  300.       // 7: Create directory /nqdir0/qdir1/qdir20/nqdir31
  301.       tempPath = new Path(quotaDir2, "nqdir31");
  302.       assertTrue(dfs.mkdirs(tempPath));
  303.       c = dfs.getContentSummary(quotaDir2);
  304.       assertEquals(c.getDirectoryCount(), 3);
  305.       assertEquals(c.getQuota(), 7);
  306.       c = dfs.getContentSummary(quotaDir1);
  307.       assertEquals(c.getDirectoryCount(), 6);
  308.       assertEquals(c.getQuota(), 6);
  309.       // 8: Create directory /nqdir0/qdir1/qdir20/nqdir33
  310.       tempPath = new Path(quotaDir2, "nqdir33");
  311.       hasException = false;
  312.       try {
  313.         assertFalse(dfs.mkdirs(tempPath));
  314.       } catch (QuotaExceededException e) {
  315.         hasException = true;
  316.       }
  317.       assertTrue(hasException);
  318.       // 9: Move /nqdir0/qdir1/qdir21/nqdir32 /nqdir0/qdir1/qdir20/nqdir30
  319.       tempPath = new Path(quotaDir2, "nqdir30");
  320.       dfs.rename(new Path(quotaDir3, "nqdir32"), tempPath);
  321.       c = dfs.getContentSummary(quotaDir2);
  322.       assertEquals(c.getDirectoryCount(), 4);
  323.       assertEquals(c.getQuota(), 7);
  324.       c = dfs.getContentSummary(quotaDir1);
  325.       assertEquals(c.getDirectoryCount(), 6);
  326.       assertEquals(c.getQuota(), 6);
  327.       // 10: Move /nqdir0/qdir1/qdir20/nqdir30 to /nqdir0/qdir1/qdir21
  328.       hasException = false;
  329.       try {
  330.         assertFalse(dfs.rename(tempPath, quotaDir3));
  331.       } catch (QuotaExceededException e) {
  332.         hasException = true;
  333.       }
  334.       assertTrue(hasException);
  335.       assertTrue(dfs.exists(tempPath));
  336.       assertFalse(dfs.exists(new Path(quotaDir3, "nqdir30")));
  337.       
  338.       // 10.a: Rename /nqdir0/qdir1/qdir20/nqdir30 to /nqdir0/qdir1/qdir21/nqdir32
  339.       hasException = false;
  340.       try {
  341.         assertFalse(dfs.rename(tempPath, new Path(quotaDir3, "nqdir32")));
  342.       } catch (QuotaExceededException e) {
  343.         hasException = true;
  344.       }
  345.       assertTrue(hasException);
  346.       assertTrue(dfs.exists(tempPath));
  347.       assertFalse(dfs.exists(new Path(quotaDir3, "nqdir32")));
  348.       // 11: Move /nqdir0/qdir1/qdir20/nqdir30 to /nqdir0
  349.       assertTrue(dfs.rename(tempPath, new Path("/nqdir0")));
  350.       c = dfs.getContentSummary(quotaDir2);
  351.       assertEquals(c.getDirectoryCount(), 2);
  352.       assertEquals(c.getQuota(), 7);
  353.       c = dfs.getContentSummary(quotaDir1);
  354.       assertEquals(c.getDirectoryCount(), 4);
  355.       assertEquals(c.getQuota(), 6);
  356.       // 12: Create directory /nqdir0/nqdir30/nqdir33
  357.       assertTrue(dfs.mkdirs(new Path("/nqdir0/nqdir30/nqdir33")));
  358.       // 13: Move /nqdir0/nqdir30 /nqdir0/qdir1/qdir20/qdir30
  359.       hasException = false;
  360.       try {
  361.         assertFalse(dfs.rename(new Path("/nqdir0/nqdir30"), tempPath));
  362.       } catch (QuotaExceededException e) {
  363.         hasException = true;
  364.       }
  365.       assertTrue(hasException);
  366.       // 14: Move /nqdir0/qdir1/qdir21 /nqdir0/qdir1/qdir20
  367.       assertTrue(dfs.rename(quotaDir3, quotaDir2));
  368.       c = dfs.getContentSummary(quotaDir1);
  369.       assertEquals(c.getDirectoryCount(), 4);
  370.       assertEquals(c.getQuota(), 6);
  371.       c = dfs.getContentSummary(quotaDir2);
  372.       assertEquals(c.getDirectoryCount(), 3);
  373.       assertEquals(c.getQuota(), 7);
  374.       tempPath = new Path(quotaDir2, "qdir21");
  375.       c = dfs.getContentSummary(tempPath);
  376.       assertEquals(c.getDirectoryCount(), 1);
  377.       assertEquals(c.getQuota(), 2);
  378.       // 15: Delete /nqdir0/qdir1/qdir20/qdir21
  379.       dfs.delete(tempPath, true);
  380.       c = dfs.getContentSummary(quotaDir2);
  381.       assertEquals(c.getDirectoryCount(), 2);
  382.       assertEquals(c.getQuota(), 7);
  383.       c = dfs.getContentSummary(quotaDir1);
  384.       assertEquals(c.getDirectoryCount(), 3);
  385.       assertEquals(c.getQuota(), 6);
  386.       // 16: Move /nqdir0/qdir30 /nqdir0/qdir1/qdir20
  387.       assertTrue(dfs.rename(new Path("/nqdir0/nqdir30"), quotaDir2));
  388.       c = dfs.getContentSummary(quotaDir2);
  389.       assertEquals(c.getDirectoryCount(), 5);
  390.       assertEquals(c.getQuota(), 7);
  391.       c = dfs.getContentSummary(quotaDir1);
  392.       assertEquals(c.getDirectoryCount(), 6);
  393.       assertEquals(c.getQuota(), 6);
  394.     } finally {
  395.       cluster.shutdown();
  396.     }
  397.   }
  398.   
  399.   /**
  400.    * Test HDFS operations that change disk space consumed by a directory tree.
  401.    * namely create, rename, delete, append, and setReplication.
  402.    * 
  403.    * This is based on testNamespaceCommands() above.
  404.    */
  405.   public void testSpaceCommands() throws Exception {
  406.     final Configuration conf = new Configuration();
  407.     // set a smaller block size so that we can test with smaller 
  408.     // diskspace quotas
  409.     conf.set("dfs.block.size", "512");
  410.     conf.setBoolean("dfs.support.append", true);
  411.     final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  412.     final FileSystem fs = cluster.getFileSystem();
  413.     assertTrue("Not a HDFS: "+fs.getUri(),
  414.                 fs instanceof DistributedFileSystem);
  415.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  416.     try {
  417.       int fileLen = 1024;
  418.       short replication = 3;
  419.       int fileSpace = fileLen * replication;
  420.       
  421.       // create directory /nqdir0/qdir1/qdir20/nqdir30
  422.       assertTrue(dfs.mkdirs(new Path("/nqdir0/qdir1/qdir20/nqdir30")));
  423.       // set the quota of /nqdir0/qdir1 to 4 * fileSpace 
  424.       final Path quotaDir1 = new Path("/nqdir0/qdir1");
  425.       dfs.setQuota(quotaDir1, FSConstants.QUOTA_DONT_SET, 4 * fileSpace);
  426.       ContentSummary c = dfs.getContentSummary(quotaDir1);
  427.       assertEquals(c.getSpaceQuota(), 4 * fileSpace);
  428.       
  429.       // set the quota of /nqdir0/qdir1/qdir20 to 6 * fileSpace 
  430.       final Path quotaDir20 = new Path("/nqdir0/qdir1/qdir20");
  431.       dfs.setQuota(quotaDir20, FSConstants.QUOTA_DONT_SET, 6 * fileSpace);
  432.       c = dfs.getContentSummary(quotaDir20);
  433.       assertEquals(c.getSpaceQuota(), 6 * fileSpace);
  434.       // Create /nqdir0/qdir1/qdir21 and set its space quota to 2 * fileSpace
  435.       final Path quotaDir21 = new Path("/nqdir0/qdir1/qdir21");
  436.       assertTrue(dfs.mkdirs(quotaDir21));
  437.       dfs.setQuota(quotaDir21, FSConstants.QUOTA_DONT_SET, 2 * fileSpace);
  438.       c = dfs.getContentSummary(quotaDir21);
  439.       assertEquals(c.getSpaceQuota(), 2 * fileSpace);
  440.       // 5: Create directory /nqdir0/qdir1/qdir21/nqdir32
  441.       Path tempPath = new Path(quotaDir21, "nqdir32");
  442.       assertTrue(dfs.mkdirs(tempPath));
  443.       
  444.       // create a file under nqdir32/fileDir
  445.       DFSTestUtil.createFile(dfs, new Path(tempPath, "fileDir/file1"), fileLen, 
  446.                              replication, 0);
  447.       c = dfs.getContentSummary(quotaDir21);
  448.       assertEquals(c.getSpaceConsumed(), fileSpace);
  449.       
  450.       // Create a larger file /nqdir0/qdir1/qdir21/nqdir33/
  451.       boolean hasException = false;
  452.       try {
  453.         DFSTestUtil.createFile(dfs, new Path(quotaDir21, "nqdir33/file2"), 
  454.                                2*fileLen, replication, 0);
  455.       } catch (QuotaExceededException e) {
  456.         hasException = true;
  457.       }
  458.       assertTrue(hasException);
  459.       // delete nqdir33
  460.       assertTrue(dfs.delete(new Path(quotaDir21, "nqdir33"), true));
  461.       c = dfs.getContentSummary(quotaDir21);
  462.       assertEquals(c.getSpaceConsumed(), fileSpace);
  463.       assertEquals(c.getSpaceQuota(), 2*fileSpace);
  464.       // Verify space before the move:
  465.       c = dfs.getContentSummary(quotaDir20);
  466.       assertEquals(c.getSpaceConsumed(), 0);
  467.       
  468.       // Move /nqdir0/qdir1/qdir21/nqdir32 /nqdir0/qdir1/qdir20/nqdir30
  469.       Path dstPath = new Path(quotaDir20, "nqdir30");
  470.       Path srcPath = new Path(quotaDir21, "nqdir32");
  471.       assertTrue(dfs.rename(srcPath, dstPath));
  472.       
  473.       // verify space after the move
  474.       c = dfs.getContentSummary(quotaDir20);
  475.       assertEquals(c.getSpaceConsumed(), fileSpace);
  476.       // verify space for its parent
  477.       c = dfs.getContentSummary(quotaDir1);
  478.       assertEquals(c.getSpaceConsumed(), fileSpace);
  479.       // verify space for source for the move
  480.       c = dfs.getContentSummary(quotaDir21);
  481.       assertEquals(c.getSpaceConsumed(), 0);
  482.       
  483.       final Path file2 = new Path(dstPath, "fileDir/file2");
  484.       int file2Len = 2 * fileLen;
  485.       // create a larger file under /nqdir0/qdir1/qdir20/nqdir30
  486.       DFSTestUtil.createFile(dfs, file2, file2Len, replication, 0);
  487.       
  488.       c = dfs.getContentSummary(quotaDir20);
  489.       assertEquals(c.getSpaceConsumed(), 3 * fileSpace);
  490.       c = dfs.getContentSummary(quotaDir21);
  491.       assertEquals(c.getSpaceConsumed(), 0);
  492.       
  493.       // Reverse: Move /nqdir0/qdir1/qdir20/nqdir30 to /nqdir0/qdir1/qdir21/
  494.       hasException = false;
  495.       try {
  496.         assertFalse(dfs.rename(dstPath, srcPath));
  497.       } catch (QuotaExceededException e) {
  498.         hasException = true;
  499.       }
  500.       assertTrue(hasException);
  501.       
  502.       // make sure no intermediate directories left by failed rename
  503.       assertFalse(dfs.exists(srcPath));
  504.       // directory should exist
  505.       assertTrue(dfs.exists(dstPath));
  506.             
  507.       // verify space after the failed move
  508.       c = dfs.getContentSummary(quotaDir20);
  509.       assertEquals(c.getSpaceConsumed(), 3 * fileSpace);
  510.       c = dfs.getContentSummary(quotaDir21);
  511.       assertEquals(c.getSpaceConsumed(), 0);
  512.       
  513.       // Test Append :
  514.       
  515.       // verify space quota
  516.       c = dfs.getContentSummary(quotaDir1);
  517.       assertEquals(c.getSpaceQuota(), 4 * fileSpace);
  518.       
  519.       // verify space before append;
  520.       c = dfs.getContentSummary(dstPath);
  521.       assertEquals(c.getSpaceConsumed(), 3 * fileSpace);
  522.       
  523.       OutputStream out = dfs.append(file2);
  524.       // appending 1 fileLen should succeed
  525.       out.write(new byte[fileLen]);
  526.       out.close();
  527.       
  528.       file2Len += fileLen; // after append
  529.       
  530.       // verify space after append;
  531.       c = dfs.getContentSummary(dstPath);
  532.       assertEquals(c.getSpaceConsumed(), 4 * fileSpace);
  533.       
  534.       // now increase the quota for quotaDir1
  535.       dfs.setQuota(quotaDir1, FSConstants.QUOTA_DONT_SET, 5 * fileSpace);
  536.       // Now, appending more than 1 fileLen should result in an error
  537.       out = dfs.append(file2);
  538.       hasException = false;
  539.       try {
  540.         out.write(new byte[fileLen + 1024]);
  541.         out.flush();
  542.         out.close();
  543.       } catch (QuotaExceededException e) {
  544.         hasException = true;
  545.         IOUtils.closeStream(out);
  546.       }
  547.       assertTrue(hasException);
  548.       
  549.       file2Len += fileLen; // after partial append
  550.       
  551.       // verify space after partial append
  552.       c = dfs.getContentSummary(dstPath);
  553.       assertEquals(c.getSpaceConsumed(), 5 * fileSpace);
  554.       
  555.       // Test set replication :
  556.       
  557.       // first reduce the replication
  558.       dfs.setReplication(file2, (short)(replication-1));
  559.       
  560.       // verify that space is reduced by file2Len
  561.       c = dfs.getContentSummary(dstPath);
  562.       assertEquals(c.getSpaceConsumed(), 5 * fileSpace - file2Len);
  563.       
  564.       // now try to increase the replication and and expect an error.
  565.       hasException = false;
  566.       try {
  567.         dfs.setReplication(file2, (short)(replication+1));
  568.       } catch (QuotaExceededException e) {
  569.         hasException = true;
  570.       }
  571.       assertTrue(hasException);
  572.       // verify space consumed remains unchanged.
  573.       c = dfs.getContentSummary(dstPath);
  574.       assertEquals(c.getSpaceConsumed(), 5 * fileSpace - file2Len);
  575.       
  576.       // now increase the quota for quotaDir1 and quotaDir20
  577.       dfs.setQuota(quotaDir1, FSConstants.QUOTA_DONT_SET, 10 * fileSpace);
  578.       dfs.setQuota(quotaDir20, FSConstants.QUOTA_DONT_SET, 10 * fileSpace);
  579.       
  580.       // then increasing replication should be ok.
  581.       dfs.setReplication(file2, (short)(replication+1));
  582.       // verify increase in space
  583.       c = dfs.getContentSummary(dstPath);
  584.       assertEquals(c.getSpaceConsumed(), 5 * fileSpace + file2Len);
  585.       
  586.     } finally {
  587.       cluster.shutdown();
  588.     }
  589.   }
  590. }