mirror of
https://github.com/containers/podman.git
synced 2025-09-28 17:25:31 +08:00
Bump github.com/uber/jaeger-client-go
Bumps [github.com/uber/jaeger-client-go](https://github.com/uber/jaeger-client-go) from 2.19.0+incompatible to 2.20.0+incompatible. - [Release notes](https://github.com/uber/jaeger-client-go/releases) - [Changelog](https://github.com/jaegertracing/jaeger-client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/uber/jaeger-client-go/compare/v2.19.0...v2.20.0) Signed-off-by: dependabot-preview[bot] <support@dependabot.com> Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
![27856297+dependabot-preview[bot]@users.noreply.github.com](/assets/img/avatar_default.png)
committed by
Valentin Rothberg

parent
2e2d82ce76
commit
75d67c4920
93
vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go
generated
vendored
93
vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go
generated
vendored
@ -20,22 +20,15 @@ import (
|
||||
)
|
||||
|
||||
// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits.
|
||||
//
|
||||
// TODO (breaking change) remove this interface in favor of public struct below
|
||||
//
|
||||
// Deprecated, use ReconfigurableRateLimiter.
|
||||
type RateLimiter interface {
|
||||
CheckCredit(itemCost float64) bool
|
||||
}
|
||||
|
||||
type rateLimiter struct {
|
||||
sync.Mutex
|
||||
|
||||
creditsPerSecond float64
|
||||
balance float64
|
||||
maxBalance float64
|
||||
lastTick time.Time
|
||||
|
||||
timeNow func() time.Time
|
||||
}
|
||||
|
||||
// NewRateLimiter creates a new rate limiter based on leaky bucket algorithm, formulated in terms of a
|
||||
// ReconfigurableRateLimiter is a rate limiter based on leaky bucket algorithm, formulated in terms of a
|
||||
// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional
|
||||
// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost
|
||||
// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is "purchased"
|
||||
@ -47,31 +40,73 @@ type rateLimiter struct {
|
||||
//
|
||||
// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput
|
||||
// as bytes/second, and calling CheckCredit() with the actual message size.
|
||||
func NewRateLimiter(creditsPerSecond, maxBalance float64) RateLimiter {
|
||||
return &rateLimiter{
|
||||
//
|
||||
// TODO (breaking change) rename to RateLimiter once the interface is removed
|
||||
type ReconfigurableRateLimiter struct {
|
||||
lock sync.Mutex
|
||||
|
||||
creditsPerSecond float64
|
||||
balance float64
|
||||
maxBalance float64
|
||||
lastTick time.Time
|
||||
|
||||
timeNow func() time.Time
|
||||
}
|
||||
|
||||
// NewRateLimiter creates a new ReconfigurableRateLimiter.
|
||||
func NewRateLimiter(creditsPerSecond, maxBalance float64) *ReconfigurableRateLimiter {
|
||||
return &ReconfigurableRateLimiter{
|
||||
creditsPerSecond: creditsPerSecond,
|
||||
balance: maxBalance,
|
||||
maxBalance: maxBalance,
|
||||
lastTick: time.Now(),
|
||||
timeNow: time.Now}
|
||||
timeNow: time.Now,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *rateLimiter) CheckCredit(itemCost float64) bool {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
// calculate how much time passed since the last tick, and update current tick
|
||||
currentTime := b.timeNow()
|
||||
elapsedTime := currentTime.Sub(b.lastTick)
|
||||
b.lastTick = currentTime
|
||||
// calculate how much credit have we accumulated since the last tick
|
||||
b.balance += elapsedTime.Seconds() * b.creditsPerSecond
|
||||
if b.balance > b.maxBalance {
|
||||
b.balance = b.maxBalance
|
||||
}
|
||||
// CheckCredit tries to reduce the current balance by itemCost provided that the current balance
|
||||
// is not lest than itemCost.
|
||||
func (rl *ReconfigurableRateLimiter) CheckCredit(itemCost float64) bool {
|
||||
rl.lock.Lock()
|
||||
defer rl.lock.Unlock()
|
||||
|
||||
// if we have enough credits to pay for current item, then reduce balance and allow
|
||||
if b.balance >= itemCost {
|
||||
b.balance -= itemCost
|
||||
if rl.balance >= itemCost {
|
||||
rl.balance -= itemCost
|
||||
return true
|
||||
}
|
||||
// otherwise check if balance can be increased due to time elapsed, and try again
|
||||
rl.updateBalance()
|
||||
if rl.balance >= itemCost {
|
||||
rl.balance -= itemCost
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// updateBalance recalculates current balance based on time elapsed. Must be called while holding a lock.
|
||||
func (rl *ReconfigurableRateLimiter) updateBalance() {
|
||||
// calculate how much time passed since the last tick, and update current tick
|
||||
currentTime := rl.timeNow()
|
||||
elapsedTime := currentTime.Sub(rl.lastTick)
|
||||
rl.lastTick = currentTime
|
||||
// calculate how much credit have we accumulated since the last tick
|
||||
rl.balance += elapsedTime.Seconds() * rl.creditsPerSecond
|
||||
if rl.balance > rl.maxBalance {
|
||||
rl.balance = rl.maxBalance
|
||||
}
|
||||
}
|
||||
|
||||
// Update changes the main parameters of the rate limiter in-place, while retaining
|
||||
// the current accumulated balance (pro-rated to the new maxBalance value). Using this method
|
||||
// instead of creating a new rate limiter helps to avoid thundering herd when sampling
|
||||
// strategies are updated.
|
||||
func (rl *ReconfigurableRateLimiter) Update(creditsPerSecond, maxBalance float64) {
|
||||
rl.lock.Lock()
|
||||
defer rl.lock.Unlock()
|
||||
|
||||
rl.updateBalance() // get up to date balance
|
||||
rl.balance = rl.balance * maxBalance / rl.maxBalance
|
||||
rl.creditsPerSecond = creditsPerSecond
|
||||
rl.maxBalance = maxBalance
|
||||
}
|
||||
|
Reference in New Issue
Block a user