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

网格计算

开发平台:

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.server.namenode;
  19. import org.apache.hadoop.fs.permission.PermissionStatus;
  20. import org.apache.hadoop.hdfs.protocol.QuotaExceededException;
  21. /**
  22.  * Directory INode class that has a quota restriction
  23.  */
  24. class INodeDirectoryWithQuota extends INodeDirectory {
  25.   private long nsQuota; /// NameSpace quota
  26.   private long nsCount;
  27.   private long dsQuota; /// disk space quota
  28.   private long diskspace;
  29.   
  30.   /** Convert an existing directory inode to one with the given quota
  31.    * 
  32.    * @param nsQuota Namespace quota to be assigned to this inode
  33.    * @param dsQuota Diskspace quota to be assigned to this indoe
  34.    * @param other The other inode from which all other properties are copied
  35.    */
  36.   INodeDirectoryWithQuota(long nsQuota, long dsQuota, INodeDirectory other)
  37.   throws QuotaExceededException {
  38.     super(other);
  39.     INode.DirCounts counts = new INode.DirCounts();
  40.     other.spaceConsumedInTree(counts);
  41.     this.nsCount= counts.getNsCount();
  42.     this.diskspace = counts.getDsCount();
  43.     setQuota(nsQuota, dsQuota);
  44.   }
  45.   
  46.   /** constructor with no quota verification */
  47.   INodeDirectoryWithQuota(
  48.       PermissionStatus permissions, long modificationTime, 
  49.       long nsQuota, long dsQuota)
  50.   {
  51.     super(permissions, modificationTime);
  52.     this.nsQuota = nsQuota;
  53.     this.dsQuota = dsQuota;
  54.     this.nsCount = 1;
  55.   }
  56.   
  57.   /** constructor with no quota verification */
  58.   INodeDirectoryWithQuota(String name, PermissionStatus permissions, 
  59.                           long nsQuota, long dsQuota)
  60.   {
  61.     super(name, permissions);
  62.     this.nsQuota = nsQuota;
  63.     this.dsQuota = dsQuota;
  64.     this.nsCount = 1;
  65.   }
  66.   
  67.   /** Get this directory's namespace quota
  68.    * @return this directory's namespace quota
  69.    */
  70.   long getNsQuota() {
  71.     return nsQuota;
  72.   }
  73.   
  74.   /** Get this directory's diskspace quota
  75.    * @return this directory's diskspace quota
  76.    */
  77.   long getDsQuota() {
  78.     return dsQuota;
  79.   }
  80.   
  81.   /** Set this directory's quota
  82.    * 
  83.    * @param nsQuota Namespace quota to be set
  84.    * @param dsQuota diskspace quota to be set
  85.    * @throws QuotaExceededException if quota is modified and the modified quota
  86.    *         is too low.
  87.    *                                
  88.    */
  89.   void setQuota(long newNsQuota, long newDsQuota) throws QuotaExceededException {
  90.     // if a quota is not chaged, ignore that in verification.
  91.     if ((newNsQuota >=0 && newNsQuota != nsQuota && newNsQuota < nsCount)  ||
  92.         (newDsQuota >=0 && newDsQuota != dsQuota && newDsQuota < diskspace)) {
  93.       throw new QuotaExceededException(newNsQuota, nsCount, 
  94.                                        newDsQuota, diskspace);
  95.     }
  96.     nsQuota = newNsQuota;
  97.     dsQuota = newDsQuota;
  98.   }
  99.   
  100.   
  101.   @Override
  102.   DirCounts spaceConsumedInTree(DirCounts counts) {
  103.     counts.nsCount += nsCount;
  104.     counts.dsCount += diskspace;
  105.     return counts;
  106.   }
  107.   /** Get the number of names in the subtree rooted at this directory
  108.    * @return the size of the subtree rooted at this directory
  109.    */
  110.   long numItemsInTree() {
  111.     return nsCount;
  112.   }
  113.   
  114.   long diskspaceConsumed() {
  115.     return diskspace;
  116.   }
  117.   
  118.   /** Update the size of the tree
  119.    * 
  120.    * @param nsDelta the change of the tree size
  121.    * @param dsDelta change to disk space occupied
  122.    * @throws QuotaExceededException if the changed size is greater 
  123.    *                                than the quota
  124.    */
  125.   void updateNumItemsInTree(long nsDelta, long dsDelta) throws 
  126.                             QuotaExceededException {
  127.     long newCount = nsCount + nsDelta;
  128.     long newDiskspace = diskspace + dsDelta;
  129.     if (nsDelta>0 || dsDelta>0) {
  130.       verifyQuota(nsQuota, newCount, dsQuota, newDiskspace);
  131.     }
  132.     nsCount = newCount;
  133.     diskspace = newDiskspace;
  134.   }
  135.   
  136.   /** 
  137.    * Sets namespace and diskspace take by the directory rooted 
  138.    * at this INode. This should be used carefully. It does not check 
  139.    * for quota violations.
  140.    * 
  141.    * @param namespace size of the directory to be set
  142.    * @param diskspace disk space take by all the nodes under this directory
  143.    */
  144.   void setSpaceConsumed(long namespace, long diskspace) {
  145.     this.nsCount = namespace;
  146.     this.diskspace = diskspace;
  147.   }
  148.   
  149.   /** Verify if the namespace count disk space satisfies the quota restriction 
  150.    * @throws QuotaExceededException if the given quota is less than the count
  151.    */
  152.   private static void verifyQuota(long nsQuota, long nsCount, 
  153.                                   long dsQuota, long diskspace)
  154.                                   throws QuotaExceededException {
  155.     if ((nsQuota >= 0 && nsQuota < nsCount) || 
  156.         (dsQuota >= 0 && dsQuota < diskspace)) {
  157.       throw new QuotaExceededException(nsQuota, nsCount, dsQuota, diskspace);
  158.     }
  159.   }
  160. }