All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta-1
Show newest version
/*
 * 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.hbase.quotas;

import java.util.Objects;
import java.util.Optional;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.hadoop.util.StringUtils;
import org.apache.yetus.audience.InterfaceAudience;

import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos;

/**
 * A point-in-time view of a space quota on a table.
 */
@InterfaceAudience.Private
public class SpaceQuotaSnapshot implements SpaceQuotaSnapshotView {
  private static final SpaceQuotaSnapshot NO_SUCH_SNAPSHOT =
    new SpaceQuotaSnapshot(SpaceQuotaStatus.notInViolation(), 0, Long.MAX_VALUE);
  private final SpaceQuotaStatus quotaStatus;
  private final long usage;
  private final long limit;

  /**
   * Encapsulates the state of a quota on a table. The quota may or may not be in violation. If the
   * quota is not in violation, the violation may be null. If the quota is in violation, there is
   * guaranteed to be a non-null violation policy.
   */
  @InterfaceAudience.Private
  public static class SpaceQuotaStatus implements SpaceQuotaStatusView {
    private static final SpaceQuotaStatus NOT_IN_VIOLATION = new SpaceQuotaStatus(null, false);
    final Optional policy;
    final boolean inViolation;

    /**
     * Constructs a {@code SpaceQuotaSnapshot} which is in violation of the provided {@code policy}.
     * 

* Use {@link #notInViolation()} to obtain an instance of this class for the cases when the * quota is not in violation. * @param policy The non-null policy being violated. */ public SpaceQuotaStatus(SpaceViolationPolicy policy) { // If the caller is instantiating a status, the policy must be non-null this(Objects.requireNonNull(policy), true); } private SpaceQuotaStatus(SpaceViolationPolicy policy, boolean inViolation) { this.policy = Optional.ofNullable(policy); this.inViolation = inViolation; } /** * Returns the violation policy, which may be null. It is guaranteed to be non-null if * {@link #isInViolation()} is {@code true}, but may be null otherwise. */ @Override public Optional getPolicy() { return policy; } /** Returns {@code true} if the quota is being violated, {@code false} otherwise. */ @Override public boolean isInViolation() { return inViolation; } /** * Returns a singleton referring to a quota which is not in violation. */ public static SpaceQuotaStatus notInViolation() { return NOT_IN_VIOLATION; } @Override public int hashCode() { return new HashCodeBuilder().append(policy == null ? 0 : policy.hashCode()) .append(inViolation).toHashCode(); } @Override public boolean equals(Object o) { if (o instanceof SpaceQuotaStatus) { SpaceQuotaStatus other = (SpaceQuotaStatus) o; return Objects.equals(policy, other.policy) && inViolation == other.inViolation; } return false; } @Override public String toString() { StringBuilder sb = new StringBuilder(getClass().getSimpleName()); sb.append("[policy=").append(policy); sb.append(", inViolation=").append(inViolation).append("]"); return sb.toString(); } public static QuotaProtos.SpaceQuotaStatus toProto(SpaceQuotaStatus status) { QuotaProtos.SpaceQuotaStatus.Builder builder = QuotaProtos.SpaceQuotaStatus.newBuilder(); builder.setInViolation(status.inViolation); if (status.isInViolation()) { builder.setViolationPolicy(ProtobufUtil.toProtoViolationPolicy(status.getPolicy().get())); } return builder.build(); } public static SpaceQuotaStatus toStatus(QuotaProtos.SpaceQuotaStatus proto) { if (proto.getInViolation()) { return new SpaceQuotaStatus(ProtobufUtil.toViolationPolicy(proto.getViolationPolicy())); } else { return NOT_IN_VIOLATION; } } } public SpaceQuotaSnapshot(SpaceQuotaStatus quotaStatus, long usage, long limit) { this.quotaStatus = Objects.requireNonNull(quotaStatus); this.usage = usage; this.limit = limit; } /** * Returns the status of the quota. */ @Override public SpaceQuotaStatus getQuotaStatus() { return quotaStatus; } /** * Returns the current usage, in bytes, of the target (e.g. table, namespace). */ @Override public long getUsage() { return usage; } /** * Returns the limit, in bytes, of the target (e.g. table, namespace). */ @Override public long getLimit() { return limit; } @Override public int hashCode() { return new HashCodeBuilder().append(quotaStatus.hashCode()).append(usage).append(limit) .toHashCode(); } @Override public boolean equals(Object o) { if (o instanceof SpaceQuotaSnapshot) { SpaceQuotaSnapshot other = (SpaceQuotaSnapshot) o; return quotaStatus.equals(other.quotaStatus) && usage == other.usage && limit == other.limit; } return false; } @Override public String toString() { StringBuilder sb = new StringBuilder(32); sb.append("SpaceQuotaSnapshot[policy=").append(quotaStatus).append(", use="); sb.append(StringUtils.byteDesc(usage)).append("/"); sb.append(StringUtils.byteDesc(limit)).append("]"); return sb.toString(); } // ProtobufUtil is in hbase-client, and this doesn't need to be public. public static SpaceQuotaSnapshot toSpaceQuotaSnapshot(QuotaProtos.SpaceQuotaSnapshot proto) { return new SpaceQuotaSnapshot(SpaceQuotaStatus.toStatus(proto.getQuotaStatus()), proto.getQuotaUsage(), proto.getQuotaLimit()); } public static QuotaProtos.SpaceQuotaSnapshot toProtoSnapshot(SpaceQuotaSnapshot snapshot) { return QuotaProtos.SpaceQuotaSnapshot.newBuilder() .setQuotaStatus(SpaceQuotaStatus.toProto(snapshot.getQuotaStatus())) .setQuotaUsage(snapshot.getUsage()).setQuotaLimit(snapshot.getLimit()).build(); } /** * Returns a singleton that corresponds to no snapshot information. */ public static SpaceQuotaSnapshot getNoSuchSnapshot() { return NO_SUCH_SNAPSHOT; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy