package com.netflix.astyanax.connectionpool.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by lalith on 31.08.14.
 */
public class SimpleRateLimiter {
    private static final Logger logger = LoggerFactory.getLogger(SimpleRateLimiter.class);
    private long lastSent;
    private double tokens;

    private double rate;
    private double rateInterval; // in milliseconds
    private final double maxTokens;


    public SimpleRateLimiter(double initialRate, double rateInterval, double maxTokens) {
        this.rate = initialRate;
        this.rateInterval = rateInterval * 1000000;
        this.maxTokens = maxTokens;
        this.tokens = maxTokens;
        this.lastSent = System.nanoTime();
    }

    public synchronized double tryAcquire() {
        tokens = Math.min(maxTokens,
                tokens + (rate/rateInterval * (System.nanoTime() - lastSent)));
        if (tokens >= 1) {
            tokens -= 1;
            lastSent = System.nanoTime();
            return 0;
        }
        else {
            return (1 - tokens) * rateInterval/rate; // Nanoseconds
        }
    }

    public synchronized double getRate() {
        return rate;
    }

    public synchronized void setRate(final double rate) {
        this.rate = rate;
    }
}
@@ -185,95 +185,8 @@
     
-private static final Logger logger = LoggerFactory.getLogger(SimpleRateLimiter.class);%0A
     
@@ -208,24 +208,28 @@
 stSent;%0A    
+   
+ 
 private doub
@@ -240,16 +240,20 @@
 okens;%0A%0A
+    
     priv
@@ -265,24 +265,28 @@
 ouble rate;%0A
+    
     private 
@@ -304,16 +304,24 @@
 Interval
+InMillis
 ; // in 
@@ -329,24 +329,28 @@
 illiseconds%0A
+    
     private 
@@ -375,16 +375,20 @@
 kens;%0A%0A%0A
+    
     publ
@@ -447,16 +447,23 @@
 Interval
+InNanos
 , double
@@ -473,16 +473,24 @@
 xTokens)
+%0A       
  %7B%0A     
@@ -484,32 +484,36 @@
       %7B%0A        
+ 
+   
 this.rate = init
@@ -521,32 +521,36 @@
 alRate;%0A        
+    
 this.rateInterva
@@ -550,16 +550,24 @@
 Interval
+InMillis
  = rateI
@@ -573,16 +573,23 @@
 Interval
+InNanos
  * 10000
@@ -596,24 +596,28 @@
 00;%0A        
+  
+  
 this.maxToke
@@ -624,32 +624,36 @@
 ns = maxTokens;%0A
+    
         this.tok
@@ -673,24 +673,28 @@
 ns;%0A        
+    
 this.lastSen
@@ -716,27 +716,35 @@
 Time();%0A    
+  
+  
 %7D%0A%0A
+    
     public s
@@ -774,16 +774,24 @@
 cquire()
+%0A       
  %7B%0A     
@@ -789,25 +789,43 @@
   %7B%0A        
-t
+    double currentT
 okens = Math
@@ -852,24 +852,52 @@
             
+               
+             
 tokens + (ra
@@ -898,17 +898,19 @@
  + (rate
-/
+ / 
 rateInte
@@ -913,16 +913,24 @@
 Interval
+InMillis
  * (Syst
@@ -970,13 +970,24 @@
     
+ 
+   
 if (
-t
+currentT
 oken
@@ -993,16 +993,28 @@
 ns %3E= 1)
+%0A           
  %7B%0A     
@@ -1024,21 +1024,44 @@
     
+  
+  
 tokens 
--= 1;%0A
+= currentTokens - 1;%0A    
     
@@ -1106,24 +1106,28 @@
             
+    
 return 0;%0A  
@@ -1128,26 +1128,34 @@
  0;%0A        
-%7D%0A
+    %7D%0A    
         else
@@ -1154,16 +1154,28 @@
     else
+%0A           
  %7B%0A     
@@ -1177,24 +1177,28 @@
             
+    
 return (1 - 
@@ -1197,17 +1197,24 @@
 rn (1 - 
-t
+currentT
 okens) *
@@ -1226,17 +1226,27 @@
 Interval
-/
+InMillis / 
 rate; //
@@ -1270,17 +1270,29 @@
     
+  
-%7D%0A
+  %7D%0A   
     
+ 
 %7D%0A%0A
+    
     
@@ -1327,19 +1327,31 @@
 etRate()
- %7B%0A
+%0A        %7B%0A    
         
@@ -1363,27 +1363,35 @@
 n rate;%0A    
+  
+  
 %7D%0A%0A
+    
     public s
@@ -1433,19 +1433,31 @@
 le rate)
- %7B%0A
+%0A        %7B%0A    
         
@@ -1478,11 +1478,16 @@
 te;%0A
+    
     %7D%0A%7D
+%0A

Patch rate limiter