Author: jing9 Date: Fri Feb 14 01:40:08 2014 New Revision: 1568186 URL: http://svn.apache.org/r1568186 Log: HDFS-5531. Merge change r1544018 from trunk.
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Content.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageSerialization.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INode.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryAttributes.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryWithQuota.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Quota.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/INodeDirectoryWithSnapshot.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/EnumCounters.java Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Fri Feb 14 01:40:08 2014 @@ -36,6 +36,9 @@ Release 2.4.0 - UNRELEASED HDFS-5940. Minor cleanups to ShortCircuitReplica, FsDatasetCache, and DomainSocketWatcher (cmccabe) + HDFS-5531. Combine the getNsQuota() and getDsQuota() methods in INode. + (szetszwo) + OPTIMIZATIONS HDFS-5790. LeaseManager.findPath is very slow when many leases need recovery Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Content.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Content.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Content.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Content.java Fri Feb 14 01:40:08 2014 @@ -47,7 +47,7 @@ public enum Content { } private Counts() { - super(Content.values()); + super(Content.class); } } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java Fri Feb 14 01:40:08 2014 @@ -2448,8 +2448,9 @@ public class FSDirectory implements Clos if (dirNode.isRoot() && nsQuota == HdfsConstants.QUOTA_RESET) { throw new IllegalArgumentException("Cannot clear namespace quota on root."); } else { // a directory inode - long oldNsQuota = dirNode.getNsQuota(); - long oldDsQuota = dirNode.getDsQuota(); + final Quota.Counts oldQuota = dirNode.getQuotaCounts(); + final long oldNsQuota = oldQuota.get(Quota.NAMESPACE); + final long oldDsQuota = oldQuota.get(Quota.DISKSPACE); if (nsQuota == HdfsConstants.QUOTA_DONT_SET) { nsQuota = oldNsQuota; } @@ -2501,8 +2502,9 @@ public class FSDirectory implements Clos try { INodeDirectory dir = unprotectedSetQuota(src, nsQuota, dsQuota); if (dir != null) { - fsImage.getEditLog().logSetQuota(src, dir.getNsQuota(), - dir.getDsQuota()); + final Quota.Counts q = dir.getQuotaCounts(); + fsImage.getEditLog().logSetQuota(src, + q.get(Quota.NAMESPACE), q.get(Quota.DISKSPACE)); } } finally { writeUnlock(); Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java Fri Feb 14 01:40:08 2014 @@ -784,18 +784,22 @@ public class FSImage implements Closeabl if (dir.isQuotaSet()) { // check if quota is violated. It indicates a software bug. + final Quota.Counts q = dir.getQuotaCounts(); + final long namespace = counts.get(Quota.NAMESPACE) - parentNamespace; - if (Quota.isViolated(dir.getNsQuota(), namespace)) { + final long nsQuota = q.get(Quota.NAMESPACE); + if (Quota.isViolated(nsQuota, namespace)) { LOG.error("BUG: Namespace quota violation in image for " + dir.getFullPathName() - + " quota = " + dir.getNsQuota() + " < consumed = " + namespace); + + " quota = " + nsQuota + " < consumed = " + namespace); } final long diskspace = counts.get(Quota.DISKSPACE) - parentDiskspace; - if (Quota.isViolated(dir.getDsQuota(), diskspace)) { + final long dsQuota = q.get(Quota.DISKSPACE); + if (Quota.isViolated(dsQuota, diskspace)) { LOG.error("BUG: Diskspace quota violation in image for " + dir.getFullPathName() - + " quota = " + dir.getDsQuota() + " < consumed = " + diskspace); + + " quota = " + dsQuota + " < consumed = " + diskspace); } ((INodeDirectoryWithQuota)dir).setSpaceConsumed(namespace, diskspace); Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java Fri Feb 14 01:40:08 2014 @@ -383,8 +383,9 @@ public class FSImageFormat { /** Update the root node's attributes */ private void updateRootAttr(INodeWithAdditionalFields root) { - long nsQuota = root.getNsQuota(); - long dsQuota = root.getDsQuota(); + final Quota.Counts q = root.getQuotaCounts(); + final long nsQuota = q.get(Quota.NAMESPACE); + final long dsQuota = q.get(Quota.DISKSPACE); FSDirectory fsDir = namesystem.dir; if (nsQuota != -1 || dsQuota != -1) { fsDir.rootDir.setQuota(nsQuota, dsQuota); Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageSerialization.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageSerialization.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageSerialization.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageSerialization.java Fri Feb 14 01:40:08 2014 @@ -226,6 +226,12 @@ public class FSImageSerialization { out.writeLong(file.getPreferredBlockSize()); } + private static void writeQuota(Quota.Counts quota, DataOutput out) + throws IOException { + out.writeLong(quota.get(Quota.NAMESPACE)); + out.writeLong(quota.get(Quota.DISKSPACE)); + } + /** * Serialize a {@link INodeDirectory} * @param node The node to write @@ -241,8 +247,8 @@ public class FSImageSerialization { out.writeLong(0); // preferred block size out.writeInt(-1); // # of blocks - out.writeLong(node.getNsQuota()); - out.writeLong(node.getDsQuota()); + writeQuota(node.getQuotaCounts(), out); + if (node instanceof INodeDirectorySnapshottable) { out.writeBoolean(true); } else { @@ -263,9 +269,7 @@ public class FSImageSerialization { writeLocalName(a, out); writePermissionStatus(a, out); out.writeLong(a.getModificationTime()); - - out.writeLong(a.getNsQuota()); - out.writeLong(a.getDsQuota()); + writeQuota(a.getQuotaCounts(), out); } /** Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INode.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INode.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INode.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INode.java Fri Feb 14 01:40:08 2014 @@ -383,10 +383,11 @@ public abstract class INode implements I public final ContentSummary computeAndConvertContentSummary( ContentSummaryComputationContext summary) { Content.Counts counts = computeContentSummary(summary).getCounts(); + final Quota.Counts q = getQuotaCounts(); return new ContentSummary(counts.get(Content.LENGTH), counts.get(Content.FILE) + counts.get(Content.SYMLINK), - counts.get(Content.DIRECTORY), getNsQuota(), - counts.get(Content.DISKSPACE), getDsQuota()); + counts.get(Content.DIRECTORY), q.get(Quota.NAMESPACE), + counts.get(Content.DISKSPACE), q.get(Quota.DISKSPACE)); } /** @@ -412,18 +413,15 @@ public abstract class INode implements I /** * Get the quota set for this inode - * @return the quota if it is set; -1 otherwise + * @return the quota counts. The count is -1 if it is not set. */ - public long getNsQuota() { - return -1; - } - - public long getDsQuota() { - return -1; + public Quota.Counts getQuotaCounts() { + return Quota.Counts.newInstance(-1, -1); } public final boolean isQuotaSet() { - return getNsQuota() >= 0 || getDsQuota() >= 0; + final Quota.Counts q = getQuotaCounts(); + return q.get(Quota.NAMESPACE) >= 0 || q.get(Quota.DISKSPACE) >= 0; } /** Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java Fri Feb 14 01:40:08 2014 @@ -612,8 +612,7 @@ public class INodeDirectory extends INod @Override public boolean metadataEquals(INodeDirectoryAttributes other) { return other != null - && getNsQuota() == other.getNsQuota() - && getDsQuota() == other.getDsQuota() + && getQuotaCounts().equals(other.getQuotaCounts()) && getPermissionLong() == other.getPermissionLong(); } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryAttributes.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryAttributes.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryAttributes.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryAttributes.java Fri Feb 14 01:40:08 2014 @@ -27,9 +27,7 @@ import com.google.common.base.Preconditi */ @InterfaceAudience.Private public interface INodeDirectoryAttributes extends INodeAttributes { - public long getNsQuota(); - - public long getDsQuota(); + public Quota.Counts getQuotaCounts(); public boolean metadataEquals(INodeDirectoryAttributes other); @@ -46,20 +44,14 @@ public interface INodeDirectoryAttribute } @Override - public long getNsQuota() { - return -1; - } - - @Override - public long getDsQuota() { - return -1; + public Quota.Counts getQuotaCounts() { + return Quota.Counts.newInstance(-1, -1); } @Override public boolean metadataEquals(INodeDirectoryAttributes other) { return other != null - && getNsQuota() == other.getNsQuota() - && getDsQuota() == other.getDsQuota() + && this.getQuotaCounts().equals(other.getQuotaCounts()) && getPermissionLong() == other.getPermissionLong(); } } @@ -68,6 +60,7 @@ public interface INodeDirectoryAttribute private final long nsQuota; private final long dsQuota; + public CopyWithQuota(byte[] name, PermissionStatus permissions, long modificationTime, long nsQuota, long dsQuota) { super(name, permissions, modificationTime); @@ -78,18 +71,14 @@ public interface INodeDirectoryAttribute public CopyWithQuota(INodeDirectory dir) { super(dir); Preconditions.checkArgument(dir.isQuotaSet()); - this.nsQuota = dir.getNsQuota(); - this.dsQuota = dir.getDsQuota(); + final Quota.Counts q = dir.getQuotaCounts(); + this.nsQuota = q.get(Quota.NAMESPACE); + this.dsQuota = q.get(Quota.DISKSPACE); } @Override - public final long getNsQuota() { - return nsQuota; - } - - @Override - public final long getDsQuota() { - return dsQuota; + public Quota.Counts getQuotaCounts() { + return Quota.Counts.newInstance(nsQuota, dsQuota); } } } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryWithQuota.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryWithQuota.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryWithQuota.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectoryWithQuota.java Fri Feb 14 01:40:08 2014 @@ -44,7 +44,7 @@ public class INodeDirectoryWithQuota ext * @param dsQuota Diskspace quota to be assigned to this indoe * @param other The other inode from which all other properties are copied */ - public INodeDirectoryWithQuota(INodeDirectory other, boolean adopt, + INodeDirectoryWithQuota(INodeDirectory other, boolean adopt, long nsQuota, long dsQuota) { super(other, adopt); final Quota.Counts counts = other.computeQuotaUsage(); @@ -54,6 +54,11 @@ public class INodeDirectoryWithQuota ext this.dsQuota = dsQuota; } + public INodeDirectoryWithQuota(INodeDirectory other, boolean adopt, + Quota.Counts quota) { + this(other, adopt, quota.get(Quota.NAMESPACE), quota.get(Quota.DISKSPACE)); + } + /** constructor with no quota verification */ INodeDirectoryWithQuota(long id, byte[] name, PermissionStatus permissions, long modificationTime, long nsQuota, long dsQuota) { @@ -67,20 +72,9 @@ public class INodeDirectoryWithQuota ext super(id, name, permissions, 0L); } - /** Get this directory's namespace quota - * @return this directory's namespace quota - */ - @Override - public long getNsQuota() { - return nsQuota; - } - - /** Get this directory's diskspace quota - * @return this directory's diskspace quota - */ @Override - public long getDsQuota() { - return dsQuota; + public Quota.Counts getQuotaCounts() { + return Quota.Counts.newInstance(nsQuota, dsQuota); } /** Set this directory's quota @@ -120,7 +114,7 @@ public class INodeDirectoryWithQuota ext } private void checkDiskspace(final long computed) { - if (-1 != getDsQuota() && diskspace != computed) { + if (-1 != getQuotaCounts().get(Quota.DISKSPACE) && diskspace != computed) { NameNode.LOG.error("BUG: Inconsistent diskspace for directory " + getFullPathName() + ". Cached = " + diskspace + " != Computed = " + computed); Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java Fri Feb 14 01:40:08 2014 @@ -295,16 +295,11 @@ public abstract class INodeReference ext } @Override - public final long getNsQuota() { - return referred.getNsQuota(); + public Quota.Counts getQuotaCounts() { + return referred.getQuotaCounts(); } @Override - public final long getDsQuota() { - return referred.getDsQuota(); - } - - @Override public final void clear() { super.clear(); referred = null; Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java Fri Feb 14 01:40:08 2014 @@ -23,7 +23,6 @@ import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; -import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.URI; import java.net.URLEncoder; @@ -63,7 +62,6 @@ import org.apache.hadoop.hdfs.server.nam import org.apache.hadoop.hdfs.server.namenode.startupprogress.Step; import org.apache.hadoop.hdfs.server.namenode.startupprogress.StepType; import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols; -import org.apache.hadoop.http.HttpConfig; import org.apache.hadoop.io.Text; import org.apache.hadoop.net.NodeBase; import org.apache.hadoop.security.UserGroupInformation; @@ -1090,7 +1088,7 @@ class NamenodeJspHelper { doc.endTag(); doc.startTag("ds_quota"); - doc.pcdata(""+inode.getDsQuota()); + doc.pcdata(""+inode.getQuotaCounts().get(Quota.DISKSPACE)); doc.endTag(); doc.startTag("permission_status"); Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Quota.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Quota.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Quota.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Quota.java Fri Feb 14 01:40:08 2014 @@ -41,7 +41,7 @@ public enum Quota { } Counts() { - super(Quota.values()); + super(Quota.class); } } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/INodeDirectoryWithSnapshot.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/INodeDirectoryWithSnapshot.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/INodeDirectoryWithSnapshot.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/INodeDirectoryWithSnapshot.java Fri Feb 14 01:40:08 2014 @@ -487,7 +487,7 @@ public class INodeDirectoryWithSnapshot INodeDirectoryWithSnapshot(INodeDirectory that, boolean adopt, DirectoryDiffList diffs) { - super(that, adopt, that.getNsQuota(), that.getDsQuota()); + super(that, adopt, that.getQuotaCounts()); this.diffs = diffs != null? diffs: new DirectoryDiffList(); } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/EnumCounters.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/EnumCounters.java?rev=1568186&r1=1568185&r2=1568186&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/EnumCounters.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/EnumCounters.java Fri Feb 14 01:40:08 2014 @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdfs.util; +import java.util.Arrays; import java.util.HashMap; import com.google.common.base.Preconditions; @@ -34,21 +35,19 @@ import com.google.common.base.Preconditi * @param <E> the enum type */ public class EnumCounters<E extends Enum<E>> { - /** An array of enum constants. */ - private final E[] enumConstants; + /** The class of the enum. */ + private final Class<E> enumClass; /** The counter array, counters[i] corresponds to the enumConstants[i]. */ private final long[] counters; /** * Construct counters for the given enum constants. - * @param enumConstants an array of enum constants such that, - * for all i, enumConstants[i].ordinal() == i. + * @param enumClass the enum class of the counters. */ - public EnumCounters(final E[] enumConstants) { - for(int i = 0; i < enumConstants.length; i++) { - Preconditions.checkArgument(enumConstants[i].ordinal() == i); - } - this.enumConstants = enumConstants; + public EnumCounters(final Class<E> enumClass) { + final E[] enumConstants = enumClass.getEnumConstants(); + Preconditions.checkNotNull(enumConstants); + this.enumClass = enumClass; this.counters = new long[enumConstants.length]; } @@ -69,6 +68,13 @@ public class EnumCounters<E extends Enum counters[e.ordinal()] = value; } + /** Set this counters to that counters. */ + public final void set(final EnumCounters<E> that) { + for(int i = 0; i < counters.length; i++) { + this.counters[i] = that.counters[i]; + } + } + /** Add the given value to counter e. */ public final void add(final E e, final long value) { counters[e.ordinal()] += value; @@ -86,7 +92,7 @@ public class EnumCounters<E extends Enum counters[e.ordinal()] -= value; } - /** Subtract that counters from this counters. */ + /** Subtract this counters from that counters. */ public final void subtract(final EnumCounters<E> that) { for(int i = 0; i < counters.length; i++) { this.counters[i] -= that.counters[i]; @@ -94,7 +100,25 @@ public class EnumCounters<E extends Enum } @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else if (obj == null || !(obj instanceof EnumCounters)) { + return false; + } + final EnumCounters<?> that = (EnumCounters<?>)obj; + return this.enumClass == that.enumClass + && Arrays.equals(this.counters, that.counters); + } + + @Override + public int hashCode() { + return Arrays.hashCode(counters); + } + + @Override public String toString() { + final E[] enumConstants = enumClass.getEnumConstants(); final StringBuilder b = new StringBuilder(); for(int i = 0; i < counters.length; i++) { final String name = enumConstants[i].name();