Chris Lu
6 years ago
2 changed files with 47 additions and 33 deletions
@ -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() |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue