001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.hadoop.hdfs.server.namenode;
019    
020    import org.apache.hadoop.classification.InterfaceAudience;
021    import org.apache.hadoop.fs.permission.PermissionStatus;
022    
023    import com.google.common.base.Preconditions;
024    
025    /**
026     * The attributes of an inode.
027     */
028    @InterfaceAudience.Private
029    public interface INodeDirectoryAttributes extends INodeAttributes {
030      public long getNsQuota();
031    
032      public long getDsQuota();
033    
034      public boolean metadataEquals(INodeDirectoryAttributes other);
035      
036      /** A copy of the inode directory attributes */
037      public static class SnapshotCopy extends INodeAttributes.SnapshotCopy
038          implements INodeDirectoryAttributes {
039        public SnapshotCopy(byte[] name, PermissionStatus permissions,
040            long modificationTime) {
041          super(name, permissions, modificationTime, 0L);
042        }
043    
044        public SnapshotCopy(INodeDirectory dir) {
045          super(dir);
046        }
047    
048        @Override
049        public long getNsQuota() {
050          return -1;
051        }
052    
053        @Override
054        public long getDsQuota() {
055          return -1;
056        }
057    
058        @Override
059        public boolean metadataEquals(INodeDirectoryAttributes other) {
060          return other != null
061              && getNsQuota() == other.getNsQuota()
062              && getDsQuota() == other.getDsQuota()
063              && getPermissionLong() == other.getPermissionLong();
064        }
065      }
066    
067      public static class CopyWithQuota extends INodeDirectoryAttributes.SnapshotCopy {
068        private final long nsQuota;
069        private final long dsQuota;
070    
071        public CopyWithQuota(byte[] name, PermissionStatus permissions,
072            long modificationTime, long nsQuota, long dsQuota) {
073          super(name, permissions, modificationTime);
074          this.nsQuota = nsQuota;
075          this.dsQuota = dsQuota;
076        }
077    
078        public CopyWithQuota(INodeDirectory dir) {
079          super(dir);
080          Preconditions.checkArgument(dir.isQuotaSet());
081          this.nsQuota = dir.getNsQuota();
082          this.dsQuota = dir.getDsQuota();
083        }
084        
085        @Override
086        public final long getNsQuota() {
087          return nsQuota;
088        }
089    
090        @Override
091        public final long getDsQuota() {
092          return dsQuota;
093        }
094      }
095    }