cubefs
125 строк · 2.7 Кб
1// Copyright 2022 The CubeFS Authors.
2//
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
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
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.
14
15package resourcepool_test
16
17import (
18"math/rand"
19"testing"
20"time"
21
22rp "github.com/cubefs/cubefs/blobstore/common/resourcepool"
23"github.com/stretchr/testify/require"
24)
25
26func TestChanPoolSizeLimited(t *testing.T) {
27p := rp.NewChanPool(func() []byte {
28return make([]byte, 1)
29}, -1)
30require.Equal(t, -1, p.Cap())
31
32b := make([]byte, 1)
33for range [1 << 23]struct{}{} {
34p.Put(b)
35}
36require.Equal(t, 1<<22, p.Idle())
37}
38
39func TestChanPoolRelease(t *testing.T) {
40rp.SetReleaseInterval(200 * time.Millisecond)
41defer rp.SetReleaseInterval(time.Minute * 2)
42
43p := rp.NewChanPool(func() []byte {
44return make([]byte, 1024)
45}, -1)
46
47for i := range [1000]struct{}{} {
48go func(i int) {
49buf, err := p.Get()
50require.NoError(t, err)
51time.Sleep(1 + time.Millisecond*time.Duration(rand.Intn(2000)))
52p.Put(buf)
53}(i)
54}
55time.Sleep(time.Second)
56}
57
58func TestChanPoolBase(t *testing.T) {
59makeN := 0
60p := rp.NewChanPool(func() []byte {
61makeN++
62return make([]byte, 1024)
63}, 2)
64
65require.Equal(t, 2, p.Cap())
66require.Equal(t, 0, p.Len())
67require.Equal(t, 0, p.Idle())
68
69_, err := p.Get()
70require.NoError(t, err)
71_, err = p.Get()
72require.NoError(t, err)
73
74require.Equal(t, 2, p.Cap())
75require.Equal(t, 2, p.Len())
76require.Equal(t, 0, p.Idle())
77
78buf, err := p.Get()
79require.NoError(t, err)
80require.Equal(t, 3, makeN)
81
82p.Put(buf)
83require.Equal(t, 1, p.Idle())
84_, err = p.Get()
85require.NoError(t, err)
86require.Equal(t, 3, makeN)
87require.Equal(t, 0, p.Idle())
88}
89
90func TestChanPoolNoLimit(t *testing.T) {
91{
92makeN := 0
93p := rp.NewChanPool(func() []byte {
94makeN++
95return make([]byte, 1024)
96}, 0)
97require.Equal(t, 0, p.Cap())
98
99_, err := p.Get()
100require.NoError(t, err)
101require.Equal(t, 1, makeN)
102}
103{
104p := rp.NewChanPool(func() []byte {
105return make([]byte, 1024)
106}, -1)
107require.Equal(t, -1, p.Cap())
108require.Equal(t, 0, p.Idle())
109
110for range [1000]struct{}{} {
111buf, err := p.Get()
112require.NoError(t, err)
113p.Put(buf)
114}
115require.Equal(t, 1, p.Idle())
116}
117}
118
119func BenchmarkChanPoolGetPut(b *testing.B) {
120benchmarkPoolGetPut(b, func(size, capacity int) rp.Pool {
121return rp.NewChanPool(func() []byte {
122return make([]byte, size)
123}, capacity)
124})
125}
126