Closed
Description
I noticed that inside the function adjustavailableTokens()
func (tb *Bucket) adjustavailableTokens(tick int64) {
if tb.availableTokens >= tb.capacity {
return
}
tb.availableTokens += (tick - tb.latestTick) * tb.quantum
if tb.availableTokens > tb.capacity {
tb.availableTokens = tb.capacity
}
tb.latestTick = tick
return
}
the tb.latestTick
is not updated if tb.availableTokens >= tb.capacity
。
That makes the description of the variable latestTick holds the latest tick for which we know the number of tokens in the bucket. not so accurate, IMO.
And I wrote a snippet of code which can produce surprising results:
func main() {
bucket := ratelimit.NewBucketWithQuantum(time.Second*1, 100, 20)
fmt.Printf("Avail=%d\n", bucket.Available())
fmt.Printf("%v\n", time.Now())
fmt.Printf("Pause wait for 5s\n")
time.Sleep(time.Second * 5)
fmt.Printf("%v\n", time.Now())
fmt.Printf("Avail=%d\n", bucket.Available())
fmt.Printf("Request token up to 100\n")
cnt := bucket.TakeAvailable(100)
fmt.Printf("Token taken=%d\n", cnt)
// It will surprise you.
fmt.Printf("Avail=%d\n", bucket.Available())
}
Output
Avail=100
2019-09-26 01:12:47.9410106 +0800 CST m=+0.003992001 Pause wait for 5s
2019-09-26 01:12:52.9614404 +0800 CST m=+5.024421801 Avail=100
Request token up to 100
Token taken=100
Avail=100
That is, after taken all tokens out of the bucket, the bucket is still full.
Is this by design or just an implementation bug?
Metadata
Metadata
Assignees
Labels
No labels