11 "golang.org/x/time/rate"
15 perTokenBandwidthSize int = 1024
18 // OssLimiter wrapper rate.Limiter
19 type OssLimiter struct {
23 // GetOssLimiter create OssLimiter
25 func GetOssLimiter(uploadSpeed int) (ossLimiter *OssLimiter, err error) {
26 limiter := rate.NewLimiter(rate.Limit(uploadSpeed), uploadSpeed)
28 // first consume the initial full token,the limiter will behave more accurately
29 limiter.AllowN(time.Now(), uploadSpeed)
36 // LimitSpeedReader for limit bandwidth upload
37 type LimitSpeedReader struct {
40 ossLimiter *OssLimiter
44 func (r *LimitSpeedReader) Read(p []byte) (n int, err error) {
48 burst := r.ossLimiter.limiter.Burst()
53 if start+burst*perTokenBandwidthSize < len(p) {
54 end = start + burst*perTokenBandwidthSize
59 tmpN, err = r.reader.Read(p[start:end])
69 tc = int(math.Ceil(float64(tmpN) / float64(perTokenBandwidthSize)))
71 re := r.ossLimiter.limiter.ReserveN(now, tc)
73 err = fmt.Errorf("LimitSpeedReader.Read() failure,ReserveN error,start:%d,end:%d,burst:%d,perTokenBandwidthSize:%d",
74 start, end, burst, perTokenBandwidthSize)
77 timeDelay := re.Delay()
84 func (r *LimitSpeedReader) Close() error {
85 rc, ok := r.reader.(io.ReadCloser)