| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.hadoop.hdfs.server.namenode; |
| |
| import org.apache.hadoop.fs.StorageType; |
| import org.apache.hadoop.hdfs.util.EnumCounters; |
| |
| /** |
| * Counters for namespace, storage space and storage type space quota and usage. |
| */ |
| public class QuotaCounts { |
| // Name space and storage space counts (HDFS-7775 refactors the original disk |
| // space count to storage space counts) |
| private EnumCounters<Quota> nsSsCounts; |
| // Storage type space counts |
| private EnumCounters<StorageType> tsCounts; |
| |
| public static class Builder { |
| private EnumCounters<Quota> nsSsCounts; |
| private EnumCounters<StorageType> tsCounts; |
| |
| public Builder() { |
| this.nsSsCounts = new EnumCounters<Quota>(Quota.class); |
| this.tsCounts = new EnumCounters<StorageType>(StorageType.class); |
| } |
| |
| public Builder nameSpace(long val) { |
| this.nsSsCounts.set(Quota.NAMESPACE, val); |
| return this; |
| } |
| |
| public Builder storageSpace(long val) { |
| this.nsSsCounts.set(Quota.STORAGESPACE, val); |
| return this; |
| } |
| |
| public Builder typeSpaces(EnumCounters<StorageType> val) { |
| if (val != null) { |
| this.tsCounts.set(val); |
| } |
| return this; |
| } |
| |
| public Builder typeSpaces(long val) { |
| this.tsCounts.reset(val); |
| return this; |
| } |
| |
| public Builder quotaCount(QuotaCounts that) { |
| this.nsSsCounts.set(that.nsSsCounts); |
| this.tsCounts.set(that.tsCounts); |
| return this; |
| } |
| |
| public QuotaCounts build() { |
| return new QuotaCounts(this); |
| } |
| } |
| |
| private QuotaCounts(Builder builder) { |
| this.nsSsCounts = builder.nsSsCounts; |
| this.tsCounts = builder.tsCounts; |
| } |
| |
| public QuotaCounts add(QuotaCounts that) { |
| this.nsSsCounts.add(that.nsSsCounts); |
| this.tsCounts.add(that.tsCounts); |
| return this; |
| } |
| |
| public QuotaCounts subtract(QuotaCounts that) { |
| this.nsSsCounts.subtract(that.nsSsCounts); |
| this.tsCounts.subtract(that.tsCounts); |
| return this; |
| } |
| |
| /** |
| * Returns a QuotaCounts whose value is {@code (-this)}. |
| * |
| * @return {@code -this} |
| */ |
| public QuotaCounts negation() { |
| QuotaCounts ret = new QuotaCounts.Builder().quotaCount(this).build(); |
| ret.nsSsCounts.negation(); |
| ret.tsCounts.negation(); |
| return ret; |
| } |
| |
| public long getNameSpace(){ |
| return nsSsCounts.get(Quota.NAMESPACE); |
| } |
| |
| public void setNameSpace(long nameSpaceCount) { |
| this.nsSsCounts.set(Quota.NAMESPACE, nameSpaceCount); |
| } |
| |
| public void addNameSpace(long nsDelta) { |
| this.nsSsCounts.add(Quota.NAMESPACE, nsDelta); |
| } |
| |
| public long getStorageSpace(){ |
| return nsSsCounts.get(Quota.STORAGESPACE); |
| } |
| |
| public void setStorageSpace(long spaceCount) { |
| this.nsSsCounts.set(Quota.STORAGESPACE, spaceCount); |
| } |
| |
| public void addStorageSpace(long dsDelta) { |
| this.nsSsCounts.add(Quota.STORAGESPACE, dsDelta); |
| } |
| |
| public EnumCounters<StorageType> getTypeSpaces() { |
| EnumCounters<StorageType> ret = |
| new EnumCounters<StorageType>(StorageType.class); |
| ret.set(tsCounts); |
| return ret; |
| } |
| |
| void setTypeSpaces(EnumCounters<StorageType> that) { |
| if (that != null) { |
| this.tsCounts.set(that); |
| } |
| } |
| |
| long getTypeSpace(StorageType type) { |
| return this.tsCounts.get(type); |
| } |
| |
| void setTypeSpace(StorageType type, long spaceCount) { |
| this.tsCounts.set(type, spaceCount); |
| } |
| |
| public void addTypeSpace(StorageType type, long delta) { |
| this.tsCounts.add(type, delta); |
| } |
| |
| public boolean anyNsSsCountGreaterOrEqual(long val) { |
| return nsSsCounts.anyGreaterOrEqual(val); |
| } |
| |
| public boolean anyTypeSpaceCountGreaterOrEqual(long val) { |
| return tsCounts.anyGreaterOrEqual(val); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj == this) { |
| return true; |
| } else if (obj == null || !(obj instanceof QuotaCounts)) { |
| return false; |
| } |
| final QuotaCounts that = (QuotaCounts)obj; |
| return this.nsSsCounts.equals(that.nsSsCounts) |
| && this.tsCounts.equals(that.tsCounts); |
| } |
| |
| @Override |
| public int hashCode() { |
| assert false : "hashCode not designed"; |
| return 42; // any arbitrary constant will do |
| } |
| } |