mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-09-19 14:27:58 +08:00
refactor: extract out the write throttler
This commit is contained in:
34
weed/util/throttler.go
Normal file
34
weed/util/throttler.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package util
|
||||
|
||||
import "time"
|
||||
|
||||
type WriteThrottler struct {
|
||||
compactionBytePerSecond int64
|
||||
lastSizeCounter int64
|
||||
lastSizeCheckTime time.Time
|
||||
}
|
||||
|
||||
func NewWriteThrottler(bytesPerSecond int64) *WriteThrottler {
|
||||
return &WriteThrottler{
|
||||
compactionBytePerSecond: bytesPerSecond,
|
||||
lastSizeCheckTime: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (wt *WriteThrottler) MaybeSlowdown(delta int64) {
|
||||
if wt.compactionBytePerSecond > 0 {
|
||||
wt.lastSizeCounter += delta
|
||||
now := time.Now()
|
||||
elapsedDuration := now.Sub(wt.lastSizeCheckTime)
|
||||
if elapsedDuration > 100*time.Millisecond {
|
||||
overLimitBytes := wt.lastSizeCounter - wt.compactionBytePerSecond/10
|
||||
if overLimitBytes > 0 {
|
||||
overRatio := float64(overLimitBytes) / float64(wt.compactionBytePerSecond)
|
||||
sleepTime := time.Duration(overRatio*1000) * time.Millisecond
|
||||
// glog.V(0).Infof("currently %d bytes, limit to %d bytes, over by %d bytes, sleeping %v over %.4f", wt.lastSizeCounter, wt.compactionBytePerSecond/10, overLimitBytes, sleepTime, overRatio)
|
||||
time.Sleep(sleepTime)
|
||||
}
|
||||
wt.lastSizeCounter, wt.lastSizeCheckTime = 0, time.Now()
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user