mirror of
https://github.com/restic/restic.git
synced 2025-12-03 23:11:47 +00:00
cmd/restic, limiter: Move config knowledge to internal packages
The GlobalOptions struct now embeds a backend.TransportOptions, so it doesn't need to construct one in open and create. The upload and download limits are similarly now a struct in internal/limiter that is embedded in GlobalOptions.
This commit is contained in:
@@ -36,7 +36,7 @@ func TestLimitBackendSave(t *testing.T) {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
limiter := NewStaticLimiter(42*1024, 42*1024)
|
||||
limiter := NewStaticLimiter(Limits{42 * 1024, 42 * 1024})
|
||||
limbe := LimitBackend(be, limiter)
|
||||
|
||||
rd := restic.NewByteReader(data, nil)
|
||||
@@ -82,7 +82,7 @@ func TestLimitBackendLoad(t *testing.T) {
|
||||
}
|
||||
return newTracedReadCloser(src), nil
|
||||
}
|
||||
limiter := NewStaticLimiter(42*1024, 42*1024)
|
||||
limiter := NewStaticLimiter(Limits{42 * 1024, 42 * 1024})
|
||||
limbe := LimitBackend(be, limiter)
|
||||
|
||||
err := limbe.Load(context.TODO(), testHandle, 0, 0, func(rd io.Reader) error {
|
||||
|
||||
@@ -12,20 +12,27 @@ type staticLimiter struct {
|
||||
downstream *ratelimit.Bucket
|
||||
}
|
||||
|
||||
// Limits represents static upload and download limits.
|
||||
// For both, zero means unlimited.
|
||||
type Limits struct {
|
||||
UploadKb int
|
||||
DownloadKb int
|
||||
}
|
||||
|
||||
// NewStaticLimiter constructs a Limiter with a fixed (static) upload and
|
||||
// download rate cap
|
||||
func NewStaticLimiter(uploadKb, downloadKb int) Limiter {
|
||||
func NewStaticLimiter(l Limits) Limiter {
|
||||
var (
|
||||
upstreamBucket *ratelimit.Bucket
|
||||
downstreamBucket *ratelimit.Bucket
|
||||
)
|
||||
|
||||
if uploadKb > 0 {
|
||||
upstreamBucket = ratelimit.NewBucketWithRate(toByteRate(uploadKb), int64(toByteRate(uploadKb)))
|
||||
if l.UploadKb > 0 {
|
||||
upstreamBucket = ratelimit.NewBucketWithRate(toByteRate(l.UploadKb), int64(toByteRate(l.UploadKb)))
|
||||
}
|
||||
|
||||
if downloadKb > 0 {
|
||||
downstreamBucket = ratelimit.NewBucketWithRate(toByteRate(downloadKb), int64(toByteRate(downloadKb)))
|
||||
if l.DownloadKb > 0 {
|
||||
downstreamBucket = ratelimit.NewBucketWithRate(toByteRate(l.DownloadKb), int64(toByteRate(l.DownloadKb)))
|
||||
}
|
||||
|
||||
return staticLimiter{
|
||||
|
||||
@@ -15,22 +15,19 @@ func TestLimiterWrapping(t *testing.T) {
|
||||
reader := bytes.NewReader([]byte{})
|
||||
writer := new(bytes.Buffer)
|
||||
|
||||
for _, limits := range []struct {
|
||||
upstream int
|
||||
downstream int
|
||||
}{
|
||||
for _, limits := range []Limits{
|
||||
{0, 0},
|
||||
{42, 0},
|
||||
{0, 42},
|
||||
{42, 42},
|
||||
} {
|
||||
limiter := NewStaticLimiter(limits.upstream*1024, limits.downstream*1024)
|
||||
limiter := NewStaticLimiter(limits)
|
||||
|
||||
mustWrapUpstream := limits.upstream > 0
|
||||
mustWrapUpstream := limits.UploadKb > 0
|
||||
test.Equals(t, limiter.Upstream(reader) != reader, mustWrapUpstream)
|
||||
test.Equals(t, limiter.UpstreamWriter(writer) != writer, mustWrapUpstream)
|
||||
|
||||
mustWrapDownstream := limits.downstream > 0
|
||||
mustWrapDownstream := limits.DownloadKb > 0
|
||||
test.Equals(t, limiter.Downstream(reader) != reader, mustWrapDownstream)
|
||||
test.Equals(t, limiter.DownstreamWriter(writer) != writer, mustWrapDownstream)
|
||||
}
|
||||
@@ -51,7 +48,7 @@ func (r *tracedReadCloser) Close() error {
|
||||
}
|
||||
|
||||
func TestRoundTripperReader(t *testing.T) {
|
||||
limiter := NewStaticLimiter(42*1024, 42*1024)
|
||||
limiter := NewStaticLimiter(Limits{42 * 1024, 42 * 1024})
|
||||
data := make([]byte, 1234)
|
||||
_, err := io.ReadFull(rand.Reader, data)
|
||||
test.OK(t, err)
|
||||
@@ -89,7 +86,7 @@ func TestRoundTripperReader(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRoundTripperCornerCases(t *testing.T) {
|
||||
limiter := NewStaticLimiter(42*1024, 42*1024)
|
||||
limiter := NewStaticLimiter(Limits{42 * 1024, 42 * 1024})
|
||||
|
||||
rt := limiter.Transport(roundTripper(func(req *http.Request) (*http.Response, error) {
|
||||
return &http.Response{}, nil
|
||||
|
||||
Reference in New Issue
Block a user