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