View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional information regarding
4    * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
5    * "License"); you may not use this file except in compliance with the License. You may obtain a
6    * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
7    * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
8    * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
9    * for the specific language governing permissions and limitations under the License.
10   */
11  package org.apache.hadoop.hbase.quotas;
12  
13  import org.apache.hadoop.hbase.classification.InterfaceAudience;
14  import org.apache.hadoop.hbase.classification.InterfaceStability;
15  import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
16  
17  /**
18   * With this limiter resources will be refilled only after a fixed interval of time.
19   */
20  @InterfaceAudience.Private
21  @InterfaceStability.Evolving
22  public class FixedIntervalRateLimiter extends RateLimiter {
23    private long nextRefillTime = -1L;
24  
25    @Override
26    public long refill(long limit) {
27      final long now = EnvironmentEdgeManager.currentTime();
28      if (now < nextRefillTime) {
29        return 0;
30      }
31      nextRefillTime = now + super.getTimeUnitInMillis();
32      return limit;
33    }
34  
35    @Override
36    public long getWaitInterval(long limit, long available, long amount) {
37      if (nextRefillTime == -1) {
38        return 0;
39      }
40      final long now = EnvironmentEdgeManager.currentTime();
41      final long refillTime = nextRefillTime;
42      return refillTime - now;
43    }
44  
45    // This method is for strictly testing purpose only
46    @Override
47    public void setNextRefillTime(long nextRefillTime) {
48      this.nextRefillTime = nextRefillTime;
49    }
50  
51    @Override
52    public long getNextRefillTime() {
53      return this.nextRefillTime;
54    }
55  }