/** * NOTE: The order matters. It should be something like [user, table, namespace, global] */ public DefaultOperationQuota(final Configuration conf, final List<QuotaLimiter> limiters) { this.writeCapacityUnit = conf.getLong(QuotaUtil.WRITE_CAPACITY_UNIT_CONF_KEY, QuotaUtil.DEFAULT_WRITE_CAPACITY_UNIT); this.readCapacityUnit = conf.getLong(QuotaUtil.READ_CAPACITY_UNIT_CONF_KEY, QuotaUtil.DEFAULT_READ_CAPACITY_UNIT); this.limiters = limiters; int size = OperationType.values().length; operationSize = new long[size]; for (int i = 0; i < size; ++i) { operationSize[i] = 0; } }
public long getOperationSize(OperationType type) { return sizeSum[type.ordinal()]; }
public AvgOperationSize() { int size = OperationType.values().length; sizeSum = new long[size]; count = new long[size]; for (int i = 0; i < size; ++i) { sizeSum[i] = 0; count[i] = 0; } }
public long getAvgOperationSize(OperationType type) { int index = type.ordinal(); return count[index] > 0 ? sizeSum[index] / count[index] : 0; }
public void addOperationSize(OperationType type, long size) { if (size > 0) { int index = type.ordinal(); sizeSum[index] += size; count[index]++; } }
@Override public void close() { // Adjust the quota consumed for the specified operation long writeDiff = operationSize[OperationType.MUTATE.ordinal()] - writeConsumed; long readDiff = operationSize[OperationType.GET.ordinal()] + operationSize[OperationType.SCAN.ordinal()] - readConsumed; long writeCapacityUnitDiff = calculateWriteCapacityUnitDiff( operationSize[OperationType.MUTATE.ordinal()], writeConsumed); long readCapacityUnitDiff = calculateReadCapacityUnitDiff( operationSize[OperationType.GET.ordinal()] + operationSize[OperationType.SCAN.ordinal()], readConsumed); for (final QuotaLimiter limiter : limiters) { if (writeDiff != 0) { limiter.consumeWrite(writeDiff, writeCapacityUnitDiff); } if (readDiff != 0) { limiter.consumeRead(readDiff, readCapacityUnitDiff); } } }
@Override public void addMutation(final Mutation mutation) { operationSize[OperationType.MUTATE.ordinal()] += QuotaUtil.calculateMutationSize(mutation); }
@Override public void addGetResult(final Result result) { operationSize[OperationType.GET.ordinal()] += QuotaUtil.calculateResultSize(result); }
@Override public void addScanResult(final List<Result> results) { operationSize[OperationType.SCAN.ordinal()] += QuotaUtil.calculateResultSize(results); }