1
2
3
4
5
6
7
8
9
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 import com.google.common.annotations.VisibleForTesting;
17
18
19
20
21
22
23 @InterfaceAudience.Private
24 @InterfaceStability.Evolving
25 public class AverageIntervalRateLimiter extends RateLimiter {
26 private long nextRefillTime = -1L;
27
28 @Override
29 public long refill(long limit) {
30 final long now = EnvironmentEdgeManager.currentTime();
31 if (nextRefillTime == -1) {
32
33 nextRefillTime = EnvironmentEdgeManager.currentTime();
34 return limit;
35 }
36
37 long delta = (limit * (now - nextRefillTime)) / super.getTimeUnitInMillis();
38 if (delta > 0) {
39 this.nextRefillTime = now;
40 return Math.min(limit, delta);
41 }
42 return 0;
43 }
44
45 @Override
46 public long getWaitInterval(long limit, long available, long amount) {
47 if (nextRefillTime == -1) {
48 return 0;
49 }
50 long timeUnitInMillis = super.getTimeUnitInMillis();
51 return ((amount * timeUnitInMillis) / limit) - ((available * timeUnitInMillis) / limit);
52 }
53
54
55 @VisibleForTesting
56 @Override
57 public void setNextRefillTime(long nextRefillTime) {
58 this.nextRefillTime = nextRefillTime;
59 }
60
61 @VisibleForTesting
62 @Override
63 public long getNextRefillTime() {
64 return this.nextRefillTime;
65 }
66
67 }