1
// Copyright 2023 The CubeFS Authors.
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
// implied. See the License for the specific language governing
13
// permissions and limitations under the License.
21
"github.com/stretchr/testify/require"
24
func TestLimitIOBase(t *testing.T) {
26
for _, flowIO := range [][2]int{
33
l := newIOLimiter(flowIO[0], flowIO[1])
34
l.ResetFlow(flowIO[0])
38
require.True(t, l.TryRun(1, f))
43
l := newIOLimiter(1<<10, 0)
46
t.Logf("status: %+v", st)
47
require.Equal(t, 1<<10, st.FlowLimit)
48
require.True(t, st.FlowUsed > 0)
49
require.True(t, st.FlowUsed <= 10)
50
require.True(t, l.TryRun(10, f))
56
done := make(chan struct{})
57
l := newIOLimiter(-1, 2)
59
t.Logf("before status: %+v", st)
60
for ii := 0; ii < st.IOConcurrency; ii++ {
62
l.Run(0, func() { <-done })
65
for ii := 0; ii < st.IOQueue*2; ii++ {
67
l.Run(0, func() { <-done })
70
time.Sleep(100 * time.Millisecond)
71
t.Logf("after status: %+v", l.Status())
72
require.False(t, l.TryRun(0, f))
77
require.True(t, q.TryRun(f))
78
t.Logf("closed status: %+v", q.Status())
82
func TestLimitIOConcurrency(t *testing.T) {
83
l := newIOLimiter(1<<10, 10)
84
done := make(chan struct{})
93
time.Sleep(time.Microsecond)
107
time.Sleep(time.Microsecond)
109
l.Run(1, func() { <-done })
122
time.Sleep(time.Microsecond)
124
l.TryRun(1, func() { <-done })
129
time.Sleep(500 * time.Millisecond)