mirror of
https://github.com/zrepl/zrepl.git
synced 2024-12-01 04:45:27 +01:00
3e93b31f75
panic while running test: invalid config`Ratelimit` field invalid: BucketCapacity must not be zero
main.runTestCase.func1.1
/home/cs/zrepl/zrepl/platformtest/harness/harness.go:190
runtime.gopanic
/home/cs/go1.13/src/runtime/panic.go:679
github.com/zrepl/zrepl/endpoint.NewSender
/home/cs/zrepl/zrepl/endpoint/endpoint.go:68
github.com/zrepl/zrepl/platformtest/tests.replicationInvocation.Do
/home/cs/zrepl/zrepl/platformtest/tests/replication.go:87
github.com/zrepl/zrepl/platformtest/tests.ReplicationFailingInitialParentProhibitsChildReplication
/home/cs/zrepl/zrepl/platformtest/tests/replication.go:925
main.runTestCase.func1
/home/cs/zrepl/zrepl/platformtest/harness/harness.go:193
main.runTestCase
/home/cs/zrepl/zrepl/platformtest/harness/harness.go:194
main.HarnessRun
/home/cs/zrepl/zrepl/platformtest/harness/harness.go:107
main.main
/home/cs/zrepl/zrepl/platformtest/harness/harness.go:42
runtime.main
/home/cs/go1.13/src/runtime/proc.go:203
runtime.goexit
/home/cs/go1.13/src/runtime/asm_amd64.s:1357
fixup for f5f269bfd5
(bandwidth limiting)
80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package bandwidthlimit
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/juju/ratelimit"
|
|
)
|
|
|
|
type Wrapper interface {
|
|
WrapReadCloser(io.ReadCloser) io.ReadCloser
|
|
}
|
|
|
|
type Config struct {
|
|
// Units in this struct are in _bytes_.
|
|
|
|
Max int64 // < 0 means no limit, BucketCapacity is irrelevant then
|
|
BucketCapacity int64
|
|
}
|
|
|
|
func NoLimitConfig() Config {
|
|
return Config{
|
|
Max: -1,
|
|
BucketCapacity: -1,
|
|
}
|
|
}
|
|
|
|
func ValidateConfig(conf Config) error {
|
|
if conf.BucketCapacity == 0 {
|
|
return errors.New("BucketCapacity must not be zero")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func WrapperFromConfig(conf Config) Wrapper {
|
|
if err := ValidateConfig(conf); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if conf.Max < 0 {
|
|
return noLimit{}
|
|
}
|
|
|
|
return &withLimit{
|
|
bucket: ratelimit.NewBucketWithRate(float64(conf.Max), conf.BucketCapacity),
|
|
}
|
|
}
|
|
|
|
type noLimit struct{}
|
|
|
|
func (_ noLimit) WrapReadCloser(rc io.ReadCloser) io.ReadCloser { return rc }
|
|
|
|
type withLimit struct {
|
|
bucket *ratelimit.Bucket
|
|
}
|
|
|
|
func (l *withLimit) WrapReadCloser(rc io.ReadCloser) io.ReadCloser {
|
|
return WrapReadCloser(rc, l.bucket)
|
|
}
|
|
|
|
type withLimitReadCloser struct {
|
|
orig io.Closer
|
|
limited io.Reader
|
|
}
|
|
|
|
func (r *withLimitReadCloser) Read(buf []byte) (int, error) {
|
|
return r.limited.Read(buf)
|
|
}
|
|
|
|
func (r *withLimitReadCloser) Close() error {
|
|
return r.orig.Close()
|
|
}
|
|
|
|
func WrapReadCloser(rc io.ReadCloser, bucket *ratelimit.Bucket) io.ReadCloser {
|
|
return &withLimitReadCloser{
|
|
limited: ratelimit.Reader(rc, bucket),
|
|
orig: rc,
|
|
}
|
|
}
|